/ Hex Artifact Content
Login

Artifact a6892805df427bb9d554c37641406438bff568f99d26e72c1fb7e45f2ed6ce5b:


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 20 20 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d  }.  /* TEXT->NUM
26d0: 45 52 49 43 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e  ERIC is many->on
26e0: 65 2e 20 20 48 65 6e 63 65 2c 20 69 74 20 69 73  e.  Hence, it is
26f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 69 6e   important to in
2700: 76 61 6c 69 64 61 74 65 20 74 68 65 0a 20 20 2a  validate the.  *
2710: 2a 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  * string represe
2720: 6e 74 61 74 69 6f 6e 20 61 66 74 65 72 20 63 6f  ntation after co
2730: 6d 70 75 74 69 6e 67 20 61 20 6e 75 6d 65 72 69  mputing a numeri
2740: 63 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 62 65  c equivalent, be
2750: 63 61 75 73 65 20 74 68 65 0a 20 20 2a 2a 20 73  cause the.  ** s
2760: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2770: 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62  tion might not b
2780: 65 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  e the canonical 
2790: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
27a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 65  or the.  ** nume
27b0: 72 69 63 20 76 61 6c 75 65 2e 20 20 54 69 63 6b  ric value.  Tick
27c0: 65 74 20 5b 33 34 33 36 33 34 39 34 32 64 64 35  et [343634942dd5
27d0: 34 61 62 35 37 62 37 30 32 34 5d 20 32 30 31 38  4ab57b7024] 2018
27e0: 2d 30 31 2d 33 31 2e 20 2a 2f 0a 20 20 70 52 65  -01-31. */.  pRe
27f0: 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  c->flags &= ~MEM
2800: 5f 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  _Str;.}../*.** P
2810: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2820: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2830: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
2840: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
2850: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
2860: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
2870: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
2880: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
2890: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
28a0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
28b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
28c0: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
28d0: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
28e0: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
28f0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2900: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2910: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2920: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2930: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
2940: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
2950: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
2960: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
2970: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
2980: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
2990: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
29a0: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
29b0: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
29c0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
29d0: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
29e0: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
29f0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2a00: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2a10: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a  LITE_AFF_BLOB:.*
2a20: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2a30: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
2a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2a50: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
2a60: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
2a70: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
2a80: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
2a90: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2aa0: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2ab0: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2ac0: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2ad0: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2ae0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2af0: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2b00: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2b10: 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
2b20: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
2b30: 61 73 73 65 72 74 28 20 61 66 66 69 6e 69 74 79  assert( affinity
2b40: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
2b50: 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79  EGER || affinity
2b60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
2b70: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  L.             |
2b80: 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  | affinity==SQLI
2b90: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
2ba0: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
2bb0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
2bc0: 29 3d 3d 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  )==0 ){ /*OPTIMI
2bd0: 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a  ZATION-IF-FALSE*
2be0: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65  /.      if( (pRe
2bf0: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  c->flags & MEM_R
2c00: 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
2c10: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
2c20: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 61  gs & MEM_Str ) a
2c30: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
2c40: 69 74 79 28 70 52 65 63 2c 31 29 3b 0a 20 20 20  ity(pRec,1);.   
2c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
2c70: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65  egerAffinity(pRe
2c80: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2c90: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66  }.  }else if( af
2ca0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2cb0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
2cc0: 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74  * Only attempt t
2cd0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
2ce0: 20 54 45 58 54 20 69 66 20 74 68 65 72 65 20 69   TEXT if there i
2cf0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  s an integer or 
2d00: 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72  real.    ** repr
2d10: 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62  esentation (blob
2d20: 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74   and NULL do not
2d30: 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20   get converted) 
2d40: 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20  but no string.  
2d50: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
2d60: 69 6f 6e 2e 20 20 49 74 20 77 6f 75 6c 64 20 62  ion.  It would b
2d70: 65 20 68 61 72 6d 6c 65 73 73 20 74 6f 20 72 65  e harmless to re
2d80: 70 65 61 74 20 74 68 65 20 63 6f 6e 76 65 72 73  peat the convers
2d90: 69 6f 6e 20 69 66 20 0a 20 20 20 20 2a 2a 20 74  ion if .    ** t
2da0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
2db0: 61 20 73 74 72 69 6e 67 20 72 65 70 2c 20 62 75  a string rep, bu
2dc0: 74 20 69 74 20 69 73 20 70 6f 69 6e 74 6c 65 73  t it is pointles
2dd0: 73 20 74 6f 20 77 61 73 74 65 20 74 68 6f 73 65  s to waste those
2de0: 0a 20 20 20 20 2a 2a 20 43 50 55 20 63 79 63 6c  .    ** CPU cycl
2df0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 30  es. */.    if( 0
2e00: 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ==(pRec->flags&M
2e10: 45 4d 5f 53 74 72 29 20 29 7b 20 2f 2a 4f 50 54  EM_Str) ){ /*OPT
2e20: 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
2e30: 53 45 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  SE*/.      if( (
2e40: 70 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  pRec->flags&(MEM
2e50: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20  _Real|MEM_Int)) 
2e60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e70: 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
2e80: 66 79 28 70 52 65 63 2c 20 65 6e 63 2c 20 31 29  fy(pRec, enc, 1)
2e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ea0: 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20      pRec->flags 
2eb0: 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  &= ~(MEM_Real|ME
2ec0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Int);.  }.}../
2ed0: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76  *.** Try to conv
2ee0: 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66 20  ert the type of 
2ef0: 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  a function argum
2f00: 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20  ent or a result 
2f10: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61  column.** into a
2f20: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
2f30: 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69  ntation.  Use ei
2f40: 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20  ther INTEGER or 
2f50: 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a  REAL whichever.*
2f60: 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  * is appropriate
2f70: 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74  .  But only do t
2f80: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66  he conversion if
2f90: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2fa0: 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20  without.** loss 
2fb0: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  of information a
2fc0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
2fd0: 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74 68  vised type of th
2fe0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  e argument..*/.i
2ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
3000: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71  _numeric_type(sq
3010: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
3020: 6c 29 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 20  l){.  int eType 
3030: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3040: 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 69 66  type(pVal);.  if
3050: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
3060: 54 45 58 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20  TEXT ){.    Mem 
3070: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56  *pMem = (Mem*)pV
3080: 61 6c 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d  al;.    applyNum
3090: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
30a0: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 54 79 70 65  m, 0);.    eType
30b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30c0: 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d  _type(pVal);.  }
30d0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
30e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74  .}../*.** Export
30f0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70  ed version of ap
3100: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54  plyAffinity(). T
3110: 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e  his one works on
3120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c   sqlite3_value*,
3130: 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74   .** not the int
3140: 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e  ernal Mem* type.
3150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3160: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
3170: 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ty(.  sqlite3_va
3180: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38  lue *pVal, .  u8
3190: 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38   affinity, .  u8
31a0: 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41   enc.){.  applyA
31b0: 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70  ffinity((Mem *)p
31c0: 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  Val, affinity, e
31d0: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d  nc);.}../*.** pM
31e0: 65 6d 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  em currently onl
31f0: 79 20 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67  y holds a string
3200: 20 74 79 70 65 20 28 6f 72 20 6d 61 79 62 65 20   type (or maybe 
3210: 61 20 42 4c 4f 42 20 74 68 61 74 20 77 65 20 63  a BLOB that we c
3220: 61 6e 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 20  an.** interpret 
3230: 61 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 77  as a string if w
3240: 65 20 77 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d  e want to).  Com
3250: 70 75 74 65 20 69 74 73 20 63 6f 72 72 65 73 70  pute its corresp
3260: 6f 6e 64 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69  onding.** numeri
3270: 63 20 74 79 70 65 2c 20 69 66 20 68 61 73 20 6f  c type, if has o
3280: 6e 65 2e 20 20 53 65 74 20 74 68 65 20 70 4d 65  ne.  Set the pMe
3290: 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d  m->u.r and pMem-
32a0: 3e 75 2e 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61  >u.i fields.** a
32b0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
32c0: 74 61 74 69 63 20 75 31 36 20 53 51 4c 49 54 45  tatic u16 SQLITE
32d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74  _NOINLINE comput
32e0: 65 4e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d  eNumericType(Mem
32f0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72   *pMem){.  asser
3300: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
3310: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3320: 65 61 6c 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  eal))==0 );.  as
3330: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
3340: 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45  gs & (MEM_Str|ME
3350: 4d 5f 42 6c 6f 62 29 29 21 3d 30 20 29 3b 0a 20  M_Blob))!=0 );. 
3360: 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46   if( sqlite3AtoF
3370: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d  (pMem->z, &pMem-
3380: 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70  >u.r, pMem->n, p
3390: 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a  Mem->enc)==0 ){.
33a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
33b0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
33c0: 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26  toi64(pMem->z, &
33d0: 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d  pMem->u.i, pMem-
33e0: 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d  >n, pMem->enc)==
33f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3400: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72  MEM_Int;.  }.  r
3410: 65 74 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a  eturn MEM_Real;.
3420: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3430: 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
3440: 20 66 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65   for pMem, eithe
3450: 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d  r MEM_Int or MEM
3460: 5f 52 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72  _Real or both or
3470: 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a  .** none.  .**.*
3480: 2a 20 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75  * Unlike applyNu
3490: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c  mericAffinity(),
34a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
34b0: 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d  es not modify pM
34c0: 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75  em->flags..** Bu
34d0: 74 20 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d  t it does set pM
34e0: 65 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d  em->u.r and pMem
34f0: 2d 3e 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74  ->u.i appropriat
3500: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ely..*/.static u
3510: 31 36 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d  16 numericType(M
3520: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28  em *pMem){.  if(
3530: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
3540: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
3550: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3560: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3570: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
3580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
3590: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
35a0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a  tr|MEM_Blob) ){.
35b0: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75      return compu
35c0: 74 65 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d  teNumericType(pM
35d0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  em);.  }.  retur
35e0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
35f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3600: 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73  * Write a nice s
3610: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74  tion of the cont
3630: 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65  ents of cell pMe
3640: 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72  m.** into buffer
3650: 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42   zBuf, length nB
3660: 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uf..*/.void sqli
3670: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
3680: 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Print(Mem *pMem,
3690: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
36a0: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75  char *zCsr = zBu
36b0: 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65  f;.  int f = pMe
36c0: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61  m->flags;..  sta
36d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
36e0: 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d  const encnames[]
36f0: 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22   = {"(X)", "(8)"
3700: 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36  , "(16LE)", "(16
3710: 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26  BE)"};..  if( f&
3720: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
3730: 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
3740: 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  c;.    if( f & M
3750: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
3760: 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  c = 'z';.      a
3770: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3780: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3790: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
37a0: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
37b0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
37c0: 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  c = 't';.      a
37d0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
37e0: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
37f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3800: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3810: 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  em ){.      c = 
3820: 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'e';.      asser
3830: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3840: 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30  tic|MEM_Dyn))==0
3850: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
3860: 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20       c = 's';.  
3870: 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b 2b    }.    *(zCsr++
3880: 29 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74  ) = c;.    sqlit
3890: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
38a0: 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d   zCsr, "%d[", pM
38b0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72  em->n);.    zCsr
38c0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
38d0: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66  n30(zCsr);.    f
38e0: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
38f0: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3910: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3920: 72 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74  r, "%02X", ((int
3930: 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78  )pMem->z[i] & 0x
3940: 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  FF));.      zCsr
3950: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3960: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3980: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
39a0: 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d  r z = pMem->z[i]
39b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32  ;.      if( z<32
39c0: 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73   || z>126 ) *zCs
39d0: 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  r++ = '.';.     
39e0: 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20   else *zCsr++ = 
39f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a  z;.    }.    *(z
3a00: 43 73 72 2b 2b 29 20 3d 20 27 5d 27 3b 0a 20 20  Csr++) = ']';.  
3a10: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65    if( f & MEM_Ze
3a20: 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ro ){.      sqli
3a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
3a40: 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d  , zCsr,"+%dz",pM
3a50: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20  em->u.nZero);.  
3a60: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3a70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  );.    }.    *zC
3a90: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
3aa0: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
3ab0: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  tr ){.    int j,
3ac0: 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20   k;.    zBuf[0] 
3ad0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66  = ' ';.    if( f
3ae0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3af0: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
3b00: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
3b10: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3b20: 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  c|MEM_Ephem))==0
3b30: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
3b40: 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63  ( f & MEM_Static
3b50: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3b60: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  ] = 't';.      a
3b70: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3b80: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
3b90: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3ba0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3bb0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  em ){.      zBuf
3bc0: 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20  [1] = 'e';.     
3bd0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
3be0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79  EM_Static|MEM_Dy
3bf0: 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  n))==0 );.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
3c10: 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a  1] = 's';.    }.
3c20: 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73      k = 2;.    s
3c30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3c40: 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22  100, &zBuf[k], "
3c50: 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  %d", pMem->n);. 
3c60: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3c70: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3c80: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3c90: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28   = '[';.    for(
3ca0: 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70  j=0; j<15 && j<p
3cb0: 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Mem->n; j++){.  
3cc0: 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d      u8 c = pMem-
3cd0: 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >z[j];.      if(
3ce0: 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78   c>=0x20 && c<0x
3cf0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  7f ){.        zB
3d00: 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  uf[k++] = c;.   
3d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d20: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e    zBuf[k++] = '.
3d30: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
3d40: 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d  .    zBuf[k++] =
3d50: 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   ']';.    sqlite
3d60: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26  3_snprintf(100,&
3d70: 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65  zBuf[k], encname
3d80: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
3d90: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3da0: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3db0: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3dc0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
3dd0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
3de0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
3df0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
3e00: 20 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20   a register for 
3e10: 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73  tracing purposes
3e20: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  :.*/.static void
3e30: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d   memTracePrint(M
3e40: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
3e50: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64  >flags & MEM_Und
3e60: 65 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72  efined ){.    pr
3e70: 69 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64  intf(" undefined
3e80: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
3e90: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  p->flags & MEM_N
3ea0: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ull ){.    print
3eb0: 66 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  f(p->flags & MEM
3ec0: 5f 5a 65 72 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e  _Zero ? " NULL-n
3ed0: 6f 63 68 6e 67 22 20 3a 20 22 20 4e 55 4c 4c 22  ochng" : " NULL"
3ee0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
3ef0: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
3f00: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
3f10: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3f20: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3f30: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3f40: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3f50: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3f60: 6e 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  nt ){.    printf
3f70: 28 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75  (" i:%lld", p->u
3f80: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
3f90: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
3fa0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
3fb0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3fc0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
3fd0: 72 69 6e 74 66 28 22 20 72 3a 25 67 22 2c 20 70  rintf(" r:%g", p
3fe0: 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ->u.r);.#endif. 
3ff0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
4000: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
4010: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4020: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
4030: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
4040: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
4050: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
4060: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
4070: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 25  ;.    printf(" %
4080: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  s", zBuf);.  }. 
4090: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
40a0: 4d 45 4d 5f 53 75 62 74 79 70 65 20 29 20 70 72  MEM_Subtype ) pr
40b0: 69 6e 74 66 28 22 20 73 75 62 74 79 70 65 3d 30  intf(" subtype=0
40c0: 78 25 30 32 78 22 2c 20 70 2d 3e 65 53 75 62 74  x%02x", p->eSubt
40d0: 79 70 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ype);.}.static v
40e0: 6f 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63  oid registerTrac
40f0: 65 28 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  e(int iReg, Mem 
4100: 2a 70 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 52  *p){.  printf("R
4110: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
4120: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
4130: 6e 74 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 28  nt(p);.  printf(
4140: 22 5c 6e 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  "\n");.  sqlite3
4150: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
4160: 72 69 61 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e  riants(p);.}.#en
4170: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4180: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4190: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
41a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
41b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
41c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
41d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
41e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
41f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4200: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4210: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4220: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4230: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4240: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4250: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4260: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4270: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4290: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
42a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
42b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
42c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
42d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
42e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
42f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4300: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4310: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4320: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4330: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4350: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4360: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4370: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4380: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4390: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
43a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
43b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
43c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
43d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
43e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
43f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4400: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4410: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4420: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4430: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4440: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4450: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4460: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4470: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4480: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4490: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
44a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
44b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
44c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
44d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
44e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
44f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4500: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4510: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4520: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4530: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4540: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4550: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4570: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4580: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4590: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
45a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
45b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
45c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
45d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
45e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
45f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4600: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4610: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4620: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4630: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4640: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4650: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4660: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4670: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4680: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4690: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
46a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
46b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
46c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
46d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
46e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
46f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4700: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4710: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4720: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4730: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4740: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4750: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4760: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4770: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4780: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
47a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
47b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
47c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
47d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
47e0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
47f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4800: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4810: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4820: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4830: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4840: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4860: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4870: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4880: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
48a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
48b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
48c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
48d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
48e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
48f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4910: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4920: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4930: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4950: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4960: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4970: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4980: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4990: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
49a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
49b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
49c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
49d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
49e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4a00: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4a10: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4a20: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4a30: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4a40: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4a50: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a70: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4a80: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4a90: 72 6f 67 72 65 73 73 4c 69 6d 69 74 3b 20 20 20  rogressLimit;   
4aa0: 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72  /* Invoke xProgr
4ab0: 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53 74  ess() when nVmSt
4ac0: 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73 20  ep reaches this 
4ad0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20  */.#endif.  Mem 
4ae0: 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *aMem = p->aMem;
4af0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
4b00: 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d  f p->aMem */.  M
4b10: 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20  em *pIn1 = 0;   
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
4b30: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
4b40: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20  /.  Mem *pIn2 = 
4b50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4b60: 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65 72  * 2nd input oper
4b70: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
4b80: 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n3 = 0;         
4b90: 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75 74      /* 3rd input
4ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4bb0: 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20 20  m *pOut = 0;    
4bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
4bd0: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69  ut operand */.#i
4be0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4bf0: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c10: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
4c20: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
4c30: 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  code */.#endif. 
4c40: 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54 41   /*** INSERT STA
4c50: 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a  CK UNION HERE **
4c60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
4c70: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4c80: 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71  IC_RUN );  /* sq
4c90: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65 72  lite3_step() ver
4ca0: 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ifies this */.  
4cb0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
4cc0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  (p);.  if( p->rc
4cd0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
4ce0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
4cf0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
4d00: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
4d10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
4d20: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
4d30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4d40: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
4d50: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74  led.  */.    got
4d60: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
4d70: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4d80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
4d90: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
4da0: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
4db0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
4dc0: 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d  || p->readOnly!=
4dd0: 30 20 29 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65  0 );.  p->iCurre
4de0: 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73  ntTime = 0;.  as
4df0: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
4e00: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73  ==0 );.  p->pRes
4e10: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64 62  ultSet = 0;.  db
4e20: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
4e30: 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 64  usy = 0;.  if( d
4e40: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
4e50: 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  ted ) goto abort
4e60: 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70  _due_to_interrup
4e70: 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
4e80: 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23  IOTraceSql(p);.#
4e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ea0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4eb0: 42 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78  BACK.  if( db->x
4ec0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
4ed0: 75 33 32 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e  u32 iPrior = p->
4ee0: 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f  aCounter[SQLITE_
4ef0: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
4f00: 45 50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  EP];.    assert(
4f10: 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65   0 < db->nProgre
4f20: 73 73 4f 70 73 20 29 3b 0a 20 20 20 20 6e 50 72  ssOps );.    nPr
4f30: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 64 62  ogressLimit = db
4f40: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d  ->nProgressOps -
4f50: 20 28 69 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e   (iPrior % db->n
4f60: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
4f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 6f 67  }else{.    nProg
4f80: 72 65 73 73 4c 69 6d 69 74 20 3d 20 30 78 66 66  ressLimit = 0xff
4f90: 66 66 66 66 66 66 3b 0a 20 20 7d 0a 23 65 6e 64  ffffff;.  }.#end
4fa0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4fb0: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4fc0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4fd0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4fe0: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
4ff0: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
5000: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
5010: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
5020: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
5030: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
5040: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
5050: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
5060: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
5070: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
5080: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5090: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
50a0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
50b0: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
50c0: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
50d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
50e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
50f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5100: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
5110: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
5120: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
5130: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5140: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
5150: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5160: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5170: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
5180: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
5190: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
51a0: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
51b0: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
51c0: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
51d0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
51e0: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
51f0: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5200: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5220: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5230: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5240: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
5250: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
5260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
5270: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
5280: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
5290: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
52a0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
52b0: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
52c0: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
52d0: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
52e0: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
52f0: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5300: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5310: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5320: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5340: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
5350: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
5360: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
5370: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
5380: 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e  te3Hwtime();.#en
5390: 64 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b  dif.    nVmStep+
53a0: 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
53b0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
53c0: 4e 53 54 41 54 55 53 0a 20 20 20 20 69 66 28 20  NSTATUS.    if( 
53d0: 70 2d 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e 61  p->anExec ) p->a
53e0: 6e 45 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d  nExec[(int)(pOp-
53f0: 61 4f 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a  aOp)]++;.#endif.
5400: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
5410: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
5420: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
5430: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
5440: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5450: 47 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  G.    if( db->fl
5460: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5470: 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
5480: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5490: 4f 70 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 29  Op(stdout, (int)
54a0: 28 70 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70  (pOp - aOp), pOp
54b0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
54c0: 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43        ..    /* C
54d0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
54e0: 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c 61  e need to simula
54f0: 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70 74 2e  te an interrupt.
5500: 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70    This only happ
5510: 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 65  ens.    ** if we
5520: 20 68 61 76 65 20 61 20 73 70 65 63 69 61 6c 20   have a special 
5530: 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 20  test build..    
5540: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5550: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 73 71  _TEST.    if( sq
5560: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
5570: 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  count>0 ){.     
5580: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
5590: 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20  pt_count--;.    
55a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
55b0: 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30  terrupt_count==0
55c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
55d0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
55e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
55f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
5600: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
5610: 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  on other operand
5620: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
5630: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20  TE_DEBUG.    {. 
5640: 20 20 20 20 20 75 38 20 6f 70 50 72 6f 70 65 72       u8 opProper
5650: 74 79 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  ty = sqlite3Opco
5660: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
5670: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69  opcode];.      i
5680: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5690: 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29   OPFLG_IN1)!=0 )
56a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
56b0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
56c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
56d0: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
56e0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
56f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5700: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5710: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29  aMem[pOp->p1]) )
5720: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5730: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
5740: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
5750: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
5760: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
5770: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
5780: 31 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  1, &aMem[pOp->p1
5790: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
57a0: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
57b0: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d  y & OPFLG_IN2)!=
57c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
57d0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
57e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
57f0: 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  ( pOp->p2<=(p->n
5800: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
5810: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  or) );.        a
5820: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
5830: 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  d(&aMem[pOp->p2]
5840: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
5850: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
5860: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
5870: 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  ts(&aMem[pOp->p2
5880: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ]) );.        RE
5890: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
58a0: 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p2, &aMem[pOp-
58b0: 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2]);.      }. 
58c0: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
58d0: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33  erty & OPFLG_IN3
58e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
58f0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
5900: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
5910: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  ert( pOp->p3<=(p
5920: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
5930: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
5940: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
5950: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
5960: 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  p3]) );.        
5970: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
5980: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
5990: 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d  iants(&aMem[pOp-
59a0: 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  >p3]) );.       
59b0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
59c0: 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70  pOp->p3, &aMem[p
59d0: 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
59e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50  }.      if( (opP
59f0: 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
5a00: 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20  OUT2)!=0 ){.    
5a10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5a20: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p2>0 );.       
5a30: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5a40: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
5a50: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
5a60: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
5a70: 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
5a80: 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20  pOp->p2]);.     
5a90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70   }.      if( (op
5aa0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
5ab0: 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20  _OUT3)!=0 ){.   
5ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5ad0: 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p3>0 );.      
5ae0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5af0: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
5b00: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
5b10: 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
5b20: 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
5b30: 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
5b40: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
5b50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5b60: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
5b70: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
5b80: 4c 45 29 0a 20 20 20 20 70 4f 72 69 67 4f 70 20  LE).    pOrigOp 
5b90: 3d 20 70 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20  = pOp;.#endif.  
5ba0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
5bb0: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a  ->opcode ){../**
5bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57  ***********.** W
5c10: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61  hat follows is a
5c20: 20 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20   massive switch 
5c30: 73 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20  statement where 
5c40: 65 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d  each case implem
5c50: 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61  ents a.** separa
5c60: 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  te instruction i
5c70: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
5c80: 63 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f  chine.  If we fo
5c90: 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a  llow the usual.*
5ca0: 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f  * indentation co
5cb0: 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20  nventions, each 
5cc0: 63 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69  case should be i
5cd0: 6e 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61  ndented by 6 spa
5ce0: 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61  ces.  But.** tha
5cf0: 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61  t is a lot of wa
5d00: 73 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68  sted space on th
5d10: 65 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20  e left margin.  
5d20: 53 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68  So the code with
5d30: 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68  in.** the switch
5d40: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20   statement will 
5d50: 62 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65  break with conve
5d60: 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75  ntion and be flu
5d70: 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72  sh-left. Another
5d80: 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20  .** big comment 
5d90: 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73  (similar to this
5da0: 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20   one) will mark 
5db0: 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  the point in the
5dc0: 20 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77   code where.** w
5dd0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63  e transition bac
5de0: 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65  k to normal inde
5df0: 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ntation..**.** T
5e00: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66  he formatting of
5e10: 20 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d   each case is im
5e20: 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61  portant.  The ma
5e30: 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74  kefile for SQLit
5e40: 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74  e.** generates t
5e50: 77 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f  wo C files "opco
5e60: 64 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f  des.h" and "opco
5e70: 64 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69  des.c" by scanni
5e80: 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20  ng this.** file 
5e90: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65  looking for line
5ea0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
5eb0: 68 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54  h "case OP_".  T
5ec0: 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c  he opcodes.h fil
5ed0: 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69  es.** will be fi
5ee0: 6c 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e  lled with #defin
5ef0: 65 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69  es that give uni
5f00: 71 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  que integer valu
5f10: 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70  es to each.** op
5f20: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63  code and the opc
5f30: 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66  odes.c file is f
5f40: 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72  illed with an ar
5f50: 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77  ray of strings w
5f60: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72  here.** each str
5f70: 69 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f  ing is the symbo
5f80: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  lic name for the
5f90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f   corresponding o
5fa0: 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a  pcode.  If the.*
5fb0: 2a 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74  * case statement
5fc0: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
5fd0: 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65  a comment of the
5fe0: 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61   form "/# same a
5ff0: 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61  s ... #/".** tha
6000: 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65  t comment is use
6010: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
6020: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  he particular va
6030: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
6040: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b  e..**.** Other k
6050: 65 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63  eywords in the c
6060: 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c  omment that foll
6070: 6f 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72  ows each case ar
6080: 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e  e used to.** con
6090: 73 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47  struct the OPFLG
60a0: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c  _INITIALIZER val
60b0: 75 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  ue that initiali
60c0: 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72  zes opcodeProper
60d0: 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64  ty[]..** Keyword
60e0: 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20  s include: in1, 
60f0: 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20  in2, in3, out2, 
6100: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
6110: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
6120: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
6130: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6140: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
6150: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
6160: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
6170: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
6180: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
6190: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
61a0: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
61b0: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
61c0: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
61d0: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
61e0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
61f0: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
6200: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
6210: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
6220: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
6230: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
6240: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
6250: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
6260: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
6270: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
6280: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
6290: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
62a0: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
62b0: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
62c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6310: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
6320: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
6330: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6340: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
6350: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
6360: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
6370: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
6380: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
6390: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
63a0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
63b0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
63c0: 2a 2a 20 54 68 65 20 50 31 20 70 61 72 61 6d 65  ** The P1 parame
63d0: 74 65 72 20 69 73 20 6e 6f 74 20 61 63 74 75 61  ter is not actua
63e0: 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68 69 73  lly used by this
63f0: 20 6f 70 63 6f 64 65 2e 20 20 48 6f 77 65 76 65   opcode.  Howeve
6400: 72 2c 20 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65  r, it.** is some
6410: 74 69 6d 65 73 20 73 65 74 20 74 6f 20 31 20 69  times set to 1 i
6420: 6e 73 74 65 61 64 20 6f 66 20 30 20 61 73 20 61  nstead of 0 as a
6430: 20 68 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d   hint to the com
6440: 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a  mand-line shell.
6450: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 47 6f 74  ** that this Got
6460: 6f 20 69 73 20 74 68 65 20 62 6f 74 74 6f 6d 20  o is the bottom 
6470: 6f 66 20 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68  of a loop and th
6480: 61 74 20 74 68 65 20 6c 69 6e 65 73 20 66 72 6f  at the lines fro
6490: 6d 20 50 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20  m P2 down.** to 
64a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65  the current line
64b0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
64c0: 74 65 64 20 66 6f 72 20 45 58 50 4c 41 49 4e 20  ted for EXPLAIN 
64d0: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20  output..*/.case 
64e0: 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20  OP_Goto: {      
64f0: 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
6500: 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  /.jump_to_p2_and
6510: 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
6520: 72 75 70 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61  rupt:.  pOp = &a
6530: 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b  Op[pOp->p2 - 1];
6540: 0a 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74  ..  /* Opcodes t
6550: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
6560: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20  the bottom of a 
6570: 6c 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f  loop (OP_Next, O
6580: 50 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f  P_Prev,.  ** OP_
6590: 56 4e 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72  VNext, or OP_Sor
65a0: 74 65 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d  terNext) all jum
65b0: 70 20 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a  p here upon.  **
65c0: 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68   completion.  Ch
65d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 73 71  eck to see if sq
65e0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
65f0: 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
6600: 64 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65  d.  ** or if the
6610: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
6620: 63 6b 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  ck needs to be i
6630: 6e 76 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20  nvoked. .  **.  
6640: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 75 73 65  ** This code use
6650: 73 20 75 6e 73 74 72 75 63 74 75 72 65 64 20 22  s unstructured "
6660: 67 6f 74 6f 22 20 73 74 61 74 65 6d 65 6e 74 73  goto" statements
6670: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f   and does not lo
6680: 6f 6b 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42  ok clean..  ** B
6690: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64  ut that is not d
66a0: 75 65 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64  ue to sloppy cod
66b0: 69 6e 67 20 68 61 62 69 74 73 2e 20 54 68 65 20  ing habits. The 
66c0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20  code is written 
66d0: 74 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f  this.  ** way fo
66e0: 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74  r performance, t
66f0: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
6700: 6f 20 72 75 6e 20 74 68 65 20 69 6e 74 65 72 72  o run the interr
6710: 75 70 74 20 61 6e 64 20 70 72 6f 67 72 65 73 73  upt and progress
6720: 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20  .  ** checks on 
6730: 65 76 65 72 79 20 6f 70 63 6f 64 65 2e 20 20 54  every opcode.  T
6740: 68 69 73 20 68 65 6c 70 73 20 73 71 6c 69 74 65  his helps sqlite
6750: 33 5f 73 74 65 70 28 29 20 74 6f 20 72 75 6e 20  3_step() to run 
6760: 61 62 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20  about 1.5%.  ** 
6770: 66 61 73 74 65 72 20 61 63 63 6f 72 64 69 6e 67  faster according
6780: 20 74 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d   to "valgrind --
6790: 74 6f 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64 22  tool=cachegrind"
67a0: 20 2a 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e   */.check_for_in
67b0: 74 65 72 72 75 70 74 3a 0a 20 20 69 66 28 20 64  terrupt:.  if( d
67c0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
67d0: 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  ted ) goto abort
67e0: 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70  _due_to_interrup
67f0: 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
6800: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
6810: 43 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61  CALLBACK.  /* Ca
6820: 6c 6c 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ll the progress 
6830: 63 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69  callback if it i
6840: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64  s configured and
6850: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 75   the required nu
6860: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42  mber.  ** of VDB
6870: 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20  E ops have been 
6880: 65 78 65 63 75 74 65 64 20 28 65 69 74 68 65 72  executed (either
6890: 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f   since this invo
68a0: 63 61 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73  cation of.  ** s
68b0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
68c0: 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74   or since last t
68d0: 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73  ime the progress
68e0: 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61   callback was ca
68f0: 6c 6c 65 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74  lled)..  ** If t
6900: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
6910: 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
6920: 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65 20  -zero, exit the 
6930: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
6940: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 74 75  with.  ** a retu
6950: 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 41  rn code SQLITE_A
6960: 42 4f 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BORT..  */.  if(
6970: 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72   nVmStep>=nProgr
6980: 65 73 73 4c 69 6d 69 74 20 26 26 20 64 62 2d 3e  essLimit && db->
6990: 78 50 72 6f 67 72 65 73 73 21 3d 30 20 29 7b 0a  xProgress!=0 ){.
69a0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
69b0: 6e 50 72 6f 67 72 65 73 73 4f 70 73 21 3d 30 20  nProgressOps!=0 
69c0: 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73  );.    nProgress
69d0: 4c 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 70 20  Limit = nVmStep 
69e0: 2b 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f  + db->nProgressO
69f0: 70 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 64 62  ps - (nVmStep%db
6a00: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b  ->nProgressOps);
6a10: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72  .    if( db->xPr
6a20: 6f 67 72 65 73 73 28 64 62 2d 3e 70 50 72 6f 67  ogress(db->pProg
6a30: 72 65 73 73 41 72 67 29 20 29 7b 0a 20 20 20 20  ressArg) ){.    
6a40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
6a50: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67  TERRUPT;.      g
6a60: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
6a70: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72  }.#endif.  .  br
6a90: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
6aa0: 65 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32 20  e:  Gosub P1 P2 
6ab0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
6ac0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 64  e the current ad
6ad0: 64 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73  dress onto regis
6ae0: 74 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68  ter P1.** and th
6af0: 65 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65  en jump to addre
6b00: 73 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ss P2..*/.case O
6b10: 50 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20  P_Gosub: {      
6b20: 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
6b30: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
6b40: 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
6b50: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
6b60: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
6b70: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
6b80: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
6b90: 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
6ba0: 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  In1)==0 );.  mem
6bb0: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
6bc0: 20 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e   pIn1);.  pIn1->
6bd0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
6be0: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28  .  pIn1->u.i = (
6bf0: 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20  int)(pOp-aOp);. 
6c00: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
6c10: 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a  pOp->p1, pIn1);.
6c20: 0a 20 20 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20  .  /* Most jump 
6c30: 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 61 20  operations do a 
6c40: 67 6f 74 6f 20 74 6f 20 74 68 69 73 20 73 70 6f  goto to this spo
6c50: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 70  t in order to up
6c60: 64 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f  date.  ** the pO
6c70: 70 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75  p pointer. */.ju
6c80: 6d 70 5f 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20  mp_to_p2:.  pOp 
6c90: 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d  = &aOp[pOp->p2 -
6ca0: 20 31 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a   1];.  break;.}.
6cb0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65 74  ./* Opcode:  Ret
6cc0: 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  urn P1 * * * *.*
6cd0: 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65  *.** Jump to the
6ce0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
6cf0: 6e 20 61 66 74 65 72 20 74 68 65 20 61 64 64 72  n after the addr
6d00: 65 73 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ess in register 
6d10: 50 31 2e 20 20 41 66 74 65 72 0a 2a 2a 20 74 68  P1.  After.** th
6d20: 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72  e jump, register
6d30: 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65   P1 becomes unde
6d40: 66 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  fined..*/.case O
6d50: 50 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20  P_Return: {     
6d60: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
6d70: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
6d80: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
6d90: 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d  t( pIn1->flags==
6da0: 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70  MEM_Int );.  pOp
6db0: 20 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e   = &aOp[pIn1->u.
6dc0: 69 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67  i];.  pIn1->flag
6dd0: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
6de0: 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  d;.  break;.}../
6df0: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f  * Opcode: InitCo
6e00: 72 6f 75 74 69 6e 65 20 50 31 20 50 32 20 50 33  routine P1 P2 P3
6e10: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75   * *.**.** Set u
6e20: 70 20 72 65 67 69 73 74 65 72 20 50 31 20 73 6f  p register P1 so
6e30: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 59 69   that it will Yi
6e40: 65 6c 64 20 74 6f 20 74 68 65 20 63 6f 72 6f 75  eld to the corou
6e50: 74 69 6e 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20  tine.** located 
6e60: 61 74 20 61 64 64 72 65 73 73 20 50 33 2e 0a 2a  at address P3..*
6e70: 2a 0a 2a 2a 20 49 66 20 50 32 21 3d 30 20 74 68  *.** If P2!=0 th
6e80: 65 6e 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65  en the coroutine
6e90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6ea0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
6eb0: 6f 77 73 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f  ows.** this opco
6ec0: 64 65 2e 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65  de.  So jump ove
6ed0: 72 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20  r the coroutine 
6ee0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
6ef0: 6f 0a 2a 2a 20 61 64 64 72 65 73 73 20 50 32 2e  o.** address P2.
6f00: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
6f10: 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f   EndCoroutine.*/
6f20: 0a 63 61 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72  .case OP_InitCor
6f30: 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a  outine: {     /*
6f40: 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
6f50: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20  t( pOp->p1>0 && 
6f60: 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d   pOp->p1<=(p->nM
6f70: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
6f80: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
6f90: 70 4f 70 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f  pOp->p2>=0 && pO
6fa0: 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  p->p2<p->nOp );.
6fb0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
6fc0: 33 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  3>=0 && pOp->p3<
6fd0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74  p->nOp );.  pOut
6fe0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6ff0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56 64  ];.  assert( !Vd
7000: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75  beMemDynamic(pOu
7010: 74 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  t) );.  pOut->u.
7020: 69 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b  i = pOp->p3 - 1;
7030: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
7040: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20   MEM_Int;.  if( 
7050: 70 4f 70 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a  pOp->p2 ) goto j
7060: 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
7070: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7080: 3a 20 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20  :  EndCoroutine 
7090: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
70a0: 20 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   The instruction
70b0: 20 61 74 20 74 68 65 20 61 64 64 72 65 73 73 20   at the address 
70c0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
70d0: 73 20 61 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75  s a Yield..** Ju
70e0: 6d 70 20 74 6f 20 74 68 65 20 50 32 20 70 61 72  mp to the P2 par
70f0: 61 6d 65 74 65 72 20 6f 66 20 74 68 61 74 20 59  ameter of that Y
7100: 69 65 6c 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74  ield..** After t
7110: 68 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65  he jump, registe
7120: 72 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64  r P1 becomes und
7130: 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  efined..**.** Se
7140: 65 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f  e also: InitCoro
7150: 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50  utine.*/.case OP
7160: 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  _EndCoroutine: {
7170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
7180: 31 20 2a 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70  1 */.  VdbeOp *p
7190: 43 61 6c 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d  Caller;.  pIn1 =
71a0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
71b0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
71c0: 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20  >flags==MEM_Int 
71d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
71e0: 31 2d 3e 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e  1->u.i>=0 && pIn
71f0: 31 2d 3e 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b  1->u.i<p->nOp );
7200: 0a 20 20 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f  .  pCaller = &aO
7210: 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20  p[pIn1->u.i];.  
7220: 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d  assert( pCaller-
7230: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c  >opcode==OP_Yiel
7240: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
7250: 43 61 6c 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26  Caller->p2>=0 &&
7260: 20 70 43 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e   pCaller->p2<p->
7270: 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp );.  pOp = &
7280: 61 4f 70 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20  aOp[pCaller->p2 
7290: 2d 20 31 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  - 1];.  pIn1->fl
72a0: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
72b0: 6e 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ned;.  break;.}.
72c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65  ./* Opcode:  Yie
72d0: 6c 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ld P1 P2 * * *.*
72e0: 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 70 72  *.** Swap the pr
72f0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77 69  ogram counter wi
7300: 74 68 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  th the value in 
7310: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 54 68  register P1.  Th
7320: 69 73 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  is.** has the ef
7330: 66 65 63 74 20 6f 66 20 79 69 65 6c 64 69 6e 67  fect of yielding
7340: 20 74 6f 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e   to a coroutine.
7350: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
7360: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 69 73 20  routine that is 
7370: 6c 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 73  launched by this
7380: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
7390: 73 20 77 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20  s with.** Yield 
73a0: 6f 72 20 52 65 74 75 72 6e 20 74 68 65 6e 20 63  or Return then c
73b0: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
73c0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
73d0: 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
73e0: 63 6f 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68  coroutine launch
73f0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72  ed by this instr
7400: 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68  uction ends with
7410: 0a 2a 2a 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65  .** EndCoroutine
7420: 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
7430: 32 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f  2 rather than co
7440: 6e 74 69 6e 75 69 6e 67 20 77 69 74 68 20 74 68  ntinuing with th
7450: 65 0a 2a 2a 20 6e 65 78 74 20 69 6e 73 74 72 75  e.** next instru
7460: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ction..**.** See
7470: 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75   also: InitCorou
7480: 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  tine.*/.case OP_
7490: 59 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20  Yield: {        
74a0: 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70      /* in1, jump
74b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74   */.  int pcDest
74c0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
74d0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
74e0: 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61  ert( VdbeMemDyna
74f0: 6d 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a  mic(pIn1)==0 );.
7500: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
7510: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73  MEM_Int;.  pcDes
7520: 74 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75  t = (int)pIn1->u
7530: 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  .i;.  pIn1->u.i 
7540: 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
7550: 70 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  p);.  REGISTER_T
7560: 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49  RACE(pOp->p1, pI
7570: 6e 31 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f  n1);.  pOp = &aO
7580: 70 5b 70 63 44 65 73 74 5d 3b 0a 20 20 62 72 65  p[pcDest];.  bre
7590: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
75a0: 3a 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50  :  HaltIfNull  P
75b0: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
75c0: 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
75d0: 50 33 5d 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a  P3]=null halt.**
75e0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61  .** Check the va
75f0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
7600: 50 33 2e 20 20 49 66 20 69 74 20 69 73 20 4e 55  P3.  If it is NU
7610: 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69  LL then Halt usi
7620: 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ng.** parameter 
7630: 50 31 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61  P1, P2, and P4 a
7640: 73 20 69 66 20 74 68 69 73 20 77 65 72 65 20 61  s if this were a
7650: 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f   Halt instructio
7660: 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61  n.  If the.** va
7670: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
7680: 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P3 is not NULL, 
7690: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
76a0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
76b0: 20 54 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   The P5 paramete
76c0: 72 20 73 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a  r should be 1..*
76d0: 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49 66  /.case OP_HaltIf
76e0: 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20  Null: {      /* 
76f0: 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20  in3 */.  pIn3 = 
7700: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
7710: 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61    if( (pIn3->fla
7720: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
7730: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20  0 ) break;.  /* 
7740: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
7750: 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a  o OP_Halt */.}..
7760: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74  /* Opcode:  Halt
7770: 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a   P1 P2 * P4 P5.*
7780: 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64 69  *.** Exit immedi
7790: 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e  ately.  All open
77a0: 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61 72   cursors, etc ar
77b0: 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f  e closed.** auto
77c0: 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  matically..**.**
77d0: 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75 6c   P1 is the resul
77e0: 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20  t code returned 
77f0: 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  by sqlite3_exec(
7800: 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  ), sqlite3_reset
7810: 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65  (),.** or sqlite
7820: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46  3_finalize().  F
7830: 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74  or a normal halt
7840: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65  , this should be
7850: 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a   SQLITE_OK (0)..
7860: 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69  ** For errors, i
7870: 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74  t can be some ot
7880: 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20 50  her value.  If P
7890: 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69 6c  1!=0 then P2 wil
78a0: 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  l determine.** w
78b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f  hether or not to
78c0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75   rollback the cu
78d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
78e0: 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62  n.  Do not rollb
78f0: 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45  ack.** if P2==OE
7900: 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f  _Fail. Do the ro
7910: 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45  llback if P2==OE
7920: 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50  _Rollback.  If P
7930: 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20  2==OE_Abort,.** 
7940: 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c  then back out al
7950: 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 68  l changes that h
7960: 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75 72  ave occurred dur
7970: 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74 69  ing this executi
7980: 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
7990: 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f  E, but do not ro
79a0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
79b0: 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  action. .**.** I
79c0: 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  f P4 is not null
79d0: 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20 65   then it is an e
79e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
79f0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73  ing..**.** P5 is
7a00: 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e   a value between
7a10: 20 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73   0 and 4, inclus
7a20: 69 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66 69  ive, that modifi
7a30: 65 73 20 74 68 65 20 50 34 20 73 74 72 69 6e 67  es the P4 string
7a40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28  ..**.**    0:  (
7a50: 6e 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20  no change).**   
7a60: 20 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f   1:  NOT NULL co
7a70: 6e 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  ntraint failed: 
7a80: 50 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49  P4.**    2:  UNI
7a90: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
7aa0: 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20  ailed: P4.**    
7ab0: 33 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  3:  CHECK constr
7ac0: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a  aint failed: P4.
7ad0: 2a 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49 47  **    4:  FOREIG
7ae0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
7af0: 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a   failed: P4.**.*
7b00: 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
7b10: 65 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e 55  ero and P4 is NU
7b20: 4c 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74 68  LL, then everyth
7b30: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 22 3a  ing after the ":
7b40: 22 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e  " is.** omitted.
7b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
7b60: 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74  an implied "Halt
7b70: 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63 74   0 0 0" instruct
7b80: 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20  ion inserted at 
7b90: 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a  the very end of.
7ba0: 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d  ** every program
7bb0: 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73  .  So a jump pas
7bc0: 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  t the last instr
7bd0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72  uction of the pr
7be0: 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20  ogram.** is the 
7bf0: 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e  same as executin
7c00: 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20  g Halt..*/.case 
7c10: 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62  OP_Halt: {.  Vdb
7c20: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
7c30: 20 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63    int pcx;..  pc
7c40: 78 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  x = (int)(pOp - 
7c50: 61 4f 70 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  aOp);.  if( pOp-
7c60: 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >p1==SQLITE_OK &
7c70: 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  & p->pFrame ){. 
7c80: 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20 73     /* Halt the s
7c90: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74 75  ub-program. Retu
7ca0: 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  rn control to th
7cb0: 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e 20  e parent frame. 
7cc0: 2a 2f 0a 20 20 20 20 70 46 72 61 6d 65 20 3d 20  */.    pFrame = 
7cd0: 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20 70  p->pFrame;.    p
7ce0: 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d  ->pFrame = pFram
7cf0: 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  e->pParent;.    
7d00: 70 2d 3e 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20  p->nFrame--;.   
7d10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7d20: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
7d30: 68 61 6e 67 65 29 3b 0a 20 20 20 20 70 63 78 20  hange);.    pcx 
7d40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  = sqlite3VdbeFra
7d50: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
7d60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  );.    if( pOp->
7d70: 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  p2==OE_Ignore ){
7d80: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75  .      /* Instru
7d90: 63 74 69 6f 6e 20 70 63 78 20 69 73 20 74 68 65  ction pcx is the
7da0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68 61 74   OP_Program that
7db0: 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 73 75 62   invoked the sub
7dc0: 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20 20 20 20  -program .      
7dd0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
7de0: 6e 67 20 68 61 6c 74 65 64 2e 20 49 66 20 74 68  ng halted. If th
7df0: 65 20 70 32 20 69 6e 73 74 72 75 63 74 69 6f 6e  e p2 instruction
7e00: 20 6f 66 20 74 68 69 73 20 4f 50 5f 48 61 6c 74   of this OP_Halt
7e10: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
7e20: 63 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ction is set to 
7e30: 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20  OE_Ignore, then 
7e40: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  the sub-program 
7e50: 69 73 20 74 68 72 6f 77 69 6e 67 0a 20 20 20 20  is throwing.    
7e60: 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65    ** an IGNORE e
7e70: 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69  xception. In thi
7e80: 73 20 63 61 73 65 20 6a 75 6d 70 20 74 6f 20 74  s case jump to t
7e90: 68 65 20 61 64 64 72 65 73 73 20 73 70 65 63 69  he address speci
7ea0: 66 69 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73  fied.      ** as
7eb0: 20 74 68 65 20 70 32 20 6f 66 20 74 68 65 20 63   the p2 of the c
7ec0: 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
7ed0: 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 78  m.  */.      pcx
7ee0: 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70   = p->aOp[pcx].p
7ef0: 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  2-1;.    }.    a
7f00: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
7f10: 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b   aMem = p->aMem;
7f20: 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  .    pOp = &aOp[
7f30: 70 63 78 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b  pcx];.    break;
7f40: 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70  .  }.  p->rc = p
7f50: 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72  Op->p1;.  p->err
7f60: 6f 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70  orAction = (u8)p
7f70: 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20  Op->p2;.  p->pc 
7f80: 3d 20 70 63 78 3b 0a 20 20 61 73 73 65 72 74 28  = pcx;.  assert(
7f90: 20 70 4f 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20   pOp->p5<=4 );. 
7fa0: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
7fb0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
7fc0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
7fd0: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
7fe0: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e   azType[] = { "N
7ff0: 4f 54 20 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55  OT NULL", "UNIQU
8000: 45 22 2c 20 22 43 48 45 43 4b 22 2c 0a 20 20 20  E", "CHECK",.   
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 22 46 4f 52 45 49            "FOREI
8040: 47 4e 20 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20  GN KEY" };.     
8050: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
8060: 70 35 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74  p5==1 );.      t
8070: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35  estcase( pOp->p5
8080: 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==2 );.      tes
8090: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d  tcase( pOp->p5==
80a0: 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
80b0: 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20  ase( pOp->p5==4 
80c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
80d0: 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73  VdbeError(p, "%s
80e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
80f0: 65 64 22 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d  ed", azType[pOp-
8100: 3e 70 35 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69  >p5-1]);.      i
8110: 66 28 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a  f( pOp->p4.z ){.
8120: 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
8130: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
8140: 6e 74 66 28 64 62 2c 20 22 25 7a 3a 20 25 73 22  ntf(db, "%z: %s"
8150: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f  , p->zErrMsg, pO
8160: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20  p->p4.z);.      
8170: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
8190: 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 70 4f 70  ror(p, "%s", pOp
81a0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20  ->p4.z);.    }. 
81b0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70     sqlite3_log(p
81c0: 4f 70 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61  Op->p1, "abort a
81d0: 74 20 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73  t %d in [%s]: %s
81e0: 22 2c 20 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c  ", pcx, p->zSql,
81f0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
8200: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8210: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61  VdbeHalt(p);.  a
8220: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8230: 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
8240: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
8250: 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
8260: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8270: 42 55 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72  BUSY ){.    p->r
8280: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
82a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
82b0: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
82c0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
82d0: 54 52 41 49 4e 54 20 29 3b 0a 20 20 20 20 61 73  TRAINT );.    as
82e0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
82f0: 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65  _OK || db->nDefe
8300: 72 72 65 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62  rredCons>0 || db
8310: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
8320: 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  ns>0 );.    rc =
8330: 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f   p->rc ? SQLITE_
8340: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
8350: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  ONE;.  }.  goto 
8360: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
8370: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67  /* Opcode: Integ
8380: 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
8390: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
83a0: 5d 3d 50 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33  ]=P1.**.** The 3
83b0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  2-bit integer va
83c0: 6c 75 65 20 50 31 20 69 73 20 77 72 69 74 74 65  lue P1 is writte
83d0: 6e 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  n into register 
83e0: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  P2..*/.case OP_I
83f0: 6e 74 65 67 65 72 3a 20 7b 20 20 20 20 20 20 20  nteger: {       
8400: 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70    /* out2 */.  p
8410: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
8420: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
8430: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pOut->u.i = pOp-
8440: 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  >p1;.  break;.}.
8450: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36  ./* Opcode: Int6
8460: 34 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  4 * P2 * P4 *.**
8470: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8480: 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  =P4.**.** P4 is 
8490: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36  a pointer to a 6
84a0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
84b0: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
84c0: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
84d0: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
84e0: 73 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20  se OP_Int64: {  
84f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
8500: 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   */.  pOut = out
8510: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
8520: 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
8530: 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30 20 29  Op->p4.pI64!=0 )
8540: 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
8550: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20  *pOp->p4.pI64;. 
8560: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
8570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8580: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
8590: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20   Opcode: Real * 
85a0: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
85b0: 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a  opsis: r[P2]=P4.
85c0: 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
85d0: 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69  inter to a 64-bi
85e0: 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
85f0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65   value..** Write
8600: 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f   that value into
8610: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
8620: 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b  .case OP_Real: {
8630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
8640: 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c  ame as TK_FLOAT,
8650: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20   out2 */.  pOut 
8660: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
8670: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74  (p, pOp);.  pOut
8680: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65  ->flags = MEM_Re
8690: 61 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73  al;.  assert( !s
86a0: 71 6c 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70  qlite3IsNaN(*pOp
86b0: 2d 3e 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20  ->p4.pReal) );. 
86c0: 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f   pOut->u.r = *pO
86d0: 70 2d 3e 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62  p->p4.pReal;.  b
86e0: 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
86f0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e  /* Opcode: Strin
8700: 67 38 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a  g8 * P2 * P4 *.*
8710: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
8720: 5d 3d 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20  ]='P4'.**.** P4 
8730: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20  points to a nul 
8740: 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
8750: 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70   string. This op
8760: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72  code is transfor
8770: 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53  med .** into a S
8780: 74 72 69 6e 67 20 6f 70 63 6f 64 65 20 62 65 66  tring opcode bef
8790: 6f 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74  ore it is execut
87a0: 65 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ed for the first
87b0: 20 74 69 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a   time.  During.*
87c0: 2a 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * this transform
87d0: 61 74 69 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74  ation, the lengt
87e0: 68 20 6f 66 20 73 74 72 69 6e 67 20 50 34 20 69  h of string P4 i
87f0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 73  s computed and s
8800: 74 6f 72 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  tored.** as the 
8810: 50 31 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  P1 parameter..*/
8820: 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 38  .case OP_String8
8830: 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 73  : {         /* s
8840: 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 49 4e 47  ame as TK_STRING
8850: 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  , out2 */.  asse
8860: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30  rt( pOp->p4.z!=0
8870: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   );.  pOut = out
8880: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
8890: 4f 70 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  Op);.  pOp->opco
88a0: 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a  de = OP_String;.
88b0: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69    pOp->p1 = sqli
88c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d  te3Strlen30(pOp-
88d0: 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66  >p4.z);..#ifndef
88e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
88f0: 31 36 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e  16.  if( encodin
8900: 67 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  g!=SQLITE_UTF8 )
8910: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8920: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
8930: 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  pOut, pOp->p4.z,
8940: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
8950: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8960: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
8970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
8980: 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  c==SQLITE_TOOBIG
8990: 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
89a0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64  TE_OK!=sqlite3Vd
89b0: 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
89c0: 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29  (pOut, encoding)
89d0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
89e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
89f0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20  ->szMalloc>0 && 
8a00: 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70  pOut->zMalloc==p
8a10: 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73  Out->z );.    as
8a20: 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e  sert( VdbeMemDyn
8a30: 61 6d 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b  amic(pOut)==0 );
8a40: 0a 20 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c  .    pOut->szMal
8a50: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  loc = 0;.    pOu
8a60: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
8a70: 53 74 61 74 69 63 3b 0a 20 20 20 20 69 66 28 20  Static;.    if( 
8a80: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
8a90: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
8aa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8ab0: 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  b, pOp->p4.z);. 
8ac0: 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34     }.    pOp->p4
8ad0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
8ae0: 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  C;.    pOp->p4.z
8af0: 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20   = pOut->z;.    
8b00: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e  pOp->p1 = pOut->
8b10: 6e 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  n;.  }.  testcas
8b20: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f  e( rc==SQLITE_TO
8b30: 4f 42 49 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20  OBIG );.#endif. 
8b40: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d   if( pOp->p1>db-
8b50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8b60: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  IMIT_LENGTH] ){.
8b70: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
8b80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8b90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
8ba0: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
8bb0: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
8bc0: 61 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a  ase, OP_String *
8bd0: 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65  /.}.  ./* Opcode
8be0: 3a 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 50  : String P1 P2 P
8bf0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
8c00: 73 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20  sis: r[P2]='P4' 
8c10: 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54  (len=P1).**.** T
8c20: 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
8c30: 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31 20  P4 of length P1 
8c40: 28 62 79 74 65 73 29 20 69 73 20 73 74 6f 72 65  (bytes) is store
8c50: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
8c60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73  ..**.** If P3 is
8c70: 20 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 74 68   not zero and th
8c80: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
8c90: 69 73 74 65 72 20 50 33 20 69 73 20 65 71 75 61  ister P3 is equa
8ca0: 6c 20 74 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a  l to P5, then.**
8cb0: 20 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66   the datatype of
8cc0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 50 32   the register P2
8cd0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
8ce0: 20 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74   BLOB.  The cont
8cf0: 65 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20 73 61  ent is.** the sa
8d00: 6d 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  me sequence of b
8d10: 79 74 65 73 2c 20 69 74 20 69 73 20 6d 65 72 65  ytes, it is mere
8d20: 6c 79 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ly interpreted a
8d30: 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64  s a BLOB instead
8d40: 0a 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e 67 2c  .** of a string,
8d50: 20 61 73 20 69 66 20 69 74 20 68 61 64 20 62 65   as if it had be
8d60: 65 6e 20 43 41 53 54 2e 20 20 49 6e 20 6f 74 68  en CAST.  In oth
8d70: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
8d80: 69 66 28 20 50 33 21 3d 30 20 61 6e 64 20 72 65  if( P3!=0 and re
8d90: 67 5b 50 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b  g[P3]==P5 ) reg[
8da0: 50 32 5d 20 3a 3d 20 43 41 53 54 28 72 65 67 5b  P2] := CAST(reg[
8db0: 50 32 5d 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a  P2] as BLOB).*/.
8dc0: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20  case OP_String: 
8dd0: 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
8de0: 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t2 */.  assert( 
8df0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a  pOp->p4.z!=0 );.
8e00: 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
8e10: 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
8e20: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
8e30: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
8e40: 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
8e50: 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70  pOut->z = pOp->p
8e60: 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  4.z;.  pOut->n =
8e70: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74   pOp->p1;.  pOut
8e80: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
8e90: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
8ea0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23  LOBSIZE(pOut);.#
8eb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
8ec0: 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
8ed0: 42 4c 4f 42 53 0a 20 20 69 66 28 20 70 4f 70 2d  BLOBS.  if( pOp-
8ee0: 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  >p3>0 ){.    ass
8ef0: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  ert( pOp->p3<=(p
8f00: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
8f10: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49  ursor) );.    pI
8f20: 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
8f30: 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p3];.    assert(
8f40: 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn3->flags & M
8f50: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 69 66  EM_Int );.    if
8f60: 28 20 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70  ( pIn3->u.i==pOp
8f70: 2d 3e 70 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61  ->p5 ) pOut->fla
8f80: 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45  gs = MEM_Blob|ME
8f90: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72  M_Static|MEM_Ter
8fa0: 6d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  m;.  }.#endif.  
8fb0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
8fc0: 6f 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20  ode: Null P1 P2 
8fd0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
8fe0: 69 73 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55  is: r[P2..P3]=NU
8ff0: 4c 4c 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  LL.**.** Write a
9000: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
9010: 74 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20  ters P2.  If P3 
9020: 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c  greater than P2,
9030: 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65   then also write
9040: 0a 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65  .** NULL into re
9050: 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76  gister P3 and ev
9060: 65 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  ery register in 
9070: 62 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50  between P2 and P
9080: 33 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20  3.  If P3.** is 
9090: 6c 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79  less than P2 (ty
90a0: 70 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65  pically P3 is ze
90b0: 72 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65  ro) then only re
90c0: 67 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20  gister P2 is.** 
90d0: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
90e0: 2a 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c  ** If the P1 val
90f0: 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
9100: 74 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68  then also set th
9110: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c  e MEM_Cleared fl
9120: 61 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55  ag so that.** NU
9130: 4c 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e  LL values will n
9140: 6f 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  ot compare equal
9150: 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f   even if SQLITE_
9160: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e  NULLEQ is set on
9170: 0a 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f  .** OP_Ne or OP_
9180: 45 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  Eq..*/.case OP_N
9190: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
91a0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e   /* out2 */.  in
91b0: 74 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c  t cnt;.  u16 nul
91c0: 6c 46 6c 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20  lFlag;.  pOut = 
91d0: 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
91e0: 2c 20 70 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20  , pOp);.  cnt = 
91f0: 70 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b  pOp->p3-pOp->p2;
9200: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
9210: 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
9220: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
9230: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
9240: 6e 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e  nullFlag = pOp->
9250: 70 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d  p1 ? (MEM_Null|M
9260: 45 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45  EM_Cleared) : ME
9270: 4d 5f 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e  M_Null;.  pOut->
9280: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
9290: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75  cnt>0 ){.    pOu
92a0: 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  t++;.    memAbou
92b0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
92c0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
92d0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
92e0: 75 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ut);.    pOut->f
92f0: 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b  lags = nullFlag;
9300: 0a 20 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30  .    pOut->n = 0
9310: 3b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d  ;.    cnt--;.  }
9320: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9330: 4f 70 63 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c  Opcode: SoftNull
9340: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53   P1 * * * *.** S
9350: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e  ynopsis: r[P1]=N
9360: 55 4c 4c 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65  ULL.**.** Set re
9370: 67 69 73 74 65 72 20 50 31 20 74 6f 20 68 61 76  gister P1 to hav
9380: 65 20 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c  e the value NULL
9390: 20 61 73 20 73 65 65 6e 20 62 79 20 74 68 65 20   as seen by the 
93a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a  OP_MakeRecord.**
93b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 62 75   instruction, bu
93c0: 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e  t do not free an
93d0: 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  y string or blob
93e0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
93f0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72  ed with.** the r
9400: 65 67 69 73 74 65 72 2c 20 73 6f 20 74 68 61 74  egister, so that
9410: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 77 61   if the value wa
9420: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
9430: 6f 62 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70  ob that was.** p
9440: 72 65 76 69 6f 75 73 6c 79 20 63 6f 70 69 65 64  reviously copied
9450: 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c   using OP_SCopy,
9460: 20 74 68 65 20 63 6f 70 69 65 73 20 77 69 6c 6c   the copies will
9470: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 20   continue to be 
9480: 76 61 6c 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  valid..*/.case O
9490: 50 5f 53 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20  P_SoftNull: {.  
94a0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
94b0: 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70  0 && pOp->p1<=(p
94c0: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
94d0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74  ursor) );.  pOut
94e0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
94f0: 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ];.  pOut->flags
9500: 20 3d 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 26   = (pOut->flags&
9510: 7e 28 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 7c  ~(MEM_Undefined|
9520: 4d 45 4d 5f 41 66 66 4d 61 73 6b 29 29 7c 4d 45  MEM_AffMask))|ME
9530: 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b  M_Null;.  break;
9540: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .}../* Opcode: B
9550: 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20 2a  lob P1 P2 * P4 *
9560: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
9570: 50 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a  P2]=P4 (len=P1).
9580: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20  **.** P4 points 
9590: 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  to a blob of dat
95a0: 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e  a P1 bytes long.
95b0: 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20    Store this.** 
95c0: 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
95d0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
95e0: 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20  Blob: {         
95f0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9600: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
9610: 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  >p1 <= SQLITE_MA
9620: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f  X_LENGTH );.  pO
9630: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
9640: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73  ase(p, pOp);.  s
9650: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
9660: 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70  Str(pOut, pOp->p
9670: 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c  4.z, pOp->p1, 0,
9680: 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63   0);.  pOut->enc
9690: 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55   = encoding;.  U
96a0: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
96b0: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
96c0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
96d0: 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32 20   Variable P1 P2 
96e0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
96f0: 69 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65  is: r[P2]=parame
9700: 74 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a  ter(P1,P4).**.**
9710: 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76 61   Transfer the va
9720: 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70 61  lues of bound pa
9730: 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f 20  rameter P1 into 
9740: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a  register P2.**.*
9750: 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
9760: 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65  er is named, the
9770: 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61  n its name appea
9780: 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65  rs in P4..** The
9790: 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73 65   P4 value is use
97a0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69 6e  d by sqlite3_bin
97b0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
97c0: 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ()..*/.case OP_V
97d0: 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20 20  ariable: {      
97e0: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
97f0: 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20  .  Mem *pVar;   
9800: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65 69      /* Value bei
9810: 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64 20 2a  ng transferred *
9820: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
9830: 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
9840: 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20  1<=p->nVar );.  
9850: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
9860: 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  z==0 || pOp->p4.
9870: 7a 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  z==sqlite3VListN
9880: 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69  umToName(p->pVLi
9890: 73 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  st,pOp->p1) );. 
98a0: 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 72   pVar = &p->aVar
98b0: 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20  [pOp->p1 - 1];. 
98c0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
98d0: 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 20  MemTooBig(pVar) 
98e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
98f0: 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20  big;.  }.  pOut 
9900: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
9910: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
9920: 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f  emShallowCopy(pO
9930: 75 74 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74  ut, pVar, MEM_St
9940: 61 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f  atic);.  UPDATE_
9950: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
9960: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
9970: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20  /* Opcode: Move 
9980: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
9990: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40 50  Synopsis: r[P2@P
99a0: 33 5d 3d 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a  3]=r[P1@P3].**.*
99b0: 2a 20 4d 6f 76 65 20 74 68 65 20 50 33 20 76 61  * Move the P3 va
99c0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
99d0: 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65   P1..P1+P3-1 ove
99e0: 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  r into.** regist
99f0: 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e  ers P2..P2+P3-1.
9a00: 20 20 52 65 67 69 73 74 65 72 73 20 50 31 2e 2e    Registers P1..
9a10: 50 31 2b 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c  P1+P3-1 are.** l
9a20: 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55  eft holding a NU
9a30: 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  LL.  It is an er
9a40: 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65 72  ror for register
9a50: 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50   ranges.** P1..P
9a60: 31 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50  1+P3-1 and P2..P
9a70: 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61  2+P3-1 to overla
9a80: 70 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72  p.  It is an err
9a90: 6f 72 0a 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20  or.** for P3 to 
9aa0: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a  be less than 1..
9ab0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a  */.case OP_Move:
9ac0: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
9ad0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9ae0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 6c 65 66  of registers lef
9af0: 74 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  t to copy */.  i
9b00: 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
9b10: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63  /* Register to c
9b20: 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  opy from */.  in
9b30: 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f  t p2;          /
9b40: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f  * Register to co
9b50: 70 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20  py to */..  n = 
9b60: 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20  pOp->p3;.  p1 = 
9b70: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20  pOp->p1;.  p2 = 
9b80: 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
9b90: 74 28 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26  t( n>0 && p1>0 &
9ba0: 26 20 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65  & p2>0 );.  asse
9bb0: 72 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20  rt( p1+n<=p2 || 
9bc0: 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70  p2+n<=p1 );..  p
9bd0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b  In1 = &aMem[p1];
9be0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
9bf0: 70 32 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61  p2];.  do{.    a
9c00: 73 73 65 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d  ssert( pOut<=&aM
9c10: 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  em[(p->nMem+1 - 
9c20: 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a  p->nCursor)] );.
9c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31      assert( pIn1
9c40: 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d  <=&aMem[(p->nMem
9c50: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
9c60: 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
9c70: 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
9c80: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  ) );.    memAbou
9c90: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
9ca0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
9cb0: 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c  dbeMemMove(pOut,
9cc0: 20 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 20 53   pIn1);.#ifdef S
9cd0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
9ce0: 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  if( pOut->pScopy
9cf0: 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20  From>=&aMem[p1] 
9d00: 26 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46  && pOut->pScopyF
9d10: 72 6f 6d 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20  rom<pOut ){.    
9d20: 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72    pOut->pScopyFr
9d30: 6f 6d 20 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20  om += pOp->p2 - 
9d40: 70 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  p1;.    }.#endif
9d50: 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
9d60: 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 20 20 52  ize(pOut);.    R
9d70: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32  EGISTER_TRACE(p2
9d80: 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 70  ++, pOut);.    p
9d90: 49 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b  In1++;.    pOut+
9da0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e  +;.  }while( --n
9db0: 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   );.  break;.}..
9dc0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20  /* Opcode: Copy 
9dd0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
9de0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40 50  Synopsis: r[P2@P
9df0: 33 2b 31 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a  3+1]=r[P1@P3+1].
9e00: 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70  **.** Make a cop
9e10: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 50  y of registers P
9e20: 31 2e 2e 50 31 2b 50 33 20 69 6e 74 6f 20 72 65  1..P1+P3 into re
9e30: 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50  gisters P2..P2+P
9e40: 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  3..**.** This in
9e50: 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20  struction makes 
9e60: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
9e70: 68 65 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70  he value.  A dup
9e80: 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64  licate.** is mad
9e90: 65 20 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20  e of any string 
9ea0: 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74  or blob constant
9eb0: 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53  .  See also OP_S
9ec0: 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Copy..*/.case OP
9ed0: 5f 43 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e  _Copy: {.  int n
9ee0: 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33  ;..  n = pOp->p3
9ef0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
9f00: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
9f10: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
9f20: 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
9f30: 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68  ut!=pIn1 );.  wh
9f40: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 73 71  ile( 1 ){.    sq
9f50: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
9f60: 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49  lowCopy(pOut, pI
9f70: 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  n1, MEM_Ephem);.
9f80: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
9f90: 7a 65 28 70 4f 75 74 29 3b 0a 23 69 66 64 65 66  ze(pOut);.#ifdef
9fa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9fb0: 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72    pOut->pScopyFr
9fc0: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
9fd0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
9fe0: 45 28 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  E(pOp->p2+pOp->p
9ff0: 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  3-n, pOut);.    
a000: 69 66 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62  if( (n--)==0 ) b
a010: 72 65 61 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b  reak;.    pOut++
a020: 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20  ;.    pIn1++;.  
a030: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
a040: 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79 20 50   Opcode: SCopy P
a050: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
a060: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b  nopsis: r[P2]=r[
a070: 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61  P1].**.** Make a
a080: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66   shallow copy of
a090: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74   register P1 int
a0a0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
a0b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
a0c0: 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68  ction makes a sh
a0d0: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
a0e0: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  e value.  If the
a0f0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73   value.** is a s
a100: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74  tring or blob, t
a110: 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73 20  hen the copy is 
a120: 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  only a pointer t
a130: 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  o the.** origina
a140: 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20 74  l and hence if t
a150: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e  he original chan
a160: 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65 20  ges so will the 
a170: 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20  copy..** Worse, 
a180: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
a190: 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20  is deallocated, 
a1a0: 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65 73  the copy becomes
a1b0: 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75   invalid..** Thu
a1c0: 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75  s the program mu
a1d0: 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
a1e0: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 77  t the original w
a1f0: 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a  ill not change.*
a200: 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  * during the lif
a210: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 70  etime of the cop
a220: 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79 20  y.  Use OP_Copy 
a230: 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65  to make a comple
a240: 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63  te.** copy..*/.c
a250: 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20  ase OP_SCopy: { 
a260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a270: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
a280: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a290: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
a2a0: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
a2b0: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
a2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a2d0: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
a2e0: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
a2f0: 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m);.#ifdef SQLIT
a300: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
a310: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d  ut->pScopyFrom==
a320: 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  0 ) pOut->pScopy
a330: 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e  From = pIn1;.#en
a340: 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  dif.  break;.}..
a350: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f  /* Opcode: IntCo
a360: 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  py P1 P2 * * *.*
a370: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
a380: 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72  ]=r[P1].**.** Tr
a390: 61 6e 73 66 65 72 20 74 68 65 20 69 6e 74 65 67  ansfer the integ
a3a0: 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e  er value held in
a3b0: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74   register P1 int
a3c0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
a3d0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
a3e0: 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
a3f0: 6e 20 6f 66 20 53 43 6f 70 79 20 74 68 61 74 20  n of SCopy that 
a400: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69  works only for i
a410: 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73  nteger.** values
a420: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74  ..*/.case OP_Int
a430: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
a440: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a450: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
a460: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
a470: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
a480: 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
a490: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
a4a0: 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
a4b0: 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
a4c0: 28 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69  (pOut, pIn1->u.i
a4d0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
a4e0: 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c 74  * Opcode: Result
a4f0: 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Row P1 P2 * * *.
a500: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74  ** Synopsis: out
a510: 70 75 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a  put=r[P1@P2].**.
a520: 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 73  ** The registers
a530: 20 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b 50   P1 through P1+P
a540: 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73 69  2-1 contain a si
a550: 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72  ngle row of.** r
a560: 65 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70 63  esults. This opc
a570: 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 20 73  ode causes the s
a580: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
a590: 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a  ll to terminate.
a5a0: 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ** with an SQLIT
a5b0: 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f 64  E_ROW return cod
a5c0: 65 20 61 6e 64 20 69 74 20 73 65 74 73 20 75 70  e and it sets up
a5d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d   the sqlite3_stm
a5e0: 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  t.** structure t
a5f0: 6f 20 70 72 6f 76 69 64 65 20 61 63 63 65 73 73  o provide access
a600: 20 74 6f 20 74 68 65 20 72 28 50 31 29 2e 2e 72   to the r(P1)..r
a610: 28 50 31 2b 50 32 2d 31 29 20 76 61 6c 75 65 73  (P1+P2-1) values
a620: 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   as.** the resul
a630: 74 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f  t row..*/.case O
a640: 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20  P_ResultRow: {. 
a650: 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
a660: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
a670: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f  ->nResColumn==pO
a680: 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72  p->p2 );.  asser
a690: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a  t( pOp->p1>0 );.
a6a0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
a6b0: 31 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  1+pOp->p2<=(p->n
a6c0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
a6d0: 6f 72 29 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65  or)+1 );..#ifnde
a6e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
a6f0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
a700: 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f    /* Run the pro
a710: 67 72 65 73 73 20 63 6f 75 6e 74 65 72 20 6a 75  gress counter ju
a720: 73 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  st before return
a730: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ing..  */.  if( 
a740: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30  db->xProgress!=0
a750: 0a 20 20 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d  .   && nVmStep>=
a760: 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 0a  nProgressLimit .
a770: 20 20 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72     && db->xProgr
a780: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
a790: 73 41 72 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20  sArg)!=0.  ){.  
a7a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
a7b0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74  TERRUPT;.    got
a7c0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
a7d0: 72 72 6f 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rror;.  }.#endif
a7e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73  ..  /* If this s
a7f0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f  tatement has vio
a800: 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20  lated immediate 
a810: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a820: 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a  traints, do.  **
a830: 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20   not return the 
a840: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
a850: 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20  odified. And do 
a860: 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20  not RELEASE the 
a870: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
a880: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e  ransaction. It n
a890: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
a8a0: 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66  d back.  */.  if
a8b0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
a8c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
a8d0: 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a  eckFk(p, 0)) ){.
a8e0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
a8f0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
a900: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73  ntRows );.    as
a910: 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d  sert( p->usesStm
a920: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  tJournal );.    
a930: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
a940: 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
a950: 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
a960: 5f 43 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20  _CountRows flag 
a970: 69 73 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65  is set in sqlite
a980: 33 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68  3.flags mask, th
a990: 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61  en .  ** DML sta
a9a0: 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74  tements invoke t
a9b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65  his opcode to re
a9c0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
a9d0: 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f  of rows .  ** mo
a9e0: 64 69 66 69 65 64 20 74 6f 20 74 68 65 20 75 73  dified to the us
a9f0: 65 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  er. This is the 
aa00: 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 61 20  only way that a 
aa10: 56 4d 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65  VM that.  ** ope
aa20: 6e 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ns a statement t
aa30: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69  ransaction may i
aa40: 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64  nvoke this opcod
aa50: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
aa60: 63 61 73 65 20 74 68 69 73 20 69 73 20 73 75 63  case this is suc
aa70: 68 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63  h a statement, c
aa80: 6c 6f 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65  lose any stateme
aa90: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
aaa0: 20 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68   ** opened by th
aab0: 69 73 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74  is VM before ret
aac0: 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74  urning control t
aad0: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
aae0: 20 69 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75   is to.  ** ensu
aaf0: 72 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  re that statemen
ab00: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  t-transactions a
ab10: 72 65 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64  re always nested
ab20: 2c 20 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e  , not overlappin
ab30: 67 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  g..  ** If the o
ab40: 70 65 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  pen statement-tr
ab50: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
ab60: 20 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68   closed here, th
ab70: 65 6e 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a  en the user.  **
ab80: 20 6d 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65   may step anothe
ab90: 72 20 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20  r VM that opens 
aba0: 69 74 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e  its own statemen
abb0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  t transaction. T
abc0: 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61  his.  ** may lea
abd0: 64 20 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67  d to overlapping
abe0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
abf0: 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  actions..  **.  
ac00: 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  ** The statement
ac10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ac20: 6e 65 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65  never a top-leve
ac30: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  l transaction.  
ac40: 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52  Hence.  ** the R
ac50: 45 4c 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f  ELEASE call belo
ac60: 77 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  w can never fail
ac70: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ac80: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
ac90: 30 20 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53  0 || db->flags&S
aca0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
acb0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
acc0: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
acd0: 65 6e 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54  ent(p, SAVEPOINT
ace0: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73  _RELEASE);.  ass
acf0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
ad00: 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61  OK );..  /* Inva
ad10: 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d  lidate all ephem
ad20: 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20  eral cursor row 
ad30: 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63  caches */.  p->c
ad40: 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61  acheCtr = (p->ca
ad50: 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a  cheCtr + 2)|1;..
ad60: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ad70: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ad80: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72  e current row ar
ad90: 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  e \000 terminate
ada0: 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20  d.  ** and have 
adb0: 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65  an assigned type
adc0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
add0: 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69  re de-ephemerali
ade0: 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69  zed as.  ** a si
adf0: 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a  de effect..  */.
ae00: 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73    pMem = p->pRes
ae10: 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70  ultSet = &aMem[p
ae20: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
ae30: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
ae40: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
ae50: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65   memIsValid(&pMe
ae60: 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65  m[i]) );.    Dee
ae70: 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65  phemeralize(&pMe
ae80: 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  m[i]);.    asser
ae90: 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67  t( (pMem[i].flag
aea0: 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d  s & MEM_Ephem)==
aeb0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
aec0: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
aed0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
aee0: 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  lob))==0 );.    
aef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
af00: 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d  lTerminate(&pMem
af10: 5b 69 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54  [i]);.    REGIST
af20: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
af30: 2b 69 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  +i, &pMem[i]);. 
af40: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
af50: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
af60: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20   no_mem;..  if( 
af70: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
af80: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b  ITE_TRACE_ROW ){
af90: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
afa0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
afb0: 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c  , db->pTraceArg,
afc0: 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   p, 0);.  }..  /
afd0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
afe0: 52 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63  ROW.  */.  p->pc
aff0: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
b000: 4f 70 29 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20  Op) + 1;.  rc = 
b010: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f  SQLITE_ROW;.  go
b020: 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
b030: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
b040: 6e 63 61 74 20 50 31 20 50 32 20 50 33 20 2a 20  ncat P1 P2 P3 * 
b050: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
b060: 5b 50 33 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d  [P3]=r[P2]+r[P1]
b070: 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  .**.** Add the t
b080: 65 78 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ext in register 
b090: 50 31 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  P1 onto the end 
b0a0: 6f 66 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a  of the text in.*
b0b0: 2a 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  * register P2 an
b0c0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
b0d0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b0e0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b0f0: 74 68 65 20 50 31 20 6f 72 20 50 32 20 74 65 78  the P1 or P2 tex
b100: 74 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20  t are NULL then 
b110: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33  store NULL in P3
b120: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50  ..**.**   P3 = P
b130: 32 20 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74  2 || P1.**.** It
b140: 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   is illegal for 
b150: 50 31 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20  P1 and P3 to be 
b160: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
b170: 72 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a  r. Sometimes,.**
b180: 20 69 66 20 50 33 20 69 73 20 74 68 65 20 73 61   if P3 is the sa
b190: 6d 65 20 72 65 67 69 73 74 65 72 20 61 73 20 50  me register as P
b1a0: 32 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  2, the implement
b1b0: 61 74 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a  ation is able.**
b1c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63   to avoid a memc
b1d0: 70 79 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  py()..*/.case OP
b1e0: 5f 43 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20  _Concat: {      
b1f0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
b200: 54 4b 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20  TK_CONCAT, in1, 
b210: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
b220: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e  64 nByte;..  pIn
b230: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
b240: 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1];.  pIn2 = &aM
b250: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70  em[pOp->p2];.  p
b260: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
b270: 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
b280: 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20  pIn1!=pOut );.  
b290: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
b2a0: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
b2b0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
b2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b2d0: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
b2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b2f0: 69 66 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  if( ExpandBlob(p
b300: 49 6e 31 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c  In1) || ExpandBl
b310: 6f 62 28 70 49 6e 32 29 20 29 20 67 6f 74 6f 20  ob(pIn2) ) goto 
b320: 6e 6f 5f 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67  no_mem;.  String
b330: 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ify(pIn1, encodi
b340: 6e 67 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  ng);.  Stringify
b350: 28 70 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn2, encoding)
b360: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31  ;.  nByte = pIn1
b370: 2d 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20  ->n + pIn2->n;. 
b380: 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61   if( nByte>db->a
b390: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
b3a0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
b3b0: 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
b3c0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b3d0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
b3e0: 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c  t, (int)nByte+2,
b3f0: 20 70 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a   pOut==pIn2) ){.
b400: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
b410: 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70  .  }.  MemSetTyp
b420: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
b430: 53 74 72 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  Str);.  if( pOut
b440: 21 3d 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65  !=pIn2 ){.    me
b450: 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49  mcpy(pOut->z, pI
b460: 6e 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b  n2->z, pIn2->n);
b470: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
b480: 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c  Out->z[pIn2->n],
b490: 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e   pIn1->z, pIn1->
b4a0: 6e 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42  n);.  pOut->z[nB
b4b0: 79 74 65 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e  yte]=0;.  pOut->
b4c0: 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a  z[nByte+1] = 0;.
b4d0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
b4e0: 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75   MEM_Term;.  pOu
b4f0: 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74  t->n = (int)nByt
b500: 65 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  e;.  pOut->enc =
b510: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
b520: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
b530: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
b540: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
b550: 64 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  dd P1 P2 P3 * *.
b560: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b570: 33 5d 3d 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a  3]=r[P1]+r[P2].*
b580: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c  *.** Add the val
b590: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b5a0: 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
b5b0: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b5c0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b5d0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b5e0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b5f0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b600: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b610: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b620: 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20  de: Multiply P1 
b630: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b640: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b650: 31 5d 2a 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a  1]*r[P2].**.**.*
b660: 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20 76  * Multiply the v
b670: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b680: 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65   P1 by the value
b690: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
b6a0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
b6b0: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b6c0: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b6d0: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b6e0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b6f0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
b700: 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20 50  code: Subtract P
b710: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b720: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b730: 5b 50 32 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P2]-r[P1].**.**
b740: 20 53 75 62 74 72 61 63 74 20 74 68 65 20 76 61   Subtract the va
b750: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b760: 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75  P1 from the valu
b770: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b780: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
b790: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b7a0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b7b0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither 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 44 69 76 69 64 65 20 50 31  pcode: Divide P1
b7f0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
b800: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
b810: 50 32 5d 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P2]/r[P1].**.** 
b820: 44 69 76 69 64 65 20 74 68 65 20 76 61 6c 75 65  Divide the value
b830: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b840: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
b850: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
b860: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b870: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b880: 50 33 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49  P3 (P3=P2/P1). I
b890: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a  f the value in .
b8a0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 69  ** register P1 i
b8b0: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
b8c0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b8d0: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b8e0: 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   is .** NULL, th
b8f0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b900: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b910: 52 65 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20  Remainder P1 P2 
b920: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b930: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25  is: r[P3]=r[P2]%
b940: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
b950: 75 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ute the remainde
b960: 72 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20  r after integer 
b970: 72 65 67 69 73 74 65 72 20 50 32 20 69 73 20 64  register P2 is d
b980: 69 76 69 64 65 64 20 62 79 20 0a 2a 2a 20 72 65  ivided by .** re
b990: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 73 74  gister P1 and st
b9a0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b9b0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 0a  n register P3. .
b9c0: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
b9d0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
b9e0: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
b9f0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
ba00: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
ba10: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
ba20: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
ba30: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba50: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
ba60: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
ba70: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
ba80: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
ba90: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
baa0: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
bab0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
bac0: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
bad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
bae0: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
baf0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
bb00: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb20: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
bb30: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
bb40: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
bb50: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
bb60: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
bb70: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
bb80: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 63 68 61 72  , out3 */.  char
bb90: 20 62 49 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53   bIntint;   /* S
bba0: 74 61 72 74 65 64 20 6f 75 74 20 61 73 20 74 77  tarted out as tw
bbb0: 6f 20 69 6e 74 65 67 65 72 20 6f 70 65 72 61 6e  o integer operan
bbc0: 64 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  ds */.  u16 flag
bbd0: 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  s;      /* Combi
bbe0: 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20  ned MEM_* flags 
bbf0: 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73  from both inputs
bc00: 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 31 3b   */.  u16 type1;
bc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63        /* Numeric
bc20: 20 74 79 70 65 20 6f 66 20 6c 65 66 74 20 6f 70   type of left op
bc30: 65 72 61 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74  erand */.  u16 t
bc40: 79 70 65 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ype2;      /* Nu
bc50: 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 72 69  meric type of ri
bc60: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
bc70: 20 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20   i64 iA;        
bc80: 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
bc90: 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e  e of left operan
bca0: 64 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20  d */.  i64 iB;  
bcb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
bcc0: 72 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  r value of right
bcd0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
bce0: 75 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a  uble rA;      /*
bcf0: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c   Real value of l
bd00: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
bd10: 20 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20   double rB;     
bd20: 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f   /* Real value o
bd30: 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  f right operand 
bd40: 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  */..  pIn1 = &aM
bd50: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74  em[pOp->p1];.  t
bd60: 79 70 65 31 20 3d 20 6e 75 6d 65 72 69 63 54 79  ype1 = numericTy
bd70: 70 65 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  pe(pIn1);.  pIn2
bd80: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
bd90: 5d 3b 0a 20 20 74 79 70 65 32 20 3d 20 6e 75 6d  ];.  type2 = num
bda0: 65 72 69 63 54 79 70 65 28 70 49 6e 32 29 3b 0a  ericType(pIn2);.
bdb0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
bdc0: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
bdd0: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c   = pIn1->flags |
bde0: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn2->flags;.  
bdf0: 69 66 28 20 28 74 79 70 65 31 20 26 20 74 79 70  if( (type1 & typ
be00: 65 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  e2 & MEM_Int)!=0
be10: 20 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e   ){.    iA = pIn
be20: 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d  1->u.i;.    iB =
be30: 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn2->u.i;.    
be40: 62 49 6e 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20  bIntint = 1;.   
be50: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
be60: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
be70: 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20  se OP_Add:      
be80: 20 69 66 28 20 73 71 6c 69 74 65 33 41 64 64 49   if( sqlite3AddI
be90: 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67  nt64(&iB,iA) ) g
bea0: 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72  oto fp_math;  br
beb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bec0: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66  OP_Subtract:  if
bed0: 28 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36  ( sqlite3SubInt6
bee0: 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f  4(&iB,iA) ) goto
bef0: 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b   fp_math;  break
bf00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
bf10: 4d 75 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73  Multiply:  if( s
bf20: 71 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26  qlite3MulInt64(&
bf30: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
bf40: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
bf50: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76       case OP_Div
bf60: 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ide: {.        i
bf70: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
bf80: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
bf90: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
bfa0: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26     if( iA==-1 &&
bfb0: 20 69 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e   iB==SMALLEST_IN
bfc0: 54 36 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  T64 ) goto fp_ma
bfd0: 74 68 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f  th;.        iB /
bfe0: 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = iA;.        br
bff0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c000: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
c010: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20        if( iA==0 
c020: 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69  ) goto arithmeti
c030: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  ;.        if( iA
c050: 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20  ==-1 ) iA = 1;. 
c060: 20 20 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b         iB %= iA;
c070: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c090: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42    pOut->u.i = iB
c0a0: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
c0b0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
c0c0: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  nt);.  }else if(
c0d0: 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75   (flags & MEM_Nu
c0e0: 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ll)!=0 ){.    go
c0f0: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c100: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c110: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 49 6e 74 69  }else{.    bInti
c120: 6e 74 20 3d 20 30 3b 0a 66 70 5f 6d 61 74 68 3a  nt = 0;.fp_math:
c130: 0a 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65  .    rA = sqlite
c140: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
c150: 49 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73  In1);.    rB = s
c160: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
c170: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73  lue(pIn2);.    s
c180: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
c190: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
c1a0: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20   OP_Add:        
c1b0: 20 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20   rB += rA;      
c1c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c1d0: 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20  se OP_Subtract: 
c1e0: 20 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20     rB -= rA;    
c1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c200: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
c210: 3a 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20  :    rB *= rA;  
c220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c230: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
c240: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28  : {.        /* (
c250: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
c260: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
c270: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
c280: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
c290: 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29   rA==(double)0 )
c2a0: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
c2b0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
c2c0: 0a 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72  .        rB /= r
c2d0: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
c2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c2f0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c300: 20 20 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b     iA = (i64)rA;
c310: 0a 20 20 20 20 20 20 20 20 69 42 20 3d 20 28 69  .        iB = (i
c320: 36 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69  64)rB;.        i
c330: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
c340: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
c350: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
c360: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20     if( iA==-1 ) 
c370: 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  iA = 1;.        
c380: 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42  rB = (double)(iB
c390: 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20   % iA);.        
c3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c3b0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
c3c0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
c3d0: 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d  _POINT.    pOut-
c3e0: 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d  >u.i = rB;.    M
c3f0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
c400: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65  ut, MEM_Int);.#e
c410: 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69  lse.    if( sqli
c420: 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a  te3IsNaN(rB) ){.
c430: 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68        goto arith
c440: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c450: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
c460: 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72 42 3b 0a  pOut->u.r = rB;.
c470: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c480: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61  ag(pOut, MEM_Rea
c490: 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 28 74 79  l);.    if( ((ty
c4a0: 70 65 31 7c 74 79 70 65 32 29 26 4d 45 4d 5f 52  pe1|type2)&MEM_R
c4b0: 65 61 6c 29 3d 3d 30 20 26 26 20 21 62 49 6e 74  eal)==0 && !bInt
c4c0: 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  int ){.      sql
c4d0: 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41  ite3VdbeIntegerA
c4e0: 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a 20  ffinity(pOut);. 
c4f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
c500: 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d    break;..arithm
c510: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
c520: 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 64  ull:.  sqlite3Vd
c530: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
c540: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
c550: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53  /* Opcode: CollS
c560: 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a  eq P1 * * P4.**.
c570: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
c580: 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20  er to a CollSeq 
c590: 6f 62 6a 65 63 74 2e 20 49 66 20 74 68 65 20 6e  object. If the n
c5a0: 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 75 73  ext call to a us
c5b0: 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f  er function.** o
c5c0: 72 20 61 67 67 72 65 67 61 74 65 20 63 61 6c 6c  r aggregate call
c5d0: 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  s sqlite3GetFunc
c5e0: 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 73 20  CollSeq(), this 
c5f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c600: 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  ce will.** be re
c610: 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20  turned. This is 
c620: 75 73 65 64 20 62 79 20 74 68 65 20 62 75 69 6c  used by the buil
c630: 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28  t-in min(), max(
c640: 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a  ) and nullif().*
c650: 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  * functions..**.
c660: 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74 20  ** If P1 is not 
c670: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
c680: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
c690: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d 69   a subsequent mi
c6a0: 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 29 20  n() or.** max() 
c6b0: 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20 73  aggregate will s
c6c0: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 63  et to 1 if the c
c6d0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 6e 6f  urrent row is no
c6e0: 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  t the minimum or
c6f0: 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 54 68  .** maximum.  Th
c700: 65 20 50 31 20 72 65 67 69 73 74 65 72 20 69 73  e P1 register is
c710: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
c720: 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  0 by this instru
c730: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
c740: 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20   interface used 
c750: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
c760: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f  ation of the afo
c770: 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63  rementioned func
c780: 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72  tions.** to retr
c790: 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  ieve the collati
c7a0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74 20  on sequence set 
c7b0: 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  by this opcode i
c7c0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  s not available.
c7d0: 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20 20 4f 6e  ** publicly.  On
c7e0: 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ly built-in func
c7f0: 74 69 6f 6e 73 20 68 61 76 65 20 61 63 63 65 73  tions have acces
c800: 73 20 74 6f 20 74 68 69 73 20 66 65 61 74 75 72  s to this featur
c810: 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  e..*/.case OP_Co
c820: 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72  llSeq: {.  asser
c830: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
c840: 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  P4_COLLSEQ );.  
c850: 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
c860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
c870: 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b  mSetInt64(&aMem[
c880: 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20  pOp->p1], 0);.  
c890: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
c8a0: 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e 64 20   Opcode: BitAnd 
c8b0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
c8c0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
c8d0: 72 5b 50 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]&r[P2].**.*
c8e0: 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77  * Take the bit-w
c8f0: 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76  ise AND of the v
c900: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
c910: 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  r P1 and P2 and.
c920: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
c930: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
c940: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
c950: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
c960: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
c970: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
c980: 3a 20 42 69 74 4f 72 20 50 31 20 50 32 20 50 33  : BitOr P1 P2 P3
c990: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
c9a0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b  : r[P3]=r[P1]|r[
c9b0: 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  P2].**.** Take t
c9c0: 68 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f  he bit-wise OR o
c9d0: 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
c9e0: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
c9f0: 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
ca00: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
ca10: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
ca20: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
ca30: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
ca40: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
ca50: 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65   Opcode: ShiftLe
ca60: 66 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ft P1 P2 P3 * *.
ca70: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
ca80: 33 5d 3d 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a  3]=r[P2]<<r[P1].
ca90: 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20  **.** Shift the 
caa0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e  integer value in
cab0: 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20   register P2 to 
cac0: 74 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a  the left by the.
cad0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
cae0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
caf0: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
cb00: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
cb10: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
cb20: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
cb30: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
cb40: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
cb50: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
cb60: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
cb70: 66 74 52 69 67 68 74 20 50 31 20 50 32 20 50 33  ftRight P1 P2 P3
cb80: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
cb90: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72  : r[P3]=r[P2]>>r
cba0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
cbb0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
cbc0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
cbd0: 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62  2 to the right b
cbe0: 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
cbf0: 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65  of bits specifie
cc00: 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72  d by the integer
cc10: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
cc20: 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65  .** Store the re
cc30: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
cc40: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
cc50: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
cc60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
cc70: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
cc80: 42 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20  BitAnd:         
cc90: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
cca0: 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e  as TK_BITAND, in
ccb0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
ccc0: 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20  case OP_BitOr:  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
ccf0: 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  TOR, in1, in2, o
cd00: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
cd10: 68 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20  hiftLeft:       
cd20: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
cd30: 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31  s TK_LSHIFT, in1
cd40: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
cd50: 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68  ase OP_ShiftRigh
cd60: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  t: {           /
cd70: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48  * same as TK_RSH
cd80: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
cd90: 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  ut3 */.  i64 iA;
cda0: 0a 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34  .  u64 uA;.  i64
cdb0: 20 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20   iB;.  u8 op;.. 
cdc0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
cdd0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d  p->p1];.  pIn2 =
cde0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
cdf0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
ce00: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
ce10: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70  (pIn1->flags | p
ce20: 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  In2->flags) & ME
ce30: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71  M_Null ){.    sq
ce40: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
ce50: 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62  ull(pOut);.    b
ce60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d  reak;.  }.  iA =
ce70: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
ce80: 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42  alue(pIn2);.  iB
ce90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
cea0: 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  tValue(pIn1);.  
ceb0: 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  op = pOp->opcode
cec0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  ;.  if( op==OP_B
ced0: 69 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20  itAnd ){.    iA 
cee0: 26 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69  &= iB;.  }else i
cef0: 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20  f( op==OP_BitOr 
cf00: 29 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b  ){.    iA |= iB;
cf10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21  .  }else if( iB!
cf20: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
cf30: 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69  ( op==OP_ShiftRi
cf40: 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68  ght || op==OP_Sh
cf50: 69 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20  iftLeft );..    
cf60: 2f 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62  /* If shifting b
cf70: 79 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f  y a negative amo
cf80: 75 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68  unt, shift in th
cf90: 65 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f  e other directio
cfa0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c  n */.    if( iB<
cfb0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
cfc0: 74 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74  t( OP_ShiftRight
cfd0: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31  ==OP_ShiftLeft+1
cfe0: 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32   );.      op = 2
cff0: 2a 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20  *OP_ShiftLeft + 
d000: 31 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42  1 - op;.      iB
d010: 20 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69   = iB>(-64) ? -i
d020: 42 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20  B : 64;.    }.. 
d030: 20 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b     if( iB>=64 ){
d040: 0a 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e  .      iA = (iA>
d050: 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69  =0 || op==OP_Shi
d060: 66 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31  ftLeft) ? 0 : -1
d070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d080: 20 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26     memcpy(&uA, &
d090: 69 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b  iA, sizeof(uA));
d0a0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f  .      if( op==O
d0b0: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20  P_ShiftLeft ){. 
d0c0: 20 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42         uA <<= iB
d0d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d0e0: 20 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42         uA >>= iB
d0f0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67  ;.        /* Sig
d100: 6e 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69  n-extend on a ri
d110: 67 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e  ght shift of a n
d120: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a  egative number *
d130: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  /.        if( iA
d140: 3c 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75  <0 ) uA |= ((((u
d150: 36 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c  64)0xffffffff)<<
d160: 33 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20  32)|0xffffffff) 
d170: 3c 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20  << (64-iB);.    
d180: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
d190: 28 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f  (&iA, &uA, sizeo
d1a0: 66 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20  f(iA));.    }.  
d1b0: 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
d1c0: 69 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  iA;.  MemSetType
d1d0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
d1e0: 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  nt);.  break;.}.
d1f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49  ./* Opcode: AddI
d200: 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  mm  P1 P2 * * *.
d210: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
d220: 31 5d 3d 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a  1]=r[P1]+P2.** .
d230: 2a 2a 20 41 64 64 20 74 68 65 20 63 6f 6e 73 74  ** Add the const
d240: 61 6e 74 20 50 32 20 74 6f 20 74 68 65 20 76 61  ant P2 to the va
d250: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
d260: 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  P1..** The resul
d270: 74 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 69  t is always an i
d280: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nteger..**.** To
d290: 20 66 6f 72 63 65 20 61 6e 79 20 72 65 67 69 73   force any regis
d2a0: 74 65 72 20 74 6f 20 62 65 20 61 6e 20 69 6e 74  ter to be an int
d2b0: 65 67 65 72 2c 20 6a 75 73 74 20 61 64 64 20 30  eger, just add 0
d2c0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
d2d0: 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Imm: {          
d2e0: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49    /* in1 */.  pI
d2f0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
d300: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p1];.  memAboutT
d310: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
d320: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
d330: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
d340: 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  1);.  pIn1->u.i 
d350: 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72  += pOp->p2;.  br
d360: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
d370: 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20  e: MustBeInt P1 
d380: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20  P2 * * *.** .** 
d390: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
d3a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
d3b0: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e  o be an integer.
d3c0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
d3d0: 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61  * in P1 is not a
d3e0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61  n integer and ca
d3f0: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
d400: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
d410: 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74  r.** without dat
d420: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d  a loss, then jum
d430: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
d440: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30   P2, or if P2==0
d450: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c  .** raise an SQL
d460: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63  ITE_MISMATCH exc
d470: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  eption..*/.case 
d480: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20  OP_MustBeInt: { 
d490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
d4a0: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
d4b0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
d4c0: 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
d4d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
d4e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
d4f0: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
d500: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
d510: 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  IC, encoding);. 
d520: 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
d530: 65 6e 28 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26  en((pIn1->flags&
d540: 4d 45 4d 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b  MEM_Int)==0, 2);
d550: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  .    if( (pIn1->
d560: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
d570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
d580: 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20   pOp->p2==0 ){. 
d590: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d5a0: 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20  TE_MISMATCH;.   
d5b0: 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
d5c0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
d5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d5e0: 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
d5f0: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
d600: 7d 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79  }.  }.  MemSetTy
d610: 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d  peFlag(pIn1, MEM
d620: 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  _Int);.  break;.
d630: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d640: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
d650: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
d660: 20 52 65 61 6c 41 66 66 69 6e 69 74 79 20 50 31   RealAffinity P1
d670: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49   * * * *.**.** I
d680: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 68 6f  f register P1 ho
d690: 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63  lds an integer c
d6a0: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20 72  onvert it to a r
d6b0: 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  eal value..**.**
d6c0: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
d6d0: 75 73 65 64 20 77 68 65 6e 20 65 78 74 72 61 63  used when extrac
d6e0: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
d6f0: 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74   from a column t
d700: 68 61 74 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20  hat.** has REAL 
d710: 61 66 66 69 6e 69 74 79 2e 20 20 53 75 63 68 20  affinity.  Such 
d720: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61  column values ma
d730: 79 20 73 74 69 6c 6c 20 62 65 20 73 74 6f 72 65  y still be store
d740: 64 20 61 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73  d as.** integers
d750: 2c 20 66 6f 72 20 73 70 61 63 65 20 65 66 66 69  , for space effi
d760: 63 69 65 6e 63 79 2c 20 62 75 74 20 61 66 74 65  ciency, but afte
d770: 72 20 65 78 74 72 61 63 74 69 6f 6e 20 77 65 20  r extraction we 
d780: 77 61 6e 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20  want them.** to 
d790: 68 61 76 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c  have only a real
d7a0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20   value..*/.case 
d7b0: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 3a  OP_RealAffinity:
d7c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
d7d0: 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20      /* in1 */.  
d7e0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
d7f0: 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e  ->p1];.  if( pIn
d800: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
d810: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
d820: 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28  3VdbeMemRealify(
d830: 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
d840: 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
d850: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d860: 54 5f 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65  T_CAST./* Opcode
d870: 3a 20 43 61 73 74 20 50 31 20 50 32 20 2a 20 2a  : Cast P1 P2 * *
d880: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
d890: 61 66 66 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a  affinity(r[P1]).
d8a0: 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20  **.** Force the 
d8b0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
d8c0: 72 20 50 31 20 74 6f 20 62 65 20 74 68 65 20 74  r P1 to be the t
d8d0: 79 70 65 20 64 65 66 69 6e 65 64 20 62 79 20 50  ype defined by P
d8e0: 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a  2..** .** <ul>.*
d8f0: 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 41 27 20 26  * <li> P2=='A' &
d900: 72 61 72 72 3b 20 42 4c 4f 42 0a 2a 2a 20 3c 6c  rarr; BLOB.** <l
d910: 69 3e 20 50 32 3d 3d 27 42 27 20 26 72 61 72 72  i> P2=='B' &rarr
d920: 3b 20 54 45 58 54 0a 2a 2a 20 3c 6c 69 3e 20 50  ; TEXT.** <li> P
d930: 32 3d 3d 27 43 27 20 26 72 61 72 72 3b 20 4e 55  2=='C' &rarr; NU
d940: 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69 3e 20 50 32  MERIC.** <li> P2
d950: 3d 3d 27 44 27 20 26 72 61 72 72 3b 20 49 4e 54  =='D' &rarr; INT
d960: 45 47 45 52 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d  EGER.** <li> P2=
d970: 3d 27 45 27 20 26 72 61 72 72 3b 20 52 45 41 4c  ='E' &rarr; REAL
d980: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
d990: 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  A NULL value is 
d9a0: 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74  not changed by t
d9b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74  his routine.  It
d9c0: 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a   remains NULL..*
d9d0: 2f 0a 63 61 73 65 20 4f 50 5f 43 61 73 74 3a 20  /.case OP_Cast: 
d9e0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
d9f0: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 61     /* in1 */.  a
da00: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
da10: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
da20: 26 26 20 70 4f 70 2d 3e 70 32 3c 3d 53 51 4c 49  && pOp->p2<=SQLI
da30: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
da40: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
da50: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  p2==SQLITE_AFF_T
da60: 45 58 54 20 29 3b 0a 20 20 74 65 73 74 63 61 73  EXT );.  testcas
da70: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
da80: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
da90: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
daa0: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  p2==SQLITE_AFF_N
dab0: 55 4d 45 52 49 43 20 29 3b 0a 20 20 74 65 73 74  UMERIC );.  test
dac0: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
dad0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
dae0: 52 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  R );.  testcase(
daf0: 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
db00: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 70  _AFF_REAL );.  p
db10: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
db20: 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p1];.  memAbout
db30: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31  ToChange(p, pIn1
db40: 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64  );.  rc = Expand
db50: 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 73 71  Blob(pIn1);.  sq
db60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 61 73 74  lite3VdbeMemCast
db70: 28 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  (pIn1, pOp->p2, 
db80: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44  encoding);.  UPD
db90: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
dba0: 28 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 72 63  (pIn1);.  if( rc
dbb0: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
dbc0: 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
dbd0: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
dbe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
dbf0: 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  T */../* Opcode:
dc00: 20 45 71 20 50 31 20 50 32 20 50 33 20 50 34 20   Eq P1 P2 P3 P4 
dc10: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
dc20: 49 46 20 72 5b 50 33 5d 3d 3d 72 5b 50 31 5d 0a  IF r[P3]==r[P1].
dc30: 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  **.** Compare th
dc40: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
dc50: 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20  ster P1 and P3. 
dc60: 20 49 66 20 72 65 67 28 50 33 29 3d 3d 72 65 67   If reg(P3)==reg
dc70: 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  (P1) then.** jum
dc80: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
dc90: 20 20 4f 72 20 69 66 20 74 68 65 20 53 51 4c 49    Or if the SQLI
dca0: 54 45 5f 53 54 4f 52 45 50 32 20 66 6c 61 67 20  TE_STOREP2 flag 
dcb0: 69 73 20 73 65 74 20 69 6e 20 50 35 2c 20 74 68  is set in P5, th
dcc0: 65 6e 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  en.** store the 
dcd0: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
dce0: 69 73 6f 6e 20 69 6e 20 72 65 67 69 73 74 65 72  ison in register
dcf0: 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53   P2..**.** The S
dd00: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70  QLITE_AFF_MASK p
dd10: 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73  ortion of P5 mus
dd20: 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79  t be an affinity
dd30: 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20   character -.** 
dd40: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
dd50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
dd60: 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  GER, and so fort
dd70: 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  h. An attempt is
dd80: 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65   made .** to coe
dd90: 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20  rce both inputs 
dda0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  according to thi
ddb0: 73 20 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72  s affinity befor
ddc0: 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69  e the.** compari
ddd0: 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20  son is made. If 
dde0: 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  the SQLITE_AFF_M
ddf0: 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65  ASK is 0x00, the
de00: 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66  n numeric.** aff
de10: 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e  inity is used. N
de20: 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 66 66  ote that the aff
de30: 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e  inity conversion
de40: 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
de50: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e  back into the in
de60: 70 75 74 20 72 65 67 69 73 74 65 72 73 20 50 31  put registers P1
de70: 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69   and P3.  So thi
de80: 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75  s opcode can cau
de90: 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74  se.** persistent
dea0: 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69   changes to regi
deb0: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
dec0: 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20  .**.** Once any 
ded0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65  conversions have
dee0: 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e   taken place, an
def0: 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20  d neither value 
df00: 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65  is NULL, .** the
df10: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70   values are comp
df20: 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61  ared. If both va
df30: 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74  lues are blobs t
df40: 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a  hen memcmp() is.
df50: 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  ** used to deter
df60: 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73  mine the results
df70: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
df80: 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c  on.  If both val
df90: 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c  ues.** are text,
dfa0: 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70   then the approp
dfb0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
dfc0: 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
dfd0: 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 75  ed in.** P4 is u
dfe0: 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  sed to do the co
dff0: 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34  mparison.  If P4
e000: 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65   is not specifie
e010: 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70  d then.** memcmp
e020: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  () is used to co
e030: 6d 70 61 72 65 20 74 65 78 74 20 73 74 72 69 6e  mpare text strin
e040: 67 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75  g.  If both valu
e050: 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69  es are.** numeri
e060: 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69  c, then a numeri
e070: 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  c comparison is 
e080: 75 73 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f  used. If the two
e090: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f   values.** are o
e0a0: 66 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  f different type
e0b0: 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20  s, then numbers 
e0c0: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c  are considered l
e0d0: 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69  ess than.** stri
e0e0: 6e 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20  ngs and strings 
e0f0: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c  are considered l
e100: 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a  ess than blobs..
e110: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
e120: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e  NULLEQ is set in
e130: 20 50 35 20 74 68 65 6e 20 74 68 65 20 72 65 73   P5 then the res
e140: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
e150: 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  n is always eith
e160: 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61  er.** true or fa
e170: 6c 73 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72  lse and is never
e180: 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20   NULL.  If both 
e190: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c  operands are NUL
e1a0: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
e1b0: 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73  t.** of comparis
e1c0: 6f 6e 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  on is true.  If 
e1d0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e1e0: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
e1f0: 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 2e  result is false.
e200: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
e210: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
e220: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
e230: 20 73 61 6d 65 20 61 73 20 69 74 20 77 6f 75 6c   same as it woul
e240: 64 20 62 65 20 69 66 0a 2a 2a 20 74 68 65 20 53  d be if.** the S
e250: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61  QLITE_NULLEQ fla
e260: 67 20 77 65 72 65 20 6f 6d 69 74 74 65 64 20 66  g were omitted f
e270: 72 6f 6d 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  rom P5..**.** If
e280: 20 62 6f 74 68 20 53 51 4c 49 54 45 5f 53 54 4f   both SQLITE_STO
e290: 52 45 50 32 20 61 6e 64 20 53 51 4c 49 54 45 5f  REP2 and SQLITE_
e2a0: 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 73 20 61  KEEPNULL flags a
e2b0: 72 65 20 73 65 74 20 74 68 65 6e 20 74 68 65 0a  re set then the.
e2c0: 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b  ** content of r[
e2d0: 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  P2] is only chan
e2e0: 67 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 76  ged if the new v
e2f0: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20  alue is NULL or 
e300: 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2a 20 49 6e  0 (false)..** In
e310: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
e320: 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61 6c 75  prior r[P2] valu
e330: 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 76  e will not be ov
e340: 65 72 77 72 69 74 74 65 6e 20 62 79 20 31 20 28  erwritten by 1 (
e350: 74 72 75 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  true)..*/./* Opc
e360: 6f 64 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33  ode: Ne P1 P2 P3
e370: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
e380: 69 73 3a 20 49 46 20 72 5b 50 33 5d 21 3d 72 5b  is: IF r[P3]!=r[
e390: 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P1].**.** This w
e3a0: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
e3b0: 68 65 20 45 71 20 6f 70 63 6f 64 65 20 65 78 63  he Eq opcode exc
e3c0: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
e3d0: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
e3e0: 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e   the operands in
e3f0: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
e400: 64 20 50 33 20 61 72 65 20 6e 6f 74 20 65 71 75  d P3 are not equ
e410: 61 6c 2e 20 20 53 65 65 20 74 68 65 20 45 71 20  al.  See the Eq 
e420: 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64  opcode for.** ad
e430: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
e440: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  tion..**.** If b
e450: 6f 74 68 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  oth SQLITE_STORE
e460: 50 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45  P2 and SQLITE_KE
e470: 45 50 4e 55 4c 4c 20 66 6c 61 67 73 20 61 72 65  EPNULL flags are
e480: 20 73 65 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a   set then the.**
e490: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32   content of r[P2
e4a0: 5d 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  ] is only change
e4b0: 64 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c  d if the new val
e4c0: 75 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 31 20  ue is NULL or 1 
e4d0: 28 74 72 75 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74  (true)..** In ot
e4e0: 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69  her words, a pri
e4f0: 6f 72 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77  or r[P2] value w
e500: 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77  ill not be overw
e510: 72 69 74 74 65 6e 20 62 79 20 30 20 28 66 61 6c  ritten by 0 (fal
e520: 73 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  se)..*/./* Opcod
e530: 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50  e: Lt P1 P2 P3 P
e540: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
e550: 3a 20 49 46 20 72 5b 50 33 5d 3c 72 5b 50 31 5d  : IF r[P3]<r[P1]
e560: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  .**.** Compare t
e570: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
e580: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e  ister P1 and P3.
e590: 20 20 49 66 20 72 65 67 28 50 33 29 3c 72 65 67    If reg(P3)<reg
e5a0: 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  (P1) then.** jum
e5b0: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
e5c0: 20 20 4f 72 20 69 66 20 74 68 65 20 53 51 4c 49    Or if the SQLI
e5d0: 54 45 5f 53 54 4f 52 45 50 32 20 66 6c 61 67 20  TE_STOREP2 flag 
e5e0: 69 73 20 73 65 74 20 69 6e 20 50 35 20 73 74 6f  is set in P5 sto
e5f0: 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
e600: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28   of comparison (
e610: 30 20 6f 72 20 31 20 6f 72 20 4e 55 4c 4c 29 20  0 or 1 or NULL) 
e620: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
e630: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
e640: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
e650: 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65   bit of P5 is se
e660: 74 20 61 6e 64 20 65 69 74 68 65 72 20 72 65 67  t and either reg
e670: 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50  (P1) or.** reg(P
e680: 33 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  3) is NULL then 
e690: 74 68 65 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  the take the jum
e6a0: 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49 54  p.  If the SQLIT
e6b0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a  E_JUMPIFNULL .**
e6c0: 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74 68   bit is clear th
e6d0: 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
e6e0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
e6f0: 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  d is NULL..**.**
e700: 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   The SQLITE_AFF_
e710: 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20  MASK portion of 
e720: 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66  P5 must be an af
e730: 66 69 6e 69 74 79 20 63 68 61 72 61 63 74 65 72  finity character
e740: 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46   -.** SQLITE_AFF
e750: 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46  _TEXT, SQLITE_AF
e760: 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73  F_INTEGER, and s
e770: 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65  o forth. An atte
e780: 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20  mpt is made .** 
e790: 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69  to coerce both i
e7a0: 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20  nputs according 
e7b0: 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74 79  to this affinity
e7c0: 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63   before the.** c
e7d0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
e7e0: 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  e. If the SQLITE
e7f0: 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30  _AFF_MASK is 0x0
e800: 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a  0, then numeric.
e810: 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ** affinity is u
e820: 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  sed. Note that t
e830: 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76  he affinity conv
e840: 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72  ersions are stor
e850: 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20  ed.** back into 
e860: 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
e870: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20  ers P1 and P3.  
e880: 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63  So this opcode c
e890: 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73  an cause.** pers
e8a0: 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74  istent changes t
e8b0: 6f 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  o registers P1 a
e8c0: 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  nd P3..**.** Onc
e8d0: 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e  e any conversion
e8e0: 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61  s have taken pla
e8f0: 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20  ce, and neither 
e900: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a  value is NULL, .
e910: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  ** the values ar
e920: 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62  e compared. If b
e930: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 62  oth values are b
e940: 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70  lobs then memcmp
e950: 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  () is.** used to
e960: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72   determine the r
e970: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f  esults of the co
e980: 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f  mparison.  If bo
e990: 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  th values.** are
e9a0: 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20   text, then the 
e9b0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
e9c0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73  ating function s
e9d0: 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50  pecified in.** P
e9e0: 34 20 69 73 20 20 75 73 65 64 20 74 6f 20 64 6f  4 is  used to do
e9f0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
ea00: 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73    If P4 is not s
ea10: 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a  pecified then.**
ea20: 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65   memcmp() is use
ea30: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78  d to compare tex
ea40: 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f  t string.  If bo
ea50: 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a  th values are.**
ea60: 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61   numeric, then a
ea70: 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69   numeric compari
ea80: 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20  son is used. If 
ea90: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
eaa0: 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72 65  * are of differe
eab0: 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e  nt types, then n
eac0: 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69  umbers are consi
ead0: 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a  dered less than.
eae0: 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73  ** strings and s
eaf0: 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69  trings are consi
eb00: 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20  dered less than 
eb10: 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  blobs..*/./* Opc
eb20: 6f 64 65 3a 20 4c 65 20 50 31 20 50 32 20 50 33  ode: Le P1 P2 P3
eb30: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
eb40: 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c 3d 72 5b  is: IF r[P3]<=r[
eb50: 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P1].**.** This w
eb60: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
eb70: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
eb80: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
eb90: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
eba0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
ebb0: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 6c  register P3 is l
ebc0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
ebd0: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  l to the content
ebe0: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   of.** register 
ebf0: 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20  P1.  See the Lt 
ec00: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
ec10: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
ec20: 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  n..*/./* Opcode:
ec30: 20 47 74 20 50 31 20 50 32 20 50 33 20 50 34 20   Gt P1 P2 P3 P4 
ec40: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
ec50: 49 46 20 72 5b 50 33 5d 3e 72 5b 50 31 5d 0a 2a  IF r[P3]>r[P1].*
ec60: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
ec70: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
ec80: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
ec90: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
eca0: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
ecb0: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
ecc0: 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65  ter P3 is greate
ecd0: 72 20 74 68 61 6e 20 74 68 65 20 63 6f 6e 74 65  r than the conte
ece0: 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65  nt of.** registe
ecf0: 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c  r P1.  See the L
ed00: 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  t opcode for add
ed10: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
ed20: 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ion..*/./* Opcod
ed30: 65 3a 20 47 65 20 50 31 20 50 32 20 50 33 20 50  e: Ge P1 P2 P3 P
ed40: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
ed50: 3a 20 49 46 20 72 5b 50 33 5d 3e 3d 72 5b 50 31  : IF r[P3]>=r[P1
ed60: 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ].**.** This wor
ed70: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
ed80: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
ed90: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
eda0: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
edb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
edc0: 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65  gister P3 is gre
edd0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
ede0: 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  al to the conten
edf0: 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  t of.** register
ee00: 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74   P1.  See the Lt
ee10: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69   opcode for addi
ee20: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
ee30: 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45  on..*/.case OP_E
ee40: 71 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q:              
ee50: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45   /* same as TK_E
ee60: 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  Q, jump, in1, in
ee70: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a  3 */.case OP_Ne:
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c  * same as TK_NE,
eea0: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
eeb0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20  */.case OP_Lt:  
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eed0: 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a  same as TK_LT, j
eee0: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
eef0: 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20  .case OP_Le:    
ef00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
ef10: 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d  me as TK_LE, jum
ef20: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
ef30: 61 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 20 20  ase OP_Gt:      
ef40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ef50: 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c   as TK_GT, jump,
ef60: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
ef70: 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20 20  e OP_Ge: {      
ef80: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ef90: 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69  s TK_GE, jump, i
efa0: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74  n1, in3 */.  int
efb0: 20 72 65 73 2c 20 72 65 73 32 3b 20 20 20 20 20   res, res2;     
efc0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68   /* Result of th
efd0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  e comparison of 
efe0: 70 49 6e 31 20 61 67 61 69 6e 73 74 20 70 49 6e  pIn1 against pIn
eff0: 33 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  3 */.  char affi
f000: 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a 20 41 66  nity;      /* Af
f010: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 66 6f  finity to use fo
f020: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  r comparison */.
f030: 20 20 75 31 36 20 66 6c 61 67 73 31 3b 20 20 20    u16 flags1;   
f040: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
f050: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
f060: 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f  f pIn1->flags */
f070: 0a 20 20 75 31 36 20 66 6c 61 67 73 33 3b 20 20  .  u16 flags3;  
f080: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
f090: 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  f initial value 
f0a0: 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 2a  of pIn3->flags *
f0b0: 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  /..  pIn1 = &aMe
f0c0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
f0d0: 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
f0e0: 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20  p3];.  flags1 = 
f0f0: 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  pIn1->flags;.  f
f100: 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c  lags3 = pIn3->fl
f110: 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  ags;.  if( (flag
f120: 73 31 20 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d  s1 | flags3)&MEM
f130: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  _Null ){.    /* 
f140: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 70 65 72  One or both oper
f150: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ands are NULL */
f160: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  .    if( pOp->p5
f170: 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   & SQLITE_NULLEQ
f180: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f190: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73  SQLITE_NULLEQ is
f1a0: 20 73 65 74 20 28 77 68 69 63 68 20 77 69 6c 6c   set (which will
f1b0: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
f1c0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 0a  the operator is.
f1d0: 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45 71 20 6f        ** OP_Eq o
f1e0: 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e 20 74 61  r OP_Ne) then ta
f1f0: 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f 72 20 6e  ke the jump or n
f200: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
f210: 77 68 65 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  whether.      **
f220: 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20 6f 70 65   or not both ope
f230: 72 61 6e 64 73 20 61 72 65 20 6e 75 6c 6c 2e 0a  rands are null..
f240: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
f250: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
f260: 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f 70  de==OP_Eq || pOp
f270: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20  ->opcode==OP_Ne 
f280: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f290: 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 43   (flags1 & MEM_C
f2a0: 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b 0a 20 20  leared)==0 );.  
f2b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70      assert( (pOp
f2c0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
f2d0: 4d 50 49 46 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  MPIFNULL)==0 );.
f2e0: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
f2f0: 31 26 66 6c 61 67 73 33 26 4d 45 4d 5f 4e 75 6c  1&flags3&MEM_Nul
f300: 6c 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  l)!=0.       && 
f310: 28 66 6c 61 67 73 33 26 4d 45 4d 5f 43 6c 65 61  (flags3&MEM_Clea
f320: 72 65 64 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  red)==0.      ){
f330: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30  .        res = 0
f340: 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61  ;  /* Operands a
f350: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20  re equal */.    
f360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f370: 20 72 65 73 20 3d 20 31 3b 20 20 2f 2a 20 4f 70   res = 1;  /* Op
f380: 65 72 61 6e 64 73 20 61 72 65 20 6e 6f 74 20 65  erands are not e
f390: 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  qual */.      }.
f3a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   /* SQLITE_NULLE
f3c0: 51 20 69 73 20 63 6c 65 61 72 20 61 6e 64 20 61  Q is clear and a
f3d0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 65 72  t least one oper
f3e0: 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a 20 20 20  and is NULL,.   
f3f0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72     ** then the r
f400: 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
f410: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 54  NULL..      ** T
f420: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
f430: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a   if the SQLITE_J
f440: 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 69 73  UMPIFNULL bit is
f450: 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
f460: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
f470: 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
f480: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  2 ){.        pOu
f490: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
f4a0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6d  2];.        iCom
f4b0: 70 61 72 65 20 3d 20 31 3b 20 20 20 20 2f 2a 20  pare = 1;    /* 
f4c0: 4f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 6f 74  Operands are not
f4d0: 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20   equal */.      
f4e0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
f4f0: 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ge(p, pOut);.   
f500: 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46       MemSetTypeF
f510: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75  lag(pOut, MEM_Nu
f520: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47  ll);.        REG
f530: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
f540: 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  >p2, pOut);.    
f550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f560: 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
f570: 28 32 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 69  (2,3);.        i
f580: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
f590: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 29  ITE_JUMPIFNULL )
f5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
f5b0: 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
f5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f5d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f5e0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
f5f0: 2a 20 4e 65 69 74 68 65 72 20 6f 70 65 72 61 6e  * Neither operan
f600: 64 20 69 73 20 4e 55 4c 4c 2e 20 20 44 6f 20 61  d is NULL.  Do a
f610: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a   comparison. */.
f620: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 70      affinity = p
f630: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
f640: 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 20 20 69 66  AFF_MASK;.    if
f650: 28 20 61 66 66 69 6e 69 74 79 3e 3d 53 51 4c 49  ( affinity>=SQLI
f660: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
f670: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  {.      if( (fla
f680: 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26 4d 45  gs1 | flags3)&ME
f690: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
f6a0: 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 28   if( (flags1 & (
f6b0: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
f6c0: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
f6d0: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
f6e0: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
f6f0: 69 6e 69 74 79 28 70 49 6e 31 2c 30 29 3b 0a 20  inity(pIn1,0);. 
f700: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
f710: 65 28 20 66 6c 61 67 73 33 21 3d 70 49 6e 33 2d  e( flags3!=pIn3-
f720: 3e 66 6c 61 67 73 20 29 3b 20 2f 2a 20 50 6f 73  >flags ); /* Pos
f730: 73 69 62 6c 65 20 69 66 20 70 49 6e 31 3d 3d 70  sible if pIn1==p
f740: 49 6e 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  In3 */.         
f750: 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e   flags3 = pIn3->
f760: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 7d  flags;.        }
f770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 66 6c  .        if( (fl
f780: 61 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  ags3 & (MEM_Int|
f790: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
f7a0: 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
f7b0: 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75           applyNu
f7c0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
f7d0: 6e 33 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  n3,0);.        }
f7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
f7f0: 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 63 6f 6d  * Handle the com
f800: 6d 6f 6e 20 63 61 73 65 20 6f 66 20 69 6e 74 65  mon case of inte
f810: 67 65 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 68  ger comparison h
f820: 65 72 65 2c 20 61 73 20 61 6e 0a 20 20 20 20 20  ere, as an.     
f830: 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
f840: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 63 61 6c  , to avoid a cal
f850: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 65 6d 43  l to sqlite3MemC
f860: 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 20 20  ompare() */.    
f870: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
f880: 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c 61 67 73  gs & pIn3->flags
f890: 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
f8a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
f8b0: 6e 33 2d 3e 75 2e 69 20 3e 20 70 49 6e 31 2d 3e  n3->u.i > pIn1->
f8c0: 75 2e 69 20 29 7b 20 72 65 73 20 3d 20 2b 31 3b  u.i ){ res = +1;
f8d0: 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70   goto compare_op
f8e0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
f8f0: 70 49 6e 33 2d 3e 75 2e 69 20 3c 20 70 49 6e 31  pIn3->u.i < pIn1
f900: 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20 2d  ->u.i ){ res = -
f910: 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f  1; goto compare_
f920: 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 72 65  op; }.        re
f930: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  s = 0;.        g
f940: 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 0a  oto compare_op;.
f950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f960: 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d 3d  e if( affinity==
f970: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
f980: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  ){.      if( (fl
f990: 61 67 73 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d  ags1 & MEM_Str)=
f9a0: 3d 30 20 26 26 20 28 66 6c 61 67 73 31 20 26 20  =0 && (flags1 & 
f9b0: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
f9c0: 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  l))!=0 ){.      
f9d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 31    testcase( pIn1
f9e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
f9f0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
fa00: 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61  tcase( pIn1->fla
fa10: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
fa20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa30: 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79  VdbeMemStringify
fa40: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 2c  (pIn1, encoding,
fa50: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73   1);.        tes
fa60: 74 63 61 73 65 28 20 28 66 6c 61 67 73 31 26 4d  tcase( (flags1&M
fa70: 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e 31  EM_Dyn) != (pIn1
fa80: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29  ->flags&MEM_Dyn)
fa90: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   );.        flag
faa0: 73 31 20 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67  s1 = (pIn1->flag
fab0: 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73  s & ~MEM_TypeMas
fac0: 6b 29 20 7c 20 28 66 6c 61 67 73 31 20 26 20 4d  k) | (flags1 & M
fad0: 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20  EM_TypeMask);.  
fae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
faf0: 6e 31 21 3d 70 49 6e 33 20 29 3b 0a 20 20 20 20  n1!=pIn3 );.    
fb00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 66    }.      if( (f
fb10: 6c 61 67 73 33 20 26 20 4d 45 4d 5f 53 74 72 29  lags3 & MEM_Str)
fb20: 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 33 20 26  ==0 && (flags3 &
fb30: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
fb40: 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  al))!=0 ){.     
fb50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
fb60: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
fb70: 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  nt );.        te
fb80: 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c  stcase( pIn3->fl
fb90: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
fba0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fbb0: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
fbc0: 79 28 70 49 6e 33 2c 20 65 6e 63 6f 64 69 6e 67  y(pIn3, encoding
fbd0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  , 1);.        te
fbe0: 73 74 63 61 73 65 28 20 28 66 6c 61 67 73 33 26  stcase( (flags3&
fbf0: 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e  MEM_Dyn) != (pIn
fc00: 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  3->flags&MEM_Dyn
fc10: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  ) );.        fla
fc20: 67 73 33 20 3d 20 28 70 49 6e 33 2d 3e 66 6c 61  gs3 = (pIn3->fla
fc30: 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61  gs & ~MEM_TypeMa
fc40: 73 6b 29 20 7c 20 28 66 6c 61 67 73 33 20 26 20  sk) | (flags3 & 
fc50: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20  MEM_TypeMask);. 
fc60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fc70: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
fc80: 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
fc90: 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c   || pOp->p4.pCol
fca0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 73 20  l==0 );.    res 
fcb0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
fcc0: 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31 2c 20  are(pIn3, pIn1, 
fcd0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a  pOp->p4.pColl);.
fce0: 20 20 7d 0a 63 6f 6d 70 61 72 65 5f 6f 70 3a 0a    }.compare_op:.
fcf0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fd00: 6e 74 2c 20 72 65 73 20 69 73 20 6e 65 67 61 74  nt, res is negat
fd10: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
fd20: 73 69 74 69 76 65 20 69 66 20 72 65 67 5b 50 31  sitive if reg[P1
fd30: 5d 20 69 73 0a 20 20 2a 2a 20 6c 65 73 73 20 74  ] is.  ** less t
fd40: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
fd50: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 72  r greater than r
fd60: 65 67 5b 50 33 5d 2c 20 72 65 73 70 65 63 74 69  eg[P3], respecti
fd70: 76 65 6c 79 2e 20 20 43 6f 6d 70 75 74 65 0a 20  vely.  Compute. 
fd80: 20 2a 2a 20 74 68 65 20 61 6e 73 77 65 72 20 74   ** the answer t
fd90: 6f 20 74 68 69 73 20 6f 70 65 72 61 74 6f 72 20  o this operator 
fda0: 69 6e 20 72 65 73 32 2c 20 64 65 70 65 6e 64 69  in res2, dependi
fdb0: 6e 67 20 6f 6e 20 77 68 61 74 20 74 68 65 20 63  ng on what the c
fdc0: 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 2a 2a 20 6f  omparison.  ** o
fdd0: 70 65 72 61 74 6f 72 20 61 63 74 75 61 6c 6c 79  perator actually
fde0: 20 69 73 2e 20 20 54 68 65 20 6e 65 78 74 20 62   is.  The next b
fdf0: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 64 65 70  lock of code dep
fe00: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
fe10: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 36  .  ** that the 6
fe20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
fe30: 61 74 6f 72 73 20 61 72 65 20 63 6f 6e 73 65 63  ators are consec
fe40: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 69  utive integers i
fe50: 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 72 64 65  n this.  ** orde
fe60: 72 3a 20 20 4e 45 2c 20 45 51 2c 20 47 54 2c 20  r:  NE, EQ, GT, 
fe70: 4c 45 2c 20 4c 54 2c 20 47 45 20 2a 2f 0a 20 20  LE, LT, GE */.  
fe80: 61 73 73 65 72 74 28 20 4f 50 5f 45 71 3d 3d 4f  assert( OP_Eq==O
fe90: 50 5f 4e 65 2b 31 20 29 3b 20 61 73 73 65 72 74  P_Ne+1 ); assert
fea0: 28 20 4f 50 5f 47 74 3d 3d 4f 50 5f 4e 65 2b 32  ( OP_Gt==OP_Ne+2
feb0: 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 4c   ); assert( OP_L
fec0: 65 3d 3d 4f 50 5f 4e 65 2b 33 20 29 3b 0a 20 20  e==OP_Ne+3 );.  
fed0: 61 73 73 65 72 74 28 20 4f 50 5f 4c 74 3d 3d 4f  assert( OP_Lt==O
fee0: 50 5f 4e 65 2b 34 20 29 3b 20 61 73 73 65 72 74  P_Ne+4 ); assert
fef0: 28 20 4f 50 5f 47 65 3d 3d 4f 50 5f 4e 65 2b 35  ( OP_Ge==OP_Ne+5
ff00: 20 29 3b 0a 20 20 69 66 28 20 72 65 73 3c 30 20   );.  if( res<0 
ff10: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
ff20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 2c            /* ne,
ff30: 20 65 71 2c 20 67 74 2c 20 6c 65 2c 20 6c 74 2c   eq, gt, le, lt,
ff40: 20 67 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 69   ge */.    stati
ff50: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
ff60: 20 63 68 61 72 20 61 4c 54 62 5b 5d 20 3d 20 7b   char aLTb[] = {
ff70: 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20   1,  0,  0,  1, 
ff80: 20 31 2c 20 20 30 20 7d 3b 0a 20 20 20 20 72 65   1,  0 };.    re
ff90: 73 32 20 3d 20 61 4c 54 62 5b 70 4f 70 2d 3e 6f  s2 = aLTb[pOp->o
ffa0: 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b 0a  pcode - OP_Ne];.
ffb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d    }else if( res=
ffc0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
ffd0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ffe0: 63 68 61 72 20 61 45 51 62 5b 5d 20 3d 20 7b 20  char aEQb[] = { 
fff0: 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 2c 20 20  0,  1,  0,  1,  
10000 30 2c 20 20 31 20 7d 3b 0a 20 20 20 20 72 65 73  0,  1 };.    res
10010 32 20 3d 20 61 45 51 62 5b 70 4f 70 2d 3e 6f 70  2 = aEQb[pOp->op
10020 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b 0a 20  code - OP_Ne];. 
10030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
10040 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
10050 64 20 63 68 61 72 20 61 47 54 62 5b 5d 20 3d 20  d char aGTb[] = 
10060 7b 20 31 2c 20 20 30 2c 20 20 31 2c 20 20 30 2c  { 1,  0,  1,  0,
10070 20 20 30 2c 20 20 31 20 7d 3b 0a 20 20 20 20 72    0,  1 };.    r
10080 65 73 32 20 3d 20 61 47 54 62 5b 70 4f 70 2d 3e  es2 = aGTb[pOp->
10090 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b  opcode - OP_Ne];
100a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20  .  }..  /* Undo 
100b0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
100c0 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69 74   by applyAffinit
100d0 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75 74  y() to the input
100e0 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20   registers. */. 
100f0 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e   assert( (pIn1->
10100 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29  flags & MEM_Dyn)
10110 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20 4d 45   == (flags1 & ME
10120 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e 31  M_Dyn) );.  pIn1
10130 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 31  ->flags = flags1
10140 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
10150 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  3->flags & MEM_D
10160 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33 20 26  yn) == (flags3 &
10170 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70   MEM_Dyn) );.  p
10180 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  In3->flags = fla
10190 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d  gs3;..  if( pOp-
101a0 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
101b0 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f 75 74  REP2 ){.    pOut
101c0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
101d0 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20  ];.    iCompare 
101e0 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 28  = res;.    if( (
101f0 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
10200 5f 4b 45 45 50 4e 55 4c 4c 29 21 3d 30 20 29 7b  _KEEPNULL)!=0 ){
10210 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4b 45  .      /* The KE
10220 45 50 4e 55 4c 4c 20 66 6c 61 67 20 70 72 65 76  EPNULL flag prev
10230 65 6e 74 73 20 4f 50 5f 45 71 20 66 72 6f 6d 20  ents OP_Eq from 
10240 6f 76 65 72 77 72 69 74 69 6e 67 20 61 20 4e 55  overwriting a NU
10250 4c 4c 20 77 69 74 68 20 31 0a 20 20 20 20 20 20  LL with 1.      
10260 2a 2a 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20  ** and prevents 
10270 4f 50 5f 4e 65 20 66 72 6f 6d 20 6f 76 65 72 77  OP_Ne from overw
10280 72 69 74 69 6e 67 20 4e 55 4c 4c 20 77 69 74 68  riting NULL with
10290 20 30 2e 20 20 54 68 69 73 20 66 6c 61 67 0a 20   0.  This flag. 
102a0 20 20 20 20 20 2a 2a 20 69 73 20 6f 6e 6c 79 20       ** is only 
102b0 75 73 65 64 20 69 6e 20 63 6f 6e 74 65 78 74 73  used in contexts
102c0 20 77 68 65 72 65 20 65 69 74 68 65 72 3a 0a 20   where either:. 
102d0 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20 6f 70       **   (1) op
102e0 3d 3d 4f 50 5f 45 71 20 26 26 20 28 72 5b 50 32  ==OP_Eq && (r[P2
102f0 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d  ]==NULL || r[P2]
10300 3d 3d 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ==0).      **   
10310 28 32 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (2) op==OP_Ne &&
10320 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c   (r[P2]==NULL ||
10330 20 72 5b 50 32 5d 3d 3d 31 29 0a 20 20 20 20 20   r[P2]==1).     
10340 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 69 74   ** Therefore it
10350 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
10360 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 63  y to check the c
10370 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20  ontent of r[P2] 
10380 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 4e 55 4c  for.      ** NUL
10390 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  L. */.      asse
103a0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
103b0 3d 4f 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d 3e 6f  =OP_Ne || pOp->o
103c0 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a  pcode==OP_Eq );.
103d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
103e0 73 32 3d 3d 30 20 7c 7c 20 72 65 73 32 3d 3d 31  s2==0 || res2==1
103f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10400 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70  se( res2==0 && p
10410 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
10420 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  q );.      testc
10430 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20  ase( res2==1 && 
10440 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
10450 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Eq );.      test
10460 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26  case( res2==0 &&
10470 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
10480 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
10490 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26  tcase( res2==1 &
104a0 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
104b0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  P_Ne );.      if
104c0 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  ( (pOp->opcode==
104d0 4f 50 5f 45 71 29 3d 3d 72 65 73 32 20 29 20 62  OP_Eq)==res2 ) b
104e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
104f0 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
10500 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d  (p, pOut);.    M
10510 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
10520 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
10530 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65    pOut->u.i = re
10540 73 32 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  s2;.    REGISTER
10550 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
10560 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pOut);.  }else{.
10570 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
10580 6b 65 6e 28 72 65 73 21 3d 30 2c 20 28 70 4f 70  ken(res!=0, (pOp
10590 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55  ->p5 & SQLITE_NU
105a0 4c 4c 45 51 29 3f 32 3a 33 29 3b 0a 20 20 20 20  LLEQ)?2:3);.    
105b0 69 66 28 20 72 65 73 32 20 29 7b 0a 20 20 20 20  if( res2 ){.    
105c0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
105d0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  2;.    }.  }.  b
105e0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
105f0 64 65 3a 20 45 6c 73 65 4e 6f 74 45 71 20 2a 20  de: ElseNotEq * 
10600 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
10610 68 69 73 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  his opcode must 
10620 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
10630 6f 77 20 61 6e 20 4f 50 5f 4c 74 20 6f 72 20 4f  ow an OP_Lt or O
10640 50 5f 47 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  P_Gt comparison 
10650 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 66 20  operator..** If 
10660 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f  result of an OP_
10670 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e  Eq comparison on
10680 20 74 68 65 20 73 61 6d 65 20 74 77 6f 20 6f 70   the same two op
10690 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20  erands.** would 
106a0 68 61 76 65 20 62 65 20 4e 55 4c 4c 20 6f 72 20  have be NULL or 
106b0 66 61 6c 73 65 20 28 30 29 2c 20 74 68 65 6e 20  false (0), then 
106c0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
106d0 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75   .** If the resu
106e0 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63  lt of an OP_Eq c
106f0 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65  omparison on the
10700 20 74 77 6f 20 70 72 65 76 69 6f 75 73 20 6f 70   two previous op
10710 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20  erands.** would 
10720 68 61 76 65 20 62 65 65 6e 20 74 72 75 65 20 28  have been true (
10730 31 29 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  1), then fall th
10740 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rough..*/.case O
10750 50 5f 45 6c 73 65 4e 6f 74 45 71 3a 20 7b 20 20  P_ElseNotEq: {  
10760 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
10770 54 4b 5f 45 53 43 41 50 45 2c 20 6a 75 6d 70 20  TK_ESCAPE, jump 
10780 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
10790 3e 61 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74  >aOp );.  assert
107a0 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
107b0 3d 3d 4f 50 5f 4c 74 20 7c 7c 20 70 4f 70 5b 2d  ==OP_Lt || pOp[-
107c0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 47 74  1].opcode==OP_Gt
107d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
107e0 70 5b 2d 31 5d 2e 70 35 20 26 20 53 51 4c 49 54  p[-1].p5 & SQLIT
107f0 45 5f 53 54 4f 52 45 50 32 20 29 3b 0a 20 20 56  E_STOREP2 );.  V
10800 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 69  dbeBranchTaken(i
10810 43 6f 6d 70 61 72 65 21 3d 30 2c 20 32 29 3b 0a  Compare!=0, 2);.
10820 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65 21 3d    if( iCompare!=
10830 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
10840 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
10850 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72  ../* Opcode: Per
10860 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50  mutation * * * P
10870 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  4 *.**.** Set th
10880 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73  e permutation us
10890 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d  ed by the OP_Com
108a0 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20 69 6e  pare operator in
108b0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
108c0 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  truction.  The p
108d0 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 73 74  ermutation is st
108e0 6f 72 65 64 20 69 6e 20 74 68 65 20 50 34 20 6f  ored in the P4 o
108f0 70 65 72 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  perand..**.** Th
10900 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73  e permutation is
10910 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69   only valid unti
10920 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 43 6f  l the next OP_Co
10930 6d 70 61 72 65 20 74 68 61 74 20 68 61 73 0a 2a  mpare that has.*
10940 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52  * the OPFLAG_PER
10950 4d 55 54 45 20 62 69 74 20 73 65 74 20 69 6e 20  MUTE bit set in 
10960 50 35 2e 20 54 79 70 69 63 61 6c 6c 79 20 74 68  P5. Typically th
10970 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
10980 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63 63 75   should .** occu
10990 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72  r immediately pr
109a0 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ior to the OP_Co
109b0 6d 70 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mpare..**.** The
109c0 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
109d0 6e 20 74 68 65 20 50 34 20 69 6e 74 65 67 65 72  n the P4 integer
109e0 20 61 72 72 61 79 20 69 73 20 74 68 65 20 6c 65   array is the le
109f0 6e 67 74 68 20 6f 66 20 74 68 65 20 61 72 72 61  ngth of the arra
10a00 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
10a10 74 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f 66  t become part of
10a20 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
10a30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72  ..*/.case OP_Per
10a40 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73  mutation: {.  as
10a50 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
10a60 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29  e==P4_INTARRAY )
10a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
10a80 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 73 73 65  >p4.ai );.  asse
10a90 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64  rt( pOp[1].opcod
10aa0 65 3d 3d 4f 50 5f 43 6f 6d 70 61 72 65 20 29 3b  e==OP_Compare );
10ab0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31  .  assert( pOp[1
10ac0 5d 2e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45  ].p5 & OPFLAG_PE
10ad0 52 4d 55 54 45 20 29 3b 0a 20 20 62 72 65 61 6b  RMUTE );.  break
10ae0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
10af0 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50 33  Compare P1 P2 P3
10b00 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
10b10 69 73 3a 20 72 5b 50 31 40 50 33 5d 20 3c 2d 3e  is: r[P1@P3] <->
10b20 20 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20   r[P2@P3].**.** 
10b30 43 6f 6d 70 61 72 65 20 74 77 6f 20 76 65 63 74  Compare two vect
10b40 6f 72 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ors of registers
10b50 20 69 6e 20 72 65 67 28 50 31 29 2e 2e 72 65 67   in reg(P1)..reg
10b60 28 50 31 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20  (P1+P3-1) (call 
10b70 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22  this.** vector "
10b80 41 22 29 20 61 6e 64 20 69 6e 20 72 65 67 28 50  A") and in reg(P
10b90 32 29 2e 2e 72 65 67 28 50 32 2b 50 33 2d 31 29  2)..reg(P2+P3-1)
10ba0 20 28 22 42 22 29 2e 20 20 53 61 76 65 20 74 68   ("B").  Save th
10bb0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74  e result of.** t
10bc0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f  he comparison fo
10bd0 72 20 75 73 65 20 62 79 20 74 68 65 20 6e 65 78  r use by the nex
10be0 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75  t OP_Jump instru
10bf0 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  ct..**.** If P5 
10c00 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 50  has the OPFLAG_P
10c10 45 52 4d 55 54 45 20 62 69 74 20 73 65 74 2c 20  ERMUTE bit set, 
10c20 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72 20 6f  then the order o
10c30 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a  f comparison is.
10c40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
10c50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10c60 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20   OP_Permutation 
10c70 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68  operator.  If th
10c80 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d  e.** OPFLAG_PERM
10c90 55 54 45 20 62 69 74 20 69 73 20 63 6c 65 61 72  UTE bit is clear
10ca0 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  , then register 
10cb0 61 72 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20  are compared in 
10cc0 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72  sequential.** or
10cd0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  der..**.** P4 is
10ce0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
10cf0 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
10d00 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
10d10 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a  ences and sort.*
10d20 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74 68 65  * orders for the
10d30 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
10d40 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 70  e permutation ap
10d50 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73 74 65  plies to registe
10d60 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65  rs.** only.  The
10d70 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74   KeyInfo element
10d80 73 20 61 72 65 20 75 73 65 64 20 73 65 71 75 65  s are used seque
10d90 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntially..**.** T
10da0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
10db0 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73   a sort comparis
10dc0 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d  on, so NULLs com
10dd0 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e  pare equal,.** N
10de0 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20 74 68  ULLs are less th
10df0 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62  an numbers, numb
10e00 65 72 73 20 61 72 65 20 6c 65 73 73 20 74 68 61  ers are less tha
10e10 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e  n strings,.** an
10e20 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 6c 65  d strings are le
10e30 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
10e40 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72  /.case OP_Compar
10e50 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  e: {.  int n;.  
10e60 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b  int i;.  int p1;
10e70 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e  .  int p2;.  con
10e80 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
10e90 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Info;.  int idx;
10ea0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
10eb0 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
10ec0 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
10ed0 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20  se on this term 
10ee0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
10ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10f00 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73  for DESCENDING s
10f10 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  ort order */.  i
10f20 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
10f30 20 20 2f 2a 20 54 68 65 20 70 65 72 6d 75 74 61    /* The permuta
10f40 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 28  tion */..  if( (
10f50 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
10f60 5f 50 45 52 4d 55 54 45 29 3d 3d 30 20 29 7b 0a  _PERMUTE)==0 ){.
10f70 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d 20 30      aPermute = 0
10f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10f90 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
10fa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
10fb0 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
10fc0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 29 3b 0a  _Permutation );.
10fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
10fe0 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f 49  -1].p4type==P4_I
10ff0 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 20 20 61  NTARRAY );.    a
11000 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 5b 2d 31  Permute = pOp[-1
11010 5d 2e 70 34 2e 61 69 20 2b 20 31 3b 0a 20 20 20  ].p4.ai + 1;.   
11020 20 61 73 73 65 72 74 28 20 61 50 65 72 6d 75 74   assert( aPermut
11030 65 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 20  e!=0 );.  }.  n 
11040 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 4b 65  = pOp->p3;.  pKe
11050 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
11060 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65  pKeyInfo;.  asse
11070 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73  rt( n>0 );.  ass
11080 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
11090 20 29 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e   );.  p1 = pOp->
110a0 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e  p1;.  p2 = pOp->
110b0 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p2;.#ifdef SQLIT
110c0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61 50  E_DEBUG.  if( aP
110d0 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69 6e  ermute ){.    in
110e0 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20 20  t k, mx = 0;.   
110f0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b   for(k=0; k<n; k
11100 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74 65  ++) if( aPermute
11110 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61 50  [k]>mx ) mx = aP
11120 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20 61  ermute[k];.    a
11130 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
11140 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  1+mx<=(p->nMem+1
11150 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
11160 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11170 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 28  p2>0 && p2+mx<=(
11180 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
11190 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d  Cursor)+1 );.  }
111a0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
111b0 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d  ( p1>0 && p1+n<=
111c0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
111d0 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
111e0 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26    assert( p2>0 &
111f0 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p2+n<=(p->nMem
11200 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
11210 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  +1 );.  }.#endif
11220 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
11230 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11240 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64  <n; i++){.    id
11250 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61  x = aPermute ? a
11260 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a  Permute[i] : i;.
11270 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
11280 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b  sValid(&aMem[p1+
11290 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61 73 73  idx]) );.    ass
112a0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
112b0 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29  &aMem[p2+idx]) )
112c0 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
112d0 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d  RACE(p1+idx, &aM
112e0 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20  em[p1+idx]);.   
112f0 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
11300 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32  p2+idx, &aMem[p2
11310 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65  +idx]);.    asse
11320 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e  rt( i<pKeyInfo->
11330 6e 4b 65 79 46 69 65 6c 64 20 29 3b 0a 20 20 20  nKeyField );.   
11340 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66   pColl = pKeyInf
11350 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  o->aColl[i];.   
11360 20 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f   bRev = pKeyInfo
11370 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
11380 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20  .    iCompare = 
11390 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
113a0 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c  e(&aMem[p1+idx],
113b0 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20   &aMem[p2+idx], 
113c0 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pColl);.    if( 
113d0 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20  iCompare ){.    
113e0 20 20 69 66 28 20 62 52 65 76 20 29 20 69 43 6f    if( bRev ) iCo
113f0 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72  mpare = -iCompar
11400 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
11410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
11420 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
11430 20 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20 2a   Jump P1 P2 P3 *
11440 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
11450 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
11460 20 61 74 20 61 64 64 72 65 73 73 20 50 31 2c 20   at address P1, 
11470 50 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e 64  P2, or P3 depend
11480 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a  ing on whether.*
11490 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * in the most re
114a0 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20  cent OP_Compare 
114b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20  instruction the 
114c0 50 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c 65  P1 vector was le
114d0 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c  ss than.** equal
114e0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
114f0 74 68 61 6e 20 74 68 65 20 50 32 20 76 65 63 74  than the P2 vect
11500 6f 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  or, respectively
11510 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d  ..*/.case OP_Jum
11520 70 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  p: {            
11530 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66   /* jump */.  if
11540 28 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a  ( iCompare<0 ){.
11550 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
11560 6b 65 6e 28 30 2c 33 29 3b 20 70 4f 70 20 3d 20  ken(0,3); pOp = 
11570 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20 2d 20 31  &aOp[pOp->p1 - 1
11580 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  ];.  }else if( i
11590 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
115a0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
115b0 6e 28 31 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61  n(1,3); pOp = &a
115c0 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b  Op[pOp->p2 - 1];
115d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
115e0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c  beBranchTaken(2,
115f0 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  3); pOp = &aOp[p
11600 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a 20 20 7d  Op->p3 - 1];.  }
11610 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
11620 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50 31 20 50  Opcode: And P1 P
11630 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
11640 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50  psis: r[P3]=(r[P
11650 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a 2a 2a 0a  1] && r[P2]).**.
11660 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
11670 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76  cal AND of the v
11680 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
11690 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  rs P1 and P2 and
116a0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65  .** write the re
116b0 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
116c0 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
116d0 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20  either P1 or P2 
116e0 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65  is 0 (false) the
116f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
11700 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  0 even if.** the
11710 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
11720 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
11730 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55  d true or two NU
11740 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55  LLs give.** a NU
11750 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a  LL output..*/./*
11760 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50   Opcode: Or P1 P
11770 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
11780 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50  psis: r[P3]=(r[P
11790 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a 2a 2a 0a  1] || r[P2]).**.
117a0 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
117b0 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20 76 61  cal OR of the va
117c0 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
117d0 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
117e0 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e 73 77  * store the answ
117f0 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
11800 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  3..**.** If eith
11810 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20 6e  er P1 or P2 is n
11820 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20 74 68  onzero (true) th
11830 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
11840 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65 76 65   1 (true).** eve
11850 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72 20 69  n if the other i
11860 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
11870 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20   NULL and false 
11880 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20  or two NULLs.** 
11890 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70  give a NULL outp
118a0 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ut..*/.case OP_A
118b0 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd:             
118c0 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 41   /* same as TK_A
118d0 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  ND, in1, in2, ou
118e0 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72  t3 */.case OP_Or
118f0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
11900 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52  /* same as TK_OR
11910 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
11920 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20 20 20   */.  int v1;   
11930 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
11940 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  :  0==FALSE, 1==
11950 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
11960 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
11970 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69 67 68  t v2;    /* Righ
11980 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41  t operand: 0==FA
11990 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
119a0 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
119b0 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   */..  pIn1 = &a
119c0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
119d0 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
119e0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
119f0 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    v1 = 2;.  }els
11a00 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  e{.    v1 = sqli
11a10 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
11a20 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20  pIn1)!=0;.  }.  
11a30 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
11a40 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e  ->p2];.  if( pIn
11a50 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  2->flags & MEM_N
11a60 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20  ull ){.    v2 = 
11a70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
11a80 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  v2 = sqlite3Vdbe
11a90 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21 3d  IntValue(pIn2)!=
11aa0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
11ab0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64  ->opcode==OP_And
11ac0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
11ad0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11ae0 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d  ar and_logic[] =
11af0 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31   { 0, 0, 0, 0, 1
11b00 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a  , 2, 0, 2, 2 };.
11b10 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67      v1 = and_log
11b20 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
11b30 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
11b40 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
11b50 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20  char or_logic[] 
11b60 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20  = { 0, 1, 2, 1, 
11b70 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b  1, 1, 2, 1, 2 };
11b80 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67  .    v1 = or_log
11b90 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
11ba0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
11bb0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
11bc0 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d  v1==2 ){.    Mem
11bd0 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
11be0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  , MEM_Null);.  }
11bf0 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  else{.    pOut->
11c00 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65  u.i = v1;.    Me
11c10 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
11c20 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
11c30 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
11c40 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50  Opcode: Not P1 P
11c50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
11c60 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50  sis: r[P2]= !r[P
11c70 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  1].**.** Interpr
11c80 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  et the value in 
11c90 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
11ca0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
11cb0 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f   Store the.** bo
11cc0 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74  olean complement
11cd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
11ce0 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69    If the value i
11cf0 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
11d00 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   .** NULL, then 
11d10 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64  a NULL is stored
11d20 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20   in P2..*/.case 
11d30 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20  OP_Not: {       
11d40 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
11d50 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c   as TK_NOT, in1,
11d60 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20   out2 */.  pIn1 
11d70 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
11d80 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
11d90 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c  [pOp->p2];.  sql
11da0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
11db0 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69 66 28 20  ll(pOut);.  if( 
11dc0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
11dd0 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Null)==0 ){. 
11de0 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
11df0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f   MEM_Int;.    pO
11e00 75 74 2d 3e 75 2e 69 20 3d 20 21 73 71 6c 69 74  ut->u.i = !sqlit
11e10 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
11e20 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  In1);.  }.  brea
11e30 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
11e40 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20 2a 20   BitNot P1 P2 * 
11e50 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
11e60 20 72 5b 50 31 5d 3d 20 7e 72 5b 50 31 5d 0a 2a   r[P1]= ~r[P1].*
11e70 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
11e80 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
11e90 67 69 73 74 65 72 20 50 31 20 61 73 20 61 6e 20  gister P1 as an 
11ea0 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72 65 20  integer.  Store 
11eb0 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d 70  the.** ones-comp
11ec0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 50 31  lement of the P1
11ed0 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
11ee0 73 74 65 72 20 50 32 2e 20 20 49 66 20 50 31 20  ster P2.  If P1 
11ef0 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  holds.** a NULL 
11f00 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e 55 4c  then store a NUL
11f10 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  L in P2..*/.case
11f20 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20 20 20   OP_BitNot: {   
11f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
11f40 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54 2c 20  e as TK_BITNOT, 
11f50 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70  in1, out2 */.  p
11f60 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
11f70 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p1];.  pOut = &
11f80 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
11f90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
11fa0 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20  etNull(pOut);.  
11fb0 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
11fc0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
11fd0 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  ){.    pOut->fla
11fe0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
11ff0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e 73    pOut->u.i = ~s
12000 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
12010 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20  ue(pIn1);.  }.  
12020 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
12030 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32 20  ode: Once P1 P2 
12040 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c  * * *.**.** Fall
12050 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
12060 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
12070 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
12080 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a  this opcode is.*
12090 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 6f 6e  * encountered on
120a0 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
120b0 20 6f 66 20 74 68 65 20 62 79 74 65 2d 63 6f 64   of the byte-cod
120c0 65 20 70 72 6f 67 72 61 6d 2e 20 20 4a 75 6d 70  e program.  Jump
120d0 20 74 6f 20 50 32 0a 2a 2a 20 6f 6e 20 74 68 65   to P2.** on the
120e0 20 73 65 63 6f 6e 64 20 61 6e 64 20 61 6c 6c 20   second and all 
120f0 73 75 62 73 65 71 75 65 6e 74 20 65 6e 63 6f 75  subsequent encou
12100 6e 74 65 72 73 20 64 75 72 69 6e 67 20 74 68 65  nters during the
12110 20 73 61 6d 65 20 69 6e 76 6f 63 61 74 69 6f 6e   same invocation
12120 2e 0a 2a 2a 0a 2a 2a 20 54 6f 70 2d 6c 65 76 65  ..**.** Top-leve
12130 6c 20 70 72 6f 67 72 61 6d 73 20 64 65 74 65 72  l programs deter
12140 6d 69 6e 65 20 66 69 72 73 74 20 69 6e 76 6f 63  mine first invoc
12150 61 74 69 6f 6e 20 62 79 20 63 6f 6d 70 61 72 69  ation by compari
12160 6e 67 20 74 68 65 20 50 31 0a 2a 2a 20 6f 70 65  ng the P1.** ope
12170 72 61 6e 64 20 61 67 61 69 6e 73 74 20 74 68 65  rand against the
12180 20 50 31 20 6f 70 65 72 61 6e 64 20 6f 6e 20 74   P1 operand on t
12190 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64  he OP_Init opcod
121a0 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
121b0 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f  ng.** of the pro
121c0 67 72 61 6d 2e 20 20 49 66 20 74 68 65 20 50 31  gram.  If the P1
121d0 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 2c 20   values differ, 
121e0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
121f0 68 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 74 68  h and make.** th
12200 65 20 50 31 20 6f 66 20 74 68 69 73 20 6f 70 63  e P1 of this opc
12210 6f 64 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ode equal to the
12220 20 50 31 20 6f 66 20 4f 50 5f 49 6e 69 74 2e 20   P1 of OP_Init. 
12230 20 49 66 20 50 31 20 76 61 6c 75 65 73 20 61 72   If P1 values ar
12240 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 74 68  e.** the same th
12250 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
12260 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 75 62 70  ..**.** For subp
12270 72 6f 67 72 61 6d 73 2c 20 74 68 65 72 65 20 69  rograms, there i
12280 73 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 20 74  s a bitmask in t
12290 68 65 20 56 64 62 65 46 72 61 6d 65 20 74 68 61  he VdbeFrame tha
122a0 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  t determines.** 
122b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
122c0 68 65 20 6a 75 6d 70 20 73 68 6f 75 6c 64 20 62  he jump should b
122d0 65 20 74 61 6b 65 6e 2e 20 20 54 68 65 20 62 69  e taken.  The bi
122e0 74 6d 61 73 6b 20 69 73 20 6e 65 63 65 73 73 61  tmask is necessa
122f0 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  ry.** because th
12300 65 20 73 65 6c 66 2d 61 6c 74 65 72 69 6e 67 20  e self-altering 
12310 63 6f 64 65 20 74 72 69 63 6b 20 64 6f 65 73 20  code trick does 
12320 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 72 65 63  not work for rec
12330 75 72 73 69 76 65 0a 2a 2a 20 74 72 69 67 67 65  ursive.** trigge
12340 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  rs..*/.case OP_O
12350 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
12360 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
12370 75 33 32 20 69 41 64 64 72 3b 20 20 20 20 20 20  u32 iAddr;      
12380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12390 72 65 73 73 20 6f 66 20 74 68 69 73 20 69 6e 73  ress of this ins
123a0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73  truction */.  as
123b0 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e  sert( p->aOp[0].
123c0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
123d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  );.  if( p->pFra
123e0 6d 65 20 29 7b 0a 20 20 20 20 69 41 64 64 72 20  me ){.    iAddr 
123f0 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d  = (int)(pOp - p-
12400 3e 61 4f 70 29 3b 0a 20 20 20 20 69 66 28 20 28  >aOp);.    if( (
12410 70 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65  p->pFrame->aOnce
12420 5b 69 41 64 64 72 2f 38 5d 20 26 20 28 31 3c 3c  [iAddr/8] & (1<<
12430 28 69 41 64 64 72 20 26 20 37 29 29 29 21 3d 30  (iAddr & 7)))!=0
12440 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42 72   ){.      VdbeBr
12450 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32 29 3b  anchTaken(1, 2);
12460 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  .      goto jump
12470 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20  _to_p2;.    }.  
12480 20 20 70 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f 6e    p->pFrame->aOn
12490 63 65 5b 69 41 64 64 72 2f 38 5d 20 7c 3d 20 31  ce[iAddr/8] |= 1
124a0 3c 3c 28 69 41 64 64 72 20 26 20 37 29 3b 0a 20  <<(iAddr & 7);. 
124b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
124c0 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f  p->aOp[0].p1==pO
124d0 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20 56  p->p1 ){.      V
124e0 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31  dbeBranchTaken(1
124f0 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  , 2);.      goto
12500 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
12510 20 7d 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61   }.  }.  VdbeBra
12520 6e 63 68 54 61 6b 65 6e 28 30 2c 20 32 29 3b 0a  nchTaken(0, 2);.
12530 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e 61    pOp->p1 = p->a
12540 4f 70 5b 30 5d 2e 70 31 3b 0a 20 20 62 72 65 61  Op[0].p1;.  brea
12550 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
12560 20 49 66 20 50 31 20 50 32 20 50 33 20 2a 20 2a   If P1 P2 P3 * *
12570 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
12580 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
12590 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
125a0 20 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c 75   true.  The valu
125b0 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  e.** is consider
125c0 65 64 20 74 72 75 65 20 69 66 20 69 74 20 69 73  ed true if it is
125d0 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e 6f 6e   numeric and non
125e0 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 76  -zero.  If the v
125f0 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73  alue.** in P1 is
12600 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20   NULL then take 
12610 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64 20  the jump if and 
12620 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e 6f  only if P3 is no
12630 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70  n-zero..*/./* Op
12640 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50  code: IfNot P1 P
12650 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  2 P3 * *.**.** J
12660 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
12670 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
12680 65 72 20 50 31 20 69 73 20 46 61 6c 73 65 2e 20  er P1 is False. 
12690 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73   The value.** is
126a0 20 63 6f 6e 73 69 64 65 72 65 64 20 66 61 6c 73   considered fals
126b0 65 20 69 66 20 69 74 20 68 61 73 20 61 20 6e 75  e if it has a nu
126c0 6d 65 72 69 63 20 76 61 6c 75 65 20 6f 66 20 7a  meric value of z
126d0 65 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c  ero.  If the val
126e0 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e  ue.** in P1 is N
126f0 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68  ULL then take th
12700 65 20 6a 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e  e jump if and on
12710 6c 79 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d  ly if P3 is non-
12720 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  zero..*/.case OP
12730 5f 49 66 3a 20 20 20 20 20 20 20 20 20 20 20 20  _If:            
12740 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
12750 31 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  1 */.case OP_IfN
12760 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ot: {           
12770 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
12780 0a 20 20 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31  .  int c;.  pIn1
12790 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
127a0 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
127b0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
127c0 29 7b 0a 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e  ){.    c = pOp->
127d0 70 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p3;.  }else{.   
127e0 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
127f0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
12800 20 20 20 20 63 20 3d 20 70 49 6e 31 2d 3e 75 2e      c = pIn1->u.
12810 69 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  i!=0;.    }else{
12820 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74  .      c = sqlit
12830 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
12840 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 20 20 20 20  pIn1)!=0.0;.    
12850 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  }.    if( pOp->o
12860 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20  pcode==OP_IfNot 
12870 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20  ) c = !c;.  }.  
12880 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
12890 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  c!=0, 2);.  if( 
128a0 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  c ){.    goto ju
128b0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
128c0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
128d0 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50  ode: IsNull P1 P
128e0 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
128f0 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3d 3d 4e  sis: if r[P1]==N
12900 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  ULL goto P2.**.*
12910 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
12920 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
12930 69 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c  ister P1 is NULL
12940 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e  ..*/.case OP_IsN
12950 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
12960 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
12970 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e  ISNULL, jump, in
12980 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
12990 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
129a0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
129b0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
129c0 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 2c 20 32 29  MEM_Null)!=0, 2)
129d0 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
129e0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
129f0 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  !=0 ){.    goto 
12a00 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
12a10 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12a20 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50  pcode: NotNull P
12a30 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
12a40 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
12a50 21 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a  !=NULL goto P2.*
12a60 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
12a70 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
12a80 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6e  register P1 is n
12a90 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61  ot NULL.  .*/.ca
12aa0 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b  se OP_NotNull: {
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12ac0 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c  ame as TK_NOTNUL
12ad0 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  L, jump, in1 */.
12ae0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
12af0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42  Op->p1];.  VdbeB
12b00 72 61 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e  ranchTaken( (pIn
12b10 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12b20 75 6c 6c 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 69  ull)==0, 2);.  i
12b30 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
12b40 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
12b50 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  {.    goto jump_
12b60 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
12b70 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12b80 3a 20 49 66 4e 75 6c 6c 52 6f 77 20 50 31 20 50  : IfNullRow P1 P
12b90 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
12ba0 70 73 69 73 3a 20 69 66 20 50 31 2e 6e 75 6c 6c  psis: if P1.null
12bb0 52 6f 77 20 74 68 65 6e 20 72 5b 50 33 5d 3d 4e  Row then r[P3]=N
12bc0 55 4c 4c 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  ULL, goto P2.**.
12bd0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  ** Check the cur
12be0 73 6f 72 20 50 31 20 74 6f 20 73 65 65 20 69 66  sor P1 to see if
12bf0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
12c00 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 4e   pointing at a N
12c10 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 69  ULL row..** If i
12c20 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 72  t is, then set r
12c30 65 67 69 73 74 65 72 20 50 33 20 74 6f 20 4e 55  egister P3 to NU
12c40 4c 4c 20 61 6e 64 20 6a 75 6d 70 20 69 6d 6d 65  LL and jump imme
12c50 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
12c60 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74 20 6f  * If P1 is not o
12c70 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 2c 20 74 68  n a NULL row, th
12c80 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
12c90 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
12ca0 6e 79 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 0a 2a  ny.** changes..*
12cb0 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 75 6c 6c  /.case OP_IfNull
12cc0 52 6f 77 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  Row: {         /
12cd0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  * jump */.  asse
12ce0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
12cf0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
12d00 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
12d10 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
12d20 70 31 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  p1]!=0 );.  if( 
12d30 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
12d40 5d 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  ]->nullRow ){.  
12d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12d60 53 65 74 4e 75 6c 6c 28 61 4d 65 6d 20 2b 20 70  SetNull(aMem + p
12d70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 67 6f 74  Op->p3);.    got
12d80 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
12d90 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  }.  break;.}..#i
12da0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12db0 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
12dc0 4e 43 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 66  NC./* Opcode: Of
12dd0 66 73 65 74 20 50 31 20 50 32 20 50 33 20 2a 20  fset P1 P2 P3 * 
12de0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
12df0 5b 50 33 5d 20 3d 20 73 71 6c 69 74 65 5f 6f 66  [P3] = sqlite_of
12e00 66 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 53  fset(P1).**.** S
12e10 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65 72  tore in register
12e20 20 72 5b 50 33 5d 20 74 68 65 20 62 79 74 65 20   r[P3] the byte 
12e30 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
12e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
12e50 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73 74 61  at is the.** sta
12e60 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61  rt of the payloa
12e70 64 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  d for the record
12e80 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
12e90 75 72 73 6f 72 20 50 31 20 69 73 20 63 75 72 72  ursor P1 is curr
12ea0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
12eb0 67 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74  g..**.** P2 is t
12ec0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
12ed0 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e   for the argumen
12ee0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  t to the sqlite_
12ef0 6f 66 66 73 65 74 28 29 20 66 75 6e 63 74 69 6f  offset() functio
12f00 6e 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  n..** This opcod
12f10 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 50  e does not use P
12f20 32 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68  2 itself, but th
12f30 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 75 73  e P2 value is us
12f40 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 64  ed by the.** cod
12f50 65 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68  e generator.  Th
12f60 65 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50 33  e P1, P2, and P3
12f70 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 69   operands to thi
12f80 73 20 6f 70 63 6f 64 65 20 61 72 65 20 74 68 65  s opcode are the
12f90 0a 2a 2a 20 61 73 20 61 73 20 66 6f 72 20 4f 50  .** as as for OP
12fa0 5f 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54  _Column..**.** T
12fb0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  his opcode is on
12fc0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20  ly available if 
12fd0 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
12fe0 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 2d  ed with the.** -
12ff0 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  DSQLITE_ENABLE_O
13000 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 6f  FFSET_SQL_FUNC o
13010 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ption..*/.case O
13020 50 5f 4f 66 66 73 65 74 3a 20 7b 20 20 20 20 20  P_Offset: {     
13030 20 20 20 20 20 2f 2a 20 6f 75 74 33 20 2a 2f 0a       /* out3 */.
13040 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
13050 3b 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45  ;    /* The VDBE
13060 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 61 73 73   cursor */.  ass
13070 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
13080 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
13090 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
130a0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
130b0 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  ];.  pOut = &p->
130c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
130d0 20 69 66 28 20 4e 45 56 45 52 28 70 43 3d 3d 30   if( NEVER(pC==0
130e0 29 20 7c 7c 20 70 43 2d 3e 65 43 75 72 54 79 70  ) || pC->eCurTyp
130f0 65 21 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e!=CURTYPE_BTREE
13100 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13110 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
13120 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
13130 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
13140 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 73  SetInt64(pOut, s
13150 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73 65  qlite3BtreeOffse
13160 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
13170 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ));.  }.  break;
13180 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13190 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
131a0 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f  T_SQL_FUNC */../
131b0 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e  * Opcode: Column
131c0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
131d0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
131e0 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  3]=PX.**.** Inte
131f0 72 70 72 65 74 20 74 68 65 20 64 61 74 61 20 74  rpret the data t
13200 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f  hat cursor P1 po
13210 69 6e 74 73 20 74 6f 20 61 73 20 61 20 73 74 72  ints to as a str
13220 75 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69  ucture built usi
13230 6e 67 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65  ng.** the MakeRe
13240 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
13250 2e 20 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65  .  (See the Make
13260 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f  Record opcode fo
13270 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  r additional.** 
13280 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
13290 74 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  t the format of 
132a0 74 68 65 20 64 61 74 61 2e 29 20 20 45 78 74 72  the data.)  Extr
132b0 61 63 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f  act the P2-th co
132c0 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69  lumn.** from thi
132d0 73 20 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68  s record.  If th
132e0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
132f0 74 20 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c  t (P2+1) .** val
13300 75 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ues in the recor
13310 64 2c 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c  d, extract a NUL
13320 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  L..**.** The val
13330 75 65 20 65 78 74 72 61 63 74 65 64 20 69 73 20  ue extracted is 
13340 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
13350 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
13360 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61  the record conta
13370 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 50  ins fewer than P
13380 32 20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65  2 fields, then e
13390 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20  xtract a NULL.  
133a0 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34  Or,.** if the P4
133b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50   argument is a P
133c0 34 5f 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61  4_MEM use the va
133d0 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 61 72  lue of the P4 ar
133e0 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65  gument as.** the
133f0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
13400 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45  f the OPFLAG_CLE
13410 41 52 43 41 43 48 45 20 62 69 74 20 69 73 20 73  ARCACHE bit is s
13420 65 74 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20  et on P5 and P1 
13430 69 73 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  is a pseudo-tabl
13440 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65  e cursor,.** the
13450 6e 20 74 68 65 20 63 61 63 68 65 20 6f 66 20 74  n the cache of t
13460 68 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 73  he cursor is res
13470 65 74 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72  et prior to extr
13480 61 63 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  acting the colum
13490 6e 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  n..** The first 
134a0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73  OP_Column agains
134b0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
134c0 20 61 66 74 65 72 20 74 68 65 20 76 61 6c 75 65   after the value
134d0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a   of the content.
134e0 2a 2a 20 72 65 67 69 73 74 65 72 20 68 61 73 20  ** register has 
134f0 63 68 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68  changed should h
13500 61 76 65 20 74 68 69 73 20 62 69 74 20 73 65 74  ave this bit set
13510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
13520 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
13530 61 6e 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  and OPFLAG_TYPEO
13540 46 41 52 47 20 62 69 74 73 20 61 72 65 20 73 65  FARG bits are se
13550 74 20 6f 6e 20 50 35 20 74 68 65 6e 0a 2a 2a 20  t on P5 then.** 
13560 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
13570 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79  aranteed to only
13580 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
13590 61 72 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65  argument of a le
135a0 6e 67 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70  ngth().** or typ
135b0 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20  eof() function, 
135c0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
135d0 68 65 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61  he loading of la
135e0 72 67 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65  rge blobs can be
135f0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20  .** skipped for 
13600 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c  length() and all
13610 20 63 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67   content loading
13620 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20   can be skipped 
13630 66 6f 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f  for typeof()..*/
13640 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a  .case OP_Column:
13650 20 7b 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20   {.  int p2;    
13660 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d          /* colum
13670 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72  n number to retr
13680 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75  ieve */.  VdbeCu
13690 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20  rsor *pC;    /* 
136a0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
136b0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
136c0 43 72 73 72 3b 20 20 20 2f 2a 20 54 68 65 20 42  Crsr;   /* The B
136d0 54 72 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  Tree cursor */. 
136e0 20 75 33 32 20 2a 61 4f 66 66 73 65 74 3b 20 20   u32 *aOffset;  
136f0 20 20 20 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69      /* aOffset[i
13700 5d 20 69 73 20 6f 66 66 73 65 74 20 74 6f 20 73  ] is offset to s
13710 74 61 72 74 20 6f 66 20 64 61 74 61 20 66 6f 72  tart of data for
13720 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   i-th column */.
13730 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
13740 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67       /* The leng
13750 74 68 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c  th of the serial
13760 69 7a 65 64 20 64 61 74 61 20 66 6f 72 20 74 68  ized data for th
13770 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
13780 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13790 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
137a0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74   */.  Mem *pDest
137b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
137c0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65  e to write the e
137d0 78 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a  xtracted value *
137e0 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20  /.  Mem sMem;   
137f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74         /* For st
13800 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  oring the record
13810 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
13820 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44  /.  const u8 *zD
13830 61 74 61 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f  ata;   /* Part o
13840 66 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69  f the record bei
13850 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
13860 63 6f 6e 73 74 20 75 38 20 2a 7a 48 64 72 3b 20  const u8 *zHdr; 
13870 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72     /* Next unpar
13880 73 65 64 20 62 79 74 65 20 6f 66 20 74 68 65 20  sed byte of the 
13890 68 65 61 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  header */.  cons
138a0 74 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f  t u8 *zEndHdr; /
138b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
138c0 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
138d0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 36  e header */.  u6
138e0 34 20 6f 66 66 73 65 74 36 34 3b 20 20 20 20 20  4 offset64;     
138f0 20 2f 2a 20 36 34 2d 62 69 74 20 6f 66 66 73 65   /* 64-bit offse
13900 74 20 2a 2f 0a 20 20 75 33 32 20 74 3b 20 20 20  t */.  u32 t;   
13910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
13920 79 70 65 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ype code from th
13930 65 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  e record header 
13940 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20  */.  Mem *pReg; 
13950 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64          /* Pseud
13960 6f 54 61 62 6c 65 20 69 6e 70 75 74 20 72 65 67  oTable input reg
13970 69 73 74 65 72 20 2a 2f 0a 0a 20 20 70 43 20 3d  ister */..  pC =
13980 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
13990 31 5d 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e  1];.  p2 = pOp->
139a0 70 32 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p2;..  /* If the
139b0 20 63 75 72 73 6f 72 20 63 61 63 68 65 20 69 73   cursor cache is
139c0 20 73 74 61 6c 65 20 28 6d 65 61 6e 69 6e 67 20   stale (meaning 
139d0 69 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  it is not curren
139e0 74 6c 79 20 70 6f 69 6e 74 20 61 74 0a 20 20 2a  tly point at.  *
139f0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  * the correct ro
13a00 77 29 20 74 68 65 6e 20 62 72 69 6e 67 20 69 74  w) then bring it
13a10 20 75 70 2d 74 6f 2d 64 61 74 65 20 62 79 20 64   up-to-date by d
13a20 6f 69 6e 67 20 74 68 65 20 6e 65 63 65 73 73 61  oing the necessa
13a30 72 79 20 0a 20 20 2a 2a 20 42 2d 54 72 65 65 20  ry .  ** B-Tree 
13a40 73 65 65 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  seek. */.  rc = 
13a50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
13a60 72 4d 6f 76 65 74 6f 28 26 70 43 2c 20 26 70 32  rMoveto(&pC, &p2
13a70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
13a80 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
13a90 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74  error;..  assert
13aa0 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
13ab0 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
13ac0 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
13ad0 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61   );.  pDest = &a
13ae0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
13af0 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
13b00 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 61 73  (p, pDest);.  as
13b10 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
13b20 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
13b30 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
13b40 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
13b50 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46  ssert( p2<pC->nF
13b60 69 65 6c 64 20 29 3b 0a 20 20 61 4f 66 66 73 65  ield );.  aOffse
13b70 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b  t = pC->aOffset;
13b80 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
13b90 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
13ba0 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72  _VTAB );.  asser
13bb0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  t( pC->eCurType!
13bc0 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
13bd0 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  || pC->nullRow )
13be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
13bf0 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50  eCurType!=CURTYP
13c00 45 5f 53 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69  E_SORTER );..  i
13c10 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  f( pC->cacheStat
13c20 75 73 21 3d 70 2d 3e 63 61 63 68 65 43 74 72 20  us!=p->cacheCtr 
13c30 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13c40 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e    /*OPTIMIZATION
13c50 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
13c60 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  if( pC->nullRow 
13c70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d  ){.      if( pC-
13c80 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
13c90 50 45 5f 50 53 45 55 44 4f 20 29 7b 0a 20 20 20  PE_PSEUDO ){.   
13ca0 20 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20       /* For the 
13cb0 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
13cc0 61 73 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72  as pseudo-cursor
13cd0 2c 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  , the seekResult
13ce0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
13cf0 2a 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  * identifies the
13d00 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
13d10 6f 6c 64 73 20 74 68 65 20 72 65 63 6f 72 64 20  olds the record 
13d20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13d30 74 28 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c  t( pC->seekResul
13d40 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  t>0 );.        p
13d50 52 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e  Reg = &aMem[pC->
13d60 73 65 65 6b 52 65 73 75 6c 74 5d 3b 0a 20 20 20  seekResult];.   
13d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
13d80 67 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  g->flags & MEM_B
13d90 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lob );.        a
13da0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
13db0 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20 20 20  d(pReg) );.     
13dc0 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69     pC->payloadSi
13dd0 7a 65 20 3d 20 70 43 2d 3e 73 7a 52 6f 77 20 3d  ze = pC->szRow =
13de0 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20   pReg->n;.      
13df0 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38    pC->aRow = (u8
13e00 2a 29 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20  *)pReg->z;.     
13e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13e20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
13e30 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
13e40 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f        goto op_co
13e50 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  lumn_out;.      
13e60 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
13e70 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75     pCrsr = pC->u
13e80 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  c.pCursor;.     
13e90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
13ea0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
13eb0 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73  TREE );.      as
13ec0 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20  sert( pCrsr );. 
13ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
13ee0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
13ef0 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b  sValid(pCrsr) );
13f00 0a 20 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f  .      pC->paylo
13f10 61 64 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  adSize = sqlite3
13f20 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
13f30 28 70 43 72 73 72 29 3b 0a 20 20 20 20 20 20 70  (pCrsr);.      p
13f40 43 2d 3e 61 52 6f 77 20 3d 20 73 71 6c 69 74 65  C->aRow = sqlite
13f50 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
13f60 63 68 28 70 43 72 73 72 2c 20 26 70 43 2d 3e 73  ch(pCrsr, &pC->s
13f70 7a 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 73 73  zRow);.      ass
13f80 65 72 74 28 20 70 43 2d 3e 73 7a 52 6f 77 3c 3d  ert( pC->szRow<=
13f90 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
13fa0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13fb0 20 70 43 2d 3e 73 7a 52 6f 77 3c 3d 36 35 35 33   pC->szRow<=6553
13fc0 36 20 29 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  6 );  /* Maximum
13fd0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 36 34   page size is 64
13fe0 4b 69 42 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  KiB */.      if(
13ff0 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
14000 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   > (u32)db->aLim
14010 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14020 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
14030 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
14040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14050 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
14060 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72  us = p->cacheCtr
14070 3b 0a 20 20 20 20 70 43 2d 3e 69 48 64 72 4f 66  ;.    pC->iHdrOf
14080 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74  fset = getVarint
14090 33 32 28 70 43 2d 3e 61 52 6f 77 2c 20 61 4f 66  32(pC->aRow, aOf
140a0 66 73 65 74 5b 30 5d 29 3b 0a 20 20 20 20 70 43  fset[0]);.    pC
140b0 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30  ->nHdrParsed = 0
140c0 3b 0a 0a 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  ;...    if( pC->
140d0 73 7a 52 6f 77 3c 61 4f 66 66 73 65 74 5b 30 5d  szRow<aOffset[0]
140e0 20 29 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d   ){      /*OPTIM
140f0 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
14100 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e  */.      /* pC->
14110 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 61  aRow does not ha
14120 76 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  ve to hold the e
14130 6e 74 69 72 65 20 72 6f 77 2c 20 62 75 74 20 69  ntire row, but i
14140 74 20 64 6f 65 73 20 61 74 20 6c 65 61 73 74 0a  t does at least.
14150 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
14160 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65   cover the heade
14170 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  r of the record.
14180 20 20 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f    If pC->aRow do
14190 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20  es not contain. 
141a0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70       ** the comp
141b0 6c 65 74 65 20 68 65 61 64 65 72 2c 20 74 68 65  lete header, the
141c0 6e 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  n set it to zero
141d0 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 68 65  , forcing the he
141e0 61 64 65 72 20 74 6f 20 62 65 0a 20 20 20 20 20  ader to be.     
141f0 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
14200 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
14210 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30      pC->aRow = 0
14220 3b 0a 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f  ;.      pC->szRo
14230 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
14240 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72   Make sure a cor
14250 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68 61  rupt database ha
14260 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61  s not given us a
14270 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65  n oversize heade
14280 72 2e 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 74  r..      ** Do t
14290 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64  his now to avoid
142a0 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d   an oversize mem
142b0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ory allocation..
142c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
142d0 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63  * Type entries c
142e0 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  an be between 1 
142f0 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68  and 5 bytes each
14300 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62  .  But 4 and 5 b
14310 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  yte.      ** typ
14320 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64  es use so much d
14330 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20 74  ata space that t
14340 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65  here can only be
14350 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a   4096 and 32 of.
14360 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72        ** them, r
14370 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f  espectively.  So
14380 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61   the maximum hea
14390 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c  der length resul
143a0 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 20  ts from a.      
143b0 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 66  ** 3-byte type f
143c0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d  or each of the m
143d0 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20  aximum of 32768 
143e0 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
143f0 65 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ee.      ** extr
14400 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 20  a bytes for the 
14410 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74  header length it
14420 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b  self.  32768*3 +
14430 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20   3 = 98307..    
14440 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61    */.      if( a
14450 4f 66 66 73 65 74 5b 30 5d 20 3e 20 39 38 33 30  Offset[0] > 9830
14460 37 20 7c 7c 20 61 4f 66 66 73 65 74 5b 30 5d 20  7 || aOffset[0] 
14470 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  > pC->payloadSiz
14480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  e ){.        got
14490 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72  o op_column_corr
144a0 75 70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  upt;.      }.   
144b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
144c0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
144d0 6d 69 7a 61 74 69 6f 6e 2e 20 20 42 79 20 73 6b  mization.  By sk
144e0 69 70 70 69 6e 67 20 6f 76 65 72 20 74 68 65 20  ipping over the 
144f0 66 69 72 73 74 20 66 65 77 20 74 65 73 74 73 0a  first few tests.
14500 20 20 20 20 20 20 2a 2a 20 28 65 78 3a 20 70 43        ** (ex: pC
14510 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32  ->nHdrParsed<=p2
14520 29 20 69 6e 20 74 68 65 20 6e 65 78 74 20 73 65  ) in the next se
14530 63 74 69 6f 6e 2c 20 77 65 20 61 63 68 69 65 76  ction, we achiev
14540 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 6d 65 61  e a.      ** mea
14550 73 75 72 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  surable performa
14560 6e 63 65 20 67 61 69 6e 2e 0a 20 20 20 20 20 20  nce gain..      
14570 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
14580 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14590 20 65 76 65 6e 20 69 66 20 61 4f 66 66 73 65 74   even if aOffset
145a0 5b 30 5d 3d 3d 30 2e 20 20 53 75 63 68 20 61 20  [0]==0.  Such a 
145b0 72 65 63 6f 72 64 20 69 73 20 6e 65 76 65 72 0a  record is never.
145c0 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74        ** generat
145d0 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 61 6e  ed by SQLite, an
145e0 64 20 63 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69  d could be consi
145f0 64 65 72 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  dered corruption
14600 2c 20 62 75 74 20 77 65 0a 20 20 20 20 20 20 2a  , but we.      *
14610 2a 20 61 63 63 65 70 74 20 69 74 20 66 6f 72 20  * accept it for 
14620 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
14630 6e 73 2e 20 20 57 68 65 6e 20 61 4f 66 66 73 65  ns.  When aOffse
14640 74 5b 30 5d 3d 3d 30 2c 20 74 68 65 20 63 6f 64  t[0]==0, the cod
14650 65 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  e this.      ** 
14660 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 74 6f 20  branch jumps to 
14670 72 65 61 64 73 20 70 61 73 74 20 74 68 65 20 65  reads past the e
14680 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
14690 2c 20 62 75 74 20 6e 65 76 65 72 20 6d 6f 72 65  , but never more
146a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 61  .      ** than a
146b0 20 66 65 77 20 62 79 74 65 73 2e 20 20 45 76 65   few bytes.  Eve
146c0 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20  n if the record 
146d0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e  occurs at the en
146e0 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  d of the page.  
146f0 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 61      ** content a
14700 72 65 61 2c 20 74 68 65 20 22 70 61 67 65 20 68  rea, the "page h
14710 65 61 64 65 72 22 20 63 6f 6d 65 73 20 61 66 74  eader" comes aft
14720 65 72 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  er the page cont
14730 65 6e 74 20 61 6e 64 20 73 6f 0a 20 20 20 20 20  ent and so.     
14740 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 72 65 61   ** this overrea
14750 64 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  d is harmless.  
14760 53 69 6d 69 6c 61 72 20 6f 76 65 72 72 65 61 64  Similar overread
14770 73 20 63 61 6e 20 6f 63 63 75 72 20 66 6f 72 20  s can occur for 
14780 61 20 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20  a corrupt.      
14790 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
147a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
147b0 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
147c0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
147d0 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
147e0 3d 70 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f  =p2 );         /
147f0 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b  * Conditional sk
14800 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 74  ipped */.      t
14810 65 73 74 63 61 73 65 28 20 61 4f 66 66 73 65 74  estcase( aOffset
14820 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
14830 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72  goto op_column_r
14840 65 61 64 5f 68 65 61 64 65 72 3b 0a 20 20 20 20  ead_header;.    
14850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
14860 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 74   sure at least t
14870 68 65 20 66 69 72 73 74 20 70 32 2b 31 20 65 6e  he first p2+1 en
14880 74 72 69 65 73 20 6f 66 20 74 68 65 20 68 65 61  tries of the hea
14890 64 65 72 20 68 61 76 65 20 62 65 65 6e 0a 20 20  der have been.  
148a0 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 76 61  ** parsed and va
148b0 6c 69 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lid information 
148c0 69 73 20 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20  is in aOffset[] 
148d0 61 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e  and pC->aType[].
148e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e  .  */.  if( pC->
148f0 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29  nHdrParsed<=p2 )
14900 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
14910 65 20 69 73 20 6d 6f 72 65 20 68 65 61 64 65 72  e is more header
14920 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70   available for p
14930 61 72 73 69 6e 67 20 69 6e 20 74 68 65 20 72 65  arsing in the re
14940 63 6f 72 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a  cord, try.    **
14950 20 74 6f 20 65 78 74 72 61 63 74 20 61 64 64 69   to extract addi
14960 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 75 70  tional fields up
14970 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2b   through the p2+
14980 31 2d 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  1-th field .    
14990 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  */.    if( pC->i
149a0 48 64 72 4f 66 66 73 65 74 3c 61 4f 66 66 73 65  HdrOffset<aOffse
149b0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t[0] ){.      /*
149c0 20 4d 61 6b 65 20 73 75 72 65 20 7a 44 61 74 61   Make sure zData
149d0 20 70 6f 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67   points to enoug
149e0 68 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  h of the record 
149f0 74 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61  to cover the hea
14a00 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  der. */.      if
14a10 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b  ( pC->aRow==0 ){
14a20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
14a30 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
14a40 28 73 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20  (sMem));.       
14a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
14a60 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
14a70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
14a80 20 61 4f 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d   aOffset[0], &sM
14a90 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  em);.        if(
14aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ab0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
14ac0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
14ad0 20 20 7a 44 61 74 61 20 3d 20 28 75 38 2a 29 73    zData = (u8*)s
14ae0 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  Mem.z;.      }el
14af0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74  se{.        zDat
14b00 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20  a = pC->aRow;.  
14b10 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
14b20 2a 20 46 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54  * Fill in pC->aT
14b30 79 70 65 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73  ype[i] and aOffs
14b40 65 74 5b 69 5d 20 76 61 6c 75 65 73 20 74 68 72  et[i] values thr
14b50 6f 75 67 68 20 74 68 65 20 70 32 2d 74 68 20 66  ough the p2-th f
14b60 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f  ield. */.    op_
14b70 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64  column_read_head
14b80 65 72 3a 0a 20 20 20 20 20 20 69 20 3d 20 70 43  er:.      i = pC
14b90 2d 3e 6e 48 64 72 50 61 72 73 65 64 3b 0a 20 20  ->nHdrParsed;.  
14ba0 20 20 20 20 6f 66 66 73 65 74 36 34 20 3d 20 61      offset64 = a
14bb0 4f 66 66 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20  Offset[i];.     
14bc0 20 7a 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20   zHdr = zData + 
14bd0 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a  pC->iHdrOffset;.
14be0 20 20 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20        zEndHdr = 
14bf0 7a 44 61 74 61 20 2b 20 61 4f 66 66 73 65 74 5b  zData + aOffset[
14c00 30 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  0];.      testca
14c10 73 65 28 20 7a 48 64 72 3e 3d 7a 45 6e 64 48 64  se( zHdr>=zEndHd
14c20 72 20 29 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  r );.      do{. 
14c30 20 20 20 20 20 20 20 69 66 28 20 28 74 20 3d 20         if( (t = 
14c40 7a 48 64 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b  zHdr[0])<0x80 ){
14c50 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 2b  .          zHdr+
14c60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  +;.          off
14c70 73 65 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33  set64 += sqlite3
14c80 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
14c90 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20  lTypeLen(t);.   
14ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14cb0 20 20 20 20 20 20 7a 48 64 72 20 2b 3d 20 73 71        zHdr += sq
14cc0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
14cd0 28 7a 48 64 72 2c 20 26 74 29 3b 0a 20 20 20 20  (zHdr, &t);.    
14ce0 20 20 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b        offset64 +
14cf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14d00 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20  ialTypeLen(t);. 
14d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14d20 20 70 43 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20   pC->aType[i++] 
14d30 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 61 4f 66  = t;.        aOf
14d40 66 73 65 74 5b 69 5d 20 3d 20 28 75 33 32 29 28  fset[i] = (u32)(
14d50 6f 66 66 73 65 74 36 34 20 26 20 30 78 66 66 66  offset64 & 0xfff
14d60 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77  fffff);.      }w
14d70 68 69 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a  hile( i<=p2 && z
14d80 48 64 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a  Hdr<zEndHdr );..
14d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
14da0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 20 69  ord is corrupt i
14db0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
14dc0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
14dd0 0a 20 20 20 20 20 20 2a 2a 20 28 31 29 20 74 68  .      ** (1) th
14de0 65 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 68  e bytes of the h
14df0 65 61 64 65 72 20 65 78 74 65 6e 64 20 70 61 73  eader extend pas
14e00 74 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 68  t the declared h
14e10 65 61 64 65 72 20 73 69 7a 65 0a 20 20 20 20 20  eader size.     
14e20 20 2a 2a 20 28 32 29 20 74 68 65 20 65 6e 74 69   ** (2) the enti
14e30 72 65 20 68 65 61 64 65 72 20 77 61 73 20 75 73  re header was us
14e40 65 64 20 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64  ed but not all d
14e50 61 74 61 20 77 61 73 20 75 73 65 64 0a 20 20 20  ata was used.   
14e60 20 20 20 2a 2a 20 28 33 29 20 74 68 65 20 65 6e     ** (3) the en
14e70 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 65 78  d of the data ex
14e80 74 65 6e 64 73 20 62 65 79 6f 6e 64 20 74 68 65  tends beyond the
14e90 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
14ea0 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
14eb0 20 20 20 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45     if( (zHdr>=zE
14ec0 6e 64 48 64 72 20 26 26 20 28 7a 48 64 72 3e 7a  ndHdr && (zHdr>z
14ed0 45 6e 64 48 64 72 20 7c 7c 20 6f 66 66 73 65 74  EndHdr || offset
14ee0 36 34 21 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53  64!=pC->payloadS
14ef0 69 7a 65 29 29 0a 20 20 20 20 20 20 20 7c 7c 20  ize)).       || 
14f00 28 6f 66 66 73 65 74 36 34 20 3e 20 70 43 2d 3e  (offset64 > pC->
14f10 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20  payloadSize).   
14f20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66     ){.        if
14f30 28 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 20  ( aOffset[0]==0 
14f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  ){.          i =
14f50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 48   0;.          zH
14f60 64 72 20 3d 20 7a 45 6e 64 48 64 72 3b 0a 20 20  dr = zEndHdr;.  
14f70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14f80 20 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61         if( pC->a
14f90 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Row==0 ) sqlite3
14fa0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
14fb0 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sMem);.         
14fc0 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
14fd0 63 6f 72 72 75 70 74 3b 0a 20 20 20 20 20 20 20  corrupt;.       
14fe0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
14ff0 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64    pC->nHdrParsed
15000 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 43 2d 3e   = i;.      pC->
15010 69 48 64 72 4f 66 66 73 65 74 20 3d 20 28 75 33  iHdrOffset = (u3
15020 32 29 28 7a 48 64 72 20 2d 20 7a 44 61 74 61 29  2)(zHdr - zData)
15030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e  ;.      if( pC->
15040 61 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74 65  aRow==0 ) sqlite
15050 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
15060 26 73 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  &sMem);.    }els
15070 65 7b 0a 20 20 20 20 20 20 74 20 3d 20 30 3b 0a  e{.      t = 0;.
15080 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
15090 20 61 66 74 65 72 20 74 72 79 69 6e 67 20 74 6f   after trying to
150a0 20 65 78 74 72 61 63 74 20 6e 65 77 20 65 6e 74   extract new ent
150b0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 68 65  ries from the he
150c0 61 64 65 72 2c 20 6e 48 64 72 50 61 72 73 65 64  ader, nHdrParsed
150d0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c   is.    ** still
150e0 20 6e 6f 74 20 75 70 20 74 6f 20 70 32 2c 20 74   not up to p2, t
150f0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
15100 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 66 65  he record has fe
15110 77 65 72 20 74 68 61 6e 20 70 32 0a 20 20 20 20  wer than p2.    
15120 2a 2a 20 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20  ** columns.  So 
15130 74 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20  the result will 
15140 62 65 20 65 69 74 68 65 72 20 74 68 65 20 64 65  be either the de
15150 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 72 20 61  fault value or a
15160 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
15170 20 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50 61    if( pC->nHdrPa
15180 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20  rsed<=p2 ){.    
15190 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
151a0 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20  e==P4_MEM ){.   
151b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
151c0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
151d0 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d  Dest, pOp->p4.pM
151e0 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b  em, MEM_Static);
151f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15210 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73  eMemSetNull(pDes
15220 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
15230 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
15240 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  _out;.    }.  }e
15250 6c 73 65 7b 0a 20 20 20 20 74 20 3d 20 70 43 2d  lse{.    t = pC-
15260 3e 61 54 79 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a  >aType[p2];.  }.
15270 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68  .  /* Extract th
15280 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68  e content for th
15290 65 20 70 32 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e  e p2+1-th column
152a0 2e 20 20 43 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f  .  Control can o
152b0 6e 6c 79 0a 20 20 2a 2a 20 72 65 61 63 68 20 74  nly.  ** reach t
152c0 68 69 73 20 70 6f 69 6e 74 20 69 66 20 61 4f 66  his point if aOf
152d0 66 73 65 74 5b 70 32 5d 2c 20 61 4f 66 66 73 65  fset[p2], aOffse
152e0 74 5b 70 32 2b 31 5d 2c 20 61 6e 64 20 70 43 2d  t[p2+1], and pC-
152f0 3e 61 54 79 70 65 5b 70 32 5d 20 61 72 65 0a 20  >aType[p2] are. 
15300 20 2a 2a 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 20   ** all valid.. 
15310 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 32   */.  assert( p2
15320 3c 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20  <pC->nHdrParsed 
15330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
15340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15350 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
15360 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
15370 69 61 6e 74 73 28 70 44 65 73 74 29 20 29 3b 0a  iants(pDest) );.
15380 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e    if( VdbeMemDyn
15390 61 6d 69 63 28 70 44 65 73 74 29 20 29 7b 0a 20  amic(pDest) ){. 
153a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
153b0 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
153c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
153d0 3d 3d 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20  ==pC->aType[p2] 
153e0 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 73 7a 52  );.  if( pC->szR
153f0 6f 77 3e 3d 61 4f 66 66 73 65 74 5b 70 32 2b 31  ow>=aOffset[p2+1
15400 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ] ){.    /* This
15410 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
15420 61 73 65 20 77 68 65 72 65 20 74 68 65 20 64 65  ase where the de
15430 73 69 72 65 64 20 63 6f 6e 74 65 6e 74 20 66 69  sired content fi
15440 74 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  ts on the origin
15450 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 2d  al.    ** page -
15460 20 77 68 65 72 65 20 74 68 65 20 63 6f 6e 74 65   where the conte
15470 6e 74 20 69 73 20 6e 6f 74 20 6f 6e 20 61 6e 20  nt is not on an 
15480 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  overflow page */
15490 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43 2d  .    zData = pC-
154a0 3e 61 52 6f 77 20 2b 20 61 4f 66 66 73 65 74 5b  >aRow + aOffset[
154b0 70 32 5d 3b 0a 20 20 20 20 69 66 28 20 74 3c 31  p2];.    if( t<1
154c0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
154d0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
154e0 7a 44 61 74 61 2c 20 74 2c 20 70 44 65 73 74 29  zData, t, pDest)
154f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15500 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
15510 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 61 20 73  umn value is a s
15520 74 72 69 6e 67 2c 20 77 65 20 6e 65 65 64 20 61  tring, we need a
15530 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75   persistent valu
15540 65 2c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  e, not.      ** 
15550 61 20 4d 45 4d 5f 45 70 68 65 6d 20 76 61 6c 75  a MEM_Ephem valu
15560 65 2e 20 20 54 68 69 73 20 62 72 61 6e 63 68 20  e.  This branch 
15570 69 73 20 61 20 66 61 73 74 20 73 68 6f 72 74 2d  is a fast short-
15580 63 75 74 20 74 68 61 74 20 69 73 20 65 71 75 69  cut that is equi
15590 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  valent.      ** 
155a0 74 6f 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  to calling sqlit
155b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
155c0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  ) and sqlite3Vdb
155d0 65 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28  eDeephemeralize(
155e0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
155f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
15600 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
15610 45 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72  EM_Blob, MEM_Str
15620 7c 4d 45 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20 20  |MEM_Term };.   
15630 20 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 6c 65     pDest->n = le
15640 6e 20 3d 20 28 74 2d 31 32 29 2f 32 3b 0a 20 20  n = (t-12)/2;.  
15650 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d      pDest->enc =
15660 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20   encoding;.     
15670 20 69 66 28 20 70 44 65 73 74 2d 3e 73 7a 4d 61   if( pDest->szMa
15680 6c 6c 6f 63 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a  lloc < len+2 ){.
15690 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66          pDest->f
156a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
156b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
156c0 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
156d0 70 44 65 73 74 2c 20 6c 65 6e 2b 32 2c 20 30 29  pDest, len+2, 0)
156e0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
156f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15700 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20       pDest->z = 
15710 70 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a  pDest->zMalloc;.
15720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
15730 6d 63 70 79 28 70 44 65 73 74 2d 3e 7a 2c 20 7a  mcpy(pDest->z, z
15740 44 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Data, len);.    
15750 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20    pDest->z[len] 
15760 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73 74  = 0;.      pDest
15770 2d 3e 7a 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a  ->z[len+1] = 0;.
15780 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61        pDest->fla
15790 67 73 20 3d 20 61 46 6c 61 67 5b 74 26 31 5d 3b  gs = aFlag[t&1];
157a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
157b0 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d      pDest->enc =
157c0 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 2f   encoding;.    /
157d0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 68 61  * This branch ha
157e0 70 70 65 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20  ppens only when 
157f0 63 6f 6e 74 65 6e 74 20 69 73 20 6f 6e 20 6f 76  content is on ov
15800 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
15810 20 20 20 20 69 66 28 20 28 28 70 4f 70 2d 3e 70      if( ((pOp->p
15820 35 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  5 & (OPFLAG_LENG
15830 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
15840 45 4f 46 41 52 47 29 29 21 3d 30 0a 20 20 20 20  EOFARG))!=0.    
15850 20 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31 32        && ((t>=12
15860 20 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c   && (t&1)==0) ||
15870 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
15880 41 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d 30  AG_TYPEOFARG)!=0
15890 29 29 0a 20 20 20 20 20 7c 7c 20 28 6c 65 6e 20  )).     || (len 
158a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
158b0 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 29 3d 3d  ialTypeLen(t))==
158c0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
158d0 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20 69 72 72  * Content is irr
158e0 65 6c 65 76 61 6e 74 20 66 6f 72 0a 20 20 20 20  elevant for.    
158f0 20 20 2a 2a 20 20 20 20 31 2e 20 74 68 65 20 74    **    1. the t
15900 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
15910 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 32 2e  ,.      **    2.
15920 20 74 68 65 20 6c 65 6e 67 74 68 28 58 29 20 66   the length(X) f
15930 75 6e 63 74 69 6f 6e 20 69 66 20 58 20 69 73 20  unction if X is 
15940 61 20 62 6c 6f 62 2c 20 61 6e 64 0a 20 20 20 20  a blob, and.    
15950 20 20 2a 2a 20 20 20 20 33 2e 20 69 66 20 74 68    **    3. if th
15960 65 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68  e content length
15970 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20   is zero..      
15980 2a 2a 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  ** So we might a
15990 73 20 77 65 6c 6c 20 75 73 65 20 62 6f 67 75 73  s well use bogus
159a0 20 63 6f 6e 74 65 6e 74 20 72 61 74 68 65 72 20   content rather 
159b0 74 68 61 6e 20 72 65 61 64 69 6e 67 0a 20 20 20  than reading.   
159c0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72     ** content fr
159d0 6f 6d 20 64 69 73 6b 2e 20 0a 20 20 20 20 20 20  om disk. .      
159e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 68  **.      ** Alth
159f0 6f 75 67 68 20 73 71 6c 69 74 65 33 56 64 62 65  ough sqlite3Vdbe
15a00 53 65 72 69 61 6c 47 65 74 28 29 20 6d 61 79 20  SerialGet() may 
15a10 72 65 61 64 20 61 74 20 6d 6f 73 74 20 38 20 62  read at most 8 b
15a20 79 74 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ytes from the.  
15a30 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61      ** buffer pa
15a40 73 73 65 64 20 74 6f 20 69 74 2c 20 64 65 62 75  ssed to it, debu
15a50 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 56  gging function V
15a60 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
15a70 74 28 29 20 6d 61 79 0a 20 20 20 20 20 20 2a 2a  t() may.      **
15a80 20 72 65 61 64 20 75 70 20 74 6f 20 31 36 2e 20   read up to 16. 
15a90 53 6f 20 31 36 20 62 79 74 65 73 20 6f 66 20 62  So 16 bytes of b
15aa0 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  ogus content is 
15ab0 73 75 70 70 6c 69 65 64 2e 0a 20 20 20 20 20 20  supplied..      
15ac0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
15ad0 75 38 20 61 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f  u8 aZero[16];  /
15ae0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 62 6f  * This is the bo
15af0 67 75 73 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  gus content */. 
15b00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15b10 53 65 72 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c  SerialGet(aZero,
15b20 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   t, pDest);.    
15b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
15b40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
15b50 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75 63  FromBtree(pC->uc
15b60 2e 70 43 75 72 73 6f 72 2c 20 61 4f 66 66 73 65  .pCursor, aOffse
15b70 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20 70 44 65 73  t[p2], len, pDes
15b80 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
15ba0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
15bb0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  error;.      sql
15bc0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
15bd0 74 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 44 65  t((const u8*)pDe
15be0 73 74 2d 3e 7a 2c 20 74 2c 20 70 44 65 73 74 29  st->z, t, pDest)
15bf0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66  ;.      pDest->f
15c00 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68  lags &= ~MEM_Eph
15c10 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f  em;.    }.  }..o
15c20 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20  p_column_out:.  
15c30 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
15c40 49 5a 45 28 70 44 65 73 74 29 3b 0a 20 20 52 45  IZE(pDest);.  RE
15c50 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
15c60 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20  ->p3, pDest);.  
15c70 62 72 65 61 6b 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d  break;..op_colum
15c80 6e 5f 63 6f 72 72 75 70 74 3a 0a 20 20 69 66 28  n_corrupt:.  if(
15c90 20 61 4f 70 5b 30 5d 2e 70 33 3e 30 20 29 7b 0a   aOp[0].p3>0 ){.
15ca0 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 61      pOp = &aOp[a
15cb0 4f 70 5b 30 5d 2e 70 33 2d 31 5d 3b 0a 20 20 20  Op[0].p3-1];.   
15cc0 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 7b   break;.  }else{
15cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15ce0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
15cf0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
15d00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
15d10 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66  }../* Opcode: Af
15d20 66 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50  finity P1 P2 * P
15d30 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
15d40 20 61 66 66 69 6e 69 74 79 28 72 5b 50 31 40 50   affinity(r[P1@P
15d50 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20  2]).**.** Apply 
15d60 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20  affinities to a 
15d70 72 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69  range of P2 regi
15d80 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
15d90 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  ith P1..**.** P4
15da0 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
15db0 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65  t is P2 characte
15dc0 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20 4e 2d 74  rs long. The N-t
15dd0 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  h character of t
15de0 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64  he.** string ind
15df0 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d  icates the colum
15e00 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  n affinity that 
15e10 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
15e20 6f 72 20 74 68 65 20 4e 2d 74 68 0a 2a 2a 20 6d  or the N-th.** m
15e30 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68  emory cell in th
15e40 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65  e range..*/.case
15e50 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a   OP_Affinity: {.
15e60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
15e70 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68  ffinity;   /* Th
15e80 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
15e90 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 7a   applied */..  z
15ea0 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e  Affinity = pOp->
15eb0 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20  p4.z;.  assert( 
15ec0 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a  zAffinity!=0 );.
15ed0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
15ee0 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
15ef0 20 7a 41 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e   zAffinity[pOp->
15f00 70 32 5d 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  p2]==0 );.  pIn1
15f10 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
15f20 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  ];.  do{.    ass
15f30 65 72 74 28 20 70 49 6e 31 20 3c 3d 20 26 70 2d  ert( pIn1 <= &p-
15f40 3e 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31  >aMem[(p->nMem+1
15f50 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20   - p->nCursor)] 
15f60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
15f70 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20  emIsValid(pIn1) 
15f80 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  );.    applyAffi
15f90 6e 69 74 79 28 70 49 6e 31 2c 20 2a 28 7a 41 66  nity(pIn1, *(zAf
15fa0 66 69 6e 69 74 79 2b 2b 29 2c 20 65 6e 63 6f 64  finity++), encod
15fb0 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b  ing);.    pIn1++
15fc0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66  ;.  }while( zAff
15fd0 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20 62 72  inity[0] );.  br
15fe0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
15ff0 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31  e: MakeRecord P1
16000 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
16010 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 6d  ynopsis: r[P3]=m
16020 6b 72 65 63 28 72 5b 50 31 40 50 32 5d 29 0a 2a  krec(r[P1@P2]).*
16030 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32 20  *.** Convert P2 
16040 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
16050 69 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74 6f  ing with P1 into
16060 20 74 68 65 20 5b 72 65 63 6f 72 64 20 66 6f 72   the [record for
16070 6d 61 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61  mat].** use as a
16080 20 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e 20   data record in 
16090 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
160a0 20 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20   or as a key.** 
160b0 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68  in an index.  Th
160c0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
160d0 64 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68  de can decode th
160e0 65 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a  e record later..
160f0 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20  **.** P4 may be 
16100 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
16110 20 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c   P2 characters l
16120 6f 6e 67 2e 20 20 54 68 65 20 4e 2d 74 68 20 63  ong.  The N-th c
16130 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
16140 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
16150 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
16160 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
16170 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
16180 74 68 65 20 4e 2d 74 68 0a 2a 2a 20 66 69 65 6c  the N-th.** fiel
16190 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
161a0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ey..**.** The ma
161b0 70 70 69 6e 67 20 66 72 6f 6d 20 63 68 61 72 61  pping from chara
161c0 63 74 65 72 20 74 6f 20 61 66 66 69 6e 69 74 79  cter to affinity
161d0 20 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65   is given by the
161e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20   SQLITE_AFF_.** 
161f0 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 69  macros defined i
16200 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a  n sqliteInt.h..*
16210 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 4e 55  *.** If P4 is NU
16220 4c 4c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65  LL then all inde
16230 78 20 66 69 65 6c 64 73 20 68 61 76 65 20 74 68  x fields have th
16240 65 20 61 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e  e affinity BLOB.
16250 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65  .*/.case OP_Make
16260 52 65 63 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a  Record: {.  u8 *
16270 7a 4e 65 77 52 65 63 6f 72 64 3b 20 20 20 20 20  zNewRecord;     
16280 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
16290 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20  o hold the data 
162a0 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f  for the new reco
162b0 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65  rd */.  Mem *pRe
162c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
162d0 2a 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64  * The new record
162e0 20 2a 2f 0a 20 20 75 36 34 20 6e 44 61 74 61 3b   */.  u64 nData;
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16300 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16310 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f  of data space */
16320 0a 20 20 69 6e 74 20 6e 48 64 72 3b 20 20 20 20  .  int nHdr;    
16330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16340 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16350 68 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a  header space */.
16360 20 20 69 36 34 20 6e 42 79 74 65 3b 20 20 20 20    i64 nByte;    
16370 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
16380 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
16390 66 6f 72 20 74 68 69 73 20 72 65 63 6f 72 64 20  for this record 
163a0 2a 2f 0a 20 20 69 36 34 20 6e 5a 65 72 6f 3b 20  */.  i64 nZero; 
163b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
163c0 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79  umber of zero by
163d0 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tes at the end o
163e0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
163f0 20 20 69 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20    int nVarint;  
16400 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16410 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
16420 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
16430 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 20 20 20   serial_type;   
16440 20 20 20 20 2f 2a 20 54 79 70 65 20 66 69 65 6c      /* Type fiel
16450 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74  d */.  Mem *pDat
16460 61 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a0;           /*
16470 20 46 69 72 73 74 20 66 69 65 6c 64 20 74 6f 20   First field to 
16480 62 65 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  be combined into
16490 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
164a0 20 4d 65 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20   Mem *pLast;    
164b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
164c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 72 65 63  field of the rec
164d0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ord */.  int nFi
164e0 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
164f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
16500 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  lds in the recor
16510 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  d */.  char *zAf
16520 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 2f 2a  finity;       /*
16530 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   The affinity st
16540 72 69 6e 67 20 66 6f 72 20 74 68 65 20 72 65 63  ring for the rec
16550 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c  ord */.  int fil
16560 65 5f 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20  e_format;       
16570 2f 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 74  /* File format t
16580 6f 20 75 73 65 20 66 6f 72 20 65 6e 63 6f 64 69  o use for encodi
16590 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ng */.  int i;  
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165b0 2a 20 53 70 61 63 65 20 75 73 65 64 20 69 6e 20  * Space used in 
165c0 7a 4e 65 77 52 65 63 6f 72 64 5b 5d 20 68 65 61  zNewRecord[] hea
165d0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  der */.  int j; 
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 69 6e  /* Space used in
16600 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d 20 63 6f   zNewRecord[] co
16610 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6c  ntent */.  u32 l
16620 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
16630 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61    /* Length of a
16640 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20   field */..  /* 
16650 41 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63  Assuming the rec
16660 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66  ord contains N f
16670 69 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72  ields, the recor
16680 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20  d format looks. 
16690 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20   ** like this:. 
166a0 20 2a 2a 0a 20 20 2a 2a 20 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 2d 2d 2d  ----------------
166f0 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a  -.  ** | hdr-siz
16700 65 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70  e | type 0 | typ
16710 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65  e 1 | ... | type
16720 20 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e   N-1 | data0 | .
16730 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20  .. | data N-1 | 
16740 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
16750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
16790 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29   **.  ** Data(0)
167a0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72   is taken from r
167b0 65 67 69 73 74 65 72 20 50 31 2e 20 20 44 61 74  egister P1.  Dat
167c0 61 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20  a(1) comes from 
167d0 72 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20  register P1+1.  
167e0 2a 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** and so forth.
167f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20  .  **.  ** Each 
16800 74 79 70 65 20 66 69 65 6c 64 20 69 73 20 61 20  type field is a 
16810 76 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74  varint represent
16820 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20 74  ing the serial t
16830 79 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  ype of the .  **
16840 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
16850 61 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65  ata element (see
16860 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16870 61 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20  alType()). The. 
16880 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65   ** hdr-size fie
16890 6c 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72  ld is also a var
168a0 69 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  int which is the
168b0 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65   offset from the
168c0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
168d0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  of the record to
168e0 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e   data0..  */.  n
168f0 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20  Data = 0;       
16900 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16910 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61  ytes of data spa
16920 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30  ce */.  nHdr = 0
16930 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
16940 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16950 20 68 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f   header space */
16960 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  .  nZero = 0;   
16970 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16980 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74  of zero bytes at
16990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
169a0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65  record */.  nFie
169b0 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  ld = pOp->p1;.  
169c0 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
169d0 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
169e0 20 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70   nField>0 && pOp
169f0 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
16a00 32 2b 6e 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d  2+nField<=(p->nM
16a10 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
16a20 72 29 2b 31 20 29 3b 0a 20 20 70 44 61 74 61 30  r)+1 );.  pData0
16a30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d   = &aMem[nField]
16a40 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70  ;.  nField = pOp
16a50 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20  ->p2;.  pLast = 
16a60 26 70 44 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31  &pData0[nField-1
16a70 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74  ];.  file_format
16a80 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69   = p->minWriteFi
16a90 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20  leFormat;..  /* 
16aa0 49 64 65 6e 74 69 66 79 20 74 68 65 20 6f 75 74  Identify the out
16ab0 70 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  put register */.
16ac0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
16ad0 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70  3<pOp->p1 || pOp
16ae0 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f  ->p3>=pOp->p1+pO
16af0 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75 74 20  p->p2 );.  pOut 
16b00 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
16b10 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
16b20 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a  ange(p, pOut);..
16b30 20 20 2f 2a 20 41 70 70 6c 79 20 74 68 65 20 72    /* Apply the r
16b40 65 71 75 65 73 74 65 64 20 61 66 66 69 6e 69 74  equested affinit
16b50 79 20 74 6f 20 61 6c 6c 20 69 6e 70 75 74 73 0a  y to all inputs.
16b60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16b70 44 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a  Data0<=pLast );.
16b80 20 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20    if( zAffinity 
16b90 29 7b 0a 20 20 20 20 70 52 65 63 20 3d 20 70 44  ){.    pRec = pD
16ba0 61 74 61 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  ata0;.    do{.  
16bb0 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
16bc0 79 28 70 52 65 63 2b 2b 2c 20 2a 28 7a 41 66 66  y(pRec++, *(zAff
16bd0 69 6e 69 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69  inity++), encodi
16be0 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ng);.      asser
16bf0 74 28 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d  t( zAffinity[0]=
16c00 3d 30 20 7c 7c 20 70 52 65 63 3c 3d 70 4c 61 73  =0 || pRec<=pLas
16c10 74 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  t );.    }while(
16c20 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d 20 29 3b   zAffinity[0] );
16c30 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
16c40 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f  ITE_ENABLE_NULL_
16c50 54 52 49 4d 0a 20 20 2f 2a 20 4e 55 4c 4c 73 20  TRIM.  /* NULLs 
16c60 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 74 72  can be safely tr
16c70 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 65  immed from the e
16c80 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
16c90 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 20 20 2a  , as long as.  *
16ca0 2a 20 61 73 20 74 68 65 20 73 63 68 65 6d 61 20  * as the schema 
16cb0 66 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20 6d  format is 2 or m
16cc0 6f 72 65 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20  ore and none of 
16cd0 74 68 65 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75  the omitted colu
16ce0 6d 6e 73 0a 20 20 2a 2a 20 68 61 76 65 20 61 20  mns.  ** have a 
16cf0 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
16d00 20 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74   value.  Also, t
16d10 68 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 62  he record must b
16d20 65 20 6c 65 66 74 20 77 69 74 68 0a 20 20 2a 2a  e left with.  **
16d30 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 69   at least one fi
16d40 65 6c 64 2e 20 20 49 66 20 50 35 3e 30 20 74 68  eld.  If P5>0 th
16d50 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 6e  en it will be on
16d60 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 0a  e more than the.
16d70 20 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68    ** index of th
16d80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
16d90 75 6d 6e 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e  umn with a non-N
16da0 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
16db0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e  e */.  if( pOp->
16dc0 70 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  p5 ){.    while(
16dd0 20 28 70 4c 61 73 74 2d 3e 66 6c 61 67 73 20 26   (pLast->flags &
16de0 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 26 26   MEM_Null)!=0 &&
16df0 20 6e 46 69 65 6c 64 3e 70 4f 70 2d 3e 70 35 20   nField>pOp->p5 
16e00 29 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 2d  ){.      pLast--
16e10 3b 0a 20 20 20 20 20 20 6e 46 69 65 6c 64 2d 2d  ;.      nField--
16e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
16e30 69 66 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  if..  /* Loop th
16e40 72 6f 75 67 68 20 74 68 65 20 65 6c 65 6d 65 6e  rough the elemen
16e50 74 73 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b  ts that will mak
16e60 65 20 75 70 20 74 68 65 20 72 65 63 6f 72 64 20  e up the record 
16e70 74 6f 20 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f  to figure.  ** o
16e80 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
16e90 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
16ea0 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  r the new record
16eb0 2e 0a 20 20 2a 2f 0a 20 20 70 52 65 63 20 3d 20  ..  */.  pRec = 
16ec0 70 4c 61 73 74 3b 0a 20 20 64 6f 7b 0a 20 20 20  pLast;.  do{.   
16ed0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
16ee0 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20  lid(pRec) );.   
16ef0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
16f00 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16f10 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65 5f  Type(pRec, file_
16f20 66 6f 72 6d 61 74 2c 20 26 6c 65 6e 29 3b 0a 20  format, &len);. 
16f30 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
16f40 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
16f50 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
16f60 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
16f70 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 77       /* Values w
16f80 69 74 68 20 4d 45 4d 5f 4e 75 6c 6c 20 61 6e 64  ith MEM_Null and
16f90 20 4d 45 4d 5f 5a 65 72 6f 20 61 72 65 20 63 72   MEM_Zero are cr
16fa0 65 61 74 65 64 20 62 79 20 78 43 6f 6c 75 6d 6e  eated by xColumn
16fb0 20 76 69 72 74 75 61 6c 0a 20 20 20 20 20 20 20   virtual.       
16fc0 20 2a 2a 20 74 61 62 6c 65 20 6d 65 74 68 6f 64   ** table method
16fd0 73 20 74 68 61 74 20 6e 65 76 65 72 20 69 6e 76  s that never inv
16fe0 6f 6b 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75  oke sqlite3_resu
16ff0 6c 74 5f 78 78 78 78 78 28 29 20 77 68 69 6c 65  lt_xxxxx() while
17000 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  .        ** comp
17010 75 74 69 6e 67 20 61 6e 20 75 6e 63 68 61 6e 67  uting an unchang
17020 69 6e 67 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ing column value
17030 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74   in an UPDATE st
17040 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
17050 20 2a 2a 20 47 69 76 65 20 73 75 63 68 20 76 61   ** Give such va
17060 6c 75 65 73 20 61 20 73 70 65 63 69 61 6c 20 69  lues a special i
17070 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79  nternal-use-only
17080 20 73 65 72 69 61 6c 2d 74 79 70 65 20 6f 66 20   serial-type of 
17090 31 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  10.        ** so
170a0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
170b0 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
170c0 20 74 6f 20 78 55 70 64 61 74 65 20 61 6e 64 20   to xUpdate and 
170d0 68 61 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  have.        ** 
170e0 61 20 74 72 75 65 20 73 71 6c 69 74 65 33 5f 76  a true sqlite3_v
170f0 61 6c 75 65 5f 6e 6f 63 68 61 6e 67 65 28 29 2e  alue_nochange().
17100 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
17110 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46  rt( pOp->p5==OPF
17120 4c 41 47 5f 4e 4f 43 48 4e 47 5f 4d 41 47 49 43  LAG_NOCHNG_MAGIC
17130 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
17140 3b 0a 20 20 20 20 20 20 20 20 73 65 72 69 61 6c  ;.        serial
17150 5f 74 79 70 65 20 3d 20 31 30 3b 0a 20 20 20 20  _type = 10;.    
17160 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 44 61 74    }else if( nDat
17170 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
17180 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45   sqlite3VdbeMemE
17190 78 70 61 6e 64 42 6c 6f 62 28 70 52 65 63 29 20  xpandBlob(pRec) 
171a0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
171b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
171c0 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70 52 65      nZero += pRe
171d0 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  c->u.nZero;.    
171e0 20 20 20 20 6c 65 6e 20 2d 3d 20 70 52 65 63 2d      len -= pRec-
171f0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
17200 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 61 74  }.    }.    nDat
17210 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 74 65  a += len;.    te
17220 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
17230 79 70 65 3d 3d 31 32 37 20 29 3b 0a 20 20 20 20  ype==127 );.    
17240 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
17250 5f 74 79 70 65 3d 3d 31 32 38 20 29 3b 0a 20 20  _type==128 );.  
17260 20 20 6e 48 64 72 20 2b 3d 20 73 65 72 69 61 6c    nHdr += serial
17270 5f 74 79 70 65 3c 3d 31 32 37 20 3f 20 31 20 3a  _type<=127 ? 1 :
17280 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
17290 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
172a0 20 20 20 20 70 52 65 63 2d 3e 75 54 65 6d 70 20      pRec->uTemp 
172b0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  = serial_type;. 
172c0 20 20 20 69 66 28 20 70 52 65 63 3d 3d 70 44 61     if( pRec==pDa
172d0 74 61 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ta0 ) break;.   
172e0 20 70 52 65 63 2d 2d 3b 0a 20 20 7d 77 68 69 6c   pRec--;.  }whil
172f0 65 28 31 29 3b 0a 0a 20 20 2f 2a 20 45 56 49 44  e(1);..  /* EVID
17300 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 35 36 34  ENCE-OF: R-22564
17310 2d 31 31 36 34 37 20 54 68 65 20 68 65 61 64 65  -11647 The heade
17320 72 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  r begins with a 
17330 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 0a 20 20  single varint.  
17340 2a 2a 20 77 68 69 63 68 20 64 65 74 65 72 6d 69  ** which determi
17350 6e 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  nes the total nu
17360 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
17370 20 74 68 65 20 68 65 61 64 65 72 2e 20 54 68 65   the header. The
17380 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 76 61 6c   varint.  ** val
17390 75 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ue is the size o
173a0 66 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  f the header in 
173b0 62 79 74 65 73 20 69 6e 63 6c 75 64 69 6e 67 20  bytes including 
173c0 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74 0a  the size varint.
173d0 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 2a 2f 0a    ** itself. */.
173e0 20 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72    testcase( nHdr
173f0 3d 3d 31 32 36 20 29 3b 0a 20 20 74 65 73 74 63  ==126 );.  testc
17400 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 37 20 29  ase( nHdr==127 )
17410 3b 0a 20 20 69 66 28 20 6e 48 64 72 3c 3d 31 32  ;.  if( nHdr<=12
17420 36 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  6 ){.    /* The 
17430 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
17440 20 20 20 6e 48 64 72 20 2b 3d 20 31 3b 0a 20 20     nHdr += 1;.  
17450 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 61  }else{.    /* Ra
17460 72 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 61  re case of a rea
17470 6c 6c 79 20 6c 61 72 67 65 20 68 65 61 64 65 72  lly large header
17480 20 2a 2f 0a 20 20 20 20 6e 56 61 72 69 6e 74 20   */.    nVarint 
17490 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
174a0 65 6e 28 6e 48 64 72 29 3b 0a 20 20 20 20 6e 48  en(nHdr);.    nH
174b0 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 3b 0a 20  dr += nVarint;. 
174c0 20 20 20 69 66 28 20 6e 56 61 72 69 6e 74 3c 73     if( nVarint<s
174d0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
174e0 6e 48 64 72 29 20 29 20 6e 48 64 72 2b 2b 3b 0a  nHdr) ) nHdr++;.
174f0 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48    }.  nByte = nH
17500 64 72 2b 6e 44 61 74 61 3b 0a 20 20 69 66 28 20  dr+nData;.  if( 
17510 6e 42 79 74 65 2b 6e 5a 65 72 6f 3e 64 62 2d 3e  nByte+nZero>db->
17520 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
17530 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
17540 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
17550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
17560 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  sure the output 
17570 72 65 67 69 73 74 65 72 20 68 61 73 20 61 20 62  register has a b
17580 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
17590 67 68 20 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a  gh to store .  *
175a0 2a 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  * the new record
175b0 2e 20 54 68 65 20 6f 75 74 70 75 74 20 72 65 67  . The output reg
175c0 69 73 74 65 72 20 28 70 4f 70 2d 3e 70 33 29 20  ister (pOp->p3) 
175d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
175e0 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66  o.  ** be one of
175f0 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
17600 74 65 72 73 20 28 62 65 63 61 75 73 65 20 74 68  ters (because th
17610 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
17620 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
17630 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
17640 65 73 69 7a 65 28 29 20 63 6f 75 6c 64 20 63 6c  esize() could cl
17650 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75 65 20  obber the value 
17660 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65  before it is use
17670 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  d)..  */.  if( s
17680 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
17690 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4f 75 74  arAndResize(pOut
176a0 2c 20 28 69 6e 74 29 6e 42 79 74 65 29 20 29 7b  , (int)nByte) ){
176b0 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
176c0 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f  ;.  }.  zNewReco
176d0 72 64 20 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d  rd = (u8 *)pOut-
176e0 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  >z;..  /* Write 
176f0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
17700 69 20 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28  i = putVarint32(
17710 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e 48 64 72  zNewRecord, nHdr
17720 29 3b 0a 20 20 6a 20 3d 20 6e 48 64 72 3b 0a 20  );.  j = nHdr;. 
17730 20 61 73 73 65 72 74 28 20 70 44 61 74 61 30 3c   assert( pData0<
17740 3d 70 4c 61 73 74 20 29 3b 0a 20 20 70 52 65 63  =pLast );.  pRec
17750 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 64 6f 7b   = pData0;.  do{
17760 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65  .    serial_type
17770 20 3d 20 70 52 65 63 2d 3e 75 54 65 6d 70 3b 0a   = pRec->uTemp;.
17780 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17790 4f 46 3a 20 52 2d 30 36 35 32 39 2d 34 37 33 36  OF: R-06529-4736
177a0 32 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  2 Following the 
177b0 73 69 7a 65 20 76 61 72 69 6e 74 20 61 72 65 20  size varint are 
177c0 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  one or more.    
177d0 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ** additional va
177e0 72 69 6e 74 73 2c 20 6f 6e 65 20 70 65 72 20 63  rints, one per c
177f0 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 20  olumn. */.    i 
17800 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
17810 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73  zNewRecord[i], s
17820 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 20 20 20  erial_type);    
17830 20 20 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61          /* seria
17840 6c 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a  l type */.    /*
17850 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17860 36 34 35 33 36 2d 35 31 37 32 38 20 54 68 65 20  64536-51728 The 
17870 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63 68 20  values for each 
17880 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
17890 63 6f 72 64 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  cord.    ** imme
178a0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74  diately follow t
178b0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
178c0 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    j += sqlite3Vd
178d0 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65  beSerialPut(&zNe
178e0 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 70 52 65 63  wRecord[j], pRec
178f0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20  , serial_type); 
17900 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  /* content */.  
17910 7d 77 68 69 6c 65 28 20 28 2b 2b 70 52 65 63 29  }while( (++pRec)
17920 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 61 73 73  <=pLast );.  ass
17930 65 72 74 28 20 69 3d 3d 6e 48 64 72 20 29 3b 0a  ert( i==nHdr );.
17940 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 42 79    assert( j==nBy
17950 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  te );..  assert(
17960 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
17970 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p3<=(p->nMem+
17980 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
17990 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28  );.  pOut->n = (
179a0 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75  int)nByte;.  pOu
179b0 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  t->flags = MEM_B
179c0 6c 6f 62 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f  lob;.  if( nZero
179d0 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e   ){.    pOut->u.
179e0 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20  nZero = nZero;. 
179f0 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c     pOut->flags |
17a00 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a  = MEM_Zero;.  }.
17a10 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
17a20 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b  (pOp->p3, pOut);
17a30 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
17a40 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20  OBSIZE(pOut);.  
17a50 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
17a60 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31 20 50 32  ode: Count P1 P2
17a70 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
17a80 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75 6e 74 28  is: r[P2]=count(
17a90 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ).**.** Store th
17aa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
17ab0 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72 20  ies (an integer 
17ac0 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74 61  value) in the ta
17ad0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a  ble or index .**
17ae0 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f   opened by curso
17af0 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65 72  r P1 in register
17b00 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   P2.*/.#ifndef S
17b10 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
17b20 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f  COUNT.case OP_Co
17b30 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  unt: {         /
17b40 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36 34 20  * out2 */.  i64 
17b50 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43 75 72 73  nEntry;.  BtCurs
17b60 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 61 73  or *pCrsr;..  as
17b70 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
17b80 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70  Op->p1]->eCurTyp
17b90 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
17ba0 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 2d   );.  pCrsr = p-
17bb0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
17bc0 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
17bd0 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a  ssert( pCrsr );.
17be0 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 2f    nEntry = 0;  /
17bf0 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f  * Not needed.  O
17c00 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c 65  nly used to sile
17c10 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a  nce a warning. *
17c20 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
17c30 42 74 72 65 65 43 6f 75 6e 74 28 70 43 72 73 72  BtreeCount(pCrsr
17c40 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20 69 66  , &nEntry);.  if
17c50 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
17c60 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
17c70 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
17c80 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
17c90 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e  .  pOut->u.i = n
17ca0 45 6e 74 72 79 3b 0a 20 20 62 72 65 61 6b 3b 0a  Entry;.  break;.
17cb0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
17cc0 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74 20 50  ode: Savepoint P
17cd0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
17ce0 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   Open, release o
17cf0 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  r rollback the s
17d00 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62  avepoint named b
17d10 79 20 70 61 72 61 6d 65 74 65 72 20 50 34 2c 20  y parameter P4, 
17d20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
17d30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31 2e  the value of P1.
17d40 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 73   To open a new s
17d50 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e  avepoint, P1==0.
17d60 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   To release (com
17d70 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74  mit) an.** exist
17d80 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c 20 50  ing savepoint, P
17d90 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c  1==1, or to roll
17da0 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69 6e 67  back an existing
17db0 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32   savepoint P1==2
17dc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76  ..*/.case OP_Sav
17dd0 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20  epoint: {.  int 
17de0 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
17df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
17e00 61 6c 75 65 20 6f 66 20 50 31 20 6f 70 65 72 61  alue of P1 opera
17e10 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  nd */.  char *zN
17e20 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
17e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17e40 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  of savepoint */.
17e50 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53    int nName;.  S
17e60 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a  avepoint *pNew;.
17e70 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61    Savepoint *pSa
17e80 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70  vepoint;.  Savep
17e90 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e  oint *pTmp;.  in
17ea0 74 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  t iSavepoint;.  
17eb0 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20  int ii;..  p1 = 
17ec0 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65  pOp->p1;.  zName
17ed0 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20   = pOp->p4.z;.. 
17ee0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
17ef0 74 68 65 20 70 31 20 70 61 72 61 6d 65 74 65 72  the p1 parameter
17f00 20 69 73 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20   is valid. Also 
17f10 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
17f20 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72   no open.  ** tr
17f30 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
17f40 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65 20  there cannot be 
17f50 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  any savepoints. 
17f60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17f70 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d  db->pSavepoint==
17f80 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
17f90 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
17fa0 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  rt( p1==SAVEPOIN
17fb0 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56  T_BEGIN||p1==SAV
17fc0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c  EPOINT_RELEASE||
17fd0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
17fe0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
17ff0 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  rt( db->pSavepoi
18000 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e  nt || db->isTran
18010 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
18020 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18030 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
18040 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20 20 61 73  ount(db) );.  as
18050 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
18060 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d  er );..  if( p1=
18070 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  =SAVEPOINT_BEGIN
18080 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
18090 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a  nVdbeWrite>0 ){.
180a0 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
180b0 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20  avepoint cannot 
180c0 62 65 20 63 72 65 61 74 65 64 20 69 66 20 74 68  be created if th
180d0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77  ere are active w
180e0 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 73  rite .      ** s
180f0 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20  tatements (i.e. 
18100 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74 65 20  open read/write 
18110 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
18120 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20   handles)..     
18130 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
18140 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63  3VdbeError(p, "c
18150 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65 70  annot open savep
18160 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61 74 65  oint - SQL state
18170 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73  ments in progres
18180 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s");.      rc = 
18190 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
181a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e   }else{.      nN
181b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
181c0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a 23  len30(zName);..#
181d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
181e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
181f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
18200 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e 20 69 66  ll is Ok even if
18210 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20   this savepoint 
18220 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 74 72  is actually a tr
18230 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
18240 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 28 61 6e  ** savepoint (an
18250 64 20 74 68 65 72 65 66 6f 72 65 20 73 68 6f 75  d therefore shou
18260 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74 20 78 53  ld not prompt xS
18270 61 76 65 70 6f 69 6e 74 28 29 29 20 63 61 6c 6c  avepoint()) call
18280 62 61 63 6b 73 2e 0a 20 20 20 20 20 20 2a 2a 20  backs..      ** 
18290 49 66 20 74 68 69 73 20 69 73 20 61 20 74 72 61  If this is a tra
182a0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
182b0 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c  nt being opened,
182c0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
182d0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  d.      ** that 
182e0 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
182f0 5d 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  ] array is empty
18300 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
18310 72 74 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  rt( db->autoComm
18320 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 54  it==0 || db->nVT
18330 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rans==0 );.     
18340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
18350 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
18360 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 0a  AVEPOINT_BEGIN,.
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
183a0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
183b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
183c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
183d0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
183e0 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  r;.#endif..     
183f0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
18400 20 73 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   savepoint struc
18410 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ture. */.      p
18420 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
18430 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
18440 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e 74 29  izeof(Savepoint)
18450 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20  +nName+1);.     
18460 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
18470 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65       pNew->zName
18480 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77   = (char *)&pNew
18490 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  [1];.        mem
184a0 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c  cpy(pNew->zName,
184b0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
184c0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f  ;.    .        /
184d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
184e0 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
184f0 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 69  n, then mark thi
18500 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 0a 20  s as a special. 
18510 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61 6e 73         ** "trans
18520 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
18530 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ". */.        if
18540 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
18550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62   ){.          db
18560 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
18570 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
18580 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
18590 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  epoint = 1;.    
185a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
185b0 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f       db->nSavepo
185c0 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  int++;.        }
185d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  ..        /* Lin
185e0 6b 20 74 68 65 20 6e 65 77 20 73 61 76 65 70 6f  k the new savepo
185f0 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  int into the dat
18600 61 62 61 73 65 20 68 61 6e 64 6c 65 27 73 20 6c  abase handle's l
18610 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ist. */.        
18620 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 64 62  pNew->pNext = db
18630 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
18640 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70        db->pSavep
18650 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  oint = pNew;.   
18660 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65       pNew->nDefe
18670 72 72 65 64 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e  rredCons = db->n
18680 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20  DeferredCons;.  
18690 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66        pNew->nDef
186a0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 64  erredImmCons = d
186b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
186c0 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ons;.      }.   
186d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
186e0 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  iSavepoint = 0;.
186f0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  .    /* Find the
18700 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e 74   named savepoint
18710 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
18720 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 2c   such savepoint,
18730 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20   then an.    ** 
18740 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
18750 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
18760 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20  .  */.    for(. 
18770 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20       pSavepoint 
18780 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
18790 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  ; .      pSavepo
187a0 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53 74  int && sqlite3St
187b0 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e 74  rICmp(pSavepoint
187c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
187d0 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e  .      pSavepoin
187e0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
187f0 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20 20  pNext.    ){.   
18800 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b 3b     iSavepoint++;
18810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
18820 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
18830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
18840 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73 75 63 68  rror(p, "no such
18850 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c   savepoint: %s",
18860 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
18870 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
18880 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18890 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30  db->nVdbeWrite>0
188a0 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e   && p1==SAVEPOIN
188b0 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
188c0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
188d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 6c 65  possible to rele
188e0 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
188f0 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68 65 72  avepoint if ther
18900 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  e are .      ** 
18910 61 63 74 69 76 65 20 77 72 69 74 65 20 73 74 61  active write sta
18920 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a  tements..      *
18930 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
18940 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e  dbeError(p, "can
18950 6e 6f 74 20 72 65 6c 65 61 73 65 20 73 61 76 65  not release save
18960 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20 20  point - ".      
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
18990 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
189a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
189b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
189c0 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f 2a 20  else{..      /* 
189d0 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
189e0 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 69 73  r or not this is
189f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73   a transaction s
18a00 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 73 6f 2c  avepoint. If so,
18a10 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
18a20 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45 20  is is a RELEASE 
18a30 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 74 68  command, then th
18a40 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
18a50 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ction .      ** 
18a60 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 0a 20  is committed. . 
18a70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
18a80 74 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20  t isTransaction 
18a90 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e  = pSavepoint->pN
18aa0 65 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e 69 73  ext==0 && db->is
18ab0 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
18ac0 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20  oint;.      if( 
18ad0 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26  isTransaction &&
18ae0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
18af0 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
18b00 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69    if( (rc = sqli
18b10 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
18b20 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , 1))!=SQLITE_OK
18b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
18b40 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
18b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b60 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
18b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
18b80 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  ( sqlite3VdbeHal
18b90 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  t(p)==SQLITE_BUS
18ba0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  Y ){.          p
18bb0 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70  ->pc = (int)(pOp
18bc0 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 20   - aOp);.       
18bd0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
18be0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
18bf0 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
18c00 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
18c10 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
18c20 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
18c30 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54  .        db->isT
18c40 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
18c50 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  int = 0;.       
18c60 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20   rc = p->rc;.   
18c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18c80 20 20 69 6e 74 20 69 73 53 63 68 65 6d 61 43 68    int isSchemaCh
18c90 61 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 69 53  ange;.        iS
18ca0 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e  avepoint = db->n
18cb0 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53 61 76  Savepoint - iSav
18cc0 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20 20  epoint - 1;.    
18cd0 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45      if( p1==SAVE
18ce0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
18cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63  {.          isSc
18d00 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62  hemaChange = (db
18d10 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
18d20 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
18d30 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
18d40 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d  for(ii=0; ii<db-
18d50 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  >nDb; ii++){.   
18d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18d70 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
18d80 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e 61 44 62  lCursors(db->aDb
18d90 5b 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20 20 20  [ii].pBt,.      
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
18dd0 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20 20 20  LLBACK,.        
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18e00 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3d 3d 30  sSchemaChange==0
18e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e30 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
18e40 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
18e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18e70 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20   isSchemaChange 
18e80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
18e90 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
18ea0 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
18eb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  +){.          rc
18ec0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
18ed0 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  avepoint(db->aDb
18ee0 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53  [ii].pBt, p1, iS
18ef0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
18f00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18f20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
18f30 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
18f40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18f60 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20   isSchemaChange 
18f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
18f80 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
18f90 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
18fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18fb0 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
18fc0 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
18fd0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
18fe0 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
18ff0 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
19000 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
19010 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
19020 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
19030 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
19040 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c   RELEASE or ROLL
19050 42 41 43 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c  BACK, destroy al
19060 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65  l .      ** save
19070 70 6f 69 6e 74 73 20 6e 65 73 74 65 64 20 69 6e  points nested in
19080 73 69 64 65 20 6f 66 20 74 68 65 20 73 61 76 65  side of the save
19090 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72  point being oper
190a0 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
190b0 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
190c0 76 65 70 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f  vepoint!=pSavepo
190d0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  int ){.        p
190e0 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
190f0 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62  oint;.        db
19100 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
19110 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
19120 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19130 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20  e(db, pTmp);.   
19140 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f       db->nSavepo
19150 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a  int--;.      }..
19160 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
19170 73 20 61 20 52 45 4c 45 41 53 45 2c 20 74 68 65  s a RELEASE, the
19180 6e 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  n destroy the sa
19190 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70  vepoint being op
191a0 65 72 61 74 65 64 20 6f 6e 20 0a 20 20 20 20 20  erated on .     
191b0 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69 74 20 69   ** too. If it i
191c0 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c  s a ROLLBACK TO,
191d0 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6e 75   then set the nu
191e0 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72 65 64  mber of deferred
191f0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
19200 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
19210 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
19220 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20  database to the 
19230 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 20 20 20  value stored.   
19240 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 73     ** when the s
19250 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65  avepoint was cre
19260 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
19270 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
19280 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
19290 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 61       assert( pSa
192a0 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61  vepoint==db->pSa
192b0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20  vepoint );.     
192c0 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
192d0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
192e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
192f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19300 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   pSavepoint);.  
19310 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61        if( !isTra
19320 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
19330 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70        db->nSavep
19340 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  oint--;.        
19350 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
19360 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
19370 72 72 65 64 43 6f 6e 73 20 3d 20 70 53 61 76 65  rredCons = pSave
19380 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64  point->nDeferred
19390 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62  Cons;.        db
193a0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
193b0 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ns = pSavepoint-
193c0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
193d0 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  s;.      }..    
193e0 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63    if( !isTransac
193f0 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d 53 41 56 45  tion || p1==SAVE
19400 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
19410 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19420 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
19430 69 6e 74 28 64 62 2c 20 70 31 2c 20 69 53 61 76  int(db, p1, iSav
19440 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
19450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19460 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
19470 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
19480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19490 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
194a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
194b0 6f 72 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  or;..  break;.}.
194c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f  ./* Opcode: Auto
194d0 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 2a  Commit P1 P2 * *
194e0 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65   *.**.** Set the
194f0 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63   database auto-c
19500 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31  ommit flag to P1
19510 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32   (1 or 0). If P2
19520 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a   is true, roll.*
19530 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65  * back any curre
19540 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72 65  ntly active btre
19550 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  e transactions. 
19560 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
19570 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28   active.** VMs (
19580 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20  apart from this 
19590 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c  one), then a ROL
195a0 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 20  LBACK fails.  A 
195b0 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 0a  COMMIT fails if.
195c0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 63 74  ** there are act
195d0 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d 73 20  ive writing VMs 
195e0 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20 74 68  or active VMs th
195f0 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
19600 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
19610 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73  instruction caus
19620 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c  es the VM to hal
19630 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75  t..*/.case OP_Au
19640 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e  toCommit: {.  in
19650 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  t desiredAutoCom
19660 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c  mit;.  int iRoll
19670 62 61 63 6b 3b 0a 0a 20 20 64 65 73 69 72 65 64  back;..  desired
19680 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70  AutoCommit = pOp
19690 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63  ->p1;.  iRollbac
196a0 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  k = pOp->p2;.  a
196b0 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
196c0 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64  toCommit==1 || d
196d0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
196e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
196f0 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19700 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61  it==1 || iRollba
19710 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
19720 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
19730 76 65 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c  ve>0 );  /* At l
19740 65 61 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d  east this one VM
19750 20 69 73 20 61 63 74 69 76 65 20 2a 2f 0a 20 20   is active */.  
19760 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
19770 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 64  ader );..  if( d
19780 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
19790 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  !=db->autoCommit
197a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c   ){.    if( iRol
197b0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  lback ){.      a
197c0 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
197d0 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20  toCommit==1 );. 
197e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
197f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
19800 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
19810 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  K);.      db->au
19820 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
19830 20 20 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69    }else if( desi
19840 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26  redAutoCommit &&
19850 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
19860 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
19870 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
19880 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43  n implements a C
19890 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20  OMMIT and other 
198a0 56 4d 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a  VMs are writing.
198b0 20 20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20        ** return 
198c0 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  an error indicat
198d0 69 6e 67 20 74 68 61 74 20 74 68 65 20 6f 74 68  ing that the oth
198e0 65 72 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70  er VMs must comp
198f0 6c 65 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20  lete first. .   
19900 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
19910 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
19920 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74  "cannot commit t
19930 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20  ransaction - ". 
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74           "SQL st
19960 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
19970 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63  ress");.      rc
19980 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19990 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
199a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
199b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63     }else if( (rc
199c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
199d0 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51  eckFk(p, 1))!=SQ
199e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
199f0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
19a00 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
19a10 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
19a20 69 74 20 3d 20 28 75 38 29 64 65 73 69 72 65 64  it = (u8)desired
19a30 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  AutoCommit;.    
19a40 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
19a50 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51  3VdbeHalt(p)==SQ
19a60 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
19a70 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29     p->pc = (int)
19a80 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
19a90 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
19aa0 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72  t = (u8)(1-desir
19ab0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20  edAutoCommit);. 
19ac0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20       p->rc = rc 
19ad0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
19ae0 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
19af0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
19b00 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
19b10 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
19b20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
19b30 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
19b40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
19b70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19b80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
19b90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
19ba0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19bb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
19bc0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
19bd0 70 2c 0a 20 20 20 20 20 20 20 20 28 21 64 65 73  p,.        (!des
19be0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f  iredAutoCommit)?
19bf0 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
19c00 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
19c10 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
19c20 22 3a 28 0a 20 20 20 20 20 20 20 20 28 69 52 6f  ":(.        (iRo
19c30 6c 6c 62 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20  llback)?"cannot 
19c40 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72  rollback - no tr
19c50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
19c60 69 76 65 22 3a 0a 20 20 20 20 20 20 20 20 20 20  ive":.          
19c70 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
19c80 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61   commit - no tra
19c90 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
19ca0 76 65 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ve"));.         
19cb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19cc0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f  _ERROR;.    goto
19cd0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
19ce0 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ror;.  }.  break
19cf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
19d00 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50  Transaction P1 P
19d10 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
19d20 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
19d30 74 69 6f 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  tion on database
19d40 20 50 31 20 69 66 20 61 20 74 72 61 6e 73 61 63   P1 if a transac
19d50 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65  tion is not alre
19d60 61 64 79 0a 2a 2a 20 61 63 74 69 76 65 2e 0a 2a  ady.** active..*
19d70 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a  * If P2 is non-z
19d80 65 72 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74  ero, then a writ
19d90 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
19da0 20 73 74 61 72 74 65 64 2c 20 6f 72 20 69 66 20   started, or if 
19db0 61 20 0a 2a 2a 20 72 65 61 64 2d 74 72 61 6e 73  a .** read-trans
19dc0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
19dd0 79 20 61 63 74 69 76 65 2c 20 69 74 20 69 73 20  y active, it is 
19de0 75 70 67 72 61 64 65 64 20 74 6f 20 61 20 77 72  upgraded to a wr
19df0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
19e00 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72  .** If P2 is zer
19e10 6f 2c 20 74 68 65 6e 20 61 20 72 65 61 64 2d 74  o, then a read-t
19e20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19e30 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  arted..**.** P1 
19e40 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
19e50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19e60 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74  e on which the t
19e70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
19e80 20 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78   started.  Index
19e90 20 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64   0 is the main d
19ea0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
19eb0 20 69 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a   index 1 is the.
19ec0 2a 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  ** file used for
19ed0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19ee0 73 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32  s.  Indices of 2
19ef0 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65   or more are use
19f00 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65  d for.** attache
19f10 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  d databases..**.
19f20 2a 2a 20 49 66 20 61 20 77 72 69 74 65 2d 74 72  ** If a write-tr
19f30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19f40 72 74 65 64 20 61 6e 64 20 74 68 65 20 56 64 62  rted and the Vdb
19f50 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  e.usesStmtJourna
19f60 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75  l flag is.** tru
19f70 65 20 28 74 68 69 73 20 66 6c 61 67 20 69 73 20  e (this flag is 
19f80 73 65 74 20 69 66 20 74 68 65 20 56 64 62 65 20  set if the Vdbe 
19f90 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20  may modify more 
19fa0 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64  than one row and
19fb0 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
19fc0 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
19fd0 29 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ), a statement t
19fe0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61  ransaction may a
19ff0 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a  lso be opened..*
1a000 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1a010 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  lly, a statement
1a020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1a030 6f 70 65 6e 65 64 20 69 66 66 20 74 68 65 20 64  opened iff the d
1a040 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1a050 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1a060 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f  ly not in autoco
1a070 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66  mmit mode, or if
1a080 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1a090 0a 2a 2a 20 61 63 74 69 76 65 20 73 74 61 74 65  .** active state
1a0a0 6d 65 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65  ments. A stateme
1a0b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
1a0c0 6c 6c 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65  llows the change
1a0d0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a  s made by this.*
1a0e0 2a 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c  * VDBE to be rol
1a0f0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61  led back after a
1a100 6e 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20  n error without 
1a110 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62  having to roll b
1a120 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  ack the.** entir
1a130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  e transaction. I
1a140 66 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e  f no error is en
1a150 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73  countered, the s
1a160 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1a170 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74  tion.** will aut
1a180 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
1a190 74 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  t when the VDBE 
1a1a0 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  halts..**.** If 
1a1b0 50 35 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20  P5!=0 then this 
1a1c0 6f 70 63 6f 64 65 20 61 6c 73 6f 20 63 68 65 63  opcode also chec
1a1d0 6b 73 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ks the schema co
1a1e0 6f 6b 69 65 20 61 67 61 69 6e 73 74 20 50 33 0a  okie against P3.
1a1f0 2a 2a 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ** and the schem
1a200 61 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75  a generation cou
1a210 6e 74 65 72 20 61 67 61 69 6e 73 74 20 50 34 2e  nter against P4.
1a220 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 63  .** The cookie c
1a230 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75 65  hanges its value
1a240 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
1a250 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 68  tabase schema ch
1a260 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f  anges..** This o
1a270 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64  peration is used
1a280 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
1a290 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  that the cookie 
1a2a0 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61  has changed.** a
1a2b0 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72 72  nd that the curr
1a2c0 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65 64  ent process need
1a2d0 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
1a2e0 73 63 68 65 6d 61 2e 20 20 49 66 20 74 68 65 20  schema.  If the 
1a2f0 73 63 68 65 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65  schema.** cookie
1a300 20 69 6e 20 50 33 20 64 69 66 66 65 72 73 20 66   in P3 differs f
1a310 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 20 63  rom the schema c
1a320 6f 6f 6b 69 65 20 69 6e 20 74 68 65 20 64 61 74  ookie in the dat
1a330 61 62 61 73 65 20 68 65 61 64 65 72 20 6f 72 0a  abase header or.
1a340 2a 2a 20 69 66 20 74 68 65 20 73 63 68 65 6d 61  ** if the schema
1a350 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
1a360 74 65 72 20 69 6e 20 50 34 20 64 69 66 66 65 72  ter in P4 differ
1a370 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
1a380 6e 74 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e  nt.** generation
1a390 20 63 6f 75 6e 74 65 72 2c 20 74 68 65 6e 20 61   counter, then a
1a3a0 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  n SQLITE_SCHEMA 
1a3b0 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 20  error is raised 
1a3c0 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  and execution.**
1a3d0 20 68 61 6c 74 73 2e 20 20 54 68 65 20 73 71 6c   halts.  The sql
1a3e0 69 74 65 33 5f 73 74 65 70 28 29 20 77 72 61 70  ite3_step() wrap
1a3f0 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  per function mig
1a400 68 74 20 74 68 65 6e 20 72 65 70 72 65 70 61 72  ht then reprepar
1a410 65 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  e the.** stateme
1a420 6e 74 20 61 6e 64 20 72 65 72 75 6e 20 69 74 20  nt and rerun it 
1a430 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
1a440 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  ng..*/.case OP_T
1a450 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20  ransaction: {.  
1a460 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
1a470 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
1a480 47 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Gen;..  assert( 
1a490 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
1a4a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
1a4b0 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d  dOnly==0 || pOp-
1a4c0 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p2==0 );.  asse
1a4d0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1a4e0 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
1a4f0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
1a500 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1a510 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29  eeMask, pOp->p1)
1a520 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
1a530 32 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  2 && (db->flags 
1a540 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e  & SQLITE_QueryOn
1a550 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ly)!=0 ){.    rc
1a560 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a570 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  LY;.    goto abo
1a580 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1a590 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d  .  }.  pBt = db-
1a5a0 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
1a5b0 74 3b 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b  t;..  if( pBt ){
1a5c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a5d0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1a5e0 28 70 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a  (pBt, pOp->p2);.
1a5f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1a600 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  ==SQLITE_BUSY_SN
1a610 41 50 53 48 4f 54 20 29 3b 0a 20 20 20 20 74 65  APSHOT );.    te
1a620 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
1a630 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
1a640 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1a650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a660 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
1a670 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
1a680 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  .        p->pc =
1a690 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
1a6a0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  );.        p->rc
1a6b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 67   = rc;.        g
1a6c0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
1a6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1a6e0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1a6f0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20  _error;.    }.. 
1a700 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26     if( pOp->p2 &
1a710 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
1a720 72 6e 61 6c 20 0a 20 20 20 20 20 26 26 20 28 64  rnal .     && (d
1a730 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
1a740 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   || db->nVdbeRea
1a750 64 3e 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  d>1) .    ){.   
1a760 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1a770 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
1a780 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
1a790 66 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  f( p->iStatement
1a7a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1a7b0 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
1a7c0 65 6d 65 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e  ement>=0 && db->
1a7d0 6e 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b  nSavepoint>=0 );
1a7e0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74  .        db->nSt
1a7f0 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20  atement++; .    
1a800 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
1a810 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  t = db->nSavepoi
1a820 6e 74 20 2b 20 64 62 2d 3e 6e 53 74 61 74 65 6d  nt + db->nStatem
1a830 65 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ent;.      }..  
1a840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a850 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
1a860 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  , SAVEPOINT_BEGI
1a870 4e 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  N, p->iStatement
1a880 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
1a890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a8b0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1a8c0 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53 74 61 74  mt(pBt, p->iStat
1a8d0 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ement);.      }.
1a8e0 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  .      /* Store 
1a8f0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1a900 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a910 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
1a920 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ed constraint.  
1a930 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20      ** counter. 
1a940 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1a950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
1a960 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1a970 62 61 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74  back,.      ** t
1a980 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  he value of this
1a990 20 63 6f 75 6e 74 65 72 20 6e 65 65 64 73 20 74   counter needs t
1a9a0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  o be restored to
1a9b0 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  o.  */.      p->
1a9c0 6e 53 74 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64  nStmtDefCons = d
1a9d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
1a9e0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  ;.      p->nStmt
1a9f0 44 65 66 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d  DefImmCons = db-
1aa00 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
1aa10 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
1aa20 20 47 61 74 68 65 72 20 74 68 65 20 73 63 68 65   Gather the sche
1aa30 6d 61 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  ma version numbe
1aa40 72 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 3a 0a  r for checking:.
1aa50 20 20 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54      ** IMPLEMENT
1aa60 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 33 31 38  ATION-OF: R-0318
1aa70 39 2d 35 31 31 33 35 20 41 73 20 65 61 63 68 20  9-51135 As each 
1aa80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 72 75  SQL statement ru
1aa90 6e 73 2c 20 74 68 65 20 73 63 68 65 6d 61 0a 20  ns, the schema. 
1aaa0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 69 73     ** version is
1aab0 20 63 68 65 63 6b 65 64 20 74 6f 20 65 6e 73 75   checked to ensu
1aac0 72 65 20 74 68 61 74 20 74 68 65 20 73 63 68 65  re that the sche
1aad0 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
1aae0 65 64 20 73 69 6e 63 65 20 74 68 65 0a 20 20 20  ed since the.   
1aaf0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1ab00 74 20 77 61 73 20 70 72 65 70 61 72 65 64 2e 0a  t was prepared..
1ab10 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1ab20 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
1ab30 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
1ab40 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
1ab50 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 47  )&iMeta);.    iG
1ab60 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  en = db->aDb[pOp
1ab70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  ->p1].pSchema->i
1ab80 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65  Generation;.  }e
1ab90 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20  lse{.    iGen = 
1aba0 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  iMeta = 0;.  }. 
1abb0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
1abc0 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  ==0 || pOp->p4ty
1abd0 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
1abe0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 26    if( pOp->p5 &&
1abf0 20 28 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 33   (iMeta!=pOp->p3
1ac00 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70   || iGen!=pOp->p
1ac10 34 2e 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  4.i) ){.    sqli
1ac20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
1ac30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
1ac40 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
1ac50 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1ac60 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
1ac70 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b 0a   has changed");.
1ac80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63      /* If the sc
1ac90 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d  hema-cookie from
1aca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1acb0 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  le matches the c
1acc0 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 74  ookie .    ** st
1acd0 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69 6e  ored with the in
1ace0 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
1acf0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  tation of the sc
1ad00 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  hema, do.    ** 
1ad10 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 73  not reload the s
1ad20 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 64  chema from the d
1ad30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1ad40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76    **.    ** If v
1ad50 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 72  irtual-tables ar
1ad60 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 69  e in use, this i
1ad70 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70  s not just an op
1ad80 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
1ad90 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c  ** Often, v-tabl
1ada0 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 64  es store their d
1adb0 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 4c  ata in other SQL
1adc0 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 63  ite tables, whic
1add0 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 65  h.    ** are que
1ade0 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ried from within
1adf0 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 68   xNext() and oth
1ae00 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f  er v-table metho
1ae10 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ds using.    ** 
1ae20 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65 73  prepared queries
1ae30 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65 72  . If such a quer
1ae40 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65  y is out-of-date
1ae50 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  , we do not want
1ae60 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   to.    ** disca
1ae70 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rd the database 
1ae80 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 75  schema, as the u
1ae90 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  ser code impleme
1aea0 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  nting the.    **
1aeb0 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 68   v-table would h
1aec0 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 20  ave to be ready 
1aed0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f  for the sqlite3_
1aee0 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 69  vtab structure i
1aef0 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20  tself.    ** to 
1af00 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  be invalidated w
1af10 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 5f  henever sqlite3_
1af20 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 64  step() is called
1af30 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20   from within .  
1af40 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d    ** a v-table m
1af50 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ethod..    */.  
1af60 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f    if( db->aDb[pO
1af70 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
1af80 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69  schema_cookie!=i
1af90 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71  Meta ){.      sq
1afa0 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
1afb0 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29  ema(db, pOp->p1)
1afc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 65  ;.    }.    p->e
1afd0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  xpired = 1;.    
1afe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
1aff0 4d 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  MA;.  }.  if( rc
1b000 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1b010 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
1b020 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1b030 65 3a 20 52 65 61 64 43 6f 6f 6b 69 65 20 50 31  e: ReadCookie P1
1b040 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
1b050 20 52 65 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d   Read cookie num
1b060 62 65 72 20 50 33 20 66 72 6f 6d 20 64 61 74 61  ber P3 from data
1b070 62 61 73 65 20 50 31 20 61 6e 64 20 77 72 69 74  base P1 and writ
1b080 65 20 69 74 20 69 6e 74 6f 20 72 65 67 69 73 74  e it into regist
1b090 65 72 20 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20  er P2..** P3==1 
1b0a0 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  is the schema ve
1b0b0 72 73 69 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73  rsion.  P3==2 is
1b0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
1b0d0 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69  rmat..** P3==3 i
1b0e0 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  s the recommende
1b0f0 64 20 70 61 67 65 72 20 63 61 63 68 65 20 73 69  d pager cache si
1b100 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ze, and so forth
1b110 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74  .  P1==0 is.** t
1b120 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1b130 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20   file and P1==1 
1b140 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1b150 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f  file used to sto
1b160 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
1b170 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
1b180 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 72 65  ere must be a re
1b190 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1b1a0 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1b1b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1b1c0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b1d0 20 6f 72 20 74 68 65 72 65 20 6d 75 73 74 20 62   or there must b
1b1e0 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
1b1f0 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63  ) before.** exec
1b200 75 74 69 6e 67 20 74 68 69 73 20 69 6e 73 74 72  uting this instr
1b210 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
1b220 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b  OP_ReadCookie: {
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b240 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
1b250 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62  iMeta;.  int iDb
1b260 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b  ;.  int iCookie;
1b270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
1b280 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 69 44  IsReader );.  iD
1b290 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  b = pOp->p1;.  i
1b2a0 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33  Cookie = pOp->p3
1b2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b2c0 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p3<SQLITE_N_BTR
1b2d0 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
1b2e0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1b2f0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1b300 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1b310 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
1b320 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1b330 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1b340 2c 20 69 44 62 29 20 29 3b 0a 0a 20 20 73 71 6c  , iDb) );..  sql
1b350 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
1b360 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
1b370 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32  t, iCookie, (u32
1b380 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f   *)&iMeta);.  pO
1b390 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
1b3a0 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
1b3b0 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61  Out->u.i = iMeta
1b3c0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1b3d0 20 4f 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b   Opcode: SetCook
1b3e0 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ie P1 P2 P3 * *.
1b3f0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
1b400 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 33  integer value P3
1b410 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d   into cookie num
1b420 62 65 72 20 50 32 20 6f 66 20 64 61 74 61 62 61  ber P2 of databa
1b430 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20  se P1..** P2==1 
1b440 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  is the schema ve
1b450 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 32 20 69 73  rsion.  P2==2 is
1b460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
1b470 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69  rmat..** P2==3 i
1b480 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  s the recommende
1b490 64 20 70 61 67 65 72 20 63 61 63 68 65 20 0a 2a  d pager cache .*
1b4a0 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66  * size, and so f
1b4b0 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 20  orth.  P1==0 is 
1b4c0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b4d0 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31  e file and P1==1
1b4e0 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   is the .** data
1b4f0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74  base file used t
1b500 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72  o store temporar
1b510 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  y tables..**.** 
1b520 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
1b530 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1b540 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20 74  fore executing t
1b550 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  his opcode..*/.c
1b560 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  ase OP_SetCookie
1b570 3a 20 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  : {.  Db *pDb;. 
1b580 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
1b590 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  <SQLITE_N_BTREE_
1b5a0 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74  META );.  assert
1b5b0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1b5c0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
1b5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
1b5e0 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
1b5f0 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29  Mask, pOp->p1) )
1b600 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
1b610 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
1b620 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
1b630 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1b640 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29  t( pDb->pBt!=0 )
1b650 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b660 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1b670 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
1b680 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65 65 20 6e  0) );.  /* See n
1b690 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65 78 20  ote about index 
1b6a0 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52  shifting on OP_R
1b6b0 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72  eadCookie */.  r
1b6c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b6d0 55 70 64 61 74 65 4d 65 74 61 28 70 44 62 2d 3e  UpdateMeta(pDb->
1b6e0 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  pBt, pOp->p2, pO
1b6f0 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20 70 4f  p->p3);.  if( pO
1b700 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43 48  p->p2==BTREE_SCH
1b710 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20  EMA_VERSION ){. 
1b720 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 73     /* When the s
1b730 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61  chema cookie cha
1b740 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68 65  nges, record the
1b750 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65   new cookie inte
1b760 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44  rnally */.    pD
1b770 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b->pSchema->sche
1b780 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d  ma_cookie = pOp-
1b790 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  >p3;.    db->mDb
1b7a0 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
1b7b0 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
1b7c0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
1b7d0 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  2==BTREE_FILE_FO
1b7e0 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52  RMAT ){.    /* R
1b7f0 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e  ecord changes in
1b800 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
1b810 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
1b820 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1b830 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d  t = pOp->p3;.  }
1b840 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
1b850 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61  1 ){.    /* Inva
1b860 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61  lidate all prepa
1b870 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77  red statements w
1b880 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50  henever the TEMP
1b890 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1b8a0 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67   schema is chang
1b8b0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34  ed.  Ticket #164
1b8c0 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  4 */.    sqlite3
1b8d0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
1b8e0 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
1b8f0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
1b900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
1b910 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1b920 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
1b930 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1b940 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20   OpenRead P1 P2 
1b950 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
1b960 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44  psis: root=P2 iD
1b970 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  b=P3.**.** Open 
1b980 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1b990 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
1b9a0 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  ase table whose 
1b9b0 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a 20  root page is.** 
1b9c0 50 32 20 69 6e 20 61 20 64 61 74 61 62 61 73 65  P2 in a database
1b9d0 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74 61   file.  The data
1b9e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 64 65 74  base file is det
1b9f0 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20 0a  ermined by P3. .
1ba00 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20 74  ** P3==0 means t
1ba10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1ba20 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74 68  , P3==1 means th
1ba30 65 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20  e database used 
1ba40 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  for .** temporar
1ba50 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50 33  y tables, and P3
1ba60 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74 68  >1 means used th
1ba70 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1ba80 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74 61  attached.** data
1ba90 62 61 73 65 2e 20 20 47 69 76 65 20 74 68 65 20  base.  Give the 
1baa0 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69 64  new cursor an id
1bab0 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20  entifier of P1. 
1bac0 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75 65   The P1.** value
1bad0 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63 6f  s need not be co
1bae0 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c 6c  ntiguous but all
1baf0 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c   P1 values shoul
1bb00 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67  d be small integ
1bb10 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e  ers..** It is an
1bb20 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74 6f   error for P1 to
1bb30 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   be negative..**
1bb40 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65  .** If P5!=0 the
1bb50 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e  n use the conten
1bb60 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32  t of register P2
1bb70 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   as the root pag
1bb80 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76 61  e, not.** the va
1bb90 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c 66  lue of P2 itself
1bba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77 69  ..**.** There wi
1bbb0 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f 63  ll be a read loc
1bbc0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1bbd0 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 72 65  e whenever there
1bbe0 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 63   is an.** open c
1bbf0 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20 64  ursor.  If the d
1bc00 61 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c 6f  atabase was unlo
1bc10 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cked prior to th
1bc20 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1bc30 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  * then a read lo
1bc40 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 20 61  ck is acquired a
1bc50 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 69  s part of this i
1bc60 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20 72  nstruction.  A r
1bc70 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c 6f  ead.** lock allo
1bc80 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ws other process
1bc90 65 73 20 74 6f 20 72 65 61 64 20 74 68 65 20 64  es to read the d
1bca0 61 74 61 62 61 73 65 20 62 75 74 20 70 72 6f 68  atabase but proh
1bcb0 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74 68  ibits.** any oth
1bcc0 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  er process from 
1bcd0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64 61  modifying the da
1bce0 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 61  tabase.  The rea
1bcf0 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65 6c  d lock is.** rel
1bd00 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20 63  eased when all c
1bd10 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73 65  ursors are close
1bd20 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73 74  d.  If this inst
1bd30 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  ruction attempts
1bd40 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65 61  .** to get a rea
1bd50 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c 73  d lock but fails
1bd60 2c 20 74 68 65 20 73 63 72 69 70 74 20 74 65 72  , the script ter
1bd70 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e 0a  minates with an.
1bd80 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  ** SQLITE_BUSY e
1bd90 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1bda0 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61   The P4 value ma
1bdb0 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69  y be either an i
1bdc0 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32  nteger (P4_INT32
1bdd0 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ) or a pointer t
1bde0 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73  o.** a KeyInfo s
1bdf0 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59  tructure (P4_KEY
1be00 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20  INFO). If it is 
1be10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
1be20 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
1be30 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20  ture, then said 
1be40 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65  structure define
1be50 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  s the content an
1be60 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20  d collating .** 
1be70 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20  sequence of the 
1be80 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e  index being open
1be90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1bea0 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67  f P4 is an integ
1beb0 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74  er .** value, it
1bec0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1bed0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1bee0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1bef0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4f  *.** See also: O
1bf00 70 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65 6e  penWrite, Reopen
1bf10 49 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  Idx.*/./* Opcode
1bf20 3a 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20 50  : ReopenIdx P1 P
1bf30 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
1bf40 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20  nopsis: root=P2 
1bf50 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68 65  iDb=P3.**.** The
1bf60 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64   ReopenIdx opcod
1bf70 65 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20  e works exactly 
1bf80 6c 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65 78  like ReadOpen ex
1bf90 63 65 70 74 20 74 68 61 74 20 69 74 20 66 69 72  cept that it fir
1bfa0 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20  st.** checks to 
1bfb0 73 65 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  see if the curso
1bfc0 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65 61  r on P1 is alrea
1bfd0 64 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20 72  dy open with a r
1bfe0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  oot page.** numb
1bff0 65 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66 20  er of P2 and if 
1c000 69 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f 64  it is this opcod
1c010 65 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f  e becomes a no-o
1c020 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  p.  In other wor
1c030 64 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  ds,.** if the cu
1c040 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
1c050 6f 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65 6f  open, do not reo
1c060 70 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  pen it..**.** Th
1c070 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f  e ReopenIdx opco
1c080 64 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  de may only be u
1c090 73 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20 61  sed with P5==0 a
1c0a0 6e 64 20 77 69 74 68 20 50 34 20 62 65 69 6e 67  nd with P4 being
1c0b0 0a 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46 4f  .** a P4_KEYINFO
1c0c0 20 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68 65   object.  Furthe
1c0d0 72 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76 61  rmore, the P3 va
1c0e0 6c 75 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  lue must be the 
1c0f0 73 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72 79  same as.** every
1c100 20 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64 78   other ReopenIdx
1c110 20 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f 72   or OpenRead for
1c120 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72   the same cursor
1c130 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   number..**.** S
1c140 65 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64 20  ee the OpenRead 
1c150 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61  opcode documenta
1c160 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
1c170 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1c180 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1c190 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50  penWrite P1 P2 P
1c1a0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
1c1b0 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62  sis: root=P2 iDb
1c1c0 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  =P3.**.** Open a
1c1d0 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   read/write curs
1c1e0 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74  or named P1 on t
1c1f0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1c200 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20  x whose root.** 
1c210 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20  page is P2.  Or 
1c220 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65  if P5!=0 use the
1c230 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
1c240 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20  ster P2 to find 
1c250 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1c260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76  ..**.** The P4 v
1c270 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68  alue may be eith
1c280 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50  er an integer (P
1c290 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f  4_INT32) or a po
1c2a0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65  inter to.** a Ke
1c2b0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1c2c0 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66  (P4_KEYINFO). If
1c2d0 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72   it is a pointer
1c2e0 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a   to a KeyInfo .*
1c2f0 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
1c300 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72 65  n said structure
1c310 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e   defines the con
1c320 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69  tent and collati
1c330 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ng .** sequence 
1c340 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  of the index bei
1c350 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72  ng opened. Other
1c360 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61  wise, if P4 is a
1c370 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61  n integer .** va
1c380 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20 74  lue, it is set t
1c390 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1c3a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
1c3b0 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a  able, or to the.
1c3c0 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78  ** largest index
1c3d0 20 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   of any column o
1c3e0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
1c3f0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65   is actually use
1c400 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  d..**.** This in
1c410 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20  struction works 
1c420 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65  just like OpenRe
1c430 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ad except that i
1c440 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73  t opens the curs
1c450 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72  or.** in read/wr
1c460 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61  ite mode.  For a
1c470 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68   given table, th
1c480 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f  ere can be one o
1c490 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79  r more read-only
1c4a0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61  .** cursors or a
1c4b0 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69   single read/wri
1c4c0 74 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f  te cursor but no
1c4d0 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65  t both..**.** Se
1c4e0 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e  e also OpenRead.
1c4f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f 70  .*/.case OP_Reop
1c500 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20 6e  enIdx: {.  int n
1c510 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f  Field;.  KeyInfo
1c520 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
1c530 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b  t p2;.  int iDb;
1c540 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20  .  int wrFlag;. 
1c550 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64   Btree *pX;.  Vd
1c560 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
1c570 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
1c580 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30  sert( pOp->p5==0
1c590 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46   || pOp->p5==OPF
1c5a0 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20  LAG_SEEKEQ );.  
1c5b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
1c5c0 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ype==P4_KEYINFO 
1c5d0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61  );.  pCur = p->a
1c5e0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1c5f0 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43 75   if( pCur && pCu
1c600 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75 33  r->pgnoRoot==(u3
1c610 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20  2)pOp->p2 ){.   
1c620 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1c630 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20 20  Db==pOp->p3 );  
1c640 20 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65 65      /* Guarantee
1c650 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 67 65  d by the code ge
1c660 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 67  nerator */.    g
1c670 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72 5f  oto open_cursor_
1c680 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a 20  set_hints;.  }. 
1c690 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
1c6a0 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
1c6b0 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f 70  ly open or is op
1c6c0 65 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  en on a differen
1c6d0 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  t.  ** index, th
1c6e0 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
1c6f0 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61 64  into OP_OpenRead
1c700 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f 70   to force a reop
1c710 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70  en */.case OP_Op
1c720 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f  enRead:.case OP_
1c730 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61 73  OpenWrite:..  as
1c740 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
1c750 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  e==OP_OpenWrite 
1c760 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c  || pOp->p5==0 ||
1c770 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47   pOp->p5==OPFLAG
1c780 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73  _SEEKEQ );.  ass
1c790 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
1c7a0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1c7b0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
1c7c0 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d 3e  penRead || pOp->
1c7d0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70 65  opcode==OP_Reope
1c7e0 6e 49 64 78 0a 20 20 20 20 20 20 20 20 20 20 7c  nIdx.          |
1c7f0 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  | p->readOnly==0
1c800 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78   );..  if( p->ex
1c810 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20  pired ){.    rc 
1c820 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  = SQLITE_ABORT_R
1c830 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f 74  OLLBACK;.    got
1c840 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1c850 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69  rror;.  }..  nFi
1c860 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49  eld = 0;.  pKeyI
1c870 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20  nfo = 0;.  p2 = 
1c880 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d  pOp->p2;.  iDb =
1c890 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65   pOp->p3;.  asse
1c8a0 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1c8b0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
1c8c0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
1c8d0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
1c8e0 69 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  iDb) );.  pDb = 
1c8f0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
1c900 20 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a   pX = pDb->pBt;.
1c910 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1c920 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
1c930 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
1c940 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  te ){.    assert
1c950 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  ( OPFLAG_FORDELE
1c960 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45 4c  TE==BTREE_FORDEL
1c970 45 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c 61  ETE );.    wrFla
1c980 67 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52 20  g = BTREE_WRCSR 
1c990 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  | (pOp->p5 & OPF
1c9a0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b 0a  LAG_FORDELETE);.
1c9b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c9c0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1c9d0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
1c9e0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1c9f0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
1ca00 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74  mat < p->minWrit
1ca10 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20  eFileFormat ){. 
1ca20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65       p->minWrite
1ca30 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62  FileFormat = pDb
1ca40 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
1ca50 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20  format;.    }.  
1ca60 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61  }else{.    wrFla
1ca70 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  g = 0;.  }.  if(
1ca80 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
1ca90 47 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20 20  G_P2ISREG ){.   
1caa0 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b   assert( p2>0 );
1cab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3c  .    assert( p2<
1cac0 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
1cad0 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  >nCursor) );.   
1cae0 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32   pIn2 = &aMem[p2
1caf0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ];.    assert( m
1cb00 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29 20  emIsValid(pIn2) 
1cb10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1cb20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
1cb30 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20  M_Int)!=0 );.   
1cb40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1cb50 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b  ntegerify(pIn2);
1cb60 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29 70  .    p2 = (int)p
1cb70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a  In2->u.i;.    /*
1cb80 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61 6c   The p2 value al
1cb90 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ways comes from 
1cba0 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61 74  a prior OP_Creat
1cbb0 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 61 6e  eBtree opcode an
1cbc0 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70  d.    ** that op
1cbd0 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  code will always
1cbe0 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c 75   set the p2 valu
1cbf0 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f  e to 2 or more o
1cc00 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20  r else fail..   
1cc10 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   ** If there wer
1cc20 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68 65  e a failure, the
1cc30 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1cc40 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20 68  ent would have h
1cc50 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65 66  alted.    ** bef
1cc60 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69  ore reaching thi
1cc70 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a  s instruction. *
1cc80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  /.    assert( p2
1cc90 3e 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  >=2 );.  }.  if(
1cca0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1ccb0 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
1ccc0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
1ccd0 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
1cce0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1ccf0 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20  o->enc==ENC(db) 
1cd00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1cd10 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20  KeyInfo->db==db 
1cd20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  );.    nField = 
1cd30 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1cd40 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eld;.  }else if(
1cd50 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1cd60 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46  _INT32 ){.    nF
1cd70 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
1cd80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1cd90 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1cda0 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d  assert( nField>=
1cdb0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1cdc0 20 6e 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f   nField==0 );  /
1cdd0 2a 20 54 61 62 6c 65 20 77 69 74 68 20 49 4e 54  * Table with INT
1cde0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1cdf0 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73   and nothing els
1ce00 65 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c  e */.  pCur = al
1ce10 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1ce20 70 4f 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c  pOp->p1, nField,
1ce30 20 69 44 62 2c 20 43 55 52 54 59 50 45 5f 42 54   iDb, CURTYPE_BT
1ce40 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 75 72  REE);.  if( pCur
1ce50 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1ce60 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52  m;.  pCur->nullR
1ce70 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ow = 1;.  pCur->
1ce80 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
1ce90 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1cea0 3d 20 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c  = p2;.#ifdef SQL
1ceb0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 75 72  ITE_DEBUG.  pCur
1cec0 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
1ced0 67 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d  g;.#endif.  rc =
1cee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1cef0 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
1cf00 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1cf10 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  ur->uc.pCursor);
1cf20 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1cf30 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1cf40 2f 2a 20 53 65 74 20 74 68 65 20 56 64 62 65 43  /* Set the VdbeC
1cf50 75 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 76 61  ursor.isTable va
1cf60 72 69 61 62 6c 65 2e 20 50 72 65 76 69 6f 75 73  riable. Previous
1cf70 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a   versions of.  *
1cf80 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
1cf90 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f   check if the ro
1cfa0 6f 74 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65  ot-page flags we
1cfb0 72 65 20 73 61 6e 65 20 61 74 20 74 68 69 73 20  re sane at this 
1cfc0 70 6f 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72  point.  ** and r
1cfd0 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20 63  eport database c
1cfe0 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65  orruption if the
1cff0 79 20 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20  y were not, but 
1d000 74 68 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20  this check has. 
1d010 20 2a 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20   ** since moved 
1d020 69 6e 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c  into the btree l
1d030 61 79 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43  ayer.  */  .  pC
1d040 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f  ur->isTable = pO
1d050 70 2d 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45  p->p4type!=P4_KE
1d060 59 49 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72  YINFO;..open_cur
1d070 73 6f 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20  sor_set_hints:. 
1d080 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
1d090 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42  BULKCSR==BTREE_B
1d0a0 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73  ULKLOAD );.  ass
1d0b0 65 72 74 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b  ert( OPFLAG_SEEK
1d0c0 45 51 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45  EQ==BTREE_SEEK_E
1d0d0 51 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Q );.  testcase(
1d0e0 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
1d0f0 47 5f 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66  G_BULKCSR );.#if
1d100 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d110 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
1d120 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
1d130 70 32 20 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b  p2 & OPFLAG_SEEK
1d140 45 51 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  EQ );.#endif.  s
1d150 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d160 72 48 69 6e 74 46 6c 61 67 73 28 70 43 75 72 2d  rHintFlags(pCur-
1d170 3e 75 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20  >uc.pCursor,.   
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d190 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4f 70              (pOp
1d1a0 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 42  ->p5 & (OPFLAG_B
1d1b0 55 4c 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45  ULKCSR|OPFLAG_SE
1d1c0 45 4b 45 51 29 29 29 3b 0a 20 20 69 66 28 20 72  EKEQ)));.  if( r
1d1d0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1d1e0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
1d1f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1d200 64 65 3a 20 4f 70 65 6e 44 75 70 20 50 31 20 50  de: OpenDup P1 P
1d210 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70  2 * * *.**.** Op
1d220 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1d230 50 31 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  P1 that points t
1d240 6f 20 74 68 65 20 73 61 6d 65 20 65 70 68 65 6d  o the same ephem
1d250 65 72 61 6c 20 74 61 62 6c 65 20 61 73 0a 2a 2a  eral table as.**
1d260 20 63 75 72 73 6f 72 20 50 32 2e 20 20 54 68 65   cursor P2.  The
1d270 20 50 32 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P2 cursor must 
1d280 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1d290 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1d2a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 2a 2a 20  penEphemeral.** 
1d2b0 6f 70 63 6f 64 65 2e 20 20 4f 6e 6c 79 20 65 70  opcode.  Only ep
1d2c0 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20  hemeral cursors 
1d2d0 6d 61 79 20 62 65 20 64 75 70 6c 69 63 61 74 65  may be duplicate
1d2e0 64 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  d..**.** Duplica
1d2f0 74 65 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  te ephemeral cur
1d300 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
1d310 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 6f 66 20  r self-joins of 
1d320 6d 61 74 65 72 69 61 6c 69 7a 65 64 20 76 69 65  materialized vie
1d330 77 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ws..*/.case OP_O
1d340 70 65 6e 44 75 70 3a 20 7b 0a 20 20 56 64 62 65  penDup: {.  Vdbe
1d350 43 75 72 73 6f 72 20 2a 70 4f 72 69 67 3b 20 20  Cursor *pOrig;  
1d360 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
1d370 6c 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 64  l cursor to be d
1d380 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 20 20 56  uplicated */.  V
1d390 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 20  dbeCursor *pCx; 
1d3a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1d3b0 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 70 4f 72  cursor */..  pOr
1d3c0 69 67 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ig = p->apCsr[pO
1d3d0 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
1d3e0 28 20 70 4f 72 69 67 2d 3e 70 42 74 78 21 3d 30  ( pOrig->pBtx!=0
1d3f0 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 65 70 68   );  /* Only eph
1d400 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20 63  emeral cursors c
1d410 61 6e 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  an be duplicated
1d420 20 2a 2f 0a 0a 20 20 70 43 78 20 3d 20 61 6c 6c   */..  pCx = all
1d430 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1d440 4f 70 2d 3e 70 31 2c 20 70 4f 72 69 67 2d 3e 6e  Op->p1, pOrig->n
1d450 46 69 65 6c 64 2c 20 2d 31 2c 20 43 55 52 54 59  Field, -1, CURTY
1d460 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28  PE_BTREE);.  if(
1d470 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1d480 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1d490 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1d4a0 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20  ->isEphemeral = 
1d4b0 31 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e  1;.  pCx->pKeyIn
1d4c0 66 6f 20 3d 20 70 4f 72 69 67 2d 3e 70 4b 65 79  fo = pOrig->pKey
1d4d0 49 6e 66 6f 3b 0a 20 20 70 43 78 2d 3e 69 73 54  Info;.  pCx->isT
1d4e0 61 62 6c 65 20 3d 20 70 4f 72 69 67 2d 3e 69 73  able = pOrig->is
1d4f0 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71  Table;.  rc = sq
1d500 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d510 28 70 4f 72 69 67 2d 3e 70 42 74 78 2c 20 4d 41  (pOrig->pBtx, MA
1d520 53 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45  STER_ROOT, BTREE
1d530 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20  _WRCSR,.        
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c    pCx->pKeyInfo,
1d560 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
1d570 29 3b 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  );.  /* The sqli
1d580 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
1d590 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6f 6e 6c   routine can onl
1d5a0 79 20 66 61 69 6c 20 66 6f 72 20 74 68 65 20 66  y fail for the f
1d5b0 69 72 73 74 20 63 75 72 73 6f 72 0a 20 20 2a 2a  irst cursor.  **
1d5c0 20 6f 70 65 6e 65 64 20 66 6f 72 20 61 20 64 61   opened for a da
1d5d0 74 61 62 61 73 65 2e 20 20 53 69 6e 63 65 20 74  tabase.  Since t
1d5e0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1d5f0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
1d600 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 70  hen this.  ** op
1d610 63 6f 64 65 20 69 73 20 72 75 6e 2c 20 74 68 65  code is run, the
1d620 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d630 73 6f 72 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  sor() cannot fai
1d640 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72  l */.  assert( r
1d650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1d660 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
1d670 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65  Opcode: OpenEphe
1d680 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34  meral P1 P2 * P4
1d690 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1d6a0 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a   nColumn=P2.**.*
1d6b0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72  * Open a new cur
1d6c0 73 6f 72 20 50 31 20 74 6f 20 61 20 74 72 61 6e  sor P1 to a tran
1d6d0 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20  sient table..** 
1d6e0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  The cursor is al
1d6f0 77 61 79 73 20 6f 70 65 6e 65 64 20 72 65 61 64  ways opened read
1d700 2f 77 72 69 74 65 20 65 76 65 6e 20 69 66 20 0a  /write even if .
1d710 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
1d720 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
1d730 79 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  y.  The ephemera
1d740 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 64 65  l.** table is de
1d750 6c 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  leted automatica
1d760 6c 6c 79 20 77 68 65 6e 20 74 68 65 20 63 75 72  lly when the cur
1d770 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1d780 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e  *.** P2 is the n
1d790 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1d7a0 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61   in the ephemera
1d7b0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  l table..** The 
1d7c0 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
1d7d0 20 61 20 42 54 72 65 65 20 74 61 62 6c 65 20 69   a BTree table i
1d7e0 66 20 50 34 3d 3d 30 20 61 6e 64 20 74 6f 20 61  f P4==0 and to a
1d7f0 20 42 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20   BTree index.** 
1d800 69 66 20 50 34 20 69 73 20 6e 6f 74 20 30 2e 20  if P4 is not 0. 
1d810 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
1d820 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
1d830 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
1d840 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 64 65 66  ture.** that def
1d850 69 6e 65 73 20 74 68 65 20 66 6f 72 6d 61 74 20  ines the format 
1d860 6f 66 20 6b 65 79 73 20 69 6e 20 74 68 65 20 69  of keys in the i
1d870 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
1d880 50 35 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  P5 parameter can
1d890 20 62 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68   be a mask of th
1d8a0 65 20 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20  e BTREE_* flags 
1d8b0 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74  defined.** in bt
1d8c0 72 65 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c  ree.h.  These fl
1d8d0 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65  ags control aspe
1d8e0 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61  cts of the opera
1d8f0 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62  tion of.** the b
1d900 74 72 65 65 2e 20 20 54 68 65 20 42 54 52 45 45  tree.  The BTREE
1d910 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1d920 64 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66  d BTREE_SINGLE f
1d930 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65  lags are.** adde
1d940 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
1d950 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1d960 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20  penAutoindex P1 
1d970 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
1d980 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50  opsis: nColumn=P
1d990 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  2.**.** This opc
1d9a0 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61  ode works the sa
1d9b0 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68  me as OP_OpenEph
1d9c0 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20  emeral.  It has 
1d9d0 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e  a.** different n
1d9e0 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ame to distingui
1d9f0 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61 62  sh its use.  Tab
1da00 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
1da10 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63  g.** by this opc
1da20 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ode will be used
1da30 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c   for automatical
1da40 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e 73  ly created trans
1da50 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20  ient.** indices 
1da60 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73  in joins..*/.cas
1da70 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  e OP_OpenAutoind
1da80 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ex: .case OP_Ope
1da90 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20  nEphemeral: {.  
1daa0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1dab0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1dac0 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74 69 63 20  Info;..  static 
1dad0 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61  const int vfsFla
1dae0 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49  gs = .      SQLI
1daf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1db00 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1db10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1db20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1db30 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1db40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1db50 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1db60 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1db70 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 20  _TRANSIENT_DB;. 
1db80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1db90 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1dba0 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
1dbb0 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1dbc0 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1dbd0 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43  , pOp->p2, -1, C
1dbe0 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20  URTYPE_BTREE);. 
1dbf0 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f   if( pCx==0 ) go
1dc00 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78  to no_mem;.  pCx
1dc10 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
1dc20 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61   pCx->isEphemera
1dc30 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  l = 1;.  rc = sq
1dc40 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
1dc50 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
1dc60 26 70 43 78 2d 3e 70 42 74 78 2c 20 0a 20 20 20  &pCx->pBtx, .   
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f       BTREE_OMIT_
1dc90 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f  JOURNAL | BTREE_
1dca0 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35  SINGLE | pOp->p5
1dcb0 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69  , vfsFlags);.  i
1dcc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dcd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1dce0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1dcf0 61 6e 73 28 70 43 78 2d 3e 70 42 74 78 2c 20 31  ans(pCx->pBtx, 1
1dd00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1dd10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd20 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69    /* If a transi
1dd30 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71  ent index is req
1dd40 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74  uired, create it
1dd50 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20   by calling.    
1dd60 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1dd70 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74  reateTable() wit
1dd80 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42  h the BTREE_BLOB
1dd90 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a  KEY flag before.
1dda0 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69      ** opening i
1ddb0 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e  t. If a transien
1ddc0 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69  t table is requi
1ddd0 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68  red, just use th
1dde0 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  e.    ** automat
1ddf0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74  ically created t
1de00 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
1de10 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49  age 1 (an BLOB_I
1de20 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20  NTKEY table)..  
1de30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
1de40 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  x->pKeyInfo = pK
1de50 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
1de60 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b  .pKeyInfo)!=0 ){
1de70 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
1de80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1de90 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b  Op->p4type==P4_K
1dea0 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  EYINFO );.      
1deb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1dec0 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78  eCreateTable(pCx
1ded0 2d 3e 70 42 74 78 2c 20 26 70 67 6e 6f 2c 20 42  ->pBtx, &pgno, B
1dee0 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70  TREE_BLOBKEY | p
1def0 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20  Op->p5); .      
1df00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1df10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1df20 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45  ert( pgno==MASTE
1df30 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20  R_ROOT+1 );.    
1df40 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1df50 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  Info->db==db );.
1df60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1df70 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45  pKeyInfo->enc==E
1df80 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20  NC(db) );.      
1df90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1dfa0 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  reeCursor(pCx->p
1dfb0 42 74 78 2c 20 70 67 6e 6f 2c 20 42 54 52 45 45  Btx, pgno, BTREE
1dfc0 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20  _WRCSR,.        
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
1dff0 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  , pCx->uc.pCurso
1e000 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1e010 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d    pCx->isTable =
1e020 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1e030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e040 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
1e050 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52  ->pBtx, MASTER_R
1e060 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
1e070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  0, pCx->uc.pCurs
1e0a0 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e  or);.      pCx->
1e0b0 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  isTable = 1;.   
1e0c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
1e0d0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1e0e0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78  _to_error;.  pCx
1e0f0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70  ->isOrdered = (p
1e100 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e  Op->p5!=BTREE_UN
1e110 4f 52 44 45 52 45 44 29 3b 0a 20 20 62 72 65 61  ORDERED);.  brea
1e120 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1e130 20 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50   SorterOpen P1 P
1e140 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
1e150 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1e160 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70  s like OP_OpenEp
1e170 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74  hemeral except t
1e180 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20  hat it opens.** 
1e190 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
1e1a0 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69 66  x that is specif
1e1b0 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20  ically designed 
1e1c0 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a  to sort large.**
1e1d0 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e   tables using an
1e1e0 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d   external merge-
1e1f0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  sort algorithm..
1e200 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1e210 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t P3 is non-zero
1e220 2c 20 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61  , then it indica
1e230 74 65 73 20 74 68 61 74 20 74 68 65 20 73 6f 72  tes that the sor
1e240 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d  ter may.** assum
1e250 65 20 74 68 61 74 20 61 20 73 74 61 62 6c 65 20  e that a stable 
1e260 73 6f 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  sort considering
1e270 20 74 68 65 20 66 69 72 73 74 20 50 33 20 66 69   the first P3 fi
1e280 65 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20  elds of each.** 
1e290 6b 65 79 20 69 73 20 73 75 66 66 69 63 69 65 6e  key is sufficien
1e2a0 74 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65  t to produce the
1e2b0 20 72 65 71 75 69 72 65 64 20 72 65 73 75 6c 74   required result
1e2c0 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  s..*/.case OP_So
1e2d0 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64  rterOpen: {.  Vd
1e2e0 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a  beCursor *pCx;..
1e2f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e300 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1e310 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
1e320 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1e330 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1e340 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20  1, pOp->p2, -1, 
1e350 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b  CURTYPE_SORTER);
1e360 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
1e370 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1e380 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  Cx->pKeyInfo = p
1e390 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
1e3a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
1e3b0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1e3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e3d0 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  x->pKeyInfo->enc
1e3e0 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72  ==ENC(db) );.  r
1e3f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
1e400 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f  orterInit(db, pO
1e410 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69  p->p3, pCx);.  i
1e420 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1e430 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1e440 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1e450 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65  Opcode: Sequence
1e460 54 65 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Test P1 P2 * * *
1e470 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
1e480 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ( cursor[P1].ctr
1e490 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a  ++ ) pc = P2.**.
1e4a0 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65  ** P1 is a sorte
1e4b0 72 20 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65  r cursor. If the
1e4c0 20 73 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65   sequence counte
1e4d0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a  r is currently z
1e4e0 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  ero, jump.** to 
1e4f0 50 32 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  P2. Regardless o
1e500 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
1e510 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1e520 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  en, increment th
1e530 65 0a 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63  e.** the sequenc
1e540 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65  e value..*/.case
1e550 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
1e560 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1e570 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20   *pC;.  assert( 
1e580 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1e590 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1e5a0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1e5b0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1e5c0 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
1e5d0 28 70 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70  (pC) );.  if( (p
1e5e0 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d  C->seqCount++)==
1e5f0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
1e600 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
1e610 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1e620 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20  ode: OpenPseudo 
1e630 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
1e640 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c  Synopsis: P3 col
1e650 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a  umns in r[P2].**
1e660 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
1e670 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  ursor that point
1e680 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c  s to a fake tabl
1e690 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1e6a0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
1e6b0 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f  of data.  The co
1e6c0 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e  ntent of that on
1e6d0 65 20 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e  e row is the con
1e6e0 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  tent of memory.*
1e6f0 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20  * register P2.  
1e700 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e710 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65  cursor P1 become
1e720 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  s an alias for t
1e730 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20  he .** MEM_Blob 
1e740 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65  content containe
1e750 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
1e760 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f  ..**.** A pseudo
1e770 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62  -table created b
1e780 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  y this opcode is
1e790 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
1e7a0 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75  single.** row ou
1e7b0 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f  tput from the so
1e7c0 72 74 65 72 20 73 6f 20 74 68 61 74 20 74 68 65  rter so that the
1e7d0 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f   row can be deco
1e7e0 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69  mposed into.** i
1e7f0 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e  ndividual column
1e800 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43  s using the OP_C
1e810 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54  olumn opcode.  T
1e820 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1e830 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e  ode.** is the on
1e840 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65  ly cursor opcode
1e850 20 74 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68   that works with
1e860 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
1e870 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65  .**.** P3 is the
1e880 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1e890 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73  s in the records
1e8a0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
1e8b0 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70  ored by.** the p
1e8c0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a  seudo-table..*/.
1e8d0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75  case OP_OpenPseu
1e8e0 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  do: {.  VdbeCurs
1e8f0 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65  or *pCx;..  asse
1e900 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1e910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1e920 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p3>=0 );.  pCx 
1e930 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1e940 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1e950 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p3, -1, CURTYP
1e960 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28  E_PSEUDO);.  if(
1e970 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1e980 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1e990 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1e9a0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 70  ->seekResult = p
1e9b0 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d 3e 69  Op->p2;.  pCx->i
1e9c0 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 2f 2a  sTable = 1;.  /*
1e9d0 20 47 69 76 65 20 74 68 69 73 20 70 73 65 75 64   Give this pseud
1e9e0 6f 2d 63 75 72 73 6f 72 20 61 20 66 61 6b 65 20  o-cursor a fake 
1e9f0 42 74 43 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  BtCursor pointer
1ea00 20 73 6f 20 74 68 61 74 20 70 43 78 0a 20 20 2a   so that pCx.  *
1ea10 2a 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  * can be safely 
1ea20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1ea30 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
1ea40 6f 28 29 2e 20 20 54 68 69 73 20 61 76 6f 69 64  o().  This avoid
1ea50 73 20 61 20 74 65 73 74 0a 20 20 2a 2a 20 66 6f  s a test.  ** fo
1ea60 72 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d  r pCx->eCurType=
1ea70 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 69  =CURTYPE_BTREE i
1ea80 6e 73 69 64 65 20 6f 66 20 73 71 6c 69 74 65 33  nside of sqlite3
1ea90 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
1eaa0 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  ().  ** which is
1eab0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1eac0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  ptimization */. 
1ead0 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
1eae0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
1eaf0 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 29  akeValidCursor()
1eb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1eb10 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61  >p5==0 );.  brea
1eb20 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1eb30 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20   Close P1 * * * 
1eb40 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  *.**.** Close a 
1eb50 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c  cursor previousl
1eb60 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20  y opened as P1. 
1eb70 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a   If P1 is not.**
1eb80 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1eb90 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1eba0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1ebb0 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20  .case OP_Close: 
1ebc0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
1ebd0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1ebe0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1ebf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
1ec00 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70  eCursor(p, p->ap
1ec10 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20  Csr[pOp->p1]);. 
1ec20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1ec30 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  1] = 0;.  break;
1ec40 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1ec50 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
1ec60 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70 63  USED_MASK./* Opc
1ec70 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65 64  ode: ColumnsUsed
1ec80 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
1ec90 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 28  ** This opcode (
1eca0 77 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73 74  which only exist
1ecb0 73 20 69 66 20 53 51 4c 69 74 65 20 77 61 73 20  s if SQLite was 
1ecc0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a  compiled with.**
1ecd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
1ece0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 29  OLUMN_USED_MASK)
1ecf0 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 69 63   identifies whic
1ed00 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  h columns of the
1ed10 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1ed20 65 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31  ex for cursor P1
1ed30 20 61 72 65 20 75 73 65 64 2e 20 20 50 34 20 69   are used.  P4 i
1ed40 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
1ed50 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34 29  er.** (P4_INT64)
1ed60 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 66 69   in which the fi
1ed70 72 73 74 20 36 33 20 62 69 74 73 20 61 72 65 20  rst 63 bits are 
1ed80 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20  one for each of 
1ed90 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33 20  the.** first 63 
1eda0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
1edb0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
1edc0 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  at are actually 
1edd0 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  used.** by the c
1ede0 75 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67 68  ursor.  The high
1edf0 2d 6f 72 64 65 72 20 62 69 74 20 69 73 20 73 65  -order bit is se
1ee00 74 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  t if any column 
1ee10 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34 74  after.** the 64t
1ee20 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63 61  h is used..*/.ca
1ee30 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  se OP_ColumnsUse
1ee40 64 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  d: {.  VdbeCurso
1ee50 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70 2d  r *pC;.  pC = p-
1ee60 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1ee70 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
1ee80 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
1ee90 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d 3e  _BTREE );.  pC->
1eea0 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36 34  maskUsed = *(u64
1eeb0 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a  *)pOp->p4.pI64;.
1eec0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
1eed0 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  f../* Opcode: Se
1eee0 65 6b 47 45 20 50 31 20 50 32 20 50 33 20 50 34  ekGE P1 P2 P3 P4
1eef0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
1ef00 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
1ef10 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
1ef20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
1ef30 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
1ef40 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
1ef50 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
1ef60 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1ef70 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20  ister P3 as the 
1ef80 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20  key.  If cursor 
1ef90 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1efa0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1efb0 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1efc0 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1efd0 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1efe0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1eff0 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1f000 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1f010 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1f020 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1f030 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1f040 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
1f050 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
1f060 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1f070 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1f080 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1f090 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1f0a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1f0b0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1f0c0 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1f0d0 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1f0e0 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to P2..**.** If 
1f0f0 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77 61  the cursor P1 wa
1f100 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
1f110 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  he OPFLAG_SEEKEQ
1f120 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73   flag, then this
1f130 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  .** opcode will 
1f140 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61  always land on a
1f150 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71 75   record that equ
1f160 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20  ally equals the 
1f170 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20  key, or.** else 
1f180 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
1f190 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68   to P2.  When th
1f1a0 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c  e cursor is OPFL
1f1b0 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a  AG_SEEKEQ, this.
1f1c0 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62  ** opcode must b
1f1d0 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  e followed by an
1f1e0 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69   IdxLE opcode wi
1f1f0 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67 75  th the same argu
1f200 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64  ments..** The Id
1f210 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  xLE opcode will 
1f220 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  be skipped if th
1f230 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65  is opcode succee
1f240 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49  ds, but the.** I
1f250 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxLE opcode will
1f260 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73   be used on subs
1f270 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72  equent loop iter
1f280 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
1f290 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
1f2a0 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66   the cursor conf
1f2b0 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69  igured to move i
1f2c0 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c  n forward order,
1f2d0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67  .** from the beg
1f2e0 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68  inning toward th
1f2f0 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72  e end.  In other
1f300 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73   words, the curs
1f310 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75  or is.** configu
1f320 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c  red to use Next,
1f330 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a   not Prev..**.**
1f340 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1f350 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b  , NotFound, Seek
1f360 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  Lt, SeekGt, Seek
1f370 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  Le.*/./* Opcode:
1f380 20 53 65 65 6b 47 54 20 50 31 20 50 32 20 50 33   SeekGT P1 P2 P3
1f390 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
1f3a0 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
1f3b0 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
1f3c0 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
1f3d0 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
1f3e0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
1f3f0 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
1f400 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
1f410 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
1f420 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20   key. If cursor 
1f430 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1f440 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1f450 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1f460 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1f470 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1f480 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1f490 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1f4a0 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1f4b0 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1f4c0 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1f4d0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1f4e0 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
1f4f0 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
1f500 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65  ater than the ke
1f510 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1f520 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1f530 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1f540 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  * the key and P2
1f550 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1f560 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1f570 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
1f580 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1f590 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  or configured to
1f5a0 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64   move in forward
1f5b0 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20   order,.** from 
1f5c0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  the beginning to
1f5d0 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49  ward the end.  I
1f5e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1f5f0 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  he cursor is.** 
1f600 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1f610 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76  e Next, not Prev
1f620 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1f630 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1f640 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47  d, SeekLt, SeekG
1f650 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20  e, SeekLe.*/./* 
1f660 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20 50  Opcode: SeekLT P
1f670 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a 2a  1 P2 P3 P4 * .**
1f680 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
1f690 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66  [P3@P4].**.** If
1f6a0 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1f6b0 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c  s to an SQL tabl
1f6c0 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75  e (B-Tree that u
1f6d0 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ses integer keys
1f6e0 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76  ), .** use the v
1f6f0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1f700 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66   P3 as a key. If
1f710 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1f720 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20  s .** to an SQL 
1f730 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69  index, then P3 i
1f740 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1f750 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65  n array of P4 re
1f760 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
1f770 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20   are used as an 
1f780 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  unpacked index k
1f790 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73  ey. .**.** Repos
1f7a0 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20  ition cursor P1 
1f7b0 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e  so that  it poin
1f7c0 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ts to the larges
1f7d0 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1f7e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1f7f0 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1f800 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1f810 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a  ords less than .
1f820 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  ** the key and P
1f830 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1f840 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1f850 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1f860 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  e leaves the cur
1f870 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74  sor configured t
1f880 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73  o move in revers
1f890 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d  e order,.** from
1f8a0 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20   the end toward 
1f8b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20  the beginning.  
1f8c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1f8d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  the cursor is.**
1f8e0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
1f8f0 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78  se Prev, not Nex
1f900 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  t..**.** See als
1f910 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1f920 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  nd, SeekGt, Seek
1f930 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1f940 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45 20   Opcode: SeekLE 
1f950 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1f960 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
1f970 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66  [P3@P4].**.** If
1f980 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1f990 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c  s to an SQL tabl
1f9a0 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75  e (B-Tree that u
1f9b0 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ses integer keys
1f9c0 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76  ), .** use the v
1f9d0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1f9e0 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66   P3 as a key. If
1f9f0 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1fa00 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20  s .** to an SQL 
1fa10 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69  index, then P3 i
1fa20 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1fa30 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65  n array of P4 re
1fa40 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
1fa50 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20   are used as an 
1fa60 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  unpacked index k
1fa70 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73  ey. .**.** Repos
1fa80 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20  ition cursor P1 
1fa90 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1faa0 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  s to the largest
1fab0 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1fac0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1fad0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1fae0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1faf0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1fb00 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72  .** less than or
1fb10 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1fb20 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1fb30 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1fb40 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  to P2..**.** Thi
1fb50 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
1fb60 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
1fb70 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
1fb80 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a   reverse order,.
1fb90 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ** from the end 
1fba0 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69 6e  toward the begin
1fbb0 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20  ning.  In other 
1fbc0 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
1fbd0 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
1fbe0 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20  ed to use Prev, 
1fbf0 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  not Next..**.** 
1fc00 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50 31  If the cursor P1
1fc10 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e   was opened usin
1fc20 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45  g the OPFLAG_SEE
1fc30 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74  KEQ flag, then t
1fc40 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69  his.** opcode wi
1fc50 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f  ll always land o
1fc60 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74 20  n a record that 
1fc70 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74  equally equals t
1fc80 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c  he key, or.** el
1fc90 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  se jump immediat
1fca0 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e  ely to P2.  When
1fcb0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f   the cursor is O
1fcc0 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68  PFLAG_SEEKEQ, th
1fcd0 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73  is.** opcode mus
1fce0 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
1fcf0 20 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64 65   an IdxGE opcode
1fd00 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61   with the same a
1fd10 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  rguments..** The
1fd20 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69   IdxGE opcode wi
1fd30 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 66  ll be skipped if
1fd40 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63   this opcode suc
1fd50 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a  ceeds, but the.*
1fd60 2a 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77  * IdxGE opcode w
1fd70 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73  ill be used on s
1fd80 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69  ubsequent loop i
1fd90 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  terations..**.**
1fda0 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1fdb0 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b  , NotFound, Seek
1fdc0 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b  Gt, SeekGe, Seek
1fdd0 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  Lt.*/.case OP_Se
1fde0 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f 2a  ekLT:         /*
1fdf0 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61   jump, in3 */.ca
1fe00 73 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20 20  se OP_SeekLE:   
1fe10 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
1fe20 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  n3 */.case OP_Se
1fe30 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f 2a  ekGE:         /*
1fe40 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61   jump, in3 */.ca
1fe50 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b 20  se OP_SeekGT: { 
1fe60 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
1fe70 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  n3 */.  int res;
1fe80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1fe90 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
1fea0 2a 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20 20  */.  int oc;    
1feb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
1fec0 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  e */.  VdbeCurso
1fed0 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65  r *pC;    /* The
1fee0 20 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b 20   cursor to seek 
1fef0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1ff00 6f 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b  ord r;  /* The k
1ff10 65 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a  ey to seek for *
1ff20 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
1ff30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ff40 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66   of columns or f
1ff50 69 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65 79  ields in the key
1ff60 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20   */.  i64 iKey; 
1ff70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ff80 72 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f 20  rowid we are to 
1ff90 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
1ffa0 20 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20   eqOnly;        
1ffb0 2f 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74  /* Only interest
1ffc0 65 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73  ed in == results
1ffd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ffe0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1fff0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
20000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
20010 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20  ->p2!=0 );.  pC 
20020 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
20030 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
20040 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
20050 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
20060 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
20070 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
20080 65 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekLE == OP_SeekL
20090 54 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T+1 );.  assert(
200a0 20 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50   OP_SeekGE == OP
200b0 5f 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61  _SeekLT+2 );.  a
200c0 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54  ssert( OP_SeekGT
200d0 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20   == OP_SeekLT+3 
200e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
200f0 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20  >isOrdered );.  
20100 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
20110 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f  Cursor!=0 );.  o
20120 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  c = pOp->opcode;
20130 0a 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20  .  eqOnly = 0;. 
20140 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
20150 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20160 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b  DEBUG.  pC->seek
20170 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  Op = pOp->opcode
20180 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
20190 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20  pC->isTable ){. 
201a0 20 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45 5f     /* The BTREE_
201b0 53 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73 20  SEEK_EQ flag is 
201c0 6f 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64 65  only set on inde
201d0 78 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20  x cursors */.   
201e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
201f0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69  BtreeCursorHasHi
20200 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  nt(pC->uc.pCurso
20210 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  r, BTREE_SEEK_EQ
20220 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
20230 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
20240 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
20250 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20 50  input value in P
20260 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61 6e  3 might be of an
20270 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72 2c  y type: integer,
20280 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a 20   real, string,. 
20290 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e     ** blob, or N
202a0 55 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65  ULL.  But it nee
202b0 64 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65  ds to be an inte
202c0 67 65 72 20 62 65 66 6f 72 65 20 77 65 20 63 61  ger before we ca
202d0 6e 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n do.    ** the 
202e0 73 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72 74  seek, so convert
202f0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 33   it. */.    pIn3
20300 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
20310 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33  ];.    if( (pIn3
20320 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
20330 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
20340 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
20350 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d  {.      applyNum
20360 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e  ericAffinity(pIn
20370 33 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  3, 0);.    }.   
20380 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56   iKey = sqlite3V
20390 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33  dbeIntValue(pIn3
203a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
203b0 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c 64  e P3 value could
203c0 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65   not be converte
203d0 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
203e0 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  r without.    **
203f0 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61   loss of informa
20400 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69  tion, then speci
20410 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  al processing is
20420 20 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a   required... */.
20430 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66      if( (pIn3->f
20440 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d  lags & MEM_Int)=
20450 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20460 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
20470 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Real)==0 ){. 
20480 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
20490 20 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74   P3 value cannot
204a0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
204b0 74 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61  to any kind of a
204c0 20 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20   number,.       
204d0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65   ** then the see
204e0 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  k is not possibl
204f0 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32  e, so jump to P2
20500 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65   */.        Vdbe
20510 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29  BranchTaken(1,2)
20520 3b 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ; goto jump_to_p
20530 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
20540 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
20550 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72 6f   /* If the appro
20560 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69 73  ximation iKey is
20570 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
20580 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65 61   actual real sea
20590 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65 72  rch.      ** ter
205a0 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20 3e 3d  m, substitute >=
205b0 20 66 6f 72 20 3e 20 61 6e 64 20 3c 20 66 6f 72   for > and < for
205c0 20 3c 3d 2e 20 65 2e 67 2e 20 69 66 20 74 68 65   <=. e.g. if the
205d0 20 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20 20   search term.   
205e0 20 20 20 2a 2a 20 69 73 20 34 2e 39 20 61 6e 64     ** is 4.9 and
205f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 70 70   the integer app
20600 72 6f 78 69 6d 61 74 69 6f 6e 20 35 3a 0a 20 20  roximation 5:.  
20610 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20620 20 20 20 20 20 20 20 28 78 20 3e 20 20 34 2e 39         (x >  4.9
20630 29 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3e  )    ->     (x >
20640 3d 20 35 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  = 5).      **   
20650 20 20 20 20 20 28 78 20 3c 3d 20 34 2e 39 29 20       (x <= 4.9) 
20660 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3c 20 20     ->     (x <  
20670 35 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  5).      */.    
20680 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3c    if( pIn3->u.r<
20690 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a  (double)iKey ){.
206a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
206b0 4f 50 5f 53 65 65 6b 47 45 3d 3d 28 4f 50 5f 53  OP_SeekGE==(OP_S
206c0 65 65 6b 47 54 2d 31 29 20 29 3b 0a 20 20 20 20  eekGT-1) );.    
206d0 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53      assert( OP_S
206e0 65 65 6b 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b 4c  eekLT==(OP_SeekL
206f0 45 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  E-1) );.        
20700 61 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b  assert( (OP_Seek
20710 4c 45 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f  LE & 0x0001)==(O
20720 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30 30  P_SeekGT & 0x000
20730 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  1) );.        if
20740 28 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d  ( (oc & 0x0001)=
20750 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30 78  =(OP_SeekGT & 0x
20760 30 30 30 31 29 20 29 20 6f 63 2d 2d 3b 0a 20 20  0001) ) oc--;.  
20770 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20780 49 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61  If the approxima
20790 74 69 6f 6e 20 69 4b 65 79 20 69 73 20 73 6d 61  tion iKey is sma
207a0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 61 63  ller than the ac
207b0 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68  tual real search
207c0 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20  .      ** term, 
207d0 73 75 62 73 74 69 74 75 74 65 20 3c 3d 20 66 6f  substitute <= fo
207e0 72 20 3c 20 61 6e 64 20 3e 20 66 6f 72 20 3e 3d  r < and > for >=
207f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65  .  */.      else
20800 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3e 28   if( pIn3->u.r>(
20810 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20  double)iKey ){. 
20820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f         assert( O
20830 50 5f 53 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53 65  P_SeekLE==(OP_Se
20840 65 6b 4c 54 2b 31 29 20 29 3b 0a 20 20 20 20 20  ekLT+1) );.     
20850 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
20860 65 6b 47 54 3d 3d 28 4f 50 5f 53 65 65 6b 47 45  ekGT==(OP_SeekGE
20870 2b 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  +1) );.        a
20880 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c  ssert( (OP_SeekL
20890 54 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50  T & 0x0001)==(OP
208a0 5f 53 65 65 6b 47 45 20 26 20 30 78 30 30 30 31  _SeekGE & 0x0001
208b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
208c0 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d   (oc & 0x0001)==
208d0 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78 30  (OP_SeekLT & 0x0
208e0 30 30 31 29 20 29 20 6f 63 2b 2b 3b 0a 20 20 20  001) ) oc++;.   
208f0 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20     }.    } .    
20900 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20910 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
20920 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
20930 30 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30 2c  0, (u64)iKey, 0,
20940 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e   &res);.    pC->
20950 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69  movetoTarget = i
20960 4b 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79  Key;  /* Used by
20970 20 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20   OP_Delete */.  
20980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
209a0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
209b0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rror;.    }.  }e
209c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
209d0 61 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  a cursor with th
209e0 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  e BTREE_SEEK_EQ 
209f0 68 69 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 20 4f  hint, only the O
20a00 50 5f 53 65 65 6b 47 45 20 61 6e 64 0a 20 20 20  P_SeekGE and.   
20a10 20 2a 2a 20 4f 50 5f 53 65 65 6b 4c 45 20 6f 70   ** OP_SeekLE op
20a20 63 6f 64 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  codes are allowe
20a30 64 2c 20 61 6e 64 20 74 68 65 73 65 20 6d 75 73  d, and these mus
20a40 74 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  t be immediately
20a50 20 66 6f 6c 6c 6f 77 65 64 0a 20 20 20 20 2a 2a   followed.    **
20a60 20 62 79 20 61 6e 20 4f 50 5f 49 64 78 47 54 20   by an OP_IdxGT 
20a70 6f 72 20 4f 50 5f 49 64 78 4c 54 20 6f 70 63 6f  or OP_IdxLT opco
20a80 64 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  de, respectively
20a90 2c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  , with the same 
20aa0 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
20ab0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
20ac0 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43  CursorHasHint(pC
20ad0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54  ->uc.pCursor, BT
20ae0 52 45 45 5f 53 45 45 4b 5f 45 51 29 20 29 7b 0a  REE_SEEK_EQ) ){.
20af0 20 20 20 20 20 20 65 71 4f 6e 6c 79 20 3d 20 31        eqOnly = 1
20b00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20b10 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
20b20 53 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f  SeekGE || pOp->o
20b30 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c 45  pcode==OP_SeekLE
20b40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20b50 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d  ( pOp[1].opcode=
20b60 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70  =OP_IdxLT || pOp
20b70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  [1].opcode==OP_I
20b80 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73  dxGT );.      as
20b90 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 31 3d  sert( pOp[1].p1=
20ba0 3d 70 4f 70 5b 30 5d 2e 70 31 20 29 3b 0a 20 20  =pOp[0].p1 );.  
20bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
20bc0 31 5d 2e 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70 32  1].p2==pOp[0].p2
20bd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20be0 28 20 70 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f 70  ( pOp[1].p3==pOp
20bf0 5b 30 5d 2e 70 33 20 29 3b 0a 20 20 20 20 20 20  [0].p3 );.      
20c00 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70  assert( pOp[1].p
20c10 34 2e 69 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e 69  4.i==pOp[0].p4.i
20c20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e   );.    }..    n
20c30 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e  Field = pOp->p4.
20c40 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
20c50 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
20c60 4e 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73 65  NT32 );.    asse
20c70 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  rt( nField>0 );.
20c80 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
20c90 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
20ca0 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75     r.nField = (u
20cb0 31 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20  16)nField;..    
20cc0 2f 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e 65  /* The next line
20cd0 20 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74 65   of code compute
20ce0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e  s as follows, on
20cf0 6c 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20 2a  ly faster:.    *
20d00 2a 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53  *   if( oc==OP_S
20d10 65 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekGT || oc==OP_
20d20 53 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a 2a  SeekLE ){.    **
20d30 20 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72       r.default_r
20d40 63 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20 20  c = -1;.    **  
20d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20   }else{.    **  
20d60 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20     r.default_rc 
20d70 3d 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d  = +1;.    **   }
20d80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64 65  .    */.    r.de
20d90 66 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20 26  fault_rc = ((1 &
20da0 20 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 54   (oc - OP_SeekLT
20db0 29 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a 20  )) ? -1 : +1);. 
20dc0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
20dd0 50 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64 65  P_SeekGT || r.de
20de0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a  fault_rc==-1 );.
20df0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
20e00 4f 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e 64  OP_SeekLE || r.d
20e10 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b  efault_rc==-1 );
20e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21  .    assert( oc!
20e30 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72 2e  =OP_SeekGE || r.
20e40 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29  default_rc==+1 )
20e50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63  ;.    assert( oc
20e60 21 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 72  !=OP_SeekLT || r
20e70 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20  .default_rc==+1 
20e80 29 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d  );..    r.aMem =
20e90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
20ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20eb0 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69  EBUG.    { int i
20ec0 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e  ; for(i=0; i<r.n
20ed0 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65  Field; i++) asse
20ee0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
20ef0 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a  r.aMem[i]) ); }.
20f00 23 65 6e 64 69 66 0a 20 20 20 20 72 2e 65 71 53  #endif.    r.eqS
20f10 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  een = 0;.    rc 
20f20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
20f30 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
20f40 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 2c  >uc.pCursor, &r,
20f50 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
20f60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
20f80 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
20f90 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
20fa0 69 66 28 20 65 71 4f 6e 6c 79 20 26 26 20 72 2e  if( eqOnly && r.
20fb0 65 71 53 65 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  eqSeen==0 ){.   
20fc0 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
20fd0 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 );.      goto 
20fe0 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a  seek_not_found;.
20ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 2d 3e      }.  }.  pC->
21000 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
21010 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
21020 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
21030 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ALE;.#ifdef SQLI
21040 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
21050 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
21060 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f  ;.#endif.  if( o
21070 63 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b 20  c>=OP_SeekGE ){ 
21080 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
21090 53 65 65 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGE || oc==OP
210a0 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 69  _SeekGT );.    i
210b0 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73  f( res<0 || (res
210c0 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
210d0 65 6b 47 54 29 20 29 7b 0a 20 20 20 20 20 20 72  ekGT) ){.      r
210e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
210f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
21100 65 78 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ext(pC->uc.pCurs
21110 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  or, 0);.      if
21120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21130 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
21140 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
21150 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21170 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20        res = 1;. 
21180 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21190 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
211a0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
211b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
211c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
211d0 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
211e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
211f0 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
21200 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLT || oc==OP_
21210 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66  SeekLE );.    if
21220 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d  ( res>0 || (res=
21230 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65  =0 && oc==OP_See
21240 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65  kLT) ){.      re
21250 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
21260 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
21270 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70 43  evious(pC->uc.pC
21280 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  ursor, 0);.     
21290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
212a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
212b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
212c0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
212d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
212e0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31           res = 1
212f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21300 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
21310 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
21320 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  or;.        }.  
21330 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
21340 0a 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d 69  .      /* res mi
21350 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65 20  ght be negative 
21360 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
21370 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68 65  e is empty.  Che
21380 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
21390 65 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ee if this is th
213a0 65 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  e case..      */
213b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c  .      res = sql
213c0 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d  ite3BtreeEof(pC-
213d0 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
213e0 20 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f 74    }.  }.seek_not
213f0 5f 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72 74  _found:.  assert
21400 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
21410 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
21420 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66  (res!=0,2);.  if
21430 28 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74  ( res ){.    got
21440 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
21450 7d 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c 79  }else if( eqOnly
21460 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21470 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  pOp[1].opcode==O
21480 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31  P_IdxLT || pOp[1
21490 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ].opcode==OP_Idx
214a0 47 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b  GT );.    pOp++;
214b0 20 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50 5f   /* Skip the OP_
214c0 49 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78 47  IdxLt or OP_IdxG
214d0 54 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 2a  T that follows *
214e0 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  /.  }.  break;.}
214f0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75  ../* Opcode: Fou
21500 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  nd P1 P2 P3 P4 *
21510 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
21520 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
21530 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
21540 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
21550 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
21560 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
21570 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
21580 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21590 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
215a0 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
215b0 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
215c0 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
215d0 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73  .** Cursor P1 is
215e0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72   on an index btr
215f0 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f  ee.  If the reco
21600 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  rd identified by
21610 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73   P3 and P4.** is
21620 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79   a prefix of any
21630 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
21640 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
21650 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31   to P2 and.** P1
21660 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
21670 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e  g at the matchin
21680 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  g entry..**.** T
21690 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65  his operation le
216a0 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
216b0 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65  in a state where
216c0 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61 64   it can be.** ad
216d0 76 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66 6f  vanced in the fo
216e0 72 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e 2e  rward direction.
216f0 20 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74 72    The Next instr
21700 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b  uction will work
21710 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68 65  ,.** but not the
21720 20 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f   Prev instructio
21730 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  n..**.** See als
21740 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43  o: NotFound, NoC
21750 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69 73  onflict, NotExis
21760 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a  ts. SeekGe.*/./*
21770 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e   Opcode: NotFoun
21780 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
21790 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
217a0 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
217b0 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65  If P4==0 then re
217c0 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20  gister P3 holds 
217d0 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74  a blob construct
217e0 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64  ed by MakeRecord
217f0 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68  .  If.** P4>0 th
21800 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  en register P3 i
21810 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50  s the first of P
21820 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74  4 registers that
21830 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65   form an unpacke
21840 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  d.** record..** 
21850 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73  .** Cursor P1 is
21860 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72   on an index btr
21870 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f  ee.  If the reco
21880 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  rd identified by
21890 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73   P3 and P4.** is
218a0 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20   not the prefix 
218b0 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20  of any entry in 
218c0 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69  P1 then a jump i
218d0 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49  s made to P2.  I
218e0 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f  f P1 .** does co
218f0 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77  ntain an entry w
21900 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63  hose prefix matc
21910 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65  hes the P3/P4 re
21920 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f  cord then contro
21930 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75  l.** falls throu
21940 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
21950 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50  nstruction and P
21960 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
21970 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74  ng at the.** mat
21980 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a  ching entry..**.
21990 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
219a0 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  n leaves the cur
219b0 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77  sor in a state w
219c0 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62  here it cannot b
219d0 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69 6e  e.** advanced in
219e0 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f   either directio
219f0 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
21a00 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64  ds, the Next and
21a10 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65 73   Prev.** opcodes
21a20 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66 74   do not work aft
21a30 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  er this operatio
21a40 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  n..**.** See als
21a50 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  o: Found, NotExi
21a60 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 0a  sts, NoConflict.
21a70 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f  */./* Opcode: No
21a80 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20 50  Conflict P1 P2 P
21a90 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
21aa0 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
21ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20  .**.** If P4==0 
21ac0 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
21ad0 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f   holds a blob co
21ae0 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b  nstructed by Mak
21af0 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20  eRecord.  If.** 
21b00 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74  P4>0 then regist
21b10 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72  er P3 is the fir
21b20 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  st of P4 registe
21b30 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20  rs that form an 
21b40 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f  unpacked.** reco
21b50 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f  rd..** .** Curso
21b60 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e  r P1 is on an in
21b70 64 65 78 20 62 74 72 65 65 2e 20 20 49 66 20 74  dex btree.  If t
21b80 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69  he record identi
21b90 66 69 65 64 20 62 79 20 50 33 20 61 6e 64 20 50  fied by P3 and P
21ba0 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e  4.** contains an
21bb0 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75  y NULL value, ju
21bc0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
21bd0 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74 65  o P2.  If all te
21be0 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  rms of the.** re
21bf0 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c  cord are not-NUL
21c00 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20 69  L then a check i
21c10 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d  s done to determ
21c20 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20 69  ine if any row i
21c30 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65  n the.** P1 inde
21c40 78 20 62 74 72 65 65 20 68 61 73 20 61 20 6d 61  x btree has a ma
21c50 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66 69  tching key prefi
21c60 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  x.  If there are
21c70 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d   no matches, jum
21c80 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  p.** immediately
21c90 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 72   to P2.  If ther
21ca0 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66 61  e is a match, fa
21cb0 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6c  ll through and l
21cc0 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20 63  eave the P1.** c
21cd0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
21ce0 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72  o the matching r
21cf0 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ow..**.** This o
21d00 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61 72  pcode is similar
21d10 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20   to OP_NotFound 
21d20 77 69 74 68 20 74 68 65 20 65 78 63 65 70 74 69  with the excepti
21d30 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ons that the.** 
21d40 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73  branch is always
21d50 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70 61   taken if any pa
21d60 72 74 20 6f 66 20 74 68 65 20 73 65 61 72 63 68  rt of the search
21d70 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e 55   key input is NU
21d80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  LL..**.** This o
21d90 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20  peration leaves 
21da0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20  the cursor in a 
21db0 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63  state where it c
21dc0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61  annot be.** adva
21dd0 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72 20 64  nced in either d
21de0 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  irection.  In ot
21df0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e  her words, the N
21e00 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20  ext and Prev.** 
21e10 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77  opcodes do not w
21e20 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73 20 6f  ork after this o
21e30 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
21e40 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75  See also: NotFou
21e50 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78  nd, Found, NotEx
21e60 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ists.*/.case OP_
21e70 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20 20  NoConflict:     
21e80 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
21e90 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  case OP_NotFound
21ea0 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  :       /* jump,
21eb0 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
21ec0 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20 20  Found: {        
21ed0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
21ee0 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78 69    int alreadyExi
21ef0 73 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65 4a  sts;.  int takeJ
21f00 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  ump;.  int ii;. 
21f10 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
21f20 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e  .  int res;.  Un
21f30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 46  packedRecord *pF
21f40 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  ree;.  UnpackedR
21f50 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a  ecord *pIdxKey;.
21f60 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
21f70 20 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   r;..#ifdef SQLI
21f80 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 4f  TE_TEST.  if( pO
21f90 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 6f  p->opcode!=OP_No
21fa0 43 6f 6e 66 6c 69 63 74 20 29 20 73 71 6c 69 74  Conflict ) sqlit
21fb0 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b  e3_found_count++
21fc0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
21fd0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
21fe0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
21ff0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
22000 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
22010 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43 20  4_INT32 );.  pC 
22020 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
22030 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
22040 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53  C!=0 );.#ifdef S
22050 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43  QLITE_DEBUG.  pC
22060 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e  ->seekOp = pOp->
22070 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20  opcode;.#endif. 
22080 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
22090 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
220a0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
220b0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
220c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
220d0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
220e0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
220f0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 69 66  Table==0 );.  if
22100 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b  ( pOp->p4.i>0 ){
22110 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
22120 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
22130 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
22140 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
22150 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33     r.aMem = pIn3
22160 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22170 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 69  DEBUG.    for(ii
22180 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65 6c 64 3b  =0; ii<r.nField;
22190 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
221a0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
221b0 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 20 29 3b  (&r.aMem[ii]) );
221c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
221d0 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73  r.aMem[ii].flags
221e0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
221f0 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e 3d  || r.aMem[ii].n=
22200 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
22210 69 69 20 29 20 52 45 47 49 53 54 45 52 5f 54 52  ii ) REGISTER_TR
22220 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69 69 2c 20  ACE(pOp->p3+ii, 
22230 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20 20  &r.aMem[ii]);.  
22240 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
22250 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20 20  IdxKey = &r;.   
22260 20 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65   pFree = 0;.  }e
22270 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
22280 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn3->flags & M
22290 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 72  EM_Blob );.    r
222a0 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  c = ExpandBlob(p
222b0 49 6e 33 29 3b 0a 20 20 20 20 61 73 73 65 72 74  In3);.    assert
222c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
222d0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
222e0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
222f0 63 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  c ) goto no_mem;
22300 0a 20 20 20 20 70 46 72 65 65 20 3d 20 70 49 64  .    pFree = pId
22310 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
22320 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
22330 65 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49 6e  ecord(pC->pKeyIn
22340 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  fo);.    if( pId
22350 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  xKey==0 ) goto n
22360 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  o_mem;.    sqlit
22370 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
22380 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
22390 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e   pIn3->n, pIn3->
223a0 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  z, pIdxKey);.  }
223b0 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  .  pIdxKey->defa
223c0 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74 61  ult_rc = 0;.  ta
223d0 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69 66  keJump = 0;.  if
223e0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
223f0 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b 0a  P_NoConflict ){.
22400 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 4f      /* For the O
22410 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70 63  P_NoConflict opc
22420 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a 75  ode, take the ju
22430 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  mp if any of the
22440 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66 69  .    ** input fi
22450 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20 73  elds are NULL, s
22460 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69 74  ince any key wit
22470 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e 6f  h a NULL will no
22480 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69 63  t.    ** conflic
22490 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  t */.    for(ii=
224a0 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e 6e  0; ii<pIdxKey->n
224b0 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  Field; ii++){.  
224c0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
224d0 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20  >aMem[ii].flags 
224e0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
224f0 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20 3d        takeJump =
22500 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
22510 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
22520 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
22530 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
22540 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
22550 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20  ursor, pIdxKey, 
22560 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  0, 0, &res);.  i
22570 66 28 20 70 46 72 65 65 20 29 20 73 71 6c 69 74  f( pFree ) sqlit
22580 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
22590 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Free);.  if( rc!
225a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
225b0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
225c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
225d0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
225e0 3d 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64 79  = res;.  already
225f0 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30  Exists = (res==0
22600 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  );.  pC->nullRow
22610 20 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69 73   = 1-alreadyExis
22620 74 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72  ts;.  pC->deferr
22630 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
22640 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22650 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
22660 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
22670 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20  ==OP_Found ){.  
22680 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
22690 6e 28 61 6c 72 65 61 64 79 45 78 69 73 74 73 21  n(alreadyExists!
226a0 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 61  =0,2);.    if( a
226b0 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 67  lreadyExists ) g
226c0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
226d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
226e0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61 6b  eBranchTaken(tak
226f0 65 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45 78  eJump||alreadyEx
22700 69 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20 20  ists==0,2);.    
22710 69 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c 20  if( takeJump || 
22720 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29  !alreadyExists )
22730 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
22740 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
22750 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  ../* Opcode: See
22760 6b 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20  kRowid P1 P2 P3 
22770 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
22780 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a   intkey=r[P3].**
22790 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
227a0 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20  dex of a cursor 
227b0 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74  open on an SQL t
227c0 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74 68  able btree (with
227d0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73   integer.** keys
227e0 29 2e 20 20 49 66 20 72 65 67 69 73 74 65 72 20  ).  If register 
227f0 50 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  P3 does not cont
22800 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  ain an integer o
22810 72 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f 74  r if P1 does not
22820 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  .** contain a re
22830 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20  cord with rowid 
22840 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  P3 then jump imm
22850 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
22860 20 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20 69   .** Or, if P2 i
22870 73 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53 51  s 0, raise an SQ
22880 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
22890 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63  or. If P1 does c
228a0 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63 6f  ontain.** a reco
228b0 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50 33  rd with rowid P3
228c0 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20   then .** leave 
228d0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
228e0 69 6e 67 20 61 74 20 74 68 61 74 20 72 65 63 6f  ing at that reco
228f0 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f  rd and fall thro
22900 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a  ugh to the next.
22910 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
22920 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74  **.** The OP_Not
22930 45 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70 65  Exists opcode pe
22940 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20  rforms the same 
22950 6f 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20 77  operation, but w
22960 69 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ith OP_NotExists
22970 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69 73  .** the P3 regis
22980 74 65 72 20 6d 75 73 74 20 62 65 20 67 75 61 72  ter must be guar
22990 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  anteed to contai
229a0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
229b0 75 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a 2a  ue.  With this.*
229c0 2a 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73 74  * opcode, regist
229d0 65 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74 20  er P3 might not 
229e0 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
229f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50  er..**.** The OP
22a00 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65  _NotFound opcode
22a10 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61   performs the sa
22a20 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  me operation on 
22a30 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20  index btrees.** 
22a40 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20  (with arbitrary 
22a50 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73  multi-value keys
22a60 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  )..**.** This op
22a70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
22a80 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
22a90 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
22aa0 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a  t be advanced.**
22ab0 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
22ac0 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
22ad0 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
22ae0 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73  and Prev opcodes
22af0 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
22b00 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  k following this
22b10 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53   opcode..**.** S
22b20 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
22b30 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66  NotFound, NoConf
22b40 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a  lict, SeekRowid.
22b50 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f  */./* Opcode: No
22b60 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50 33  tExists P1 P2 P3
22b70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
22b80 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a  : intkey=r[P3].*
22b90 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
22ba0 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72  ndex of a cursor
22bb0 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20   open on an SQL 
22bc0 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74  table btree (wit
22bd0 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  h integer.** key
22be0 73 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69 6e  s).  P3 is an in
22bf0 74 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49 66  teger rowid.  If
22c00 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   P1 does not con
22c10 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69  tain a record wi
22c20 74 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20 74  th.** rowid P3 t
22c30 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  hen jump immedia
22c40 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72 2c  tely to P2.  Or,
22c50 20 69 66 20 50 32 20 69 73 20 30 2c 20 72 61 69   if P2 is 0, rai
22c60 73 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  se an.** SQLITE_
22c70 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49  CORRUPT error. I
22c80 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69  f P1 does contai
22c90 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20  n a record with 
22ca0 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a  rowid P3 then .*
22cb0 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73  * leave the curs
22cc0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  or pointing at t
22cd0 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66  hat record and f
22ce0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
22cf0 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72  he next.** instr
22d00 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  uction..**.** Th
22d10 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f  e OP_SeekRowid o
22d20 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
22d30 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
22d40 6e 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f 77  n but also allow
22d50 73 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67 69  s the.** P3 regi
22d60 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
22d70 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76 61  a non-integer va
22d80 6c 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63 61  lue, in which ca
22d90 73 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a 2a  se the jump is.*
22da0 2a 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 20  * always taken. 
22db0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 71   This opcode req
22dc0 75 69 72 65 73 20 74 68 61 74 20 50 33 20 61 6c  uires that P3 al
22dd0 77 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20  ways contain an 
22de0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
22df0 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f  he OP_NotFound o
22e00 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
22e10 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
22e20 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n on index btree
22e30 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74  s.** (with arbit
22e40 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65  rary multi-value
22e50 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   keys)..**.** Th
22e60 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
22e70 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
22e80 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
22e90 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63  cannot be advanc
22ea0 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20  ed.** in either 
22eb0 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
22ec0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
22ed0 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70  Next and Prev op
22ee0 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  codes will.** no
22ef0 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67  t work following
22f00 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
22f10 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
22f20 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  und, NotFound, N
22f30 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52  oConflict, SeekR
22f40 6f 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  owid.*/.case OP_
22f50 53 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20 20  SeekRowid: {    
22f60 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
22f70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
22f80 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
22f90 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
22fa0 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b 0a  es;.  u64 iKey;.
22fb0 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
22fc0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
22fd0 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
22fe0 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20  EM_Int)==0 ){.  
22ff0 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
23000 70 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46 46  pIn3, SQLITE_AFF
23010 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69  _NUMERIC, encodi
23020 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  ng);.    if( (pI
23030 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
23040 49 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6a  Int)==0 ) goto j
23050 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
23060 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
23070 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69 73   into OP_NotExis
23080 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f  ts */.case OP_No
23090 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20 20  tExists:        
230a0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
230b0 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  /.  pIn3 = &aMem
230c0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
230d0 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
230e0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
230f0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
23100 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
23110 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
23120 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
23130 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
23140 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  pC!=0 );.#ifdef 
23150 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
23160 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a 23  C->seekOp = 0;.#
23170 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
23180 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
23190 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
231a0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
231b0 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
231c0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
231d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
231e0 72 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d 20  r!=0 );.  res = 
231f0 30 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e 33  0;.  iKey = pIn3
23200 2d 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73 71  ->u.i;.  rc = sq
23210 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
23220 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20  Unpacked(pCrsr, 
23230 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65 73  0, iKey, 0, &res
23240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
23250 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65  =SQLITE_OK || re
23260 73 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d 6f  s==0 );.  pC->mo
23270 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b 65  vetoTarget = iKe
23280 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20 4f  y;  /* Used by O
23290 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70 43  P_Delete */.  pC
232a0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
232b0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
232c0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
232d0 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
232e0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62 65  veto = 0;.  Vdbe
232f0 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
23300 3d 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65 65  =0,2);.  pC->see
23310 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20  kResult = res;. 
23320 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a 20   if( res!=0 ){. 
23330 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
23340 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
23350 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29  if( pOp->p2==0 )
23360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
23370 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23390 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
233a0 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p2;.    }.  }.  
233b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
233c0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
233d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
233e0 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63   Opcode: Sequenc
233f0 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
23400 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
23410 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b  =cursor[P1].ctr+
23420 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  +.**.** Find the
23430 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
23440 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
23450 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  for cursor P1..*
23460 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71 75  * Write the sequ
23470 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ence number into
23480 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
23490 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75   The sequence nu
234a0 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73  mber on the curs
234b0 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  or is incremente
234c0 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20  d after this.** 
234d0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  instruction.  .*
234e0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e  /.case OP_Sequen
234f0 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ce: {           
23500 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73  /* out2 */.  ass
23510 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
23520 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
23530 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
23540 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  t( p->apCsr[pOp-
23550 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73  >p1]!=0 );.  ass
23560 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ert( p->apCsr[pO
23570 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70 65  p->p1]->eCurType
23580 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29  !=CURTYPE_VTAB )
23590 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
235a0 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
235b0 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
235c0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
235d0 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a  1]->seqCount++;.
235e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
235f0 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64  Opcode: NewRowid
23600 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
23610 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
23620 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74  =rowid.**.** Get
23630 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72   a new integer r
23640 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e  ecord number (a.
23650 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73 65  k.a "rowid") use
23660 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20  d as the key to 
23670 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  a table..** The 
23680 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
23690 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
236a0 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e  used as a key in
236b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
236c0 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72 73   table that curs
236d0 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e  or P1 points to.
236e0 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64    The new record
236f0 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74 74   number is writt
23700 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  en.** written to
23710 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
23720 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e  .** If P3>0 then
23730 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74 65   P3 is a registe
23740 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72  r in the root fr
23750 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42 45  ame of this VDBE
23760 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20   that holds .** 
23770 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 76  the largest prev
23780 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
23790 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
237a0 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75  No new record nu
237b0 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  mbers are.** all
237c0 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  owed to be less 
237d0 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e  than this value.
237e0 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65   When this value
237f0 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61 78   reaches its max
23800 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  imum, .** an SQL
23810 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69  ITE_FULL error i
23820 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65  s generated. The
23830 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73 20   P3 register is 
23840 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
23850 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20   '.** generated 
23860 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54  record number. T
23870 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d  his P3 mechanism
23880 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
23890 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
238a0 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  * AUTOINCREMENT 
238b0 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65  feature..*/.case
238c0 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20   OP_NewRowid: { 
238d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
238e0 32 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20 20  2 */.  i64 v;   
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23900 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a   The new rowid *
23910 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
23920 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  pC;        /* Cu
23930 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74 6f  rsor of table to
23940 20 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f 77   get the new row
23950 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  id */.  int res;
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23970 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 73  * Result of an s
23980 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
23990 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  ) */.  int cnt; 
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239b0 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69   Counter to limi
239c0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
239d0 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65  searches */.  Me
239e0 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
239f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
23a00 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73 74   holding largest
23a10 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f 49   rowid for AUTOI
23a20 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64  NCREMENT */.  Vd
23a30 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
23a40 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61       /* Root fra
23a50 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20  me of VDBE */.. 
23a60 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20   v = 0;.  res = 
23a70 30 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  0;.  pOut = out2
23a80 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
23a90 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
23aa0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
23ab0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
23ac0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
23ad0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
23ae0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
23af0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
23b00 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
23b10 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
23b20 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
23b30 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f  !=0 );.  {.    /
23b40 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64  * The next rowid
23b50 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65   or record numbe
23b60 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72  r (different ter
23b70 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a  ms for the same.
23b80 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73      ** thing) is
23b90 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74   obtained in a t
23ba0 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68  wo-step algorith
23bb0 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m..    **.    **
23bc0 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70   First we attemp
23bd0 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  t to find the la
23be0 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
23bf0 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65  owid and add one
23c00 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e  .    ** to that.
23c10 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72    But if the lar
23c20 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
23c30 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74  wid is already t
23c40 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a  he maximum.    *
23c50 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  * positive integ
23c60 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  er, we have to f
23c70 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
23c80 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
23c90 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61   probabilistic a
23ca0 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a  lgorithm.    **.
23cb0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
23cc0 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74  d algorithm is t
23cd0 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64  o select a rowid
23ce0 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73   at random and s
23cf0 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  ee if.    ** it 
23d00 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
23d10 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  n the table.  If
23d20 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
23d30 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  st, we have.    
23d40 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49  ** succeeded.  I
23d50 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77  f the random row
23d60 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77  id does exist, w
23d70 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f  e select a new o
23d80 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  ne.    ** and tr
23d90 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31  y again, up to 1
23da0 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f  00 times..    */
23db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
23dc0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  >isTable );..#if
23dd0 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54  def SQLITE_32BIT
23de0 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e  _ROWID.#   defin
23df0 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66  e MAX_ROWID 0x7f
23e00 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20  ffffff.#else.   
23e10 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65   /* Some compile
23e20 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75  rs complain abou
23e30 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74  t constants of t
23e40 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66  he form 0x7fffff
23e50 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20  ffffffffff..    
23e60 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61  ** Others compla
23e70 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66  in about 0x7ffff
23e80 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20  ffffffffffffLL. 
23e90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
23ea0 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a  acro seems.    *
23eb0 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  * to provide the
23ec0 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20   constant while 
23ed0 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69  making all compi
23ee0 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20  lers happy..    
23ef0 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
23f00 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20  X_ROWID  (i64)( 
23f10 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66  (((u64)0x7ffffff
23f20 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30  f)<<32) | (u64)0
23f30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64  xffffffff ).#end
23f40 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d  if..    if( !pC-
23f50 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
23f60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23f70 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70  lite3BtreeLast(p
23f80 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
23f90 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
23fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23fb0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
23fc0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
23fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23fe0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
23ff0 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49     v = 1;   /* I
24000 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37  MP: R-61914-4807
24010 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  4 */.      }else
24020 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
24030 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
24040 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e  rsorIsValid(pC->
24050 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  uc.pCursor) );. 
24060 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74         v = sqlit
24070 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
24080 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  y(pC->uc.pCursor
24090 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
240a0 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20  >=MAX_ROWID ){. 
240b0 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65           pC->use
240c0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b  RandomRowid = 1;
240d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
240e0 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20 20            v++;  
240f0 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33 38   /* IMP: R-29538
24100 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20 20  -34987 */.      
24110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24120 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
24130 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
24140 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f 70  MENT.    if( pOp
24150 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ->p3 ){.      /*
24160 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
24170 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
24180 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
24190 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
241a0 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
241b0 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
241c0 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d       for(pFrame=
241d0 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
241e0 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
241f0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
24200 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nt);.        /* 
24210 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
24220 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
24230 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
24240 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24250 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20  3<=pFrame->nMem 
24260 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  );.        pMem 
24270 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
24280 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
24290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
242a0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
242b0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
242c0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
242d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
242e0 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
242f0 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
24300 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
24310 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
24320 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74          memAbout
24330 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d  ToChange(p, pMem
24340 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24350 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
24360 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20  lid(pMem) );..  
24370 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
24380 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d  CE(pOp->p3, pMem
24390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
243a0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
243b0 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61  y(pMem);.      a
243c0 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
243d0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
243e0 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29  0 );  /* mem(P3)
243f0 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
24400 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
24410 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f  Mem->u.i==MAX_RO
24420 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61  WID || pC->useRa
24430 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20  ndomRowid ){.   
24440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24450 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
24460 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20 2a   R-17817-00630 *
24470 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  /.        goto a
24480 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
24490 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
244a0 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69   if( v<pMem->u.i
244b0 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  +1 ){.        v 
244c0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b  = pMem->u.i + 1;
244d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
244e0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Mem->u.i = v;.  
244f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
24500 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  f( pC->useRandom
24510 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f  Rowid ){.      /
24520 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
24530 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38  -OF: R-07677-418
24540 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73  81 If the larges
24550 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c  t ROWID is equal
24560 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
24570 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   largest possibl
24580 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33  e integer (92233
24590 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20  72036854775807) 
245a0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
245b0 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e  e.      ** engin
245c0 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67  e starts picking
245d0 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64   positive candid
245e0 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61  ate ROWIDs at ra
245f0 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20  ndom until.     
24600 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65   ** it finds one
24610 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65   that is not pre
24620 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f  viously used. */
24630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24640 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a  Op->p3==0 );  /*
24650 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e   We cannot be in
24660 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f   random rowid mo
24670 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20  de if this is.  
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
246a0 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74   AUTOINCREMENT t
246b0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63  able. */.      c
246c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  nt = 0;.      do
246d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
246e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
246f0 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20  eof(v), &v);.   
24700 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52       v &= (MAX_R
24710 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20  OWID>>1); v++;  
24720 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 76  /* Ensure that v
24730 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
24740 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d   zero */.      }
24750 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73  while(  ((rc = s
24760 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
24770 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
24780 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  .pCursor, 0, (u6
24790 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20  4)v,.           
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d        0, &res))=
247d0 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20  =SQLITE_OK).    
247e0 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d          && (res=
247f0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
24800 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b  && (++cnt<100));
24810 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
24820 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
24830 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  o_error;.      i
24840 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
24850 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24860 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
24870 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a   R-38219-53002 *
24880 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  /.        goto a
24890 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
248a0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
248b0 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20   assert( v>0 ); 
248c0 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d   /* EV: R-40812-
248d0 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  03570 */.    }. 
248e0 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
248f0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
24900 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
24910 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
24920 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
24930 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  v;.  break;.}../
24940 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74  * Opcode: Insert
24950 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
24960 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74  ** Synopsis: int
24970 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d 72  key=r[P3] data=r
24980 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  [P2].**.** Write
24990 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
249a0 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73  he table of curs
249b0 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e  or P1.  A new en
249c0 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65  try is.** create
249d0 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  d if it doesn't 
249e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72  already exist or
249f0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e   the data for an
24a00 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74   existing.** ent
24a10 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ry is overwritte
24a20 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20  n.  The data is 
24a30 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c  the value MEM_Bl
24a40 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ob stored in reg
24a50 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ister.** number 
24a60 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73  P2. The key is s
24a70 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
24a80 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75  r P3. The key mu
24a90 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49  st.** be a MEM_I
24aa0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
24ab0 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
24ac0 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65  flag of P5 is se
24ad0 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  t, then the row 
24ae0 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a  change count is.
24af0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28  ** incremented (
24b00 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20  otherwise not). 
24b10 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c   If the OPFLAG_L
24b20 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66  ASTROWID flag of
24b30 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74   P5 is set,.** t
24b40 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f  hen rowid is sto
24b50 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65  red for subseque
24b60 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65  nt return by the
24b70 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  .** sqlite3_last
24b80 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
24b90 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77  function (otherw
24ba0 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69  ise it is unmodi
24bb0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fied)..**.** If 
24bc0 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  the OPFLAG_USESE
24bd0 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66  EKRESULT flag of
24be0 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 20   P5 is set, the 
24bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
24c00 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74  ight.** run fast
24c10 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61  er by avoiding a
24c20 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65  n unnecessary se
24c30 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e  ek on cursor P1.
24c40 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68    However,.** th
24c50 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
24c60 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74  RESULT flag must
24c70 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20   only be set if 
24c80 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
24c90 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b  no prior.** seek
24ca0 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  s on the cursor 
24cb0 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72  or if the most r
24cc0 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20  ecent seek used 
24cd0 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 50  a key equal to P
24ce0 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  3..**.** If the 
24cf0 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20  OPFLAG_ISUPDATE 
24d00 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
24d10 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  n this opcode is
24d20 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55   part of an.** U
24d30 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e  PDATE operation.
24d40 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20    Otherwise (if 
24d50 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61  the flag is clea
24d60 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  r) then this opc
24d70 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f  ode.** is part o
24d80 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  f an INSERT oper
24d90 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66  ation.  The diff
24da0 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69  erence is only i
24db0 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74  mportant to.** t
24dc0 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a  he update hook..
24dd0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
24de0 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  P4 may point to 
24df0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
24e00 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c  e, or may be NUL
24e10 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a 20  L. If it is .** 
24e20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
24e30 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28  he update-hook (
24e40 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65 43  sqlite3.xUpdateC
24e50 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76 6f  allback) is invo
24e60 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ked .** followin
24e70 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69  g a successful i
24e80 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41  nsert..**.** (WA
24e90 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50  RNING/TODO: If P
24ea0 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75  1 is a pseudo-cu
24eb0 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64  rsor and P2 is d
24ec0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
24ed0 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77  located, then ow
24ee0 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73  nership of P2 is
24ef0 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20   transferred to 
24f00 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  the pseudo-curso
24f10 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65  r.** and registe
24f20 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68  r P2 becomes eph
24f30 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20  emeral.  If the 
24f40 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65  cursor is change
24f50 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  d, the.** value 
24f60 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77  of register P2 w
24f70 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e  ill then change.
24f80 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
24f90 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75   does not.** cau
24fa0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
24fb0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ).**.** This ins
24fc0 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  truction only wo
24fd0 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20  rks on tables.  
24fe0 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69  The equivalent i
24ff0 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f  nstruction.** fo
25000 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f  r indices is OP_
25010 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a  IdxInsert..*/./*
25020 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49   Opcode: InsertI
25030 6e 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  nt P1 P2 P3 P4 P
25040 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  5.** Synopsis: i
25050 6e 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72 5b  ntkey=P3 data=r[
25060 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P2].**.** This w
25070 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
25080 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65  e OP_Insert exce
25090 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  pt that the key 
250a0 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  is the.** intege
250b0 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20  r value P3, not 
250c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
250d0 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
250e0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
250f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  */.case OP_Inser
25100 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  t: .case OP_Inse
25110 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a  rtInt: {.  Mem *
25120 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  pData;       /* 
25130 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
25140 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
25150 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
25160 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b  ted */.  Mem *pK
25170 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  ey;        /* ME
25180 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b  M cell holding k
25190 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ey  for the reco
251a0 72 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  rd */.  VdbeCurs
251b0 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72  or *pC;   /* Cur
251c0 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74  sor to table int
251d0 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20 69  o which insert i
251e0 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  s written */.  i
251f0 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20  nt seekResult;  
25200 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
25210 69 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66  ior seek or 0 if
25220 20 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c   no USESEEKRESUL
25230 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73  T flag */.  cons
25240 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a  t char *zDb;  /*
25250 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d   database name -
25260 20 75 73 65 64 20 62 79 20 74 68 65 20 75 70 64   used by the upd
25270 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61  ate hook */.  Ta
25280 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
25290 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
252a0 72 65 20 2d 20 75 73 65 64 20 62 79 20 75 70 64  re - used by upd
252b0 61 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64 61  ate and pre-upda
252c0 74 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 42 74  te hooks */.  Bt
252d0 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 20 20 20  reePayload x;   
252e0 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20 62 65  /* Payload to be
252f0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
25300 70 44 61 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f  pData = &aMem[pO
25310 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
25320 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
25330 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
25340 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
25350 6d 65 6d 49 73 56 61 6c 69 64 28 70 44 61 74 61  memIsValid(pData
25360 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  ) );.  pC = p->a
25370 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
25380 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
25390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
253a0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
253b0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
253c0 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
253d0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
253e0 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  rt( (pOp->p5 & O
253f0 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c  PFLAG_ISNOOP) ||
25400 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
25410 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
25420 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
25430 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3e 3d  || pOp->p4type>=
25440 50 34 5f 53 54 41 54 49 43 20 29 3b 0a 20 20 52  P4_STATIC );.  R
25450 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
25460 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 0a  p->p2, pData);..
25470 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
25480 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a  e==OP_Insert ){.
25490 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d      pKey = &aMem
254a0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61  [pOp->p3];.    a
254b0 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61  ssert( pKey->fla
254c0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
254d0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
254e0 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a  sValid(pKey) );.
254f0 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
25500 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79  CE(pOp->p3, pKey
25510 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20  );.    x.nKey = 
25520 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c  pKey->u.i;.  }el
25530 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
25540 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
25550 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20  InsertInt );.   
25560 20 78 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d 3e 70   x.nKey = pOp->p
25570 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f  3;.  }..  if( pO
25580 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
25590 42 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41 54  BLE && HAS_UPDAT
255a0 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20  E_HOOK(db) ){.  
255b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44    assert( pC->iD
255c0 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20  b>=0 );.    zDb 
255d0 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
255e0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
255f0 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e   pTab = pOp->p4.
25600 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
25610 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
25620 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 48  LAG_ISNOOP) || H
25630 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b  asRowid(pTab) );
25640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
25650 61 62 20 3d 20 30 3b 0a 20 20 20 20 7a 44 62 20  ab = 0;.    zDb 
25660 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65  = 0;  /* Not nee
25670 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
25680 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
25690 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66  . */.  }..#ifdef
256a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
256b0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
256c0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  /* Invoke the pr
256d0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69  e-update hook, i
256e0 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20 70  f any */.  if( p
256f0 54 61 62 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Tab ){.    if( d
25700 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
25710 6c 62 61 63 6b 20 26 26 20 21 28 70 4f 70 2d 3e  lback && !(pOp->
25720 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50  p5 & OPFLAG_ISUP
25730 44 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 73  DATE) ){.      s
25740 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
25750 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53  ateHook(p, pC, S
25760 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44  QLITE_INSERT, zD
25770 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c  b, pTab, x.nKey,
25780 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  pOp->p2);.    }.
25790 20 20 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64      if( db->xUpd
257a0 61 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c  ateCallback==0 |
257b0 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 3d 3d 30 20  | pTab->aCol==0 
257c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  ){.      /* Prev
257d0 65 6e 74 20 70 6f 73 74 2d 75 70 64 61 74 65 20  ent post-update 
257e0 68 6f 6f 6b 20 66 72 6f 6d 20 72 75 6e 6e 69 6e  hook from runnin
257f0 67 20 69 6e 20 63 61 73 65 73 20 77 68 65 6e 20  g in cases when 
25800 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 2a 2f  it should not */
25810 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
25820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
25830 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
25840 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b  G_ISNOOP ) break
25850 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
25860 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25870 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
25880 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70  hange++;.  if( p
25890 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
258a0 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e  LASTROWID ) db->
258b0 6c 61 73 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b  lastRowid = x.nK
258c0 65 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ey;.  assert( pD
258d0 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  ata->flags & (ME
258e0 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
258f0 29 3b 0a 20 20 78 2e 70 44 61 74 61 20 3d 20 70  );.  x.pData = p
25900 44 61 74 61 2d 3e 7a 3b 0a 20 20 78 2e 6e 44 61  Data->z;.  x.nDa
25910 74 61 20 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20  ta = pData->n;. 
25920 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28   seekResult = ((
25930 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25940 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20  _USESEEKRESULT) 
25950 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  ? pC->seekResult
25960 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61   : 0);.  if( pDa
25970 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ta->flags & MEM_
25980 5a 65 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a  Zero ){.    x.nZ
25990 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e  ero = pData->u.n
259a0 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Zero;.  }else{. 
259b0 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a     x.nZero = 0;.
259c0 20 20 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30    }.  x.pKey = 0
259d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
259e0 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e  BtreeInsert(pC->
259f0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a  uc.pCursor, &x,.
25a00 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
25a10 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c   (OPFLAG_APPEND|
25a20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
25a30 49 4f 4e 29 29 2c 20 73 65 65 6b 52 65 73 75 6c  ION)), seekResul
25a40 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66  t.  );.  pC->def
25a50 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
25a60 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
25a70 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
25a80 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
25a90 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  he update-hook i
25aa0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
25ab0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
25ac0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
25ad0 72 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  r;.  if( pTab ){
25ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
25af0 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
25b00 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
25b10 74 28 20 70 54 61 62 2d 3e 61 43 6f 6c 21 3d 30  t( pTab->aCol!=0
25b20 20 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64   );.    db->xUpd
25b30 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
25b40 70 55 70 64 61 74 65 41 72 67 2c 0a 20 20 20 20  pUpdateArg,.    
25b50 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20         (pOp->p5 
25b60 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
25b70 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
25b80 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
25b90 52 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  RT,.           z
25ba0 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Db, pTab->zName,
25bb0 20 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20   x.nKey);.  }.  
25bc0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
25bd0 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50  ode: Delete P1 P
25be0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
25bf0 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f   Delete the reco
25c00 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20  rd at which the 
25c10 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72  P1 cursor is cur
25c20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
25c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
25c40 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
25c50 4e 20 62 69 74 20 6f 66 20 74 68 65 20 50 35 20  N bit of the P5 
25c60 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
25c70 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
25c80 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66  rsor will be lef
25c90 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65  t pointing at  e
25ca0 69 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f  ither the next o
25cb0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  r the previous.*
25cc0 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * record in the 
25cd0 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20  table. If it is 
25ce0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25cf0 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
25d00 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  , then.** the ne
25d10 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  xt Next instruct
25d20 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ion will be a no
25d30 2d 6f 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74  -op. As a result
25d40 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  , in this case.*
25d50 2a 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65  * it is ok to de
25d60 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72  lete a record fr
25d70 6f 6d 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74  om within a Next
25d80 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50   loop. If .** OP
25d90 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
25da0 4e 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 63  N bit of P5 is c
25db0 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
25dc0 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a  ursor will be.**
25dd0 20 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65   left in an unde
25de0 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  fined state..**.
25df0 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
25e00 5f 41 55 58 44 45 4c 45 54 45 20 62 69 74 20 69  _AUXDELETE bit i
25e10 73 20 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61  s set on P5, tha
25e20 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
25e30 20 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20   this.** delete 
25e40 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61  one of several a
25e50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
25e60 65 6c 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20  eleting a table 
25e70 72 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a  row and all its.
25e80 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ** associated in
25e90 64 65 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78  dex entries.  Ex
25ea0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f  actly one of tho
25eb0 73 65 20 64 65 6c 65 74 65 73 20 69 73 20 74 68  se deletes is th
25ec0 65 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64  e "primary".** d
25ed0 65 6c 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65  elete.  The othe
25ee0 72 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50  rs are all on OP
25ef0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63  FLAG_FORDELETE c
25f00 75 72 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61  ursors or else a
25f10 72 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74  re.** marked wit
25f20 68 20 74 68 65 20 41 55 58 44 45 4c 45 54 45 20  h the AUXDELETE 
25f30 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  flag..**.** If t
25f40 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
25f50 45 20 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42  E flag of P2 (NB
25f60 3a 20 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20  : P2 not P5) is 
25f70 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
25f80 77 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e  w.** change coun
25f90 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
25fa0 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
25fb0 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20  ..**.** P1 must 
25fc0 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61  not be pseudo-ta
25fd0 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20  ble.  It has to 
25fe0 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20  be a real table 
25ff0 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65  with.** multiple
26000 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   rows..**.** If 
26010 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  P4 is not NULL t
26020 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hen it points to
26030 20 61 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e   a Table object.
26040 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69   In this case ei
26050 74 68 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64  ther .** the upd
26060 61 74 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74  ate or pre-updat
26070 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c  e hook, or both,
26080 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e   may be invoked.
26090 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
260a0 75 73 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ust.** have been
260b0 20 70 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e   positioned usin
260c0 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72  g OP_NotFound pr
260d0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
260e0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a  this opcode in .
260f0 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 53 70  ** this case. Sp
26100 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f  ecifically, if o
26110 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
26120 2c 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  , the pre-update
26130 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76   hook is .** inv
26140 6f 6b 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f  oked if P4 is no
26150 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61  t NULL. The upda
26160 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te-hook is invok
26170 65 64 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e  ed if one is con
26180 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20  figured, .** P4 
26190 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
261a0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
261b0 4e 47 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  NGE flag is set 
261c0 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  in P2..**.** If 
261d0 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
261e0 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ATE flag is set 
261f0 69 6e 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63  in P2, then P3 c
26200 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
26210 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65  ess.** of the me
26220 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
26230 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
26240 65 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  e that the rowid
26250 20 6f 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c   of the row will
26260 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79  .** be set to by
26270 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a   the update..*/.
26280 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20  case OP_Delete: 
26290 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
262a0 70 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pC;.  const char
262b0 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a   *zDb;.  Table *
262c0 70 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c  pTab;.  int opfl
262d0 61 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20  ags;..  opflags 
262e0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
262f0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
26300 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
26310 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
26320 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
26330 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
26340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26350 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
26360 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
26370 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
26380 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
26390 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
263a0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
263b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
263c0 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d  DEBUG.  if( pOp-
263d0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
263e0 45 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f  E && HasRowid(pO
263f0 70 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70  p->p4.pTab) && p
26400 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20  Op->p5==0 ){.   
26410 20 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72   /* If p5 is zer
26420 6f 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72  o, the seek oper
26430 61 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74  ation that posit
26440 69 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72  ioned the cursor
26450 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
26460 20 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20   OP_Delete will 
26470 68 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68  have also set th
26480 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  e pC->movetoTarg
26490 65 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  et field to the 
264a0 72 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20  rowid of.    ** 
264b0 74 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  the row that is 
264c0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
264d0 0a 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20  .    i64 iKey = 
264e0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
264f0 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
26500 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65  ursor);.    asse
26510 72 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  rt( pC->movetoTa
26520 72 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20  rget==iKey );.  
26530 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
26540 66 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  f the update-hoo
26550 6b 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d  k or pre-update-
26560 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76  hook will be inv
26570 6f 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f  oked, set zDb to
26580 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
26590 66 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73  f the db to pass
265a0 20 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20   as to it. Also 
265b0 73 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74  set local pTab t
265c0 6f 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66  o a copy.  ** of
265d0 20 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c   p4.pTab. Finall
265e0 79 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65  y, if p5 is true
265f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
26600 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  t this cursor wa
26610 73 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65  s.  ** last move
26620 64 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f  d with OP_Next o
26630 72 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53  r OP_Prev, not S
26640 65 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c  eek or NotFound,
26650 20 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43   set .  ** VdbeC
26660 75 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67  ursor.movetoTarg
26670 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
26680 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69  t rowid.  */.  i
26690 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
266a0 50 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f  P4_TABLE && HAS_
266b0 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20  UPDATE_HOOK(db) 
266c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
266d0 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  C->iDb>=0 );.   
266e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
266f0 2e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  .pTab!=0 );.    
26700 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43  zDb = db->aDb[pC
26710 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  ->iDb].zDbSName;
26720 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d  .    pTab = pOp-
26730 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66  >p4.pTab;.    if
26740 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
26750 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
26760 29 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61  )!=0 && pC->isTa
26770 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d  ble ){.      pC-
26780 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20  >movetoTarget = 
26790 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
267a0 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
267b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
267c0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
267d0 20 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65   0;   /* Not nee
267e0 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
267f0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
26800 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  . */.    pTab = 
26810 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  0;  /* Not neede
26820 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f  d.  Silence a co
26830 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20  mpiler warning. 
26840 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  */.  }..#ifdef S
26850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
26860 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a  UPDATE_HOOK.  /*
26870 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
26880 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
26890 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
268a0 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
268b0 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
268c0 3e 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20  >p4.pTab ){.    
268d0 61 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67  assert( !(opflag
268e0 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  s & OPFLAG_ISUPD
268f0 41 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ATE) .         |
26900 7c 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  | HasRowid(pTab)
26910 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
26920 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e   (aMem[pOp->p3].
26930 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
26940 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c   .    );.    sql
26950 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
26960 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20  eHook(p, pC,.   
26970 20 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20       (opflags & 
26980 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
26990 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
269a0 20 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45   : SQLITE_DELETE
269b0 2c 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20  , .        zDb, 
269c0 70 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f  pTab, pC->moveto
269d0 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  Target,.        
269e0 70 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20  pOp->p3.    );. 
269f0 20 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73   }.  if( opflags
26a00 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50   & OPFLAG_ISNOOP
26a10 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66   ) break;.#endif
26a20 0a 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61  . .  /* Only fla
26a30 67 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  gs that can be s
26a40 65 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54  et are SAVEPOIST
26a50 49 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54  ION and AUXDELET
26a60 45 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20  E */ .  assert( 
26a70 28 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46  (pOp->p5 & ~(OPF
26a80 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
26a90 7c 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54  |OPFLAG_AUXDELET
26aa0 45 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  E))==0 );.  asse
26ab0 72 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  rt( OPFLAG_SAVEP
26ac0 4f 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53  OSITION==BTREE_S
26ad0 41 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20  AVEPOSITION );. 
26ae0 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
26af0 41 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45  AUXDELETE==BTREE
26b00 5f 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23  _AUXDELETE );..#
26b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26b20 55 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  UG.  if( p->pFra
26b30 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
26b40 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c   pC->isEphemeral
26b50 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
26b60 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
26b70 5f 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20  _AUXDELETE)==0. 
26b80 20 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77         && (pC->w
26b90 72 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46  rFlag & OPFLAG_F
26ba0 4f 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20  ORDELETE)==0.   
26bb0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74     ){.      nExt
26bc0 72 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20  raDelete++;.    
26bd0 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  }.    if( pOp->p
26be0 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  2 & OPFLAG_NCHAN
26bf0 47 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  GE ){.      nExt
26c00 72 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20  raDelete--;.    
26c10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26c20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
26c30 65 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70  eDelete(pC->uc.p
26c40 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29  Cursor, pOp->p5)
26c50 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
26c60 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
26c70 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73  E;.  pC->seekRes
26c80 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ult = 0;.  if( r
26c90 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
26ca0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
26cb0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
26cc0 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
26cd0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
26ce0 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
26cf0 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
26d00 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
26d10 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
26d20 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73  eCallback && Has
26d30 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
26d40 20 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65       db->xUpdate
26d50 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
26d60 64 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f  dateArg, SQLITE_
26d70 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61  DELETE, zDb, pTa
26d80 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
26d90 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61      pC->movetoTa
26da0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
26db0 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
26dc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26dd0 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f  break;.}./* Opco
26de0 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a  de: ResetCount *
26df0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
26e00 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
26e10 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
26e20 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
26e30 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
26e40 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
26e50 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73  r (returned by s
26e60 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
26e70 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  to sqlite3_chang
26e80 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74  es())..** Then t
26e90 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20  he VMs internal 
26ea0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72  change counter r
26eb0 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54  esets to 0..** T
26ec0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
26ed0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
26ee0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
26ef0 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69  tCount: {.  sqli
26f00 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
26f10 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
26f20 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  );.  p->nChange 
26f30 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
26f40 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
26f50 65 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  erCompare P1 P2 
26f60 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69  P3 P4.** Synopsi
26f70 73 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74  s: if key(P1)!=t
26f80 72 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f  rim(r[P3],P4) go
26f90 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69  to P2.**.** P1 i
26fa0 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
26fb0 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
26fc0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70  ion compares a p
26fd0 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
26fe0 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72  record blob in r
26ff0 65 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e  egister P3 again
27000 73 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  st a prefix of t
27010 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  he entry that .*
27020 2a 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  * the sorter cur
27030 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
27040 69 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74  ints to.  Only t
27050 68 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c  he first P4 fiel
27060 64 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61  ds.** of r[P3] a
27070 6e 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  nd the sorter re
27080 63 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65  cord are compare
27090 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  d..**.** If eith
270a0 65 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72  er P3 or the sor
270b0 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  ter contains a N
270c0 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  ULL in one of th
270d0 65 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  eir significant.
270e0 2a 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63  ** fields (not c
270f0 6f 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66  ounting the P4 f
27100 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
27110 20 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72   which are ignor
27120 65 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed) then.** the 
27130 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  comparison is as
27140 73 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61  sumed to be equa
27150 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68  l..**.** Fall th
27160 72 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e  rough to next in
27170 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65  struction if the
27180 20 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d   two records com
27190 70 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a  pare equal to.**
271a0 20 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75   each other.  Ju
271b0 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79  mp to P2 if they
271c0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a   are different..
271d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
271e0 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64  rCompare: {.  Vd
271f0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
27200 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
27210 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20  KeyCol;..  pC = 
27220 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
27230 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
27240 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61  orter(pC) );.  a
27250 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
27260 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
27270 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
27280 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43  Op->p3];.  nKeyC
27290 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ol = pOp->p4.i;.
272a0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
272b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
272c0 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70  terCompare(pC, p
272d0 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72  In3, nKeyCol, &r
272e0 65 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  es);.  VdbeBranc
272f0 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
27300 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
27310 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
27320 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20  rror;.  if( res 
27330 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
27340 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a  2;.  break;.};..
27350 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
27360 72 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a  rData P1 P2 P3 *
27370 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
27380 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a  r[P2]=data.**.**
27390 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
273a0 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72  ster P2 the curr
273b0 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20  ent sorter data 
273c0 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f  for sorter curso
273d0 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c  r P1..** Then cl
273e0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  ear the column h
273f0 65 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63  eader cache on c
27400 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ursor P3..**.** 
27410 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  This opcode is n
27420 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d  ormally use to m
27430 6f 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74  ove a record out
27440 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61   of the sorter a
27450 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67  nd into.** a reg
27460 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68  ister that is th
27470 65 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70  e source for a p
27480 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73  seudo-table curs
27490 6f 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  or created using
274a0 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20  .** OpenPseudo. 
274b0 20 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62   That pseudo-tab
274c0 6c 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  le cursor is the
274d0 20 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65   one that is ide
274e0 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
274f0 72 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65  rameter P3.  Cle
27500 61 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c  aring the P3 col
27510 75 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72  umn cache as par
27520 74 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  t of this opcode
27530 20 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f   saves.** us fro
27540 6d 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75  m having to issu
27550 65 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c  e a separate Nul
27560 6c 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  lRow instruction
27570 20 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63   to clear that c
27580 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ache..*/.case OP
27590 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20  _SorterData: {. 
275a0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
275b0 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ..  pOut = &aMem
275c0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20  [pOp->p2];.  pC 
275d0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
275e0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69  p1];.  assert( i
275f0 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20  sSorter(pC) );. 
27600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
27610 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43  eSorterRowkey(pC
27620 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72  , pOut);.  asser
27630 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
27640 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73   || (pOut->flags
27650 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a   & MEM_Blob) );.
27660 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
27670 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
27680 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
27690 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
276a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
276b0 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  ;.  p->apCsr[pOp
276c0 2d 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74  ->p3]->cacheStat
276d0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
276e0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
276f0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61   Opcode: RowData
27700 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
27710 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
27720 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74  =data.**.** Writ
27730 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
27740 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  P2 the complete 
27750 72 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  row content for 
27760 74 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77  the row at .** w
27770 68 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69  hich cursor P1 i
27780 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27790 74 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69  ting..** There i
277a0 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
277b0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
277c0 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74    .** It is just
277d0 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
277e0 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61   P2 register exa
277f0 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
27800 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
27810 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
27820 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
27830 20 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   is an index, th
27840 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  en the content i
27850 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
27860 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73   row..** If curs
27870 6f 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65  or P2 is a table
27880 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27890 6e 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20  nt extracted is 
278a0 74 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  the data..**.** 
278b0 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  If the P1 cursor
278c0 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
278d0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
278e0 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77   (not a NULL row
278f0 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74  ).** of a real t
27900 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
27910 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  do-table..**.** 
27920 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68  If P3!=0 then th
27930 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c  is opcode is all
27940 6f 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20  owed to make an 
27950 65 70 68 65 72 6d 65 72 61 6c 20 70 6f 69 6e 74  ephermeral point
27960 65 72 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64  er.** into the d
27970 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
27980 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
27990 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
279a0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69  e output.** regi
279b0 73 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76  ster will be inv
279c0 61 6c 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e  alidated as soon
279d0 20 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d   as the cursor m
279e0 6f 76 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67  oves - including
279f0 0a 2a 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64  .** moves caused
27a00 20 62 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72   by other cursor
27a10 73 20 74 68 61 74 20 22 73 61 76 65 22 20 74 68  s that "save" th
27a20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
27a30 72 73 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f  rsors.** positio
27a40 6e 20 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20  n in order that 
27a50 74 68 65 79 20 63 61 6e 20 77 72 69 74 65 20 74  they can write t
27a60 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
27a70 2e 20 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74  .  If P3==0.** t
27a80 68 65 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  hen a copy of th
27a90 65 20 64 61 74 61 20 69 73 20 6d 61 64 65 20 69  e data is made i
27aa0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21  nto memory.  P3!
27ab0 3d 30 20 69 73 20 66 61 73 74 65 72 2c 20 62 75  =0 is faster, bu
27ac0 74 0a 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61  t.** P3==0 is sa
27ad0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33  fer..**.** If P3
27ae0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  !=0 then the con
27af0 74 65 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72  tent of the P2 r
27b00 65 67 69 73 74 65 72 20 69 73 20 75 6e 73 75 69  egister is unsui
27b10 74 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  table for use.**
27b20 20 69 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e   in OP_Result an
27b30 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20  d any OP_Result 
27b40 77 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20  will invalidate 
27b50 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  the P2 register 
27b60 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  content..** The 
27b70 50 32 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  P2 register cont
27b80 65 6e 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74  ent is invalidat
27b90 65 64 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69  ed by opcodes li
27ba0 6b 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  ke OP_Function o
27bb0 72 0a 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20  r.** by any use 
27bc0 6f 66 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f  of another curso
27bd0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
27be0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f  e same table..*/
27bf0 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61  .case OP_RowData
27c00 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
27c10 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
27c20 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e   *pCrsr;.  u32 n
27c30 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
27c40 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
27c50 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
27c60 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27c70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
27c80 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
27c90 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
27ca0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
27cb0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
27cc0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
27cd0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
27ce0 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d  t( isSorter(pC)=
27cf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27d00 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29  pC->nullRow==0 )
27d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
27d20 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
27d30 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
27d40 63 2e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  c.pCursor;..  /*
27d50 20 54 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20   The OP_RowData 
27d60 6f 70 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66  opcodes always f
27d70 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73  ollow OP_NotExis
27d80 74 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65  ts or.  ** OP_Se
27d90 65 6b 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65  ekRowid or OP_Re
27da0 77 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74  wind/Op_Next wit
27db0 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67  h no intervening
27dc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
27dd0 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e  ** that might in
27de0 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
27df0 73 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69  sor..  ** If thi
27e00 73 20 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20  s where not the 
27e10 63 61 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20  case, on of the 
27e20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
27e30 28 29 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66  ()s.  ** would f
27e40 61 69 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69  ail.  Should thi
27e50 73 20 65 76 65 72 20 63 68 61 6e 67 65 20 28 62  s ever change (b
27e60 65 63 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65  ecause of change
27e70 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20  s in the code.  
27e80 2a 2a 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68  ** generator) th
27e90 65 6e 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64  en the fix would
27ea0 20 62 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20   be to insert a 
27eb0 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
27ec0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
27ed0 76 65 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  veto()..  */.  a
27ee0 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
27ef0 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
27f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27f10 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
27f20 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69  lid(pCrsr) );.#i
27f30 66 20 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75  f 0  /* Not requ
27f40 69 72 65 64 20 64 75 65 20 74 6f 20 74 68 65 20  ired due to the 
27f50 70 72 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65  previous to asse
27f60 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
27f70 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
27f80 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
27f90 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21  o(pC);.  if( rc!
27fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
27fb0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
27fc0 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rror;.#endif..  
27fd0 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
27fe0 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73  PayloadSize(pCrs
27ff0 72 29 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32  r);.  if( n>(u32
28000 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  )db->aLimit[SQLI
28010 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
28020 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
28030 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74  _big;.  }.  test
28040 63 61 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20  case( n==0 );.  
28050 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
28060 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72  MemFromBtree(pCr
28070 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b  sr, 0, n, pOut);
28080 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
28090 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
280a0 72 6f 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d  ror;.  if( !pOp-
280b0 3e 70 33 20 29 20 44 65 65 70 68 65 6d 65 72 61  >p3 ) Deephemera
280c0 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50  lize(pOut);.  UP
280d0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
280e0 45 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53  E(pOut);.  REGIS
280f0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
28100 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  2, pOut);.  brea
28110 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
28120 20 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a   Rowid P1 P2 * *
28130 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
28140 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
28150 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73  * Store in regis
28160 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65  ter P2 an intege
28170 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6b  r which is the k
28180 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ey of the table 
28190 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31  entry that.** P1
281a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
281b0 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31  int to..**.** P1
281c0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
281d0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
281e0 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
281f0 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73 65 64  ble.  There used
28200 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61   to.** be a sepa
28210 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f  rate OP_VRowid o
28220 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69  pcode for use wi
28230 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
28240 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f  s, but this.** o
28250 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f  ne opcode now wo
28260 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62  rks for both tab
28270 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73  le types..*/.cas
28280 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20  e OP_Rowid: {   
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282a0 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43   out2 */.  VdbeC
282b0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34  ursor *pC;.  i64
282c0 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   v;.  sqlite3_vt
282d0 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e  ab *pVtab;.  con
282e0 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
282f0 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70  e *pModule;..  p
28300 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
28310 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
28320 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
28330 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
28340 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
28350 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
28360 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
28370 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
28380 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  t( pC->eCurType!
28390 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
283a0 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  || pC->nullRow )
283b0 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c  ;.  if( pC->null
283c0 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  Row ){.    pOut-
283d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
283e0 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l;.    break;.  
283f0 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65  }else if( pC->de
28400 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
28410 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65      v = pC->move
28420 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  toTarget;.#ifnde
28430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
28440 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c  RTUALTABLE.  }el
28450 73 65 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  se if( pC->eCurT
28460 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41  ype==CURTYPE_VTA
28470 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
28480 20 70 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30   pC->uc.pVCur!=0
28490 20 29 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20   );.    pVtab = 
284a0 70 43 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56  pC->uc.pVCur->pV
284b0 74 61 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  tab;.    pModule
284c0 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
284d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
284e0 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29  Module->xRowid )
284f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75  ;.    rc = pModu
28500 6c 65 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75  le->xRowid(pC->u
28510 63 2e 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20  c.pVCur, &v);.  
28520 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
28530 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
28540 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ab);.    if( rc 
28550 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
28560 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69  _to_error;.#endi
28570 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28580 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
28590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
285a0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
285b0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
285c0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
285d0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
285e0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
285f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
28600 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20  Restore(pC);.   
28610 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
28620 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
28630 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e  r;.    if( pC->n
28640 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
28650 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
28660 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
28670 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  eak;.    }.    v
28680 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
28690 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63  ntegerKey(pC->uc
286a0 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  .pCursor);.  }. 
286b0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pOut->u.i = v;.
286c0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
286d0 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50  pcode: NullRow P
286e0 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
286f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28700 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  P1 to a null row
28710 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e  .  Any OP_Column
28720 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74   operations.** t
28730 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20  hat occur while 
28740 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  the cursor is on
28750 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69   the null row wi
28760 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69  ll always.** wri
28770 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  te a NULL..*/.ca
28780 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b  se OP_NullRow: {
28790 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
287a0 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
287b0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
287c0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
287d0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
287e0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
287f0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
28800 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
28810 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
28820 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
28830 45 3b 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75  E;.  if( pC->eCu
28840 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
28850 54 52 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65  TREE ){.    asse
28860 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
28870 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  or!=0 );.    sql
28880 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28890 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72  rsor(pC->uc.pCur
288a0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  sor);.  }.  brea
288b0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
288c0 20 53 65 65 6b 45 6e 64 20 50 31 20 2a 20 2a 20   SeekEnd P1 * * 
288d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74 69  * *.**.** Positi
288e0 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 61 74 20  on cursor P1 at 
288f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
28900 74 72 65 65 20 66 6f 72 20 74 68 65 20 70 75 72  tree for the pur
28910 70 6f 73 65 20 6f 66 0a 2a 2a 20 61 70 70 65 6e  pose of.** appen
28920 64 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ding a new entry
28930 20 6f 6e 74 6f 20 74 68 65 20 62 74 72 65 65 2e   onto the btree.
28940 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
28950 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 75  umed that the cu
28960 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
28970 79 20 66 6f 72 20 61 70 70 65 6e 64 69 6e 67 20  y for appending 
28980 61 6e 64 20 73 6f 0a 2a 2a 20 69 66 20 74 68 65  and so.** if the
28990 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
289a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
289b0 72 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  r must already b
289c0 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
289d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
289e0 62 74 72 65 65 20 61 6e 64 20 73 6f 20 6e 6f 20  btree and so no 
289f0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
28a00 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   to.** the curso
28a10 72 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  r..*/./* Opcode:
28a20 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20   Last P1 P2 * * 
28a30 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
28a40 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69   use of the Rowi
28a50 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 50  d or Column or P
28a60 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  rev instruction 
28a70 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20  for P1 .** will 
28a80 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73  refer to the las
28a90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
28aa0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
28ab0 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
28ac0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
28ad0 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32   is empty and P2
28ae0 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d  >0, then jump im
28af0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
28b00 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f  .** If P2 is 0 o
28b10 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  r if the table o
28b20 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
28b30 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
28b40 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
28b50 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
28b60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  on..**.** This o
28b70 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
28b80 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72   cursor configur
28b90 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65  ed to move in re
28ba0 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20  verse order,.** 
28bb0 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77  from the end tow
28bc0 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ard the beginnin
28bd0 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  g.  In other wor
28be0 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  ds, the cursor i
28bf0 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  s.** configured 
28c00 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74  to use Prev, not
28c10 20 4e 65 78 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f   Next..*/.case O
28c20 50 5f 53 65 65 6b 45 6e 64 3a 0a 63 61 73 65 20  P_SeekEnd:.case 
28c30 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20  OP_Last: {      
28c40 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
28c50 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
28c60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
28c70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
28c80 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
28c90 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
28ca0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
28cb0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
28cc0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
28cd0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
28ce0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
28cf0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
28d00 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
28d10 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72 65  uc.pCursor;.  re
28d20 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
28d30 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 23 69 66   pCrsr!=0 );.#if
28d40 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28d50 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20  .  pC->seekOp = 
28d60 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e  pOp->opcode;.#en
28d70 64 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  dif.  if( pOp->o
28d80 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 45 6e  pcode==OP_SeekEn
28d90 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
28da0 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20   pOp->p2==0 );. 
28db0 20 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c     pC->seekResul
28dc0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  t = -1;.    if( 
28dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28de0 6f 72 49 73 56 61 6c 69 64 4e 4e 28 70 43 72 73  orIsValidNN(pCrs
28df0 72 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  r) ){.      brea
28e00 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
28e10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
28e20 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72 65 73  Last(pCrsr, &res
28e30 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  );.  pC->nullRow
28e40 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43   = (u8)res;.  pC
28e50 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
28e60 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 0;.  pC->cach
28e70 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
28e80 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72 63 20  STALE;.  if( rc 
28e90 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
28ea0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
28eb0 20 70 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20   pOp->p2>0 ){.  
28ec0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
28ed0 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20  n(res!=0,2);.   
28ee0 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20   if( res ) goto 
28ef0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
28f00 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
28f10 70 63 6f 64 65 3a 20 49 66 53 6d 61 6c 6c 65 72  pcode: IfSmaller
28f20 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
28f30 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
28f40 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28f50 69 6e 20 74 68 65 20 74 61 62 6c 65 20 50 31 2e  in the table P1.
28f60 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20    Jump to P2 if 
28f70 74 68 61 74 0a 2a 2a 20 65 73 74 69 6d 61 74 65  that.** estimate
28f80 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 61 70   is less than ap
28f90 70 72 6f 78 69 6d 61 74 65 6c 79 20 32 2a 2a 28  proximately 2**(
28fa0 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a 63 61 73 65  0.1*P3)..*/.case
28fb0 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 3a 20 7b   OP_IfSmaller: {
28fc0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
28fd0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
28fe0 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
28ff0 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
29000 73 3b 0a 20 20 69 36 34 20 73 7a 3b 0a 0a 20 20  s;.  i64 sz;..  
29010 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
29020 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
29030 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
29040 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
29050 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
29060 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  pC!=0 );.  pCrsr
29070 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
29080 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  r;.  assert( pCr
29090 73 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  sr );.  rc = sql
290a0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
290b0 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 69  Crsr, &res);.  i
290c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
290d0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
290e0 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
290f0 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74 65  .    sz = sqlite
29100 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
29110 74 28 70 43 72 73 72 29 3b 0a 20 20 20 20 69 66  t(pCrsr);.    if
29120 28 20 41 4c 57 41 59 53 28 73 7a 3e 3d 30 29 20  ( ALWAYS(sz>=0) 
29130 26 26 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  && sqlite3LogEst
29140 28 28 75 36 34 29 73 7a 29 3c 70 4f 70 2d 3e 70  ((u64)sz)<pOp->p
29150 33 20 29 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d  3 ) res = 1;.  }
29160 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
29170 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
29180 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
29190 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
291a0 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
291b0 65 3a 20 53 6f 72 74 65 72 53 6f 72 74 20 50 31  e: SorterSort P1
291c0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
291d0 41 66 74 65 72 20 61 6c 6c 20 72 65 63 6f 72 64  After all record
291e0 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65  s have been inse
291f0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 53 6f  rted into the So
29200 72 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 69  rter object.** i
29210 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 31 2c  dentified by P1,
29220 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63   invoke this opc
29230 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ode to actually 
29240 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 0a  do the sorting..
29250 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
29260 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
29270 63 6f 72 64 73 20 74 6f 20 62 65 20 73 6f 72 74  cords to be sort
29280 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ed..**.** This o
29290 70 63 6f 64 65 20 69 73 20 61 6e 20 61 6c 69 61  pcode is an alia
292a0 73 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20 61 6e  s for OP_Sort an
292b0 64 20 4f 50 5f 52 65 77 69 6e 64 20 74 68 61 74  d OP_Rewind that
292c0 20 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20   is used.** for 
292d0 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 73 2e 0a  Sorter objects..
292e0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f  */./* Opcode: So
292f0 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  rt P1 P2 * * *.*
29300 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
29310 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68   does exactly th
29320 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
29330 4f 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74  OP_Rewind except
29340 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72   that.** it incr
29350 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75  ements an undocu
29360 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61  mented global va
29370 72 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20  riable used for 
29380 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53  testing..**.** S
29390 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  orting is accomp
293a0 6c 69 73 68 65 64 20 62 79 20 77 72 69 74 69 6e  lished by writin
293b0 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61  g records into a
293c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a   sorting index,.
293d0 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e  ** then rewindin
293e0 67 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64  g that index and
293f0 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
29400 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
29410 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75  to.** end.  We u
29420 73 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f  se the OP_Sort o
29430 70 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66  pcode instead of
29440 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f   OP_Rewind to do
29450 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e   the.** rewindin
29460 67 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c  g so that the gl
29470 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69  obal variable wi
29480 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65  ll be incremente
29490 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73  d and.** regress
294a0 69 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65  ion tests can de
294b0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
294c0 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d  or not the optim
294d0 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65  izer is.** corre
294e0 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20  ctly optimizing 
294f0 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61  out sorts..*/.ca
29500 73 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  se OP_SorterSort
29510 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a  :    /* jump */.
29520 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b 20  case OP_Sort: { 
29530 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
29540 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
29550 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73  TEST.  sqlite3_s
29560 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ort_count++;.  s
29570 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
29580 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  unt--;.#endif.  
29590 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49  p->aCounter[SQLI
295a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
295b0 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c  RT]++;.  /* Fall
295c0 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50   through into OP
295d0 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20  _Rewind */.}./* 
295e0 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50  Opcode: Rewind P
295f0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
29600 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66   The next use of
29610 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f   the Rowid or Co
29620 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73  lumn or Next ins
29630 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20  truction for P1 
29640 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74  .** will refer t
29650 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
29660 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
29670 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
29680 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  ..** If the tabl
29690 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d  e or index is em
296a0 70 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  pty, jump immedi
296b0 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20  ately to P2..** 
296c0 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  If the table or 
296d0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70  index is not emp
296e0 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ty, fall through
296f0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
29700 67 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  g .** instructio
29710 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
29720 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
29730 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
29740 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72  d to move in for
29750 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  ward order,.** f
29760 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
29770 67 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64  g toward the end
29780 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
29790 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
297a0 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
297b0 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20  o use Next, not 
297c0 50 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Prev..*/.case OP
297d0 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20  _Rewind: {      
297e0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
297f0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
29800 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
29810 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
29820 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
29830 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
29840 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
29850 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
29860 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
29870 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
29880 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d  t( isSorter(pC)=
29890 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  =(pOp->opcode==O
298a0 50 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b  P_SorterSort) );
298b0 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 69 66 64  .  res = 1;.#ifd
298c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
298d0 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f    pC->seekOp = O
298e0 50 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64 69 66  P_Rewind;.#endif
298f0 0a 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28  .  if( isSorter(
29900 70 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pC) ){.    rc = 
29910 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
29920 72 52 65 77 69 6e 64 28 70 43 2c 20 26 72 65 73  rRewind(pC, &res
29930 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29940 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
29950 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
29960 52 45 45 20 29 3b 0a 20 20 20 20 70 43 72 73 72  REE );.    pCrsr
29970 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
29980 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
29990 43 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d  Crsr );.    rc =
299a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
299b0 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
299c0 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
299d0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
299e0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
299f0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
29a00 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
29a10 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
29a20 5f 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75  _error;.  pC->nu
29a30 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b  llRow = (u8)res;
29a40 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
29a50 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  p2>0 && pOp->p2<
29a60 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64 62 65  p->nOp );.  Vdbe
29a70 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
29a80 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
29a90 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
29aa0 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
29ab0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20  /* Opcode: Next 
29ac0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
29ad0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72  *.** Advance cur
29ae0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
29af0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
29b00 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
29b10 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
29b20 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
29b30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
29b40 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  re key/value pai
29b50 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
29b60 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
29b70 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
29b80 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
29b90 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65  e cursor advance
29ba0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
29bb0 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
29bc0 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
29bd0 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64  * The Next opcod
29be0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
29bf0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
29c00 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a  kGT, SeekGE, or.
29c10 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63  ** OP_Rewind opc
29c20 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69  ode used to posi
29c30 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e  tion the cursor.
29c40 20 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c    Next is not al
29c50 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c  lowed.** to foll
29c60 6f 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c  ow SeekLT, SeekL
29c70 45 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a  E, or OP_Last..*
29c80 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
29c90 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
29ca0 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
29cb0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
29cc0 20 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a    P1 must have.*
29cd0 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72  * been opened pr
29ce0 69 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f  ior to this opco
29cf0 64 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61  de or the progra
29d00 6d 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  m will segfault.
29d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61  .**.** The P3 va
29d20 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f  lue is a hint to
29d30 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   the btree imple
29d40 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33  mentation. If P3
29d50 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  ==1, that.** mea
29d60 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20  ns P1 is an SQL 
29d70 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74  index and that t
29d80 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
29d90 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
29da0 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  ** omitted if th
29db0 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  at index had bee
29dc0 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73  n unique.  P3 is
29dd0 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20   usually 0.  P3 
29de0 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74  is.** always eit
29df0 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a  her 0 or 1..**.*
29e00 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f  * P4 is always o
29e10 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43  f type P4_ADVANC
29e20 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  E. The function 
29e30 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
29e40 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
29e50 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eNext()..**.** I
29e60 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
29e70 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
29e80 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
29e90 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
29ea0 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
29eb0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
29ec0 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
29ed0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
29ee0 73 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74 49 66  so: Prev, NextIf
29ef0 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  Open.*/./* Opcod
29f00 65 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20 50 31  e: NextIfOpen P1
29f10 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
29f20 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
29f30 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4e  orks just like N
29f40 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20  ext except that 
29f50 69 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  if cursor P1 is 
29f60 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62  not.** open it b
29f70 65 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ehaves a no-op..
29f80 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72  */./* Opcode: Pr
29f90 65 76 20 50 31 20 50 32 20 50 33 20 50 34 20 50  ev P1 P2 P3 P4 P
29fa0 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20  5.**.** Back up 
29fb0 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
29fc0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
29fd0 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  he previous key/
29fe0 64 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73  data pair in its
29ff0 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
2a000 65 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ex.  If there is
2a010 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79   no previous key
2a020 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65  /value pairs the
2a030 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  n fall through.*
2a040 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
2a050 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ng instruction. 
2a060 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73   But if the curs
2a070 6f 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75  or backup was su
2a080 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d  ccessful,.** jum
2a090 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
2a0a0 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68   P2..**.**.** Th
2a0b0 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73  e Prev opcode is
2a0c0 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c   only valid foll
2a0d0 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c 54 2c  owing an SeekLT,
2a0e0 20 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a 20 4f   SeekLE, or.** O
2a0f0 50 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20 75 73  P_Last opcode us
2a100 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
2a110 68 65 20 63 75 72 73 6f 72 2e 20 20 50 72 65 76  he cursor.  Prev
2a120 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a   is not allowed.
2a130 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65  ** to follow See
2a140 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 20  kGT, SeekGE, or 
2a150 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a 2a 2a  OP_Rewind..**.**
2a160 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
2a170 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
2a180 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
2a190 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 66  seudo-table.  If
2a1a0 20 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20 6f 70   P1 is.** not op
2a1b0 65 6e 20 74 68 65 6e 20 74 68 65 20 62 65 68 61  en then the beha
2a1c0 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65  vior is undefine
2a1d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20  d..**.** The P3 
2a1e0 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20  value is a hint 
2a1f0 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70  to the btree imp
2a200 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20  lementation. If 
2a210 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d  P3==1, that.** m
2a220 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51  eans P1 is an SQ
2a230 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74  L index and that
2a240 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
2a250 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
2a260 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20  n.** omitted if 
2a270 74 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62  that index had b
2a280 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20  een unique.  P3 
2a290 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50  is usually 0.  P
2a2a0 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65  3 is.** always e
2a2b0 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a  ither 0 or 1..**
2a2c0 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73  .** P4 is always
2a2d0 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41   of type P4_ADVA
2a2e0 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  NCE. The functio
2a2f0 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  n pointer points
2a300 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
2a310 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a  reePrevious()..*
2a320 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f  *.** If P5 is po
2a330 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a  sitive and the j
2a340 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68  ump is taken, th
2a350 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72  en event counter
2a360 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20  .** number P5-1 
2a370 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
2a380 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63  statement is inc
2a390 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f 2a 20  remented..*/./* 
2a3a0 4f 70 63 6f 64 65 3a 20 50 72 65 76 49 66 4f 70  Opcode: PrevIfOp
2a3b0 65 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50  en P1 P2 P3 P4 P
2a3c0 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  5.**.** This opc
2a3d0 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ode works just l
2a3e0 69 6b 65 20 50 72 65 76 20 65 78 63 65 70 74 20  ike Prev except 
2a3f0 74 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50  that if cursor P
2a400 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e  1 is not.** open
2a410 20 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f   it behaves a no
2a420 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  -op..*/./* Opcod
2a430 65 3a 20 53 6f 72 74 65 72 4e 65 78 74 20 50 31  e: SorterNext P1
2a440 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a   P2 * * P5.**.**
2a450 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72   This opcode wor
2a460 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 50 5f  ks just like OP_
2a470 4e 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74  Next except that
2a480 20 50 31 20 6d 75 73 74 20 62 65 20 61 0a 2a 2a   P1 must be a.**
2a490 20 73 6f 72 74 65 72 20 6f 62 6a 65 63 74 20 66   sorter object f
2a4a0 6f 72 20 77 68 69 63 68 20 74 68 65 20 4f 50 5f  or which the OP_
2a4b0 53 6f 72 74 65 72 53 6f 72 74 20 6f 70 63 6f 64  SorterSort opcod
2a4c0 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 69 6e  e has been.** in
2a4d0 76 6f 6b 65 64 2e 20 20 54 68 69 73 20 6f 70 63  voked.  This opc
2a4e0 6f 64 65 20 61 64 76 61 6e 63 65 73 20 74 68 65  ode advances the
2a4f0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2a500 65 78 74 20 73 6f 72 74 65 64 0a 2a 2a 20 72 65  ext sorted.** re
2a510 63 6f 72 64 2c 20 6f 72 20 6a 75 6d 70 73 20 74  cord, or jumps t
2a520 6f 20 50 32 20 69 66 20 74 68 65 72 65 20 61 72  o P2 if there ar
2a530 65 20 6e 6f 20 6d 6f 72 65 20 73 6f 72 74 65 64  e no more sorted
2a540 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63 61 73   records..*/.cas
2a550 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
2a560 20 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20   {  /* jump */. 
2a570 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
2a580 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ..  pC = p->apCs
2a590 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2a5a0 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70  sert( isSorter(p
2a5b0 43 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  C) );.  rc = sql
2a5c0 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 4e 65  ite3VdbeSorterNe
2a5d0 78 74 28 64 62 2c 20 70 43 29 3b 0a 20 20 67 6f  xt(db, pC);.  go
2a5e0 74 6f 20 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61  to next_tail;.ca
2a5f0 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
2a600 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a  :    /* jump */.
2a610 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
2a620 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  en:    /* jump *
2a630 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  /.  if( p->apCsr
2a640 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30 20 29 20 62  [pOp->p1]==0 ) b
2a650 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  reak;.  /* Fall 
2a660 74 68 72 6f 75 67 68 20 2a 2f 0a 63 61 73 65 20  through */.case 
2a670 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20 20  OP_Prev:        
2a680 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
2a690 65 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20 20 20  e OP_Next:      
2a6a0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
2a6b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2a6c0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2a6d0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
2a6e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41  ssert( pOp->p5<A
2a6f0 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75  rraySize(p->aCou
2a700 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20  nter) );.  pC = 
2a710 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2a720 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2a730 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a740 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
2a750 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  to==0 );.  asser
2a760 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2a770 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2a780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2a790 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74  >opcode!=OP_Next
2a7a0 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76   || pOp->p4.xAdv
2a7b0 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72  ance==sqlite3Btr
2a7c0 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65  eeNext );.  asse
2a7d0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
2a7e0 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d  =OP_Prev || pOp-
2a7f0 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71  >p4.xAdvance==sq
2a800 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2a810 75 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  us );.  assert( 
2a820 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
2a830 4e 65 78 74 49 66 4f 70 65 6e 20 7c 7c 20 70 4f  NextIfOpen || pO
2a840 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
2a850 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2a860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2a870 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
2a880 65 76 49 66 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d  evIfOpen || pOp-
2a890 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71  >p4.xAdvance==sq
2a8a0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2a8b0 75 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4e  us);..  /* The N
2a8c0 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  ext opcode is on
2a8d0 6c 79 20 75 73 65 64 20 61 66 74 65 72 20 53 65  ly used after Se
2a8e0 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 61 6e  ekGT, SeekGE, an
2a8f0 64 20 52 65 77 69 6e 64 2e 0a 20 20 2a 2a 20 54  d Rewind..  ** T
2a900 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69  he Prev opcode i
2a910 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65  s only used afte
2a920 72 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  r SeekLT, SeekLE
2a930 2c 20 61 6e 64 20 4c 61 73 74 2e 20 2a 2f 0a 20  , and Last. */. 
2a940 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2a950 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code!=OP_Next ||
2a960 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
2a970 5f 4e 65 78 74 49 66 4f 70 65 6e 0a 20 20 20 20  _NextIfOpen.    
2a980 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70     || pC->seekOp
2a990 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 70  ==OP_SeekGT || p
2a9a0 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
2a9b0 65 6b 47 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  ekGE.       || p
2a9c0 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65  C->seekOp==OP_Re
2a9d0 77 69 6e 64 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  wind || pC->seek
2a9e0 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64 29 3b 0a 20  Op==OP_Found);. 
2a9f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2aa00 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c  code!=OP_Prev ||
2aa10 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
2aa20 5f 50 72 65 76 49 66 4f 70 65 6e 0a 20 20 20 20  _PrevIfOpen.    
2aa30 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70     || pC->seekOp
2aa40 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 70  ==OP_SeekLT || p
2aa50 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
2aa60 65 6b 4c 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  ekLE.       || p
2aa70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61  C->seekOp==OP_La
2aa80 73 74 20 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4f  st );..  rc = pO
2aa90 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 28 70  p->p4.xAdvance(p
2aaa0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70  C->uc.pCursor, p
2aab0 4f 70 2d 3e 70 33 29 3b 0a 6e 65 78 74 5f 74 61  Op->p3);.next_ta
2aac0 69 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68 65 53  il:.  pC->cacheS
2aad0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2aae0 41 4c 45 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  ALE;.  VdbeBranc
2aaf0 68 54 61 6b 65 6e 28 72 63 3d 3d 53 51 4c 49 54  hTaken(rc==SQLIT
2ab00 45 5f 4f 4b 2c 32 29 3b 0a 20 20 69 66 28 20 72  E_OK,2);.  if( r
2ab10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ab20 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
2ab30 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 75  = 0;.    p->aCou
2ab40 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 5d 2b 2b 3b  nter[pOp->p5]++;
2ab50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2ab60 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
2ab70 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
2ab80 23 65 6e 64 69 66 0a 20 20 20 20 67 6f 74 6f 20  #endif.    goto 
2ab90 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63  jump_to_p2_and_c
2aba0 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
2abb0 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pt;.  }.  if( rc
2abc0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  !=SQLITE_DONE ) 
2abd0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2abe0 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20  o_error;.  rc = 
2abf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 43 2d  SQLITE_OK;.  pC-
2ac00 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
2ac10 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69  goto check_for_i
2ac20 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20  nterrupt;.}../* 
2ac30 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72  Opcode: IdxInser
2ac40 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
2ac50 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2ac60 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65  y=r[P2].**.** Re
2ac70 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20  gister P2 holds 
2ac80 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79  an SQL index key
2ac90 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a   made using the.
2aca0 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e  ** MakeRecord in
2acb0 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69  structions.  Thi
2acc0 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20  s opcode writes 
2acd0 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f  that key.** into
2ace0 20 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20   the index P1.  
2acf0 44 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74  Data for the ent
2ad00 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a  ry is nil..**.**
2ad10 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 7a 65   If P4 is not ze
2ad20 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
2ad30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
2ad40 75 65 73 20 69 6e 20 74 68 65 20 75 6e 70 61 63  ues in the unpac
2ad50 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f 66 20 72 65  ked.** key of re
2ad60 67 28 50 32 29 2e 20 20 49 6e 20 74 68 61 74 20  g(P2).  In that 
2ad70 63 61 73 65 2c 20 50 33 20 69 73 20 74 68 65 20  case, P3 is the 
2ad80 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
2ad90 73 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66  st register.** f
2ada0 6f 72 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  or the unpacked 
2adb0 6b 65 79 2e 20 20 54 68 65 20 61 76 61 69 6c 61  key.  The availa
2adc0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 75 6e  bility of the un
2add0 70 61 63 6b 65 64 20 6b 65 79 20 63 61 6e 20 73  packed key can s
2ade0 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65 20 61  ometimes.** be a
2adf0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  n optimization..
2ae00 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20  **.** If P5 has 
2ae10 74 68 65 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  the OPFLAG_APPEN
2ae20 44 20 62 69 74 20 73 65 74 2c 20 74 68 61 74 20  D bit set, that 
2ae30 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2ae40 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a   b-tree layer.**
2ae50 20 74 68 61 74 20 74 68 69 73 20 69 6e 73 65 72   that this inser
2ae60 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62  t is likely to b
2ae70 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a  e an append..**.
2ae80 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65  ** If P5 has the
2ae90 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
2aea0 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68  bit set, then th
2aeb0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2aec0 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   is.** increment
2aed0 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72  ed by this instr
2aee0 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  uction.  If the 
2aef0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62  OPFLAG_NCHANGE b
2af00 69 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a 2a 20  it is clear,.** 
2af10 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20  then the change 
2af20 63 6f 75 6e 74 65 72 20 69 73 20 75 6e 63 68 61  counter is uncha
2af30 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
2af40 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
2af50 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20  KRESULT flag of 
2af60 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69  P5 is set, the i
2af70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69  mplementation mi
2af80 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65  ght.** run faste
2af90 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e  r by avoiding an
2afa0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65   unnecessary see
2afb0 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20  k on cursor P1. 
2afc0 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65   However,.** the
2afd0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
2afe0 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20  ESULT flag must 
2aff0 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74  only be set if t
2b000 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
2b010 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73  o prior.** seeks
2b020 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f   on the cursor o
2b030 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r if the most re
2b040 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61  cent seek used a
2b050 20 6b 65 79 20 65 71 75 69 76 61 6c 65 6e 74 0a   key equivalent.
2b060 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  ** to P2. .**.**
2b070 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
2b080 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  n only works for
2b090 20 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65   indices.  The e
2b0a0 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75  quivalent instru
2b0b0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62  ction.** for tab
2b0c0 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74  les is OP_Insert
2b0d0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2b0e0 53 6f 72 74 65 72 49 6e 73 65 72 74 20 50 31 20  SorterInsert P1 
2b0f0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
2b100 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a  psis: key=r[P2].
2b110 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
2b120 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69  2 holds an SQL i
2b130 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73  ndex key made us
2b140 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52  ing the.** MakeR
2b150 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
2b160 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  ns.  This opcode
2b170 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79   writes that key
2b180 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  .** into the sor
2b190 74 65 72 20 50 31 2e 20 20 44 61 74 61 20 66 6f  ter P1.  Data fo
2b1a0 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e  r the entry is n
2b1b0 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  il..*/.case OP_S
2b1c0 6f 72 74 65 72 49 6e 73 65 72 74 3a 20 20 20 20  orterInsert:    
2b1d0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 63 61 73     /* in2 */.cas
2b1e0 65 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3a 20  e OP_IdxInsert: 
2b1f0 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20  {        /* in2 
2b200 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2b210 2a 70 43 3b 0a 20 20 42 74 72 65 65 50 61 79 6c  *pC;.  BtreePayl
2b220 6f 61 64 20 78 3b 0a 0a 20 20 61 73 73 65 72 74  oad x;..  assert
2b230 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2b240 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
2b250 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
2b260 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2b270 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2b280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
2b290 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d  orter(pC)==(pOp-
2b2a0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2b2b0 65 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20 70  erInsert) );.  p
2b2c0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
2b2d0 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
2b2e0 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
2b2f0 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20  M_Blob );.  if( 
2b300 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
2b310 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
2b320 68 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72  hange++;.  asser
2b330 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2b340 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c  =CURTYPE_BTREE |
2b350 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2b360 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29  P_SorterInsert )
2b370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2b380 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
2b390 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
2b3a0 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63 20  pIn2);.  if( rc 
2b3b0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2b3c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
2b3d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2b3e0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 7b  _SorterInsert ){
2b3f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b400 33 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65  3VdbeSorterWrite
2b410 28 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65  (pC, pIn2);.  }e
2b420 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20  lse{.    x.nKey 
2b430 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78  = pIn2->n;.    x
2b440 2e 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b  .pKey = pIn2->z;
2b450 0a 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d  .    x.aMem = aM
2b460 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  em + pOp->p3;.  
2b470 20 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29    x.nMem = (u16)
2b480 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72  pOp->p4.i;.    r
2b490 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b4a0 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43  Insert(pC->uc.pC
2b4b0 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20  ursor, &x,.     
2b4c0 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28      (pOp->p5 & (
2b4d0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50  OPFLAG_APPEND|OP
2b4e0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
2b4f0 4e 29 29 2c 20 0a 20 20 20 20 20 20 20 20 28 28  N)), .        ((
2b500 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
2b510 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20  _USESEEKRESULT) 
2b520 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  ? pC->seekResult
2b530 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b   : 0).        );
2b540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
2b550 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2b560 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61  =0 );.    pC->ca
2b570 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2b580 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69  E_STALE;.  }.  i
2b590 66 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f 72  f( rc) goto abor
2b5a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2b5b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2b5c0 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65  pcode: IdxDelete
2b5d0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2b5e0 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
2b5f0 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68  [P2@P3].**.** Th
2b600 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20  e content of P3 
2b610 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
2b620 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50  ng at register P
2b630 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70  2 form.** an unp
2b640 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
2b650 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d   This opcode rem
2b660 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20  oves that entry 
2b670 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64  from the .** ind
2b680 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72  ex opened by cur
2b690 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20  sor P1..*/.case 
2b6a0 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a  OP_IdxDelete: {.
2b6b0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2b6c0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
2b6d0 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
2b6e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2b6f0 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   r;..  assert( p
2b700 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73  Op->p3>0 );.  as
2b710 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
2b720 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
2b730 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
2b740 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29   p->nCursor)+1 )
2b750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2b760 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2b770 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2b780 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2b790 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2b7a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2b7b0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2b7c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2b7d0 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  EE );.  pCrsr = 
2b7e0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
2b7f0 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21    assert( pCrsr!
2b800 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b810 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  pOp->p5==0 );.  
2b820 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
2b830 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e  >pKeyInfo;.  r.n
2b840 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
2b850 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 75 6c  ->p3;.  r.defaul
2b860 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e 61 4d  t_rc = 0;.  r.aM
2b870 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
2b880 70 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  p2];.  rc = sqli
2b890 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2b8a0 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
2b8b0 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
2b8c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2b8d0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2b8e0 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  r;.  if( res==0 
2b8f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2b900 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70  te3BtreeDelete(p
2b910 43 72 73 72 2c 20 42 54 52 45 45 5f 41 55 58 44  Crsr, BTREE_AUXD
2b920 45 4c 45 54 45 29 3b 0a 20 20 20 20 69 66 28 20  ELETE);.    if( 
2b930 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2b940 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2b950 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  }.  assert( pC->
2b960 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2b970 30 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  0 );.  pC->cache
2b980 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
2b990 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b  TALE;.  pC->seek
2b9a0 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 62 72  Result = 0;.  br
2b9b0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2b9c0 65 3a 20 44 65 66 65 72 72 65 64 53 65 65 6b 20  e: DeferredSeek 
2b9d0 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a 2a 20  P1 * P3 P4 *.** 
2b9e0 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65 20 50  Synopsis: Move P
2b9f0 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 20 69 66  3 to P1.rowid if
2ba00 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a 20 50 31   needed.**.** P1
2ba10 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e 64 65   is an open inde
2ba20 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50 33 20  x cursor and P3 
2ba30 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e 20 74  is a cursor on t
2ba40 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2ba50 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 69 73  .** table.  This
2ba60 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61 20 64   opcode does a d
2ba70 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f 66 20  eferred seek of 
2ba80 74 68 65 20 50 33 20 74 61 62 6c 65 20 63 75 72  the P3 table cur
2ba90 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f  sor.** to the ro
2baa0 77 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  w that correspon
2bab0 64 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ds to the curren
2bac0 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a 2a 0a  t row of P1..**.
2bad0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66  ** This is a def
2bae0 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74  erred seek.  Not
2baf0 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61  hing actually ha
2bb00 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74  ppens until.** t
2bb10 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
2bb20 64 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f  d to read a reco
2bb30 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  rd.  That way, i
2bb40 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63  f no reads.** oc
2bb50 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73  cur, no unnecess
2bb60 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e  ary I/O happens.
2bb70 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65  .**.** P4 may be
2bb80 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
2bb90 65 67 65 72 73 20 28 74 79 70 65 20 50 34 5f 49  egers (type P4_I
2bba0 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61 69 6e  NTARRAY) contain
2bbb0 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74 72 79  ing.** one entry
2bbc0 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
2bbd0 20 69 6e 20 74 68 65 20 50 33 20 74 61 62 6c 65   in the P3 table
2bbe0 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e 74 72  .  If array entr
2bbf0 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e 6f 6e  y a(i).** is non
2bc00 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65 61 64  -zero, then read
2bc10 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69 29 2d  ing column a(i)-
2bc20 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 50 33  1 from cursor P3
2bc30 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65   is .** equivale
2bc40 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69 6e 67  nt to performing
2bc50 20 74 68 65 20 64 65 66 65 72 72 65 64 20 73 65   the deferred se
2bc60 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65 61 64  ek and then read
2bc70 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a 2a 2a  ing column i .**
2bc80 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69 73 20   from P1.  This 
2bc90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73  information is s
2bca0 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e 64 20  tored in P3 and 
2bcb0 75 73 65 64 20 74 6f 20 72 65 64 69 72 65 63 74  used to redirect
2bcc0 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69 6e 73  .** reads agains
2bcd0 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50 31 2c  t P3 over to P1,
2bce0 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79 20 61   thus possibly a
2bcf0 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65 65 64  voiding the need
2bd00 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e 64 20   to.** seek and 
2bd10 72 65 61 64 20 63 75 72 73 6f 72 20 50 33 2e 0a  read cursor P3..
2bd20 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  */./* Opcode: Id
2bd30 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a  xRowid P1 P2 * *
2bd40 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2bd50 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
2bd60 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67  * Write into reg
2bd70 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65  ister P2 an inte
2bd80 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
2bd90 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2bda0 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a 2a 20  he record at.** 
2bdb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
2bdc0 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74 65 64  ndex key pointed
2bdd0 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20 50 31   to by cursor P1
2bde0 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65 72 20  .  This integer 
2bdf0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 65  should be.** the
2be00 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 74 61   rowid of the ta
2be10 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  ble entry to whi
2be20 63 68 20 74 68 69 73 20 69 6e 64 65 78 20 65 6e  ch this index en
2be30 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a  try points..**.*
2be40 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f 77 69  * See also: Rowi
2be50 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 2a  d, MakeRecord..*
2be60 2f 0a 63 61 73 65 20 4f 50 5f 44 65 66 65 72 72  /.case OP_Deferr
2be70 65 64 53 65 65 6b 3a 0a 63 61 73 65 20 4f 50 5f  edSeek:.case OP_
2be80 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  IdxRowid: {     
2be90 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
2bea0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2beb0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C;             /
2bec0 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78 20 63  * The P1 index c
2bed0 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 43  ursor */.  VdbeC
2bee0 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72 3b 20  ursor *pTabCur; 
2bef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2bf00 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 28 4f   table cursor (O
2bf10 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20 6f  P_DeferredSeek o
2bf20 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20 72 6f  nly) */.  i64 ro
2bf30 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2bf40 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74        /* Rowid t
2bf50 68 61 74 20 50 31 20 63 75 72 72 65 6e 74 20 70  hat P1 current p
2bf60 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  oints to */..  a
2bf70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2bf80 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
2bf90 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
2bfa0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
2bfb0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
2bfc0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
2bfd0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2bfe0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2bff0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
2c000 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
2c010 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
2c020 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73  Table==0 );.  as
2c030 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
2c040 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
2c050 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e 6e 75   assert( !pC->nu
2c060 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e 6f 70  llRow || pOp->op
2c070 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69  code==OP_IdxRowi
2c080 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 49  d );..  /* The I
2c090 64 78 52 6f 77 69 64 20 61 6e 64 20 53 65 65 6b  dxRowid and Seek
2c0a0 20 6f 70 63 6f 64 65 73 20 61 72 65 20 63 6f 6d   opcodes are com
2c0b0 62 69 6e 65 64 20 62 65 63 61 75 73 65 20 6f 66  bined because of
2c0c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 79   the commonality
2c0d0 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33  .  ** of sqlite3
2c0e0 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
2c0f0 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56  e() and sqlite3V
2c100 64 62 65 49 64 78 52 6f 77 69 64 28 29 2e 20 2a  dbeIdxRowid(). *
2c110 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2c120 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
2c130 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  e(pC);..  /* sql
2c140 69 74 65 33 56 62 65 43 75 72 73 6f 72 52 65 73  ite3VbeCursorRes
2c150 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  tore() can only 
2c160 66 61 69 6c 20 69 66 20 74 68 65 20 72 65 63 6f  fail if the reco
2c170 72 64 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  rd has been dele
2c180 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66 72 6f  ted.  ** out fro
2c190 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
2c1a0 6f 72 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 6e  or.  That will n
2c1b0 65 76 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72  ever happens for
2c1c0 20 61 6e 20 49 64 78 52 6f 77 69 64 0a 20 20 2a   an IdxRowid.  *
2c1d0 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f 64 65  * or Seek opcode
2c1e0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2c1f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc!=SQLITE_OK) )
2c200 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2c210 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28  to_error;..  if(
2c220 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b   !pC->nullRow ){
2c230 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 30 3b 20  .    rowid = 0; 
2c240 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
2c250 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69   Only used to si
2c260 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e  lence a warning.
2c270 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2c280 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
2c290 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43 75 72  (db, pC->uc.pCur
2c2a0 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20  sor, &rowid);.  
2c2b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c2c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2c2d0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2c2e0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
2c2f0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2c300 3d 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b  =OP_DeferredSeek
2c310 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c320 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20  ( pOp->p3>=0 && 
2c330 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75 72 73  pOp->p3<p->nCurs
2c340 6f 72 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  or );.      pTab
2c350 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
2c360 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61  Op->p3];.      a
2c370 73 73 65 72 74 28 20 70 54 61 62 43 75 72 21 3d  ssert( pTabCur!=
2c380 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2c390 74 28 20 70 54 61 62 43 75 72 2d 3e 65 43 75 72  t( pTabCur->eCur
2c3a0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2c3b0 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REE );.      ass
2c3c0 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 75 63  ert( pTabCur->uc
2c3d0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
2c3e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2c3f0 62 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 29 3b  bCur->isTable );
2c400 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e  .      pTabCur->
2c410 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
2c420 20 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f 76 65     pTabCur->move
2c430 74 6f 54 61 72 67 65 74 20 3d 20 72 6f 77 69 64  toTarget = rowid
2c440 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d  ;.      pTabCur-
2c450 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
2c460 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
2c470 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
2c480 50 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c 20 70  P4_INTARRAY || p
2c490 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29 3b 0a  Op->p4.ai==0 );.
2c4a0 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 61        pTabCur->a
2c4b0 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e 70 34  AltMap = pOp->p4
2c4c0 2e 61 69 3b 0a 20 20 20 20 20 20 70 54 61 62 43  .ai;.      pTabC
2c4d0 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72 20 3d  ur->pAltCursor =
2c4e0 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   pC;.    }else{.
2c4f0 20 20 20 20 20 20 70 4f 75 74 20 3d 20 6f 75 74        pOut = out
2c500 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
2c510 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  Op);.      pOut-
2c520 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20  >u.i = rowid;.  
2c530 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2c540 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2c550 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69  code==OP_IdxRowi
2c560 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
2c570 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 26  VdbeMemSetNull(&
2c580 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
2c590 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2c5a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 45  /* Opcode: IdxGE
2c5b0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2c5c0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2c5d0 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2c5e0 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2c5f0 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2c600 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2c610 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2c620 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2c630 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2c640 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69  EY.  Compare thi
2c650 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69  s key value agai
2c660 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a  nst the index .*
2c670 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72  * that P1 is cur
2c680 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2c690 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  to, ignoring the
2c6a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2c6b0 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73  ROWID .** fields
2c6c0 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
2c6d0 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
2c6e0 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61  ex entry is grea
2c6f0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
2c700 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
2c710 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
2c720 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
2c730 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
2c740 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2c750 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  uction..*/./* Op
2c760 63 6f 64 65 3a 20 49 64 78 47 54 20 50 31 20 50  code: IdxGT P1 P
2c770 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2c780 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
2c790 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  @P4].**.** The P
2c7a0 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
2c7b0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
2c7c0 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
2c7d0 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
2c7e0 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
2c7f0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
2c800 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
2c810 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74   value against t
2c820 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61  he index .** tha
2c830 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  t P1 is currentl
2c840 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69  y pointing to, i
2c850 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d  gnoring the PRIM
2c860 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44  ARY KEY or ROWID
2c870 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74   .** fields at t
2c880 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  he end..**.** If
2c890 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e   the P1 index en
2c8a0 74 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74  try is greater t
2c8b0 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
2c8c0 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74  e.** then jump t
2c8d0 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
2c8e0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2c8f0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2c900 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ction..*/./* Opc
2c910 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32  ode: IdxLT P1 P2
2c920 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2c930 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2c940 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2c950 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2c960 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2c970 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2c980 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2c990 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2c9a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2c9b0 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
2c9c0 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2c9d0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e  gainst.** the in
2c9e0 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63  dex that P1 is c
2c9f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2ca00 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2ca10 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2ca20 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68  r.** ROWID on th
2ca30 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
2ca40 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2ca50 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
2ca60 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
2ca70 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
2ca80 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
2ca90 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2caa0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2cab0 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ction..*/./* Opc
2cac0 6f 64 65 3a 20 49 64 78 4c 45 20 50 31 20 50 32  ode: IdxLE P1 P2
2cad0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2cae0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2caf0 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2cb00 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2cb10 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2cb20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2cb30 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2cb40 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2cb50 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2cb60 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
2cb70 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2cb80 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e  gainst.** the in
2cb90 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63  dex that P1 is c
2cba0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2cbb0 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2cbc0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2cbd0 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68  r.** ROWID on th
2cbe0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
2cbf0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2cc00 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
2cc10 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2cc20 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
2cc30 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50  hen jump.** to P
2cc40 32 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  2. Otherwise fal
2cc50 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2cc60 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2cc70 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  n..*/.case OP_Id
2cc80 78 4c 45 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  xLE:          /*
2cc90 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
2cca0 5f 49 64 78 47 54 3a 20 20 20 20 20 20 20 20 20  _IdxGT:         
2ccb0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65   /* jump */.case
2ccc0 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20   OP_IdxLT:      
2ccd0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2cce0 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 20 7b  ase OP_IdxGE:  {
2ccf0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2cd00 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2cd10 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
2cd20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2cd30 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
2cd40 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2cd50 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2cd60 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2cd70 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2cd80 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2cd90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f   assert( pC->isO
2cda0 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65  rdered );.  asse
2cdb0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2cdc0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2cdd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2cde0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 29 3b  >uc.pCursor!=0);
2cdf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
2ce00 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
2ce10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2ce20 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
2ce30 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  >p5==1 );.  asse
2ce40 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
2ce50 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 72  =P4_INT32 );.  r
2ce60 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
2ce70 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46  pKeyInfo;.  r.nF
2ce80 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
2ce90 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20 70 4f 70  >p4.i;.  if( pOp
2cea0 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64 78 4c  ->opcode<OP_IdxL
2ceb0 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
2cec0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2ced0 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f  _IdxLE || pOp->o
2cee0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20  pcode==OP_IdxGT 
2cef0 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  );.    r.default
2cf00 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  _rc = -1;.  }els
2cf10 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2cf20 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2cf30 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  dxGE || pOp->opc
2cf40 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b  ode==OP_IdxLT );
2cf50 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72  .    r.default_r
2cf60 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 2e 61  c = 0;.  }.  r.a
2cf70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
2cf80 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >p3];.#ifdef SQL
2cf90 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 69 6e  ITE_DEBUG.  { in
2cfa0 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t i; for(i=0; i<
2cfb0 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61  r.nField; i++) a
2cfc0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
2cfd0 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b  d(&r.aMem[i]) );
2cfe0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 73 20   }.#endif.  res 
2cff0 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65  = 0;  /* Not nee
2d000 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20  ded.  Only used 
2d010 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72  to silence a war
2d020 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ning. */.  rc = 
2d030 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
2d040 79 43 6f 6d 70 61 72 65 28 64 62 2c 20 70 43 2c  yCompare(db, pC,
2d050 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 61 73   &r, &res);.  as
2d060 73 65 72 74 28 20 28 4f 50 5f 49 64 78 4c 45 26  sert( (OP_IdxLE&
2d070 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29  1)==(OP_IdxLT&1)
2d080 20 26 26 20 28 4f 50 5f 49 64 78 47 45 26 31 29   && (OP_IdxGE&1)
2d090 3d 3d 28 4f 50 5f 49 64 78 47 54 26 31 29 20 29  ==(OP_IdxGT&1) )
2d0a0 3b 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70  ;.  if( (pOp->op
2d0b0 63 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49 64 78  code&1)==(OP_Idx
2d0c0 4c 54 26 31 29 20 29 7b 0a 20 20 20 20 61 73 73  LT&1) ){.    ass
2d0d0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2d0e0 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f  ==OP_IdxLE || pO
2d0f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2d100 78 4c 54 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  xLT );.    res =
2d110 20 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -res;.  }else{.
2d120 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
2d130 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  >opcode==OP_IdxG
2d140 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  E || pOp->opcode
2d150 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20  ==OP_IdxGT );.  
2d160 20 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20 20 56    res++;.  }.  V
2d170 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72  dbeBranchTaken(r
2d180 65 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28 20 72  es>0,2);.  if( r
2d190 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2d1a0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69  ue_to_error;.  i
2d1b0 66 28 20 72 65 73 3e 30 20 29 20 67 6f 74 6f 20  f( res>0 ) goto 
2d1c0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
2d1d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2d1e0 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50 32  e: Destroy P1 P2
2d1f0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65   P3 * *.**.** De
2d200 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 64  lete an entire d
2d210 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
2d220 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
2d230 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
2d240 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
2d250 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a  s given by P1..*
2d260 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
2d270 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20 69  eing destroyed i
2d280 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  s in the main da
2d290 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
2d2a0 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d  3==0.  If.** P3=
2d2b0 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  =1 then the tabl
2d2c0 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73  e to be clear is
2d2d0 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
2d2e0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  y database file.
2d2f0 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ** that is used 
2d300 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20  to store tables 
2d310 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45  create using CRE
2d320 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41  ATE TEMPORARY TA
2d330 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  BLE..**.** If AU
2d340 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
2d350 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73 20 70  led then it is p
2d360 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e 6f  ossible that ano
2d370 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a  ther root page.*
2d380 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65 64  * might be moved
2d390 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79 20   into the newly 
2d3a0 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61 67  deleted root pag
2d3b0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
2d3c0 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  ep all.** root p
2d3d0 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73 20  ages contiguous 
2d3e0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2d3f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d400 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a  .  The former.**
2d410 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
2d420 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f 76  ot page that mov
2d430 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20 62  ed - its value b
2d440 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20 6f  efore the move o
2d450 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20  ccurred -.** is 
2d460 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
2d470 65 72 20 50 32 2e 20 49 66 20 6e 6f 20 70 61 67  er P2. If no pag
2d480 65 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72  e movement was r
2d490 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65  equired (because
2d4a0 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 62 65   the.** table be
2d4b0 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61 73 20  ing dropped was 
2d4c0 61 6c 72 65 61 64 79 20 74 68 65 20 6c 61 73 74  already the last
2d4d0 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61   one in the data
2d4e0 62 61 73 65 29 20 74 68 65 6e 20 61 20 0a 2a 2a  base) then a .**
2d4f0 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20   zero is stored 
2d500 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  in register P2. 
2d510 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2d520 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20  s disabled then 
2d530 61 20 7a 65 72 6f 20 0a 2a 2a 20 69 73 20 73 74  a zero .** is st
2d540 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
2d550 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   P2..**.** This 
2d560 6f 70 63 6f 64 65 20 74 68 72 6f 77 73 20 61 6e  opcode throws an
2d570 20 65 72 72 6f 72 20 69 66 20 74 68 65 72 65 20   error if there 
2d580 61 72 65 20 61 6e 79 20 61 63 74 69 76 65 20 72  are any active r
2d590 65 61 64 65 72 20 56 4d 73 20 77 68 65 6e 0a 2a  eader VMs when.*
2d5a0 2a 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e  * it is invoked.
2d5b0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
2d5c0 20 61 76 6f 69 64 20 74 68 65 20 64 69 66 66 69   avoid the diffi
2d5d0 63 75 6c 74 79 20 61 73 73 6f 63 69 61 74 65 64  culty associated
2d5e0 20 77 69 74 68 20 0a 2a 2a 20 75 70 64 61 74 69   with .** updati
2d5f0 6e 67 20 65 78 69 73 74 69 6e 67 20 63 75 72 73  ng existing curs
2d600 6f 72 73 20 77 68 65 6e 20 61 20 72 6f 6f 74 20  ors when a root 
2d610 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 69 6e  page is moved in
2d620 20 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20 0a   an AUTOVACUUM .
2d630 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
2d640 73 20 65 72 72 6f 72 20 69 73 20 74 68 72 6f 77  s error is throw
2d650 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61  n even if the da
2d660 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6e  tabase is not an
2d670 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20   AUTOVACUUM .** 
2d680 64 62 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  db in order to a
2d690 76 6f 69 64 20 69 6e 74 72 6f 64 75 63 69 6e 67  void introducing
2d6a0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c   an incompatibil
2d6b0 69 74 79 20 62 65 74 77 65 65 6e 20 61 75 74 6f  ity between auto
2d6c0 76 61 63 75 75 6d 20 0a 2a 2a 20 61 6e 64 20 6e  vacuum .** and n
2d6d0 6f 6e 2d 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  on-autovacuum mo
2d6e0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  des..**.** See a
2d6f0 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61  lso: Clear.*/.ca
2d700 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b  se OP_Destroy: {
2d710 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2d720 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20 20    int iMoved;.  
2d730 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
2d740 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
2d750 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d760 70 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20 20 70  pOp->p1>1 );.  p
2d770 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
2d780 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
2d790 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
2d7a0 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 64 62  M_Null;.  if( db
2d7b0 2d 3e 6e 56 64 62 65 52 65 61 64 20 3e 20 64 62  ->nVdbeRead > db
2d7c0 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20 29 7b  ->nVDestroy+1 ){
2d7d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d7e0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e  _LOCKED;.    p->
2d7f0 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
2d800 5f 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f 74 6f  _Abort;.    goto
2d810 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2d820 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
2d830 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b    iDb = pOp->p3;
2d840 0a 20 20 20 20 61 73 73 65 72 74 28 20 44 62 4d  .    assert( DbM
2d850 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
2d860 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 20 20  Mask, iDb) );.  
2d870 20 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20 20 2f    iMoved = 0;  /
2d880 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f  * Not needed.  O
2d890 6e 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  nly to silence a
2d8a0 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20   warning. */.   
2d8b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2d8c0 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e  eeDropTable(db->
2d8d0 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f  aDb[iDb].pBt, pO
2d8e0 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b  p->p1, &iMoved);
2d8f0 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
2d900 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
2d910 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76  pOut->u.i = iMov
2d920 65 64 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ed;.    if( rc )
2d930 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2d940 74 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e 64 65  to_error;.#ifnde
2d950 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d960 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2d970 20 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20   iMoved!=0 ){.  
2d980 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50      sqlite3RootP
2d990 61 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62  ageMoved(db, iDb
2d9a0 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70  , iMoved, pOp->p
2d9b0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c  1);.      /* All
2d9c0 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72   OP_Destroy oper
2d9d0 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20  ations occur on 
2d9e0 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a  the same btree *
2d9f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2da00 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
2da10 6c 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63  lt==0 || resetSc
2da20 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62  hemaOnFault==iDb
2da30 2b 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65  +1 );.      rese
2da40 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d  tSchemaOnFault =
2da50 20 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65   iDb+1;.    }.#e
2da60 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
2da70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2da80 43 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a  Clear P1 P2 P3.*
2da90 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
2daa0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2dab0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
2dac0 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
2dad0 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68  ot page.** in th
2dae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2daf0 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20  is given by P1. 
2db00 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73   But, unlike Des
2db10 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  troy, do not.** 
2db20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
2db30 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74   or index from t
2db40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2db50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
2db60 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73  e being clear is
2db70 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
2db80 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32  abase file if P2
2db90 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d  ==0.  If.** P2==
2dba0 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  1 then the table
2dbb0 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20   to be clear is 
2dbc0 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
2dbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
2dbe0 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  * that is used t
2dbf0 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63  o store tables c
2dc00 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41  reate using CREA
2dc10 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42  TE TEMPORARY TAB
2dc20 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LE..**.** If the
2dc30 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e   P3 value is non
2dc40 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
2dc50 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
2dc60 6f 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20  o must be an.** 
2dc70 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e  intkey table (an
2dc80 20 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20   SQL table, not 
2dc90 61 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68  an index). In th
2dca0 69 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20  is case the row 
2dcb0 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74  change .** count
2dcc0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
2dcd0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2dce0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2dcf0 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64  le being cleared
2dd00 2e 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67  . .** If P3 is g
2dd10 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
2dd20 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
2dd30 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2dd40 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73  ter P3 is.** als
2dd50 6f 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  o incremented by
2dd60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2dd70 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2dd80 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a   being cleared..
2dd90 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2dda0 44 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20  Destroy.*/.case 
2ddb0 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e  OP_Clear: {.  in
2ddc0 74 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e  t nChange;. .  n
2ddd0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73  Change = 0;.  as
2dde0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2ddf0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
2de00 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2de10 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2de20 70 32 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  p2) );.  rc = sq
2de30 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2de40 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e  able(.      db->
2de50 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74  aDb[pOp->p2].pBt
2de60 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d  , pOp->p1, (pOp-
2de70 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a  >p3 ? &nChange :
2de80 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   0).  );.  if( p
2de90 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d  Op->p3 ){.    p-
2dea0 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  >nChange += nCha
2deb0 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  nge;.    if( pOp
2dec0 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p3>0 ){.      
2ded0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
2dee0 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  id(&aMem[pOp->p3
2def0 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41  ]) );.      memA
2df00 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
2df10 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b  &aMem[pOp->p3]);
2df20 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d  .      aMem[pOp-
2df30 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61  >p3].u.i += nCha
2df40 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nge;.    }.  }. 
2df50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2df60 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2df70 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
2df80 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 53  * Opcode: ResetS
2df90 6f 72 74 65 72 20 50 31 20 2a 20 2a 20 2a 20 2a  orter P1 * * * *
2dfa0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  .**.** Delete al
2dfb0 6c 20 63 6f 6e 74 65 6e 74 73 20 66 72 6f 6d 20  l contents from 
2dfc0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
2dfd0 62 6c 65 20 6f 72 20 73 6f 72 74 65 72 0a 2a 2a  ble or sorter.**
2dfe0 20 74 68 61 74 20 69 73 20 6f 70 65 6e 20 6f 6e   that is open on
2dff0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a   cursor P1..**.*
2e000 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 6e  * This opcode on
2e010 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 63 75 72  ly works for cur
2e020 73 6f 72 73 20 75 73 65 64 20 66 6f 72 20 73 6f  sors used for so
2e030 72 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 6f 70 65  rting and.** ope
2e040 6e 65 64 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  ned with OP_Open
2e050 45 70 68 65 6d 65 72 61 6c 20 6f 72 20 4f 50 5f  Ephemeral or OP_
2e060 53 6f 72 74 65 72 4f 70 65 6e 2e 0a 2a 2f 0a 63  SorterOpen..*/.c
2e070 61 73 65 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  ase OP_ResetSort
2e080 65 72 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  er: {.  VdbeCurs
2e090 6f 72 20 2a 70 43 3b 0a 20 0a 20 20 61 73 73 65  or *pC;. .  asse
2e0a0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2e0b0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2e0c0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2e0d0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2e0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2e0f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 53 6f 72  0 );.  if( isSor
2e100 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 73  ter(pC) ){.    s
2e110 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
2e120 52 65 73 65 74 28 64 62 2c 20 70 43 2d 3e 75 63  Reset(db, pC->uc
2e130 2e 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 65 6c  .pSorter);.  }el
2e140 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2e150 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2e160 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2e170 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
2e180 73 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a 20 20  sEphemeral );.  
2e190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e1a0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 4f 66 43  reeClearTableOfC
2e1b0 75 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75  ursor(pC->uc.pCu
2e1c0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  rsor);.    if( r
2e1d0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2e1e0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2e1f0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2e200 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 42 74  Opcode: CreateBt
2e210 72 65 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ree P1 P2 P3 * *
2e220 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
2e230 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 20  P2]=root iDb=P1 
2e240 66 6c 61 67 73 3d 50 33 0a 2a 2a 0a 2a 2a 20 41  flags=P3.**.** A
2e250 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 62 2d  llocate a new b-
2e260 74 72 65 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  tree in the main
2e270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2e280 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68  f P1==0 or in th
2e290 65 0a 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61  e.** TEMP databa
2e2a0 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
2e2b0 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
2e2c0 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
2e2d0 2a 20 50 31 3e 31 2e 20 20 54 68 65 20 50 33 20  * P1>1.  The P3 
2e2e0 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
2e2f0 20 31 20 28 42 54 52 45 45 5f 49 4e 54 4b 45 59   1 (BTREE_INTKEY
2e300 29 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61  ) for a rowid ta
2e310 62 6c 65 0a 2a 2a 20 69 74 20 6d 75 73 74 20 62  ble.** it must b
2e320 65 20 32 20 28 42 54 52 45 45 5f 42 4c 4f 42 4b  e 2 (BTREE_BLOBK
2e330 45 59 29 20 66 6f 72 20 61 20 69 6e 64 65 78 20  EY) for a index 
2e340 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
2e350 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72   table..** The r
2e360 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
2e370 6f 66 20 74 68 65 20 6e 65 77 20 62 2d 74 72 65  of the new b-tre
2e380 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  e is stored in r
2e390 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
2e3a0 61 73 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  ase OP_CreateBtr
2e3b0 65 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  ee: {          /
2e3c0 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
2e3d0 70 67 6e 6f 3b 0a 20 20 44 62 20 2a 70 44 62 3b  pgno;.  Db *pDb;
2e3e0 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ..  pOut = out2P
2e3f0 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
2e400 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20  );.  pgno = 0;. 
2e410 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2e420 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 7c  ==BTREE_INTKEY |
2e430 7c 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45  | pOp->p3==BTREE
2e440 5f 42 4c 4f 42 4b 45 59 20 29 3b 0a 20 20 61 73  _BLOBKEY );.  as
2e450 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2e460 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
2e470 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
2e480 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
2e490 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
2e4a0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
2e4b0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
2e4c0 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2e4d0 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  Db[pOp->p1];.  a
2e4e0 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21  ssert( pDb->pBt!
2e4f0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2e500 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
2e510 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26  able(pDb->pBt, &
2e520 70 67 6e 6f 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  pgno, pOp->p3);.
2e530 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e540 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2e550 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  or;.  pOut->u.i 
2e560 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b  = pgno;.  break;
2e570 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
2e580 71 6c 45 78 65 63 20 2a 20 2a 20 2a 20 50 34 20  qlExec * * * P4 
2e590 2a 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  *.**.** Run the 
2e5a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  SQL statement or
2e5b0 20 73 74 61 74 65 6d 65 6e 74 73 20 73 70 65 63   statements spec
2e5c0 69 66 69 65 64 20 69 6e 20 74 68 65 20 50 34 20  ified in the P4 
2e5d0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20  string..*/.case 
2e5e0 4f 50 5f 53 71 6c 45 78 65 63 3a 20 7b 0a 20 20  OP_SqlExec: {.  
2e5f0 64 62 2d 3e 6e 53 71 6c 45 78 65 63 2b 2b 3b 0a  db->nSqlExec++;.
2e600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e610 78 65 63 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e  xec(db, pOp->p4.
2e620 7a 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 64  z, 0, 0, 0);.  d
2e630 62 2d 3e 6e 53 71 6c 45 78 65 63 2d 2d 3b 0a 20  b->nSqlExec--;. 
2e640 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2e650 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2e660 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
2e670 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53  * Opcode: ParseS
2e680 63 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20  chema P1 * * P4 
2e690 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  *.**.** Read and
2e6a0 20 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69   parse all entri
2e6b0 65 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49  es from the SQLI
2e6c0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
2e6d0 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a  of database P1.*
2e6e0 2a 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  * that match the
2e6f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34   WHERE clause P4
2e700 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  . .**.** This op
2e710 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2e720 20 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74   parser to creat
2e730 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
2e740 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e  machine,.** then
2e750 20 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69   runs the new vi
2e760 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
2e770 49 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d  It is thus a re-
2e780 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a  entrant opcode..
2e790 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65  */.case OP_Parse
2e7a0 53 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20  Schema: {.  int 
2e7b0 69 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  iDb;.  const cha
2e7c0 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68  r *zMaster;.  ch
2e7d0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74  ar *zSql;.  Init
2e7e0 44 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a  Data initData;..
2e7f0 20 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65    /* Any prepare
2e800 64 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  d statement that
2e810 20 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70   invokes this op
2e820 63 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d  code will hold m
2e830 75 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65  utexes.  ** on e
2e840 76 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69  very btree.  Thi
2e850 73 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73  s is a prerequis
2e860 69 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  ite for invoking
2e870 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e   .  ** sqlite3In
2e880 69 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  itCallback()..  
2e890 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2e8a0 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62  _DEBUG.  for(iDb
2e8b0 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
2e8c0 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   iDb++){.    ass
2e8d0 65 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73  ert( iDb==1 || s
2e8e0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2e8f0 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44  Mutex(db->aDb[iD
2e900 62 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23  b].pBt) );.  }.#
2e910 65 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70  endif..  iDb = p
2e920 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74  Op->p1;.  assert
2e930 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
2e940 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
2e950 65 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72  ert( DbHasProper
2e960 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53  ty(db, iDb, DB_S
2e970 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a  chemaLoaded) );.
2e980 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2e990 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f  a conditional */
2e9a0 20 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d   {.    zMaster =
2e9b0 20 4d 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20   MASTER_NAME;.  
2e9c0 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20    initData.db = 
2e9d0 64 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61  db;.    initData
2e9e0 2e 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  .iDb = pOp->p1;.
2e9f0 20 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45      initData.pzE
2ea00 72 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72  rrMsg = &p->zErr
2ea10 4d 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  Msg;.    zSql = 
2ea20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2ea30 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  b,.       "SELEC
2ea40 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
2ea50 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e  , sql FROM '%q'.
2ea60 25 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45  %s WHERE %s ORDE
2ea70 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20  R BY rowid",.   
2ea80 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
2ea90 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74  .zDbSName, zMast
2eaa0 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  er, pOp->p4.z);.
2eab0 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2eac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2ead0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2eae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2eaf0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
2eb00 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
2eb10 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
2eb20 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69  y = 1;.      ini
2eb30 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
2eb40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73 65  E_OK;.      asse
2eb50 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
2eb60 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
2eb70 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2eb80 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74  (db, zSql, sqlit
2eb90 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20  e3InitCallback, 
2eba0 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20  &initData, 0);. 
2ebb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ebc0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e  ITE_OK ) rc = in
2ebd0 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20  itData.rc;.     
2ebe0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
2ebf0 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  (db, zSql);.    
2ec00 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
2ec10 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2ec20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
2ec30 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
2ec40 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
2ec50 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
2ec60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2ec70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
2ec80 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
2ec90 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2eca0 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62  o_error;.  }.  b
2ecb0 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20 21  reak;  .}..#if !
2ecc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ecd0 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a 20  MIT_ANALYZE)./* 
2ece0 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61 6c  Opcode: LoadAnal
2ecf0 79 73 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  ysis P1 * * * *.
2ed00 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 73  **.** Read the s
2ed10 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
2ed20 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 50  e for database P
2ed30 31 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63  1 and load the c
2ed40 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 61  ontent.** of tha
2ed50 74 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65  t table into the
2ed60 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78 20   internal index 
2ed70 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69  hash table.  Thi
2ed80 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a 20  s will cause.** 
2ed90 74 68 65 20 61 6e 61 6c 79 73 69 73 20 74 6f 20  the analysis to 
2eda0 62 65 20 75 73 65 64 20 77 68 65 6e 20 70 72 65  be used when pre
2edb0 70 61 72 69 6e 67 20 61 6c 6c 20 73 75 62 73 65  paring all subse
2edc0 71 75 65 6e 74 20 71 75 65 72 69 65 73 2e 0a 2a  quent queries..*
2edd0 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41 6e  /.case OP_LoadAn
2ede0 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61 73 73 65  alysis: {.  asse
2edf0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2ee00 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
2ee10 62 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  b );.  rc = sqli
2ee20 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28  te3AnalysisLoad(
2ee30 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  db, pOp->p1);.  
2ee40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2ee50 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2ee60 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23  ;.  break;  .}.#
2ee70 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2ee80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  d(SQLITE_OMIT_AN
2ee90 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70  ALYZE) */../* Op
2eea0 63 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20  code: DropTable 
2eeb0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2eec0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
2eed0 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
2eee0 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
2eef0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
2ef00 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
2ef10 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
2ef20 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
2ef30 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61  alled after a ta
2ef40 62 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65  ble.** is droppe
2ef50 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69  d from disk (usi
2ef60 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f  ng the Destroy o
2ef70 70 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20  pcode) in order 
2ef80 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20  to keep .** the 
2ef90 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
2efa0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
2efb0 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
2efc0 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
2efd0 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
2efe0 65 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20  e OP_DropTable: 
2eff0 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  {.  sqlite3Unlin
2f000 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
2f010 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
2f020 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
2f030 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2f040 44 72 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a  DropIndex P1 * *
2f050 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f   P4 *.**.** Remo
2f060 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ve the internal 
2f070 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61  (in-memory) data
2f080 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
2f090 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65   describe.** the
2f0a0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20   index named P4 
2f0b0 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
2f0c0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
2f0d0 61 66 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a  after an index.*
2f0e0 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f  * is dropped fro
2f0f0 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68  m disk (using th
2f100 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65  e Destroy opcode
2f110 29 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ).** in order to
2f120 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e   keep the intern
2f130 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
2f140 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
2f150 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
2f160 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
2f170 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
2f180 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71  ropIndex: {.  sq
2f190 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
2f1a0 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f  leteIndex(db, pO
2f1b0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a  p->p1, pOp->p4.z
2f1c0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
2f1d0 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72  * Opcode: DropTr
2f1e0 69 67 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20  igger P1 * * P4 
2f1f0 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  *.**.** Remove t
2f200 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d  he internal (in-
2f210 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72  memory) data str
2f220 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73  uctures that des
2f230 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69  cribe.** the tri
2f240 67 67 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e  gger named P4 in
2f250 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
2f260 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
2f270 74 65 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a  ter a trigger.**
2f280 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   is dropped from
2f290 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65   disk (using the
2f2a0 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29   Destroy opcode)
2f2b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
2f2c0 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  p .** the intern
2f2d0 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
2f2e0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
2f2f0 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
2f300 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
2f310 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
2f320 72 6f 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20  ropTrigger: {.  
2f330 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
2f340 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
2f350 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
2f360 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.z);.  break;.
2f370 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2f380 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2f390 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64  Y_CHECK./* Opcod
2f3a0 65 3a 20 49 6e 74 65 67 72 69 74 79 43 6b 20 50  e: IntegrityCk P
2f3b0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
2f3c0 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73  .** Do an analys
2f3d0 69 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  is of the curren
2f3e0 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73  tly open databas
2f3f0 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20  e.  Store in.** 
2f400 72 65 67 69 73 74 65 72 20 50 31 20 74 68 65 20  register P1 the 
2f410 74 65 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  text of an error
2f420 20 6d 65 73 73 61 67 65 20 64 65 73 63 72 69 62   message describ
2f430 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  ing any problems
2f440 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c  ..** If no probl
2f450 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 73  ems are found, s
2f460 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72  tore a NULL in r
2f470 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a  egister P1..**.*
2f480 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 20 50  * The register P
2f490 33 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6c  3 contains one l
2f4a0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ess than the max
2f4b0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
2f4c0 6c 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a  llowed errors..*
2f4d0 2a 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33  * At most reg(P3
2f4e0 29 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65  ) errors will be
2f4f0 20 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e   reported..** In
2f500 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2f510 65 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73  e analysis stops
2f520 20 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28   as soon as reg(
2f530 50 31 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a  P1) errors are .
2f540 2a 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31  ** seen.  Reg(P1
2f550 29 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  ) is updated wit
2f560 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
2f570 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67  errors remaining
2f580 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ..**.** The root
2f590 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66   page numbers of
2f5a0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
2f5b0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
2f5c0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 73 74 6f 72  integers.** stor
2f5d0 65 64 20 69 6e 20 50 34 5f 49 4e 54 41 52 52 41  ed in P4_INTARRA
2f5e0 59 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  Y argument..**.*
2f5f0 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
2f600 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
2f610 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
2f620 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2f630 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
2f640 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2f650 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
2f660 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
2f670 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2f680 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2f690 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65   pragma..*/.case
2f6a0 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a   OP_IntegrityCk:
2f6b0 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20   {.  int nRoot; 
2f6c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f6d0 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63  f tables to chec
2f6e0 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72  k.  (Number of r
2f6f0 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20  oot pages.) */. 
2f700 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20   int *aRoot;    
2f710 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f   /* Array of roo
2f720 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f  tpage numbers fo
2f730 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63  r tables to be c
2f740 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
2f750 6e 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e  nErr;       /* N
2f760 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2f770 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68  reported */.  ch
2f780 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a  ar *z;        /*
2f790 20 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72   Text of the err
2f7a0 6f 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d  or report */.  M
2f7b0 65 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f  em *pnErr;     /
2f7c0 2a 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69  * Register keepi
2f7d0 6e 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f  ng track of erro
2f7e0 72 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  rs remaining */.
2f7f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
2f800 73 52 65 61 64 65 72 20 29 3b 0a 20 20 6e 52 6f  sReader );.  nRo
2f810 6f 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  ot = pOp->p2;.  
2f820 61 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 34 2e  aRoot = pOp->p4.
2f830 61 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  ai;.  assert( nR
2f840 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  oot>0 );.  asser
2f850 74 28 20 61 52 6f 6f 74 5b 30 5d 3d 3d 6e 52 6f  t( aRoot[0]==nRo
2f860 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ot );.  assert( 
2f870 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
2f880 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
2f890 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
2f8a0 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d 65  ;.  pnErr = &aMe
2f8b0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
2f8c0 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c  sert( (pnErr->fl
2f8d0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
2f8e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
2f8f0 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 28  pnErr->flags & (
2f900 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
2f910 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20  ))==0 );.  pIn1 
2f920 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2f930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2f940 3e 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p5<db->nDb );. 
2f950 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
2f960 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
2f970 2c 20 70 4f 70 2d 3e 70 35 29 20 29 3b 0a 20 20  , pOp->p5) );.  
2f980 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  z = sqlite3Btree
2f990 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 64  IntegrityCheck(d
2f9a0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e  b->aDb[pOp->p5].
2f9b0 70 42 74 2c 20 26 61 52 6f 6f 74 5b 31 5d 2c 20  pBt, &aRoot[1], 
2f9c0 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20 20  nRoot,.         
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9e0 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e 45          (int)pnE
2f9f0 72 72 2d 3e 75 2e 69 2b 31 2c 20 26 6e 45 72 72  rr->u.i+1, &nErr
2fa00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2fa10 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29  MemSetNull(pIn1)
2fa20 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20  ;.  if( nErr==0 
2fa30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ){.    assert( z
2fa40 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ==0 );.  }else i
2fa50 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( z==0 ){.    g
2fa60 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65  oto no_mem;.  }e
2fa70 6c 73 65 7b 0a 20 20 20 20 70 6e 45 72 72 2d 3e  lse{.    pnErr->
2fa80 75 2e 69 20 2d 3d 20 6e 45 72 72 2d 31 3b 0a 20  u.i -= nErr-1;. 
2fa90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2faa0 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c  mSetStr(pIn1, z,
2fab0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
2fac0 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
2fad0 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
2fae0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
2faf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2fb00 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49  hangeEncoding(pI
2fb10 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n1, encoding);. 
2fb20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2fb30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2fb40 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
2fb50 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  */../* Opcode: R
2fb60 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20 2a  owSetAdd P1 P2 *
2fb70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
2fb80 3a 20 72 6f 77 73 65 74 28 50 31 29 3d 72 5b 50  : rowset(P1)=r[P
2fb90 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  2].**.** Insert 
2fba0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
2fbb0 65 20 68 65 6c 64 20 62 79 20 72 65 67 69 73 74  e held by regist
2fbc0 65 72 20 50 32 20 69 6e 74 6f 20 61 20 52 6f 77  er P2 into a Row
2fbd0 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 68 65  Set object.** he
2fbe0 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ld in register P
2fbf0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73 65  1..**.** An asse
2fc00 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 50  rtion fails if P
2fc10 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  2 is not an inte
2fc20 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ger..*/.case OP_
2fc30 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20 20 20  RowSetAdd: {    
2fc40 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20 2a     /* in1, in2 *
2fc50 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
2fc60 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
2fc70 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
2fc80 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  2];.  assert( (p
2fc90 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
2fca0 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69 66  _Int)!=0 );.  if
2fcb0 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
2fcc0 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
2fcd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2fce0 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70  beMemSetRowSet(p
2fcf0 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70  In1);.    if( (p
2fd00 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
2fd10 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f  _RowSet)==0 ) go
2fd20 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
2fd30 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
2fd40 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  sert(pIn1->u.pRo
2fd50 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e 69 29  wSet, pIn2->u.i)
2fd60 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2fd70 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 52   Opcode: RowSetR
2fd80 65 61 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ead P1 P2 P3 * *
2fd90 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
2fda0 50 33 5d 3d 72 6f 77 73 65 74 28 50 31 29 0a 2a  P3]=rowset(P1).*
2fdb0 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65  *.** Extract the
2fdc0 20 73 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65 20   smallest value 
2fdd0 66 72 6f 6d 20 74 68 65 20 52 6f 77 53 65 74 20  from the RowSet 
2fde0 6f 62 6a 65 63 74 20 69 6e 20 50 31 0a 2a 2a 20  object in P1.** 
2fdf0 61 6e 64 20 70 75 74 20 74 68 61 74 20 76 61 6c  and put that val
2fe00 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
2fe10 20 50 33 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 52   P3..** Or, if R
2fe20 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 50 31 20  owSet object P1 
2fe30 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  is initially emp
2fe40 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20  ty, leave P3.** 
2fe50 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75  unchanged and ju
2fe60 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
2fe70 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
2fe80 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20  _RowSetRead: {  
2fe90 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
2fea0 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  1, out3 */.  i64
2feb0 20 76 61 6c 3b 0a 0a 20 20 70 49 6e 31 20 3d 20   val;..  pIn1 = 
2fec0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2fed0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
2fee0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
2fef0 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  ==0 .   || sqlit
2ff00 65 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49 6e  e3RowSetNext(pIn
2ff10 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26 76  1->u.pRowSet, &v
2ff20 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  al)==0.  ){.    
2ff30 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69  /* The boolean i
2ff40 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a 2f  ndex is empty */
2ff50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ff60 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29  MemSetNull(pIn1)
2ff70 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  ;.    VdbeBranch
2ff80 54 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20 20 20  Taken(1,2);.    
2ff90 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f  goto jump_to_p2_
2ffa0 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  and_check_for_in
2ffb0 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65  terrupt;.  }else
2ffc0 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65  {.    /* A value
2ffd0 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d   was pulled from
2ffe0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
2fff0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
30000 6e 28 30 2c 32 29 3b 0a 20 20 20 20 73 71 6c 69  n(0,2);.    sqli
30010 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74  te3VdbeMemSetInt
30020 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  64(&aMem[pOp->p3
30030 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 67  ], val);.  }.  g
30040 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  oto check_for_in
30050 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f  terrupt;.}../* O
30060 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 54 65 73  pcode: RowSetTes
30070 74 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a  t P1 P2 P3 P4.**
30080 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
30090 50 33 5d 20 69 6e 20 72 6f 77 73 65 74 28 50 31  P3] in rowset(P1
300a0 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  ) goto P2.**.** 
300b0 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  Register P3 is a
300c0 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61  ssumed to hold a
300d0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
300e0 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74  value. If regist
300f0 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e  er P1.** contain
30100 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  s a RowSet objec
30110 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65  t and that RowSe
30120 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  t object contain
30130 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68  s.** the value h
30140 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20  eld in P3, jump 
30150 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
30160 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72  Otherwise, inser
30170 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  t the.** integer
30180 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20   in P3 into the 
30190 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69  RowSet and conti
301a0 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  nue on to the.**
301b0 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a   next opcode..**
301c0 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f  .** The RowSet o
301d0 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a  bject is optimiz
301e0 65 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ed for the case 
301f0 77 68 65 72 65 20 73 65 74 73 20 6f 66 20 69 6e  where sets of in
30200 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 69 6e  tegers.** are in
30210 73 65 72 74 65 64 20 69 6e 20 64 69 73 74 69 6e  serted in distin
30220 63 74 20 70 68 61 73 65 73 2c 20 77 68 69 63 68  ct phases, which
30230 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69   each set contai
30240 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73  ns no duplicates
30250 2e 0a 2a 2a 20 45 61 63 68 20 73 65 74 20 69 73  ..** Each set is
30260 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
30270 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75 65   unique P4 value
30280 2e 20 54 68 65 20 66 69 72 73 74 20 73 65 74 0a  . The first set.
30290 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d  ** must have P4=
302a0 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73 65  =0, the final se
302b0 74 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d  t must have P4==
302c0 2d 31 2c 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  -1, and for all 
302d0 6f 74 68 65 72 20 73 65 74 73 0a 2a 2a 20 6d 75  other sets.** mu
302e0 73 74 20 68 61 76 65 20 50 34 3e 30 2e 0a 2a 2a  st have P4>0..**
302f0 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
30300 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28  optimizations: (
30310 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68  a) when P4==0 th
30320 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
30330 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 52 6f  o test.** the Ro
30340 77 53 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  wSet object for 
30350 50 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61  P3, as it is gua
30360 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63  ranteed not to c
30370 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62  ontain it,.** (b
30380 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68  ) when P4==-1 th
30390 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
303a0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c  o insert the val
303b0 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a  ue, as it will.*
303c0 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65  * never be teste
303d0 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77  d for, and (c) w
303e0 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74  hen a value that
303f0 20 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   is part of set 
30400 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64  X is.** inserted
30410 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
30420 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20  ed to search to 
30430 73 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20  see if the same 
30440 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65  value was.** pre
30450 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64  viously inserted
30460 20 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   as part of set 
30470 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61  X (only if it wa
30480 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
30490 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74  inserted as part
304a0 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   of some other s
304b0 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  et)..*/.case OP_
304c0 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20  RowSetTest: {   
304d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304e0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20    /* jump, in1, 
304f0 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  in3 */.  int iSe
30500 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b  t;.  int exists;
30510 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
30520 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
30530 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
30540 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70  3];.  iSet = pOp
30550 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74  ->p4.i;.  assert
30560 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn3->flags&ME
30570 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  M_Int );..  /* I
30580 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
30590 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
305a0 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69   rowset object i
305b0 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31  n memory cell P1
305c0 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74  ,.  ** delete it
305d0 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c   now and initial
305e0 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65  ize P1 with an e
305f0 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f  mpty rowset.  */
30600 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
30610 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
30620 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
30630 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
30640 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
30650 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
30660 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
30670 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
30680 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
30690 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
306a0 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74  NT32 );.  assert
306b0 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53  ( iSet==-1 || iS
306c0 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  et>=0 );.  if( i
306d0 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74  Set ){.    exist
306e0 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65  s = sqlite3RowSe
306f0 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52  tTest(pIn1->u.pR
30700 6f 77 53 65 74 2c 20 69 53 65 74 2c 20 70 49 6e  owSet, iSet, pIn
30710 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 56 64 62  3->u.i);.    Vdb
30720 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 65 78 69  eBranchTaken(exi
30730 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69  sts!=0,2);.    i
30740 66 28 20 65 78 69 73 74 73 20 29 20 67 6f 74 6f  f( exists ) goto
30750 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
30760 0a 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29  .  if( iSet>=0 )
30770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77  {.    sqlite3Row
30780 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
30790 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d  u.pRowSet, pIn3-
307a0 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65  >u.i);.  }.  bre
307b0 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  ak;.}...#ifndef 
307c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
307d0 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  GER../* Opcode: 
307e0 50 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33  Program P1 P2 P3
307f0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65   P4 P5.**.** Exe
30800 63 75 74 65 20 74 68 65 20 74 72 69 67 67 65 72  cute the trigger
30810 20 70 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20   program passed 
30820 61 73 20 50 34 20 28 74 79 70 65 20 50 34 5f 53  as P4 (type P4_S
30830 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a  UBPROGRAM). .**.
30840 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74  ** P1 contains t
30850 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
30860 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  e memory cell th
30870 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
30880 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a  first memory .**
30890 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61   cell in an arra
308a0 79 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  y of values used
308b0 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   as arguments to
308c0 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
308d0 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  . P2 .** contain
308e0 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f  s the address to
308f0 20 6a 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20   jump to if the 
30900 73 75 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f  sub-program thro
30910 77 73 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a  ws an IGNORE .**
30920 20 65 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67   exception using
30930 20 74 68 65 20 52 41 49 53 45 28 29 20 66 75 6e   the RAISE() fun
30940 63 74 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20  ction. Register 
30950 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  P3 contains the 
30960 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61  address .** of a
30970 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
30980 74 68 69 73 20 28 74 68 65 20 70 61 72 65 6e 74  this (the parent
30990 29 20 56 4d 20 74 68 61 74 20 69 73 20 75 73 65  ) VM that is use
309a0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
309b0 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71  e .** memory req
309c0 75 69 72 65 64 20 62 79 20 74 68 65 20 73 75 62  uired by the sub
309d0 2d 76 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65  -vdbe at runtime
309e0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  ..**.** P4 is a 
309f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  pointer to the V
30a00 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  M containing the
30a10 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
30a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
30a30 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
30a40 72 65 63 75 72 73 69 76 65 20 70 72 6f 67 72 61  recursive progra
30a50 6d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 20  m invocation is 
30a60 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65  enabled..*/.case
30a70 20 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20   OP_Program: {  
30a80 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
30a90 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
30aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30ab0 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72  mber of memory r
30ac0 65 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62  egisters for sub
30ad0 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e  -program */.  in
30ae0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
30af0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
30b00 66 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20  f runtime space 
30b10 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62  required for sub
30b20 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65  -program */.  Me
30b30 6d 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20  m *pRt;         
30b40 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
30b50 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75  r to allocate ru
30b60 6e 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20  ntime space */. 
30b70 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20   Mem *pMem;     
30b80 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
30b90 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
30ba0 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ugh memory cells
30bb0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b   */.  Mem *pEnd;
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30bd0 20 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c   Last memory cel
30be0 6c 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a  l in new array *
30bf0 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
30c00 46 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e  Frame;      /* N
30c10 65 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f  ew vdbe frame to
30c20 20 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20   execute in */. 
30c30 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72   SubProgram *pPr
30c40 6f 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d  ogram;   /* Sub-
30c50 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
30c60 74 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b  te */.  void *t;
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c80 2f 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66  /* Token identif
30c90 79 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a  ying trigger */.
30ca0 0a 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f  .  pProgram = pO
30cb0 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
30cc0 20 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f    pRt = &aMem[pO
30cd0 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
30ce0 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e  ( pProgram->nOp>
30cf0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
30d00 74 68 65 20 70 35 20 66 6c 61 67 20 69 73 20 63  the p5 flag is c
30d10 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72  lear, then recur
30d20 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
30d30 6f 66 20 74 72 69 67 67 65 72 73 20 69 73 20 0a  of triggers is .
30d40 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f    ** disabled fo
30d50 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
30d60 61 74 69 62 69 6c 69 74 79 20 28 70 35 20 69 73  atibility (p5 is
30d70 20 73 65 74 20 69 66 20 74 68 69 73 20 73 75 62   set if this sub
30d80 2d 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73  -program.  ** is
30d90 20 72 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65   really a trigge
30da0 72 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e  r, not a foreign
30db0 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64   key action, and
30dc0 20 74 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20   the flag set.  
30dd0 2a 2a 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  ** and cleared b
30de0 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 72 65  y the "PRAGMA re
30df0 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
30e00 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65  " command is cle
30e10 61 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ar)..  ** .  ** 
30e20 49 74 20 69 73 20 72 65 63 75 72 73 69 76 65 20  It is recursive 
30e30 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72  invocation of tr
30e40 69 67 67 65 72 73 2c 20 61 74 20 74 68 65 20 53  iggers, at the S
30e50 51 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69  QL level, that i
30e60 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64  s .  ** disabled
30e70 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  . In some cases 
30e80 61 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72  a single trigger
30e90 20 6d 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f   may generate mo
30ea0 72 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a  re than one .  *
30eb0 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66  * SubProgram (if
30ec0 20 74 68 65 20 74 72 69 67 67 65 72 20 6d 61 79   the trigger may
30ed0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
30ee0 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  h more than one 
30ef0 64 69 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20  different .  ** 
30f00 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f  ON CONFLICT algo
30f10 72 69 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72  rithm). SubProgr
30f20 61 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 73  am structures as
30f30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 0a  sociated with a.
30f40 20 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67    ** single trig
30f50 67 65 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65  ger all have the
30f60 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20   same value for 
30f70 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74  the SubProgram.t
30f80 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61  oken .  ** varia
30f90 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
30fa0 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20  Op->p5 ){.    t 
30fb0 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65  = pProgram->toke
30fc0 6e 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  n;.    for(pFram
30fd0 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
30fe0 61 6d 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74  ame && pFrame->t
30ff0 6f 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d  oken!=t; pFrame=
31000 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
31010 3b 0a 20 20 20 20 69 66 28 20 70 46 72 61 6d 65  ;.    if( pFrame
31020 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
31030 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d   if( p->nFrame>=
31040 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
31050 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
31060 44 45 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63  DEPTH] ){.    rc
31070 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
31080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31090 45 72 72 6f 72 28 70 2c 20 22 74 6f 6f 20 6d 61  Error(p, "too ma
310a0 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
310b0 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 22 29  gger recursion")
310c0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
310d0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
310e0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
310f0 72 20 70 52 74 20 69 73 20 75 73 65 64 20 74 6f  r pRt is used to
31100 20 73 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72   store the memor
31110 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  y required to sa
31120 76 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  ve the state.  *
31130 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
31140 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68   program, and th
31150 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  e memory require
31160 64 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  d at runtime to 
31170 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65  execute.  ** the
31180 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
31190 2e 20 49 66 20 74 68 69 73 20 74 72 69 67 67 65  . If this trigge
311a0 72 20 68 61 73 20 62 65 65 6e 20 66 69 72 65 64  r has been fired
311b0 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52   before, then pR
311c0 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  t .  ** is alrea
311d0 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74  dy allocated. Ot
311e0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74  herwise, it must
311f0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
31200 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d    */.  if( (pRt-
31210 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65  >flags&MEM_Frame
31220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  )==0 ){.    /* S
31230 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69  ubProgram.nMem i
31240 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
31250 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ber of memory ce
31260 6c 6c 73 20 75 73 65 64 20 62 79 20 74 68 65 20  lls used by the 
31270 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20  .    ** program 
31280 73 74 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f  stored in SubPro
31290 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c  gram.aOp. As wel
312a0 6c 20 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20  l as these, one 
312b0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65  memory.    ** ce
312c0 6c 6c 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ll is required f
312d0 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 75  or each cursor u
312e0 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 67 72  sed by the progr
312f0 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20  am. Set local.  
31300 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d    ** variable nM
31310 65 6d 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56  em (and later, V
31320 64 62 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d  dbeFrame.nChildM
31330 65 6d 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75  em) to this valu
31340 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d  e..    */.    nM
31350 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  em = pProgram->n
31360 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e  Mem + pProgram->
31370 6e 43 73 72 3b 0a 20 20 20 20 61 73 73 65 72 74  nCsr;.    assert
31380 28 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ( nMem>0 );.    
31390 69 66 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  if( pProgram->nC
313a0 73 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b 2b 3b 0a  sr==0 ) nMem++;.
313b0 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
313c0 44 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72  D8(sizeof(VdbeFr
313d0 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20  ame)).          
313e0 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a      + nMem * siz
313f0 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20  eof(Mem).       
31400 20 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61         + pProgra
31410 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66  m->nCsr * sizeof
31420 28 56 64 62 65 43 75 72 73 6f 72 2a 29 0a 20 20  (VdbeCursor*).  
31430 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 70              + (p
31440 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20 37  Program->nOp + 7
31450 29 2f 38 3b 0a 20 20 20 20 70 46 72 61 6d 65 20  )/8;.    pFrame 
31460 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
31470 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
31480 3b 0a 20 20 20 20 69 66 28 20 21 70 46 72 61 6d  ;.    if( !pFram
31490 65 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  e ){.      goto 
314a0 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
314b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
314c0 52 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20 20  Release(pRt);.  
314d0 20 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20 4d    pRt->flags = M
314e0 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70 52  EM_Frame;.    pR
314f0 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70 46  t->u.pFrame = pF
31500 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61 6d  rame;..    pFram
31510 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46  e->v = p;.    pF
31520 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20  rame->nChildMem 
31530 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61  = nMem;.    pFra
31540 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20  me->nChildCsr = 
31550 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a  pProgram->nCsr;.
31560 20 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d      pFrame->pc =
31570 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
31580 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  );.    pFrame->a
31590 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20  Mem = p->aMem;. 
315a0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20     pFrame->nMem 
315b0 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  = p->nMem;.    p
315c0 46 72 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20 70  Frame->apCsr = p
315d0 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20 70 46 72  ->apCsr;.    pFr
315e0 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70  ame->nCursor = p
315f0 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->nCursor;.    p
31600 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e  Frame->aOp = p->
31610 61 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  aOp;.    pFrame-
31620 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  >nOp = p->nOp;. 
31630 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e     pFrame->token
31640 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b   = pProgram->tok
31650 65 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  en;.#ifdef SQLIT
31660 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
31670 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 46 72  ANSTATUS.    pFr
31680 61 6d 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d  ame->anExec = p-
31690 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
316a0 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62  .    pEnd = &Vdb
316b0 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
316c0 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  )[pFrame->nChild
316d0 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d  Mem];.    for(pM
316e0 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28  em=VdbeFrameMem(
316f0 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70  pFrame); pMem!=p
31700 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  End; pMem++){.  
31710 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
31720 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
31730 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  .      pMem->db 
31740 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = db;.    }.  }e
31750 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20  lse{.    pFrame 
31760 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b  = pRt->u.pFrame;
31770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
31780 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f  ogram->nMem+pPro
31790 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61  gram->nCsr==pFra
317a0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 0a 20  me->nChildMem . 
317b0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 67         || (pProg
317c0 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20 26 26 20  ram->nCsr==0 && 
317d0 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 31  pProgram->nMem+1
317e0 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
317f0 4d 65 6d 29 20 29 3b 0a 20 20 20 20 61 73 73 65  Mem) );.    asse
31800 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  rt( pProgram->nC
31810 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69  sr==pFrame->nChi
31820 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73  ldCsr );.    ass
31830 65 72 74 28 20 28 69 6e 74 29 28 70 4f 70 20 2d  ert( (int)(pOp -
31840 20 61 4f 70 29 3d 3d 70 46 72 61 6d 65 2d 3e 70   aOp)==pFrame->p
31850 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e  c );.  }..  p->n
31860 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d  Frame++;.  pFram
31870 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e  e->pParent = p->
31880 70 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65  pFrame;.  pFrame
31890 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62  ->lastRowid = db
318a0 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70  ->lastRowid;.  p
318b0 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d  Frame->nChange =
318c0 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70   p->nChange;.  p
318d0 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
318e0 20 3d 20 70 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67   = p->db->nChang
318f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  e;.  assert( pFr
31900 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ame->pAuxData==0
31910 20 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41   );.  pFrame->pA
31920 75 78 44 61 74 61 20 3d 20 70 2d 3e 70 41 75 78  uxData = p->pAux
31930 44 61 74 61 3b 0a 20 20 70 2d 3e 70 41 75 78 44  Data;.  p->pAuxD
31940 61 74 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43  ata = 0;.  p->nC
31950 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
31960 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b  pFrame = pFrame;
31970 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65  .  p->aMem = aMe
31980 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
31990 28 70 46 72 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e  (pFrame);.  p->n
319a0 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  Mem = pFrame->nC
319b0 68 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43  hildMem;.  p->nC
319c0 75 72 73 6f 72 20 3d 20 28 75 31 36 29 70 46 72  ursor = (u16)pFr
319d0 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a  ame->nChildCsr;.
319e0 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64    p->apCsr = (Vd
319f0 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
31a00 6d 5b 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 46  m[p->nMem];.  pF
31a10 72 61 6d 65 2d 3e 61 4f 6e 63 65 20 3d 20 28 75  rame->aOnce = (u
31a20 38 2a 29 26 70 2d 3e 61 70 43 73 72 5b 70 50 72  8*)&p->apCsr[pPr
31a30 6f 67 72 61 6d 2d 3e 6e 43 73 72 5d 3b 0a 20 20  ogram->nCsr];.  
31a40 6d 65 6d 73 65 74 28 70 46 72 61 6d 65 2d 3e 61  memset(pFrame->a
31a50 4f 6e 63 65 2c 20 30 2c 20 28 70 50 72 6f 67 72  Once, 0, (pProgr
31a60 61 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f 38 29 3b  am->nOp + 7)/8);
31a70 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20  .  p->aOp = aOp 
31a80 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b  = pProgram->aOp;
31a90 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f  .  p->nOp = pPro
31aa0 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 23 69 66 64 65  gram->nOp;.#ifde
31ab0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31ac0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
31ad0 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 30 3b    p->anExec = 0;
31ae0 0a 23 65 6e 64 69 66 0a 20 20 70 4f 70 20 3d 20  .#endif.  pOp = 
31af0 26 61 4f 70 5b 2d 31 5d 3b 0a 0a 20 20 62 72 65  &aOp[-1];..  bre
31b00 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
31b10 3a 20 50 61 72 61 6d 20 50 31 20 50 32 20 2a 20  : Param P1 P2 * 
31b20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  * *.**.** This o
31b30 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 76  pcode is only ev
31b40 65 72 20 70 72 65 73 65 6e 74 20 69 6e 20 73 75  er present in su
31b50 62 2d 70 72 6f 67 72 61 6d 73 20 63 61 6c 6c 65  b-programs calle
31b60 64 20 76 69 61 20 74 68 65 20 0a 2a 2a 20 4f 50  d via the .** OP
31b70 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63  _Program instruc
31b80 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20 76 61 6c  tion. Copy a val
31b90 75 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ue currently sto
31ba0 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  red in a memory 
31bb0 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  .** cell of the 
31bc0 63 61 6c 6c 69 6e 67 20 28 70 61 72 65 6e 74 29  calling (parent)
31bd0 20 66 72 61 6d 65 20 74 6f 20 63 65 6c 6c 20 50   frame to cell P
31be0 32 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  2 in the current
31bf0 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61 64 64 72   frames .** addr
31c00 65 73 73 20 73 70 61 63 65 2e 20 54 68 69 73 20  ess space. This 
31c10 69 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67  is used by trigg
31c20 65 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20 61  er programs to a
31c30 63 63 65 73 73 20 74 68 65 20 6e 65 77 2e 2a 20  ccess the new.* 
31c40 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 76 61  .** and old.* va
31c50 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lues..**.** The 
31c60 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
31c70 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ell in the paren
31c80 74 20 66 72 61 6d 65 20 69 73 20 64 65 74 65 72  t frame is deter
31c90 6d 69 6e 65 64 20 62 79 20 61 64 64 69 6e 67 0a  mined by adding.
31ca0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
31cb0 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20  the P1 argument 
31cc0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
31cd0 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20  the P1 argument 
31ce0 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  to the.** callin
31cf0 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73  g OP_Program ins
31d00 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
31d10 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b 20 20 20  e OP_Param: {   
31d20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
31d30 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  */.  VdbeFrame *
31d40 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70  pFrame;.  Mem *p
31d50 49 6e 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  In;.  pOut = out
31d60 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
31d70 4f 70 29 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20  Op);.  pFrame = 
31d80 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e  p->pFrame;.  pIn
31d90 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
31da0 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d  [pOp->p1 + pFram
31db0 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70  e->aOp[pFrame->p
31dc0 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c  c].p1];   .  sql
31dd0 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
31de0 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e  owCopy(pOut, pIn
31df0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
31e00 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  break;.}..#endif
31e10 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
31e20 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
31e30 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
31e40 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
31e50 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46  KEY./* Opcode: F
31e60 6b 43 6f 75 6e 74 65 72 20 50 31 20 50 32 20 2a  kCounter P1 P2 *
31e70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
31e80 3a 20 66 6b 63 74 72 5b 50 31 5d 2b 3d 50 32 0a  : fkctr[P1]+=P2.
31e90 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  **.** Increment 
31ea0 61 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  a "constraint co
31eb0 75 6e 74 65 72 22 20 62 79 20 50 32 20 28 50 32  unter" by P2 (P2
31ec0 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65   may be negative
31ed0 20 6f 72 20 70 6f 73 69 74 69 76 65 29 2e 0a 2a   or positive)..*
31ee0 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a  * If P1 is non-z
31ef0 65 72 6f 2c 20 74 68 65 20 64 61 74 61 62 61 73  ero, the databas
31f00 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  e constraint cou
31f10 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
31f20 74 65 64 20 0a 2a 2a 20 28 64 65 66 65 72 72 65  ted .** (deferre
31f30 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
31f40 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f 74 68 65  nstraints). Othe
31f50 72 77 69 73 65 2c 20 69 66 20 50 31 20 69 73 20  rwise, if P1 is 
31f60 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20 73 74  zero, the .** st
31f70 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65 72 20  atement counter 
31f80 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28  is incremented (
31f90 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
31fa0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
31fb0 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  s)..*/.case OP_F
31fc0 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20 69 66  kCounter: {.  if
31fd0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
31fe0 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 7b  LITE_DeferFKs ){
31ff0 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
32000 65 64 49 6d 6d 43 6f 6e 73 20 2b 3d 20 70 4f 70  edImmCons += pOp
32010 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->p2;.  }else if
32020 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20  ( pOp->p1 ){.   
32030 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
32040 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  ns += pOp->p2;. 
32050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
32060 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20  FkConstraint += 
32070 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20 62  pOp->p2;.  }.  b
32080 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
32090 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50 31 20  de: FkIfZero P1 
320a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
320b0 70 73 69 73 3a 20 69 66 20 66 6b 63 74 72 5b 50  psis: if fkctr[P
320c0 31 5d 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a  1]==0 goto P2.**
320d0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
320e0 74 65 73 74 73 20 69 66 20 61 20 66 6f 72 65 69  tests if a forei
320f0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
32100 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 63 75 72  t-counter is cur
32110 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20  rently zero..** 
32120 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69  If so, jump to i
32130 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f  nstruction P2. O
32140 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
32150 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
32160 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  xt .** instructi
32170 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20  on..**.** If P1 
32180 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
32190 6e 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  n the jump is ta
321a0 6b 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  ken if the datab
321b0 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63  ase constraint-c
321c0 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72  ounter.** is zer
321d0 6f 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20  o (the one that 
321e0 63 6f 75 6e 74 73 20 64 65 66 65 72 72 65 64 20  counts deferred 
321f0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
32200 74 69 6f 6e 73 29 2e 20 49 66 20 50 31 20 69 73  tions). If P1 is
32210 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75  .** zero, the ju
32220 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  mp is taken if t
32230 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  he statement con
32240 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20  straint-counter 
32250 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65  is zero.** (imme
32260 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
32270 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  y constraint vio
32280 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73  lations)..*/.cas
32290 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b  e OP_FkIfZero: {
322a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
322b0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   */.  if( pOp->p
322c0 31 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61  1 ){.    VdbeBra
322d0 6e 63 68 54 61 6b 65 6e 28 64 62 2d 3e 6e 44 65  nchTaken(db->nDe
322e0 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26  ferredCons==0 &&
322f0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
32300 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20  mCons==0, 2);.  
32310 20 20 69 66 28 20 64 62 2d 3e 6e 44 65 66 65 72    if( db->nDefer
32320 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26 20 64 62  redCons==0 && db
32330 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
32340 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  ns==0 ) goto jum
32350 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65  p_to_p2;.  }else
32360 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
32370 54 61 6b 65 6e 28 70 2d 3e 6e 46 6b 43 6f 6e 73  Taken(p->nFkCons
32380 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d  traint==0 && db-
32390 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
323a0 73 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66  s==0, 2);.    if
323b0 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  ( p->nFkConstrai
323c0 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65  nt==0 && db->nDe
323d0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30  ferredImmCons==0
323e0 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
323f0 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
32400 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
32410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32420 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f 0a  _FOREIGN_KEY */.
32430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32440 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
32450 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65  NT./* Opcode: Me
32460 6d 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20 2a  mMax P1 P2 * * *
32470 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
32480 50 31 5d 3d 6d 61 78 28 72 5b 50 31 5d 2c 72 5b  P1]=max(r[P1],r[
32490 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  P2]).**.** P1 is
324a0 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
324b0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
324c0 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72 6f   this VM (the ro
324d0 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20 64  ot frame is.** d
324e0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
324f0 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20  e current frame 
32500 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  if this instruct
32510 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78 65  ion is being exe
32520 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  cuted.** within 
32530 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e 20  a sub-program). 
32540 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
32550 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
32560 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a  the maximum of .
32570 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  ** its current v
32580 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c  alue and the val
32590 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
325a0 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  2..**.** This in
325b0 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77 73  struction throws
325c0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
325d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20   memory cell is 
325e0 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a  not initially.**
325f0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
32600 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20  case OP_MemMax: 
32610 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20  {        /* in2 
32620 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  */.  VdbeFrame *
32630 70 46 72 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d  pFrame;.  if( p-
32640 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 66  >pFrame ){.    f
32650 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
32660 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
32670 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
32680 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
32690 20 20 20 70 49 6e 31 20 3d 20 26 70 46 72 61 6d     pIn1 = &pFram
326a0 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  e->aMem[pOp->p1]
326b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
326c0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
326d0 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >p1];.  }.  asse
326e0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
326f0 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  In1) );.  sqlite
32700 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
32710 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  fy(pIn1);.  pIn2
32720 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
32730 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
32740 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49  MemIntegerify(pI
32750 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d  n2);.  if( pIn1-
32760 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b  >u.i<pIn2->u.i){
32770 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d  .    pIn1->u.i =
32780 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a   pIn2->u.i;.  }.
32790 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
327a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
327b0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a  _AUTOINCREMENT *
327c0 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  /../* Opcode: If
327d0 50 6f 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Pos P1 P2 P3 * *
327e0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
327f0 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b   r[P1]>0 then r[
32800 50 31 5d 2d 3d 50 33 2c 20 67 6f 74 6f 20 50 32  P1]-=P3, goto P2
32810 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
32820 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  P1 must contain 
32830 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49  an integer..** I
32840 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  f the value of r
32850 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31 20  egister P1 is 1 
32860 6f 72 20 67 72 65 61 74 65 72 2c 20 73 75 62 74  or greater, subt
32870 72 61 63 74 20 50 33 20 66 72 6f 6d 20 74 68 65  ract P3 from the
32880 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 50 31 20  .** value in P1 
32890 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  and jump to P2..
328a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 69  **.** If the ini
328b0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 65  tial value of re
328c0 67 69 73 74 65 72 20 50 31 20 69 73 20 6c 65 73  gister P1 is les
328d0 73 20 74 68 61 6e 20 31 2c 20 74 68 65 6e 20 74  s than 1, then t
328e0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 75  he.** value is u
328f0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 63 6f 6e  nchanged and con
32900 74 72 6f 6c 20 70 61 73 73 65 73 20 74 68 72 6f  trol passes thro
32910 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
32920 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
32930 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b  case OP_IfPos: {
32940 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
32950 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
32960 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
32970 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
32980 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
32990 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
329a0 6b 65 6e 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30  ken( pIn1->u.i>0
329b0 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  , 2);.  if( pIn1
329c0 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20 70  ->u.i>0 ){.    p
329d0 49 6e 31 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70 2d  In1->u.i -= pOp-
329e0 3e 70 33 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  >p3;.    goto ju
329f0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
32a00 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
32a10 6f 64 65 3a 20 4f 66 66 73 65 74 4c 69 6d 69 74  ode: OffsetLimit
32a20 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
32a30 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
32a40 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b 50 32 5d  P1]>0 then r[P2]
32a50 3d 72 5b 50 31 5d 2b 6d 61 78 28 30 2c 72 5b 50  =r[P1]+max(0,r[P
32a60 33 5d 29 20 65 6c 73 65 20 72 5b 50 32 5d 3d 28  3]) else r[P2]=(
32a70 2d 31 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  -1).**.** This o
32a80 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 61  pcode performs a
32a90 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 63   commonly used c
32aa0 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 6f 63  omputation assoc
32ab0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 4c 49  iated with.** LI
32ac0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 70  MIT and OFFSET p
32ad0 72 6f 63 65 73 73 2e 20 20 72 5b 50 31 5d 20 68  rocess.  r[P1] h
32ae0 6f 6c 64 73 20 74 68 65 20 6c 69 6d 69 74 20 63  olds the limit c
32af0 6f 75 6e 74 65 72 2e 20 20 72 5b 50 33 5d 0a 2a  ounter.  r[P3].*
32b00 2a 20 68 6f 6c 64 73 20 74 68 65 20 6f 66 66 73  * holds the offs
32b10 65 74 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 65  et counter.  The
32b20 20 6f 70 63 6f 64 65 20 63 6f 6d 70 75 74 65 73   opcode computes
32b30 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 76 61   the combined va
32b40 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4c 49  lue.** of the LI
32b50 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 61  MIT and OFFSET a
32b60 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20 76  nd stores that v
32b70 61 6c 75 65 20 69 6e 20 72 5b 50 32 5d 2e 20 20  alue in r[P2].  
32b80 54 68 65 20 72 5b 50 32 5d 0a 2a 2a 20 76 61 6c  The r[P2].** val
32b90 75 65 20 63 6f 6d 70 75 74 65 64 20 69 73 20 74  ue computed is t
32ba0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
32bb0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
32bc0 6c 20 6e 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  l need to be.** 
32bd0 76 69 73 69 74 65 64 20 69 6e 20 6f 72 64 65 72  visited in order
32be0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
32bf0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   query..**.** If
32c00 20 72 5b 50 33 5d 20 69 73 20 7a 65 72 6f 20 6f   r[P3] is zero o
32c10 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74  r negative, that
32c20 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
32c30 6e 6f 20 4f 46 46 53 45 54 0a 2a 2a 20 61 6e 64  no OFFSET.** and
32c40 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f   r[P2] is set to
32c50 20 62 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66   be the value of
32c60 20 74 68 65 20 4c 49 4d 49 54 2c 20 72 5b 50 31   the LIMIT, r[P1
32c70 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 72 5b 50 31  ]..**.** if r[P1
32c80 5d 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ] is zero or neg
32c90 61 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e  ative, that mean
32ca0 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4c 49  s there is no LI
32cb0 4d 49 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d  MIT.** and r[P2]
32cc0 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2e 20 0a   is set to -1. .
32cd0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
32ce0 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f   r[P2] is set to
32cf0 20 74 68 65 20 73 75 6d 20 6f 66 20 72 5b 50 31   the sum of r[P1
32d00 5d 20 61 6e 64 20 72 5b 50 33 5d 2e 0a 2a 2f 0a  ] and r[P3]..*/.
32d10 63 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 4c 69  case OP_OffsetLi
32d20 6d 69 74 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 31  mit: {    /* in1
32d30 2c 20 6f 75 74 32 2c 20 69 6e 33 20 2a 2f 0a 20  , out2, in3 */. 
32d40 20 69 36 34 20 78 3b 0a 20 20 70 49 6e 31 20 3d   i64 x;.  pIn1 =
32d50 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
32d60 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
32d70 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4f 75 74  pOp->p3];.  pOut
32d80 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
32d90 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73  e(p, pOp);.  ass
32da0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
32db0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
32dc0 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c  assert( pIn3->fl
32dd0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
32de0 0a 20 20 78 20 3d 20 70 49 6e 31 2d 3e 75 2e 69  .  x = pIn1->u.i
32df0 3b 0a 20 20 69 66 28 20 78 3c 3d 30 20 7c 7c 20  ;.  if( x<=0 || 
32e00 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
32e10 26 78 2c 20 70 49 6e 33 2d 3e 75 2e 69 3e 30 3f  &x, pIn3->u.i>0?
32e20 70 49 6e 33 2d 3e 75 2e 69 3a 30 29 20 29 7b 0a  pIn3->u.i:0) ){.
32e30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 49      /* If the LI
32e40 4d 49 54 20 69 73 20 6c 65 73 73 20 74 68 61 6e  MIT is less than
32e50 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
32e60 6f 2c 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e  o, loop forever.
32e70 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73    This.    ** is
32e80 20 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 42 75   documented.  Bu
32e90 74 20 61 6c 73 6f 2c 20 69 66 20 74 68 65 20 4c  t also, if the L
32ea0 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 78 63 65  IMIT+OFFSET exce
32eb0 65 64 73 20 32 5e 36 33 20 74 68 65 6e 0a 20 20  eds 2^63 then.  
32ec0 20 20 2a 2a 20 61 6c 73 6f 20 6c 6f 6f 70 20 66    ** also loop f
32ed0 6f 72 65 76 65 72 2e 20 20 54 68 69 73 20 69 73  orever.  This is
32ee0 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20   undocumented.  
32ef0 49 6e 20 66 61 63 74 2c 20 6f 6e 65 20 63 6f 75  In fact, one cou
32f00 6c 64 20 61 72 67 75 65 0a 20 20 20 20 2a 2a 20  ld argue.    ** 
32f10 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 20 73 68  that the loop sh
32f20 6f 75 6c 64 20 74 65 72 6d 69 6e 61 74 65 2e 20  ould terminate. 
32f30 20 42 75 74 20 61 73 73 75 6d 69 6e 67 20 31 20   But assuming 1 
32f40 62 69 6c 6c 69 6f 6e 20 69 74 65 72 61 74 69 6f  billion iteratio
32f50 6e 73 0a 20 20 20 20 2a 2a 20 70 65 72 20 73 65  ns.    ** per se
32f60 63 6f 6e 64 20 28 66 61 72 20 65 78 63 65 65 64  cond (far exceed
32f70 69 6e 67 20 74 68 65 20 63 61 70 61 62 69 6c 69  ing the capabili
32f80 74 69 65 73 20 6f 66 20 61 6e 79 20 63 75 72 72  ties of any curr
32f90 65 6e 74 20 68 61 72 64 77 61 72 65 29 0a 20 20  ent hardware).  
32fa0 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 74 61    ** it would ta
32fb0 6b 65 20 6e 65 61 72 6c 79 20 33 30 30 20 79 65  ke nearly 300 ye
32fc0 61 72 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ars to actually 
32fd0 72 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74 2e  reach the limit.
32fe0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70    So.    ** loop
32ff0 69 6e 67 20 66 6f 72 65 76 65 72 20 69 73 20 61  ing forever is a
33000 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 70 70 72   reasonable appr
33010 6f 78 69 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  oximation. */.  
33020 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2d 31    pOut->u.i = -1
33030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
33040 4f 75 74 2d 3e 75 2e 69 20 3d 20 78 3b 0a 20 20  Out->u.i = x;.  
33050 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
33060 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 5a 65   Opcode: IfNotZe
33070 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ro P1 P2 * * *.*
33080 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72  * Synopsis: if r
33090 5b 50 31 5d 21 3d 30 20 74 68 65 6e 20 72 5b 50  [P1]!=0 then r[P
330a0 31 5d 2d 2d 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a  1]--, goto P2.**
330b0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20  .** Register P1 
330c0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20  must contain an 
330d0 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
330e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
330f0 73 74 65 72 20 50 31 20 69 73 0a 2a 2a 20 69 6e  ster P1 is.** in
33100 69 74 69 61 6c 6c 79 20 67 72 65 61 74 65 72 20  itially greater 
33110 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
33120 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  decrement the va
33130 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
33140 50 31 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  P1..** If it is 
33150 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 65 67 61 74 69  non-zero (negati
33160 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 20  ve or positive) 
33170 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 6a 75  and then also ju
33180 6d 70 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 49  mp to P2.  .** I
33190 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
331a0 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 2c   initially zero,
331b0 20 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61 6e   leave it unchan
331c0 67 65 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72  ged and fall thr
331d0 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ough..*/.case OP
331e0 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b 20 20 20  _IfNotZero: {   
331f0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
33200 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
33210 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
33220 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
33230 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  ags&MEM_Int );. 
33240 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
33250 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c 20 32 29  (pIn1->u.i<0, 2)
33260 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
33270 69 20 29 7b 0a 20 20 20 20 20 69 66 28 20 70 49  i ){.     if( pI
33280 6e 31 2d 3e 75 2e 69 3e 30 20 29 20 70 49 6e 31  n1->u.i>0 ) pIn1
33290 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 20 20 20 67 6f  ->u.i--;.     go
332a0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
332b0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
332c0 2a 20 4f 70 63 6f 64 65 3a 20 44 65 63 72 4a 75  * Opcode: DecrJu
332d0 6d 70 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  mpZero P1 P2 * *
332e0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
332f0 69 66 20 28 2d 2d 72 5b 50 31 5d 29 3d 3d 30 20  if (--r[P1])==0 
33300 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65  goto P2.**.** Re
33310 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 68  gister P1 must h
33320 6f 6c 64 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  old an integer. 
33330 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Decrement the v
33340 61 6c 75 65 20 69 6e 20 50 31 0a 2a 2a 20 61 6e  alue in P1.** an
33350 64 20 6a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  d jump to P2 if 
33360 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
33370 20 65 78 61 63 74 6c 79 20 7a 65 72 6f 2e 0a 2a   exactly zero..*
33380 2f 0a 63 61 73 65 20 4f 50 5f 44 65 63 72 4a 75  /.case OP_DecrJu
33390 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 2f  mpZero: {      /
333a0 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
333b0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
333c0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
333d0 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn1->flags&ME
333e0 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70  M_Int );.  if( p
333f0 49 6e 31 2d 3e 75 2e 69 3e 53 4d 41 4c 4c 45 53  In1->u.i>SMALLES
33400 54 5f 49 4e 54 36 34 20 29 20 70 49 6e 31 2d 3e  T_INT64 ) pIn1->
33410 75 2e 69 2d 2d 3b 0a 20 20 56 64 62 65 42 72 61  u.i--;.  VdbeBra
33420 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75  nchTaken(pIn1->u
33430 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  .i==0, 2);.  if(
33440 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 20   pIn1->u.i==0 ) 
33450 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
33460 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
33470 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70   Opcode: AggStep
33480 30 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a  0 * P2 P3 P4 P5.
33490 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63  ** Synopsis: acc
334a0 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b  um=r[P3] step(r[
334b0 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78  P2@P5]).**.** Ex
334c0 65 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66  ecute the step f
334d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61  unction for an a
334e0 67 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a  ggregate.  The.*
334f0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50  * function has P
33500 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50  5 arguments.   P
33510 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
33520 6f 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a  o the FuncDef.**
33530 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
33540 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75  specifies the fu
33550 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74 65  nction.  Registe
33560 72 20 50 33 20 69 73 20 74 68 65 0a 2a 2a 20 61  r P3 is the.** a
33570 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
33580 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e  * The P5 argumen
33590 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  ts are taken fro
335a0 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  m register P2 an
335b0 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73  d its.** success
335c0 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ors..*/./* Opcod
335d0 65 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32 20  e: AggStep * P2 
335e0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
335f0 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33  psis: accum=r[P3
33600 5d 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d 29  ] step(r[P2@P5])
33610 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  .**.** Execute t
33620 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
33630 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
33640 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74  e.  The.** funct
33650 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d  ion has P5 argum
33660 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61 20  ents.   P4 is a 
33670 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
33680 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 0a 2a 2a  lite3_context.**
33690 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
336a0 75 73 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  used to run the 
336b0 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73  function.  Regis
336c0 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 73 20  ter P3 is.** as 
336d0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  the accumulator.
336e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
336f0 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
33700 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
33710 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
33720 63 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  ccessors..**.** 
33730 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 69  This opcode is i
33740 6e 69 74 69 61 6c 6c 79 20 63 6f 64 65 64 20 61  nitially coded a
33750 73 20 4f 50 5f 41 67 67 53 74 65 70 30 2e 20 20  s OP_AggStep0.  
33760 4f 6e 20 66 69 72 73 74 20 65 76 61 6c 75 61 74  On first evaluat
33770 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 46 75 6e 63  ion,.** the Func
33780 44 65 66 20 73 74 6f 72 65 64 20 69 6e 20 50 34  Def stored in P4
33790 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
337a0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f  to an sqlite3_co
337b0 6e 74 65 78 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ntext and.** the
337c0 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67   opcode is chang
337d0 65 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  ed.  In this way
337e0 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  , the initializa
337f0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
33800 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f  qlite3_context o
33810 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65  nly happens once
33820 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 20  , instead of on 
33830 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 65  each call to the
33840 0a 2a 2a 20 73 74 65 70 20 66 75 6e 63 74 69 6f  .** step functio
33850 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  n..*/.case OP_Ag
33860 67 53 74 65 70 30 3a 20 7b 0a 20 20 69 6e 74 20  gStep0: {.  int 
33870 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n;.  sqlite3_con
33880 74 65 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61  text *pCtx;..  a
33890 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
338a0 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20 29  pe==P4_FUNCDEF )
338b0 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b  ;.  n = pOp->p5;
338c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
338d0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
338e0 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
338f0 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61  >nCursor) );.  a
33900 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28  ssert( n==0 || (
33910 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70  pOp->p2>0 && pOp
33920 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  ->p2+n<=(p->nMem
33930 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
33940 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
33950 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32   pOp->p3<pOp->p2
33960 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70   || pOp->p3>=pOp
33970 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78  ->p2+n );.  pCtx
33980 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
33990 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 2a 73 69  ocRawNN(db, n*si
339a0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c  zeof(sqlite3_val
339b0 75 65 2a 29 20 2b 0a 20 20 20 20 20 20 20 20 20  ue*) +.         
339c0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 70 43        (sizeof(pC
339d0 74 78 5b 30 5d 29 20 2b 20 73 69 7a 65 6f 66 28  tx[0]) + sizeof(
339e0 4d 65 6d 29 20 2d 20 73 69 7a 65 6f 66 28 73 71  Mem) - sizeof(sq
339f0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 29 3b  lite3_value*)));
33a00 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
33a10 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
33a20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a  pCtx->pMem = 0;.
33a30 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 28    pCtx->pOut = (
33a40 4d 65 6d 2a 29 26 28 70 43 74 78 2d 3e 61 72 67  Mem*)&(pCtx->arg
33a50 76 5b 6e 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  v[n]);.  sqlite3
33a60 56 64 62 65 4d 65 6d 49 6e 69 74 28 70 43 74 78  VdbeMemInit(pCtx
33a70 2d 3e 70 4f 75 74 2c 20 64 62 2c 20 4d 45 4d 5f  ->pOut, db, MEM_
33a80 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70  Null);.  pCtx->p
33a90 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
33aa0 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f  Func;.  pCtx->iO
33ab0 70 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  p = (int)(pOp - 
33ac0 61 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56  aOp);.  pCtx->pV
33ad0 64 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d  dbe = p;.  pCtx-
33ae0 3e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20  >skipFlag = 0;. 
33af0 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 3d   pCtx->isError =
33b00 20 30 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67 63   0;.  pCtx->argc
33b10 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = n;.  pOp->p4t
33b20 79 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54 58  ype = P4_FUNCCTX
33b30 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  ;.  pOp->p4.pCtx
33b40 20 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e   = pCtx;.  pOp->
33b50 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53  opcode = OP_AggS
33b60 74 65 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  tep;.  /* Fall t
33b70 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41  hrough into OP_A
33b80 67 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65  ggStep */.}.case
33b90 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
33ba0 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
33bb0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
33bc0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20  .  Mem *pMem;.. 
33bd0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
33be0 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43 54 58  type==P4_FUNCCTX
33bf0 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 70 4f 70   );.  pCtx = pOp
33c00 2d 3e 70 34 2e 70 43 74 78 3b 0a 20 20 70 4d 65  ->p4.pCtx;.  pMe
33c10 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
33c20 33 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  3];..  /* If thi
33c30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
33c40 73 69 64 65 20 6f 66 20 61 20 74 72 69 67 67 65  side of a trigge
33c50 72 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  r, the register 
33c60 61 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a  array in aMem[].
33c70 20 20 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67    ** might chang
33c80 65 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61 6c 75  e from one evalu
33c90 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ation to the nex
33ca0 74 2e 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f  t.  The next blo
33cb0 63 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a 2a 20  ck of code.  ** 
33cc0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
33cd0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 72   the register ar
33ce0 72 61 79 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ray has changed,
33cf0 20 61 6e 64 20 69 66 20 73 6f 20 69 74 0a 20 20   and if so it.  
33d00 2a 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 73  ** reinitializes
33d10 20 74 68 65 20 72 65 6c 61 76 61 6e 74 20 70 61   the relavant pa
33d20 72 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  rts of the sqlit
33d30 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63  e3_context objec
33d40 74 20 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d  t */.  if( pCtx-
33d50 3e 70 4d 65 6d 20 21 3d 20 70 4d 65 6d 20 29 7b  >pMem != pMem ){
33d60 0a 20 20 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20  .    pCtx->pMem 
33d70 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28  = pMem;.    for(
33d80 69 3d 70 43 74 78 2d 3e 61 72 67 63 2d 31 3b 20  i=pCtx->argc-1; 
33d90 69 3e 3d 30 3b 20 69 2d 2d 29 20 70 43 74 78 2d  i>=0; i--) pCtx-
33da0 3e 61 72 67 76 5b 69 5d 20 3d 20 26 61 4d 65 6d  >argv[i] = &aMem
33db0 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20 20 7d  [pOp->p2+i];.  }
33dc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33dd0 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
33de0 20 69 3c 70 43 74 78 2d 3e 61 72 67 63 3b 20 69   i<pCtx->argc; i
33df0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
33e00 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 43 74 78   memIsValid(pCtx
33e10 2d 3e 61 72 67 76 5b 69 5d 29 20 29 3b 0a 20 20  ->argv[i]) );.  
33e20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
33e30 28 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 43 74 78  (pOp->p2+i, pCtx
33e40 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a  ->argv[i]);.  }.
33e50 23 65 6e 64 69 66 0a 0a 20 20 70 4d 65 6d 2d 3e  #endif..  pMem->
33e60 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n++;.  assert( p
33e70 43 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67 73  Ctx->pOut->flags
33e80 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  ==MEM_Null );.  
33e90 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 69 73  assert( pCtx->is
33ea0 45 72 72 6f 72 3d 3d 30 20 29 3b 0a 20 20 61 73  Error==0 );.  as
33eb0 73 65 72 74 28 20 70 43 74 78 2d 3e 73 6b 69 70  sert( pCtx->skip
33ec0 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 28 70 43  Flag==0 );.  (pC
33ed0 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  tx->pFunc->xSFun
33ee0 63 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72  c)(pCtx,pCtx->ar
33ef0 67 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20  gc,pCtx->argv); 
33f00 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d  /* IMP: R-24505-
33f10 32 33 32 33 30 20 2a 2f 0a 20 20 69 66 28 20 70  23230 */.  if( p
33f20 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a  Ctx->isError ){.
33f30 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73      if( pCtx->is
33f40 45 72 72 6f 72 3e 30 20 29 7b 0a 20 20 20 20 20  Error>0 ){.     
33f50 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
33f60 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  r(p, "%s", sqlit
33f70 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 43  e3_value_text(pC
33f80 74 78 2d 3e 70 4f 75 74 29 29 3b 0a 20 20 20 20  tx->pOut));.    
33f90 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 69 73 45    rc = pCtx->isE
33fa0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
33fb0 69 66 28 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c  if( pCtx->skipFl
33fc0 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ag ){.      asse
33fd0 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
33fe0 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29  de==OP_CollSeq )
33ff0 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 4f 70 5b  ;.      i = pOp[
34000 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66  -1].p1;.      if
34010 28 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( i ) sqlite3Vdb
34020 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
34030 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  em[i], 1);.     
34040 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20   pCtx->skipFlag 
34050 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
34060 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
34070 65 61 73 65 28 70 43 74 78 2d 3e 70 4f 75 74 29  ease(pCtx->pOut)
34080 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 75 74  ;.    pCtx->pOut
34090 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
340a0 6c 6c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 69 73  ll;.    pCtx->is
340b0 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 69  Error = 0;.    i
340c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
340d0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
340e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
340f0 43 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67 73  Ctx->pOut->flags
34100 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  ==MEM_Null );.  
34110 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 73 6b  assert( pCtx->sk
34120 69 70 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 62  ipFlag==0 );.  b
34130 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
34140 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20  de: AggFinal P1 
34150 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
34160 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50  opsis: accum=r[P
34170 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 78  1] N=P2.**.** Ex
34180 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69  ecute the finali
34190 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  zer function for
341a0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
341b0 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d  P1 is.** the mem
341c0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61  ory location tha
341d0 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c  t is the accumul
341e0 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67  ator for the agg
341f0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32  regate..**.** P2
34200 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
34210 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  f arguments that
34220 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
34230 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20  on takes and.** 
34240 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
34250 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66  to the FuncDef f
34260 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
34270 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67  .  The P2.** arg
34280 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65  ument is not use
34290 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
342a0 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68  .  It is only th
342b0 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75  ere to disambigu
342c0 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ate.** functions
342d0 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76   that can take v
342e0 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f  arying numbers o
342f0 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  f arguments.  Th
34300 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74  e.** P4 argument
34310 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
34320 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61  for the degenera
34330 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  te case where.**
34340 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
34350 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69  on was not previ
34360 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ously called..*/
34370 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61  .case OP_AggFina
34380 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  l: {.  Mem *pMem
34390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
343a0 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
343b0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
343c0 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
343d0 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
343e0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
343f0 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
34400 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41  ~(MEM_Null|MEM_A
34410 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20  gg))==0 );.  rc 
34420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
34430 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70  Finalize(pMem, p
34440 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20  Op->p4.pFunc);. 
34450 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
34460 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
34470 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  p, "%s", sqlite3
34480 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d  _value_text(pMem
34490 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  ));.    goto abo
344a0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
344b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
344c0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
344d0 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29  (pMem, encoding)
344e0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
344f0 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20  LOBSIZE(pMem);. 
34500 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
34510 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20  MemTooBig(pMem) 
34520 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
34530 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  big;.  }.  break
34540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
34550 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
34560 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69  Opcode: Checkpoi
34570 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  nt P1 P2 P3 * *.
34580 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  **.** Checkpoint
34590 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68   database P1. Th
345a0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
345b0 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65   P1 is not curre
345c0 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d  ntly in.** WAL m
345d0 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50  ode. Parameter P
345e0 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  2 is one of SQLI
345f0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
34600 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20  SSIVE, FULL,.** 
34610 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55 4e  RESTART, or TRUN
34620 43 41 54 45 2e 20 20 57 72 69 74 65 20 31 20 6f  CATE.  Write 1 o
34630 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d  r 0 into mem[P3]
34640 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   if the checkpoi
34650 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51  nt returns.** SQ
34660 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74  LITE_BUSY or not
34670 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
34680 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
34690 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
346a0 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74  e.** WAL after t
346b0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  he checkpoint in
346c0 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64  to mem[P3+1] and
346d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
346e0 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57  ages.** in the W
346f0 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65  AL that have bee
34700 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61  n checkpointed a
34710 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f  fter the checkpo
34720 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  int.** completes
34730 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e   into mem[P3+2].
34740 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20    However on an 
34750 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d  error, mem[P3+1]
34760 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32   and.** mem[P3+2
34770 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  ] are initialize
34780 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65  d to -1..*/.case
34790 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20   OP_Checkpoint: 
347a0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
347d0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65  ter */.  int aRe
347e0 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  s[3];           
347f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
34800 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  lts */.  Mem *pM
34810 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
34820 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
34830 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
34840 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
34850 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
34860 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20   aRes[0] = 0;.  
34870 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32  aRes[1] = aRes[2
34880 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74  ] = -1;.  assert
34890 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  ( pOp->p2==SQLIT
348a0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
348b0 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  SIVE.       || p
348c0 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
348d0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20  HECKPOINT_FULL. 
348e0 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32        || pOp->p2
348f0 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
34900 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20 20  INT_RESTART.    
34910 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53     || pOp->p2==S
34920 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
34930 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20  _TRUNCATE.  );. 
34940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
34950 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d  ckpoint(db, pOp-
34960 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61  >p1, pOp->p2, &a
34970 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d  Res[1], &aRes[2]
34980 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
34990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
349a0 45 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61 62  E_BUSY ) goto ab
349b0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
349c0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
349d0 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30  E_OK;.    aRes[0
349e0 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  ] = 1;.  }.  for
349f0 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d  (i=0, pMem = &aM
34a00 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33  em[pOp->p3]; i<3
34a10 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
34a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
34a30 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c  emSetInt64(pMem,
34a40 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a   (i64)aRes[i]);.
34a50 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b    }    .  break;
34a60 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69  .};  .#endif..#i
34a70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34a80 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f  T_PRAGMA./* Opco
34a90 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20  de: JournalMode 
34aa0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
34ab0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f  ** Change the jo
34ac0 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61  urnal mode of da
34ad0 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e  tabase P1 to P3.
34ae0 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   P3 must be one 
34af0 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f  of the.** PAGER_
34b00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20  JOURNALMODE_XXX 
34b10 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67  values. If chang
34b20 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
34b30 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b  various rollback
34b40 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74  .** modes (delet
34b50 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72  e, truncate, per
34b60 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65  sist, off and me
34b70 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61  mory), this is a
34b80 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61   simple.** opera
34b90 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72  tion. No IO is r
34ba0 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
34bb0 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  f changing into 
34bc0 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f  or out of WAL mo
34bd0 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  de the procedure
34be0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63   is more complic
34bf0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ated..**.** Writ
34c00 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  e a string conta
34c10 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  ining the final 
34c20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20  journal-mode to 
34c30 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
34c40 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
34c50 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74  ode: {    /* out
34c60 32 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42  2 */.  Btree *pB
34c70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34c80 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
34c90 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61  to change journa
34ca0 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50  l mode of */.  P
34cb0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34cd0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
34ce0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
34cf0 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20   int eNew;      
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d10 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20   /* New journal 
34d20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  mode */.  int eO
34d30 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
34d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34d50 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   old journal mod
34d60 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
34d70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63  ITE_OMIT_WAL.  c
34d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
34d90 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  name;          /
34da0 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61  * Name of databa
34db0 73 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  se file for pPag
34dc0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
34dd0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
34de0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
34df0 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b   eNew = pOp->p3;
34e00 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77 3d  .  assert( eNew=
34e10 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34e20 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
34e30 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
34e40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
34e50 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c 7c  NCATE .       ||
34e60 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34e70 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
34e80 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
34e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34ea0 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c  ODE_OFF.       |
34eb0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
34ec0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
34ed0 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
34ee0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34ef0 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c  DE_WAL.       ||
34f00 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34f10 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
34f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
34f30 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
34f40 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
34f50 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
34f60 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42  Only==0 );..  pB
34f70 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
34f80 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67  >p1].pBt;.  pPag
34f90 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
34fa0 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65  ePager(pBt);.  e
34fb0 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Old = sqlite3Pag
34fc0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
34fd0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
34fe0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
34ff0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20  NALMODE_QUERY ) 
35000 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69  eNew = eOld;.  i
35010 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72  f( !sqlite3Pager
35020 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61  OkToChangeJourna
35030 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20  lMode(pPager) ) 
35040 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69  eNew = eOld;..#i
35050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35060 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d  T_WAL.  zFilenam
35070 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
35080 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 2c  Filename(pPager,
35090 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f   1);..  /* Do no
350a0 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69  t allow a transi
350b0 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f  tion to journal_
350c0 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20 64  mode=WAL for a d
350d0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20  atabase.  ** in 
350e0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
350f0 65 20 6f 72 20 69 66 20 74 68 65 20 56 46 53 20  e or if the VFS 
35100 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
35110 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a   shared memory .
35120 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d    */.  if( eNew=
35130 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35140 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73 71  DE_WAL.   && (sq
35150 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
35160 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20  ilename)==0     
35170 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69        /* Temp fi
35180 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  le */.       || 
35190 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c  !sqlite3PagerWal
351a0 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72  Supported(pPager
351b0 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65  ))   /* No share
351c0 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72 74  d-memory support
351d0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65   */.  ){.    eNe
351e0 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20  w = eOld;.  }.. 
351f0 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64   if( (eNew!=eOld
35200 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50  ).   && (eOld==P
35210 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35220 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41  _WAL || eNew==PA
35230 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35240 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  WAL).  ){.    if
35250 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
35260 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65  t || db->nVdbeRe
35270 61 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63  ad>1 ){.      rc
35280 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
35290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
352a0 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20  beError(p,.     
352b0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61       "cannot cha
352c0 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20  nge %s wal mode 
352d0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
352e0 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
352f0 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47        (eNew==PAG
35300 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
35310 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f  AL ? "into" : "o
35320 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b  ut of").      );
35330 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
35340 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
35350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20      }else{. .   
35360 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47     if( eOld==PAG
35370 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
35380 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  AL ){.        /*
35390 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20   If leaving WAL 
353a0 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20  mode, close the 
353b0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
353c0 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c  cessful, the cal
353d0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  l.        ** to 
353e0 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20  PagerCloseWal() 
353f0 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20  checkpoints and 
35400 64 65 6c 65 74 65 73 20 74 68 65 20 77 72 69 74  deletes the writ
35410 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20  e-ahead-log .   
35420 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e       ** file. An
35430 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
35440 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c  may still be hel
35450 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
35460 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20  e file .        
35470 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63 63 65  ** after a succe
35480 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20  ssful return. . 
35490 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
354a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
354b0 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67  gerCloseWal(pPag
354c0 65 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20 20  er, db);.       
354d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
354e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
354f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a  sqlite3PagerSetJ
35500 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
35510 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, eNew);.      
35520 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
35530 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  if( eOld==PAGER_
35540 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
35550 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  RY ){.        /*
35560 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69   Cannot transiti
35570 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  on directly from
35580 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20   MEMORY to WAL. 
35590 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20   Use mode OFF.  
355a0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69        ** as an i
355b0 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20  ntermediate */. 
355c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
355d0 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
355e0 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f  e(pPager, PAGER_
355f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
35600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
35610 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61     /* Open a tra
35620 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
35630 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52  database file. R
35640 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
35650 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
35660 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61  * mode, this tra
35670 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nsaction always 
35680 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
35690 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a  journal..      *
356a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
356b0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
356c0 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b  Trans(pBt)==0 );
356d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
356e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
356f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35700 42 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28  BtreeSetVersion(
35710 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45  pBt, (eNew==PAGE
35720 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
35730 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20  L ? 2 : 1));.   
35740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
35750 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
35760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
35770 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20 65  */..  if( rc ) e
35780 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e  New = eOld;.  eN
35790 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ew = sqlite3Page
357a0 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
357b0 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a  pPager, eNew);..
357c0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
357d0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
357e0 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
357f0 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Out->z = (char *
35800 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d  )sqlite3JournalM
35810 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20  odename(eNew);. 
35820 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74   pOut->n = sqlit
35830 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d  e3Strlen30(pOut-
35840 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  >z);.  pOut->enc
35850 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
35860 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35870 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74  ngeEncoding(pOut
35880 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69  , encoding);.  i
35890 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
358a0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
358b0 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e  .  break;.};.#en
358c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
358d0 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69  IT_PRAGMA */..#i
358e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
358f0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26  E_OMIT_VACUUM) &
35900 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
35910 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f  E_OMIT_ATTACH)./
35920 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d  * Opcode: Vacuum
35930 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
35940 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74  * Vacuum the ent
35950 69 72 65 20 64 61 74 61 62 61 73 65 20 50 31 2e  ire database P1.
35960 20 20 50 31 20 69 73 20 30 20 66 6f 72 20 22 6d    P1 is 0 for "m
35970 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20 6d  ain", and 2 or m
35980 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 74  ore.** for an at
35990 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
359a0 20 20 54 68 65 20 22 74 65 6d 70 22 20 64 61 74    The "temp" dat
359b0 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65  abase may not be
359c0 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63 61   vacuumed..*/.ca
359d0 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a  se OP_Vacuum: {.
359e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
359f0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63  dOnly==0 );.  rc
35a00 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63   = sqlite3RunVac
35a10 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  uum(&p->zErrMsg,
35a20 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20   db, pOp->p1);. 
35a30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
35a40 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
35a50 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
35a60 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
35a70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
35a80 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70  UTOVACUUM)./* Op
35a90 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d  code: IncrVacuum
35aa0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
35ab0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
35ac0 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20  gle step of the 
35ad0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
35ae0 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a  um procedure on.
35af0 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61  ** the P1 databa
35b00 73 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75  se. If the vacuu
35b10 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  m has finished, 
35b20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
35b30 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72  ion.** P2. Other
35b40 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75  wise, fall throu
35b50 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
35b60 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
35b70 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75  ase OP_IncrVacuu
35b80 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  m: {        /* j
35b90 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ump */.  Btree *
35ba0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
35bb0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
35bc0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
35bd0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
35be0 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
35bf0 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
35c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
35c10 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42  dOnly==0 );.  pB
35c20 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
35c30 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d  >p1].pBt;.  rc =
35c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
35c50 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20  rVacuum(pBt);.  
35c60 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
35c70 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 2c  rc==SQLITE_DONE,
35c80 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  2);.  if( rc ){.
35c90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35ca0 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61  TE_DONE ) goto a
35cb0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
35cc0 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
35cd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
35ce0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
35cf0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
35d00 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78  f../* Opcode: Ex
35d10 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  pire P1 * * * *.
35d20 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63  **.** Cause prec
35d30 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
35d40 74 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20 57  ts to expire.  W
35d50 68 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20 73  hen an expired s
35d60 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65  tatement.** is e
35d70 78 65 63 75 74 65 64 20 75 73 69 6e 67 20 73 71  xecuted using sq
35d80 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 74 20  lite3_step() it 
35d90 77 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74 6f  will either auto
35da0 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65 70  matically.** rep
35db0 72 65 70 61 72 65 20 69 74 73 65 6c 66 20 28 69  repare itself (i
35dc0 66 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61  f it was origina
35dd0 6c 6c 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  lly created usin
35de0 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  g sqlite3_prepar
35df0 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69 74  e_v2()).** or it
35e00 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
35e10 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a  SQLITE_SCHEMA..*
35e20 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30  * .** If P1 is 0
35e30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73  , then all SQL s
35e40 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65  tatements become
35e50 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20   expired. If P1 
35e60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
35e70 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75  then only the cu
35e80 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e  rrently executin
35e90 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65  g statement is e
35ea0 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  xpired..*/.case 
35eb0 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69  OP_Expire: {.  i
35ec0 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  f( !pOp->p1 ){. 
35ed0 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
35ee0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
35ef0 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  ts(db);.  }else{
35f00 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
35f10 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 1;.  }.  break
35f20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
35f30 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
35f40 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  CACHE./* Opcode:
35f50 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32   TableLock P1 P2
35f60 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
35f70 70 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f 6f  psis: iDb=P1 roo
35f80 74 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a 2a  t=P2 write=P3.**
35f90 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63  .** Obtain a loc
35fa0 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  k on a particula
35fb0 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e  r table. This in
35fc0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c  struction is onl
35fd0 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74  y used when.** t
35fe0 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
35ff0 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
36000 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  ed. .**.** P1 is
36010 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
36020 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 73 71  e database in sq
36030 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74  lite3.aDb[] of t
36040 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f  he database.** o
36050 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b  n which the lock
36060 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 20 41   is acquired.  A
36070 20 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74   readlock is obt
36080 61 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f  ained if P3==0 o
36090 72 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63  r.** a write loc
360a0 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a  k if P3==1..**.*
360b0 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68  * P2 contains th
360c0 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74  e root-page of t
360d0 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
360e0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61  ..**.** P4 conta
360f0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
36100 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
36110 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63   table being loc
36120 6b 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  ked. This is onl
36130 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e  y.** used to gen
36140 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
36150 65 73 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f  essage if the lo
36160 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
36170 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ained..*/.case O
36180 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20  P_TableLock: {. 
36190 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 20   u8 isWriteLock 
361a0 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20  = (u8)pOp->p3;. 
361b0 20 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63 6b   if( isWriteLock
361c0 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67   || 0==(db->flag
361d0 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
361e0 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 69 6e  ommit) ){.    in
361f0 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  t p1 = pOp->p1; 
36200 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
36210 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62  =0 && p1<db->nDb
36220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36230 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
36240 72 65 65 4d 61 73 6b 2c 20 70 31 29 20 29 3b 0a  reeMask, p1) );.
36250 20 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72      assert( isWr
36260 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73  iteLock==0 || is
36270 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  WriteLock==1 );.
36280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36290 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64  BtreeLockTable(d
362a0 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20  b->aDb[p1].pBt, 
362b0 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65  pOp->p2, isWrite
362c0 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
362d0 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  c ){.      if( (
362e0 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
362f0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
36300 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
36310 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
36320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36330 65 45 72 72 6f 72 28 70 2c 20 22 64 61 74 61 62  eError(p, "datab
36340 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
36350 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ked: %s", z);.  
36360 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
36370 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
36380 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
36390 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
363a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
363b0 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
363c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
363d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
363e0 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65  E./* Opcode: VBe
363f0 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  gin * * * P4 *.*
36400 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61  *.** P4 may be a
36410 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
36420 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
36430 63 74 75 72 65 2e 20 49 66 20 73 6f 2c 20 63 61  cture. If so, ca
36440 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65 67 69  ll the .** xBegi
36450 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61  n method for tha
36460 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  t table..**.** A
36470 6c 73 6f 2c 20 77 68 65 74 68 65 72 20 6f 72 20  lso, whether or 
36480 6e 6f 74 20 50 34 20 69 73 20 73 65 74 2c 20 63  not P4 is set, c
36490 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
364a0 73 20 6e 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c  s not being call
364b0 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69  ed from.** withi
364c0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  n a callback to 
364d0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
364e0 78 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20  xSync() method. 
364f0 49 66 20 69 74 20 69 73 2c 20 74 68 65 20 65 72  If it is, the er
36500 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  ror.** code will
36510 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
36520 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73  E_LOCKED..*/.cas
36530 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20  e OP_VBegin: {. 
36540 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a   VTable *pVTab;.
36550 20 20 70 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70    pVTab = pOp->p
36560 34 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20  4.pVtab;.  rc = 
36570 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e  sqlite3VtabBegin
36580 28 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 69  (db, pVTab);.  i
36590 66 28 20 70 56 54 61 62 20 29 20 73 71 6c 69 74  f( pVTab ) sqlit
365a0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
365b0 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74  sg(p, pVTab->pVt
365c0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
365d0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
365e0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
365f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
36600 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36610 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
36620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36630 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
36640 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20 50  pcode: VCreate P
36650 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
36660 20 50 32 20 69 73 20 61 20 72 65 67 69 73 74 65   P2 is a registe
36670 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
36680 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75   name of a virtu
36690 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  al table in data
366a0 62 61 73 65 20 0a 2a 2a 20 50 31 2e 20 43 61 6c  base .** P1. Cal
366b0 6c 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65  l the xCreate me
366c0 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61  thod for that ta
366d0 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
366e0 56 43 72 65 61 74 65 3a 20 7b 0a 20 20 4d 65 6d  VCreate: {.  Mem
366f0 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   sMem;          
36700 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74  /* For storing t
36710 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
36720 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  decoded */.  con
36730 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20  st char *zTab;  
36740 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76  /* Name of the v
36750 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
36760 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c  .  memset(&sMem,
36770 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29   0, sizeof(sMem)
36780 29 3b 0a 20 20 73 4d 65 6d 2e 64 62 20 3d 20 64  );.  sMem.db = d
36790 62 3b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20  b;.  /* Because 
367a0 50 32 20 69 73 20 61 6c 77 61 79 73 20 61 20 73  P2 is always a s
367b0 74 61 74 69 63 20 73 74 72 69 6e 67 2c 20 69 74  tatic string, it
367c0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
367d0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  or the.  ** sqli
367e0 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 29  te3VdbeMemCopy()
367f0 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73   to fail */.  as
36800 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d  sert( (aMem[pOp-
36810 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  >p2].flags & MEM
36820 5f 53 74 72 29 21 3d 30 20 29 3b 0a 20 20 61 73  _Str)!=0 );.  as
36830 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d  sert( (aMem[pOp-
36840 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  >p2].flags & MEM
36850 5f 53 74 61 74 69 63 29 21 3d 30 20 29 3b 0a 20  _Static)!=0 );. 
36860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
36870 65 4d 65 6d 43 6f 70 79 28 26 73 4d 65 6d 2c 20  eMemCopy(&sMem, 
36880 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
36890 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
368a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a 54  QLITE_OK );.  zT
368b0 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
368c0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
368d0 74 65 78 74 28 26 73 4d 65 6d 29 3b 0a 20 20 61  text(&sMem);.  a
368e0 73 73 65 72 74 28 20 7a 54 61 62 20 7c 7c 20 64  ssert( zTab || d
368f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36900 29 3b 0a 20 20 69 66 28 20 7a 54 61 62 20 29 7b  );.  if( zTab ){
36910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36920 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28  3VtabCallCreate(
36930 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 7a 54 61  db, pOp->p1, zTa
36940 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  b, &p->zErrMsg);
36950 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
36960 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
36970 65 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  em);.  if( rc ) 
36980 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
36990 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
369a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
369b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
369c0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
369d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
369e0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
369f0 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20  pcode: VDestroy 
36a00 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
36a10 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
36a20 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
36a30 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
36a40 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44  P1.  Call the xD
36a50 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a  estroy method.**
36a60 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a   of that table..
36a70 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74  */.case OP_VDest
36a80 72 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56 44  roy: {.  db->nVD
36a90 65 73 74 72 6f 79 2b 2b 3b 0a 20 20 72 63 20 3d  estroy++;.  rc =
36aa0 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
36ab0 44 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d  Destroy(db, pOp-
36ac0 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
36ad0 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79  .  db->nVDestroy
36ae0 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  --;.  if( rc ) g
36af0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36b00 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
36b10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
36b20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
36b30 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
36b40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
36b50 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
36b60 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a  code: VOpen P1 *
36b70 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
36b80 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36b90 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
36ba0 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69   object, an sqli
36bb0 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
36bc0 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63  re..** P1 is a c
36bd0 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54  ursor number.  T
36be0 68 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73  his opcode opens
36bf0 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
36c00 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
36c10 65 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61  e and stores tha
36c20 74 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a  t cursor in P1..
36c30 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e  */.case OP_VOpen
36c40 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
36c50 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65   *pCur;.  sqlite
36c60 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
36c70 56 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  VCur;.  sqlite3_
36c80 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
36c90 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
36ca0 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20  ule *pModule;.. 
36cb0 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
36cc0 65 61 64 65 72 20 29 3b 0a 20 20 70 43 75 72 20  eader );.  pCur 
36cd0 3d 20 30 3b 0a 20 20 70 56 43 75 72 20 3d 20 30  = 0;.  pVCur = 0
36ce0 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
36cf0 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
36d00 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30  ;.  if( pVtab==0
36d10 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d   || NEVER(pVtab-
36d20 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a  >pModule==0) ){.
36d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36d40 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f  LOCKED;.    goto
36d50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
36d60 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75  ror;.  }.  pModu
36d70 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  le = pVtab->pMod
36d80 75 6c 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  ule;.  rc = pMod
36d90 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62  ule->xOpen(pVtab
36da0 2c 20 26 70 56 43 75 72 29 3b 0a 20 20 73 71 6c  , &pVCur);.  sql
36db0 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
36dc0 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rmsg(p, pVtab);.
36dd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
36de0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
36df0 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  or;..  /* Initia
36e00 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61  lize sqlite3_vta
36e10 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c  b_cursor base cl
36e20 61 73 73 20 2a 2f 0a 20 20 70 56 43 75 72 2d 3e  ass */.  pVCur->
36e30 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a  pVtab = pVtab;..
36e40 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
36e50 76 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65  vdbe cursor obje
36e60 63 74 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61  ct */.  pCur = a
36e70 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
36e80 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c   pOp->p1, 0, -1,
36e90 20 43 55 52 54 59 50 45 5f 56 54 41 42 29 3b 0a   CURTYPE_VTAB);.
36ea0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
36eb0 20 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72    pCur->uc.pVCur
36ec0 20 3d 20 70 56 43 75 72 3b 0a 20 20 20 20 70 56   = pVCur;.    pV
36ed0 74 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tab->nRef++;.  }
36ee0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36ef0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
36f00 65 64 20 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c  ed );.    pModul
36f10 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
36f20 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ;.    goto no_me
36f30 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  m;.  }.  break;.
36f40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
36f50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
36f60 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
36f70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36f80 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
36f90 6f 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20  ode: VFilter P1 
36fa0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
36fb0 6e 6f 70 73 69 73 3a 20 69 70 6c 61 6e 3d 72 5b  nopsis: iplan=r[
36fc0 50 33 5d 20 7a 70 6c 61 6e 3d 27 50 34 27 0a 2a  P3] zplan='P4'.*
36fd0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72  *.** P1 is a cur
36fe0 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  sor opened using
36ff0 20 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61   VOpen.  P2 is a
37000 6e 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  n address to jum
37010 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66  p to if.** the f
37020 69 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73  iltered result s
37030 65 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  et is empty..**.
37040 2a 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20  ** P4 is either 
37050 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67  NULL or a string
37060 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
37070 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
37080 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20  Index.** method 
37090 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20  of the module.  
370a0 54 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69  The interpretati
370b0 6f 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72  on of the P4 str
370c0 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74  ing is left.** t
370d0 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70  o the module imp
370e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
370f0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
37100 6e 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74  nvokes the xFilt
37110 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65  er method on the
37120 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
37130 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50  pecified.** by P
37140 31 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20  1.  The integer 
37150 71 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d  query plan param
37160 65 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20  eter to xFilter 
37170 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
37180 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67  ister.** P3. Reg
37190 69 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65  ister P3+1 store
371a0 73 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d  s the argc param
371b0 65 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65  eter to be passe
371c0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c  d to the.** xFil
371d0 74 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69  ter method. Regi
371e0 73 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31  sters P3+2..P3+1
371f0 2b 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72  +argc are the ar
37200 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  gc.** additional
37210 20 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63   parameters whic
37220 68 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a  h are passed to.
37230 2a 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72  ** xFilter as ar
37240 67 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b  gv. Register P3+
37250 32 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30  2 becomes argv[0
37260 5d 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f  ] when passed to
37270 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   xFilter..**.** 
37280 41 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74  A jump is made t
37290 6f 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75  o P2 if the resu
372a0 6c 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c  lt set after fil
372b0 74 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20  tering would be 
372c0 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  empty..*/.case O
372d0 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f  P_VFilter: {   /
372e0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  * jump */.  int 
372f0 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65  nArg;.  int iQue
37300 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ry;.  const sqli
37310 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
37320 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65  ule;.  Mem *pQue
37330 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63  ry;.  Mem *pArgc
37340 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
37350 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a  _cursor *pVCur;.
37360 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
37370 70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72  pVtab;.  VdbeCur
37380 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
37390 20 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   res;.  int i;. 
373a0 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20   Mem **apArg;.. 
373b0 20 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b   pQuery = &aMem[
373c0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67  pOp->p3];.  pArg
373d0 63 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a  c = &pQuery[1];.
373e0 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73    pCur = p->apCs
373f0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
37400 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
37410 28 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45  (pQuery) );.  RE
37420 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
37430 2d 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20  ->p3, pQuery);. 
37440 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
37450 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
37460 5f 56 54 41 42 20 29 3b 0a 20 20 70 56 43 75 72  _VTAB );.  pVCur
37470 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75   = pCur->uc.pVCu
37480 72 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56 43  r;.  pVtab = pVC
37490 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  ur->pVtab;.  pMo
374a0 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
374b0 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61  odule;..  /* Gra
374c0 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62  b the index numb
374d0 65 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61  er and argc para
374e0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
374f0 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61  rt( (pQuery->fla
37500 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26  gs&MEM_Int)!=0 &
37510 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d  & pArgc->flags==
37520 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72  MEM_Int );.  nAr
37530 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e  g = (int)pArgc->
37540 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20  u.i;.  iQuery = 
37550 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69  (int)pQuery->u.i
37560 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
37570 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
37580 64 20 2a 2f 0a 20 20 72 65 73 20 3d 20 30 3b 0a  d */.  res = 0;.
37590 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41    apArg = p->apA
375a0 72 67 3b 0a 20 20 66 6f 72 28 69 20 3d 20 30 3b  rg;.  for(i = 0;
375b0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
375c0 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70     apArg[i] = &p
375d0 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20  Argc[i+1];.  }. 
375e0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
375f0 46 69 6c 74 65 72 28 70 56 43 75 72 2c 20 69 51  Filter(pVCur, iQ
37600 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  uery, pOp->p4.z,
37610 20 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20   nArg, apArg);. 
37620 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
37630 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
37640 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
37650 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
37660 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20  _error;.  res = 
37670 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56  pModule->xEof(pV
37680 43 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 6e 75  Cur);.  pCur->nu
37690 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 56 64 62  llRow = 0;.  Vdb
376a0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
376b0 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65  !=0,2);.  if( re
376c0 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
376d0 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
376e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
376f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
37700 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
37710 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
37720 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
37730 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32  e: VColumn P1 P2
37740 20 50 33 20 2a 20 50 35 0a 2a 2a 20 53 79 6e 6f   P3 * P5.** Syno
37750 70 73 69 73 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c  psis: r[P3]=vcol
37760 75 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74  umn(P2).**.** St
37770 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  ore in register 
37780 50 33 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  P3 the value of 
37790 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e  the P2-th column
377a0 20 6f 66 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   of.** the curre
377b0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69  nt row of the vi
377c0 72 74 75 61 6c 2d 74 61 62 6c 65 20 6f 66 20 63  rtual-table of c
377d0 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ursor P1..**.** 
377e0 49 66 20 74 68 65 20 56 43 6f 6c 75 6d 6e 20 6f  If the VColumn o
377f0 70 63 6f 64 65 20 69 73 20 62 65 69 6e 67 20 75  pcode is being u
37800 73 65 64 20 74 6f 20 66 65 74 63 68 20 74 68 65  sed to fetch the
37810 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 61 6e 20   value of.** an 
37820 75 6e 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d  unchanging colum
37830 6e 20 64 75 72 69 6e 67 20 61 6e 20 55 50 44 41  n during an UPDA
37840 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68  TE operation, th
37850 65 6e 20 74 68 65 20 50 35 0a 2a 2a 20 76 61 6c  en the P5.** val
37860 75 65 20 69 73 20 31 2e 20 20 4f 74 68 65 72 77  ue is 1.  Otherw
37870 69 73 65 2c 20 50 35 20 69 73 20 30 2e 20 20 54  ise, P5 is 0.  T
37880 68 65 20 50 35 20 76 61 6c 75 65 20 69 73 20 72  he P5 value is r
37890 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 73 71  eturned.** by sq
378a0 6c 69 74 65 33 5f 76 74 61 62 5f 6e 6f 63 68 61  lite3_vtab_nocha
378b0 6e 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  nge() routine ca
378c0 6e 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  n can be used.**
378d0 20 62 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c   by virtual tabl
378e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
378f0 73 20 74 6f 20 72 65 74 75 72 6e 20 73 70 65 63  s to return spec
37900 69 61 6c 20 22 6e 6f 2d 63 68 61 6e 67 65 22 0a  ial "no-change".
37910 2a 2a 20 6d 61 72 6b 73 20 77 68 69 63 68 20 63  ** marks which c
37920 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  an be more effic
37930 69 65 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  ient, depending 
37940 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  on the virtual t
37950 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
37960 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71  _VColumn: {.  sq
37970 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
37980 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
37990 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
379a0 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74  le;.  Mem *pDest
379b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ;.  sqlite3_cont
379c0 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a 20  ext sContext;.. 
379d0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75   VdbeCursor *pCu
379e0 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
379f0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
37a00 20 70 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d   pCur->eCurType=
37a10 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b  =CURTYPE_VTAB );
37a20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
37a30 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
37a40 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
37a50 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
37a60 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Dest = &aMem[pOp
37a70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p3];.  memAbou
37a80 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65  tToChange(p, pDe
37a90 73 74 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  st);.  if( pCur-
37aa0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
37ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
37ac0 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
37ad0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70    break;.  }.  p
37ae0 56 74 61 62 20 3d 20 70 43 75 72 2d 3e 75 63 2e  Vtab = pCur->uc.
37af0 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20  pVCur->pVtab;.  
37b00 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
37b10 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
37b20 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  rt( pModule->xCo
37b30 6c 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74  lumn );.  memset
37b40 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73  (&sContext, 0, s
37b50 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29 29  izeof(sContext))
37b60 3b 0a 20 20 73 43 6f 6e 74 65 78 74 2e 70 4f 75  ;.  sContext.pOu
37b70 74 20 3d 20 70 44 65 73 74 3b 0a 20 20 69 66 28  t = pDest;.  if(
37b80 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20   pOp->p5 ){.    
37b90 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
37ba0 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
37bb0 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d    pDest->flags =
37bc0 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65   MEM_Null|MEM_Ze
37bd0 72 6f 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 75  ro;.    pDest->u
37be0 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 65  .nZero = 0;.  }e
37bf0 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  lse{.    MemSetT
37c00 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d  ypeFlag(pDest, M
37c10 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  EM_Null);.  }.  
37c20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  rc = pModule->xC
37c30 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 75 63 2e 70  olumn(pCur->uc.p
37c40 56 43 75 72 2c 20 26 73 43 6f 6e 74 65 78 74 2c  VCur, &sContext,
37c50 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 73 71 6c   pOp->p2);.  sql
37c60 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
37c70 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rmsg(p, pVtab);.
37c80 20 20 69 66 28 20 73 43 6f 6e 74 65 78 74 2e 69    if( sContext.i
37c90 73 45 72 72 6f 72 3e 30 20 29 7b 0a 20 20 20 20  sError>0 ){.    
37ca0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
37cb0 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  (p, "%s", sqlite
37cc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 44 65  3_value_text(pDe
37cd0 73 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  st));.    rc = s
37ce0 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b  Context.isError;
37cf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
37d00 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
37d10 28 70 44 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67  (pDest, encoding
37d20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
37d30 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
37d40 73 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  st);.  UPDATE_MA
37d50 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
37d60 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
37d70 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
37d80 44 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  Dest) ){.    got
37d90 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
37da0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
37db0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
37dc0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
37dd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
37de0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37df0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37e00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37e10 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
37e20 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a   VNext P1 P2 * *
37e30 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
37e40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50   virtual table P
37e50 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  1 to the next ro
37e60 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20  w in its result 
37e70 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20  set and.** jump 
37e80 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
37e90 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76  2.  Or, if the v
37ea0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73  irtual table has
37eb0 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20   reached.** the 
37ec0 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c  end of its resul
37ed0 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c  t set, then fall
37ee0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
37ef0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
37f00 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65  ..*/.case OP_VNe
37f10 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  xt: {   /* jump 
37f20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
37f30 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
37f40 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
37f50 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74   *pModule;.  int
37f60 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73   res;.  VdbeCurs
37f70 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73  or *pCur;..  res
37f80 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70   = 0;.  pCur = p
37f90 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
37fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
37fb0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
37fc0 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 69 66  YPE_VTAB );.  if
37fd0 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
37fe0 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ){.    break;.  
37ff0 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
38000 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
38010 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
38020 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
38030 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
38040 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a  ->xNext );..  /*
38050 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78   Invoke the xNex
38060 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  t() method of th
38070 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20  e module. There 
38080 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68  is no way for th
38090 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  e.  ** underlyin
380a0 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
380b0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
380c0 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72  ror if one occur
380d0 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e  s during.  ** xN
380e0 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20  ext(). Instead, 
380f0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
38100 72 73 2c 20 74 72 75 65 20 69 73 20 72 65 74 75  rs, true is retu
38110 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67  rned (indicating
38120 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61   that .  ** data
38130 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61   is available) a
38140 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
38150 65 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  e returned when 
38160 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20  xColumn or.  ** 
38170 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f  some other metho
38180 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65  d is next invoke
38190 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69  d on the save vi
381a0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
381b0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  or..  */.  rc = 
381c0 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
381d0 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
381e0 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
381f0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
38200 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
38210 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
38220 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d  o_error;.  res =
38230 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
38240 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
38250 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
38260 6e 28 21 72 65 73 2c 32 29 3b 0a 20 20 69 66 28  n(!res,2);.  if(
38270 20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20   !res ){.    /* 
38280 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
38290 2c 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a  , jump to P2 */.
382a0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
382b0 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f  _p2_and_check_fo
382c0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d  r_interrupt;.  }
382d0 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f  .  goto check_fo
382e0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23  r_interrupt;.}.#
382f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
38300 4f 4d 49 54 5f