/ Hex Artifact Content
Login

Artifact adc8a378710ec2376101483cc8a5f499539ee9bbebfb2a784f3370704d5d44ad:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43  ;.    }.    *(zC
3740: 73 72 2b 2b 29 20 3d 20 63 3b 0a 20 20 20 20 73  sr++) = c;.    s
3750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3760: 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22  100, zCsr, "%d["
3770: 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  , pMem->n);.    
3780: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3790: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
37a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36     for(i=0; i<16
37b0: 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69   && i<pMem->n; i
37c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
37d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
37e0: 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28   zCsr, "%02X", (
37f0: 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20  (int)pMem->z[i] 
3800: 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20  & 0xFF));.      
3810: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3820: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3830: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3840: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
3850: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
3860: 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e   char z = pMem->
3870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[i];.      if( 
3880: 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20  z<32 || z>126 ) 
3890: 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20  *zCsr++ = '.';. 
38a0: 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b       else *zCsr+
38b0: 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  + = z;.    }.   
38c0: 20 2a 28 7a 43 73 72 2b 2b 29 20 3d 20 27 5d 27   *(zCsr++) = ']'
38d0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
38e0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
38f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3900: 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a  (100, zCsr,"+%dz
3910: 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29  ",pMem->u.nZero)
3920: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3940: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
3950: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
3960: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
3970: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
3980: 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66  t j, k;.    zBuf
3990: 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [0] = ' ';.    i
39a0: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29  f( f & MEM_Dyn )
39b0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
39c0: 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'z';.      ass
39d0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
39e0: 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29  tatic|MEM_Ephem)
39f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3a00: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3a10: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42  atic ){.      zB
3a20: 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20  uf[1] = 't';.   
3a30: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3a40: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
3a50: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
3a60: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3a70: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
3a80: 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20  zBuf[1] = 'e';. 
3a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
3aa0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
3ab0: 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Dyn))==0 );.  
3ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3ad0: 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20  Buf[1] = 's';.  
3ae0: 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20    }.    k = 2;. 
3af0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3b00: 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b  ntf(100, &zBuf[k
3b10: 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e  ], "%d", pMem->n
3b20: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3b30: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3b40: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3b50: 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  k++] = '[';.    
3b60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26  for(j=0; j<15 &&
3b70: 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29   j<pMem->n; j++)
3b80: 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20 70  {.      u8 c = p
3b90: 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20  Mem->z[j];.     
3ba0: 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20   if( c>=0x20 && 
3bb0: 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20  c<0x7f ){.      
3bc0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b    zBuf[k++] = c;
3bd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3be0: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
3bf0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = '.';.      }. 
3c00: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b     }.    zBuf[k+
3c10: 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71  +] = ']';.    sq
3c20: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
3c30: 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63  00,&zBuf[k], enc
3c40: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3c50: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3c60: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3c70: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3c80: 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  k++] = 0;.  }.}.
3c90: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
3ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3cb0: 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75  * Print the valu
3cc0: 65 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  e of a register 
3cd0: 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72 70  for tracing purp
3ce0: 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  oses:.*/.static 
3cf0: 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69  void memTracePri
3d00: 6e 74 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66  nt(Mem *p){.  if
3d10: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3d20: 5f 55 6e 64 65 66 69 6e 65 64 20 29 7b 0a 20 20  _Undefined ){.  
3d30: 20 20 70 72 69 6e 74 66 28 22 20 75 6e 64 65 66    printf(" undef
3d40: 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ined");.  }else 
3d50: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3d60: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
3d70: 72 69 6e 74 66 28 22 20 4e 55 4c 4c 22 29 3b 0a  rintf(" NULL");.
3d80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
3d90: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
3da0: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d  |MEM_Str))==(MEM
3db0: 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b  _Int|MEM_Str) ){
3dc0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 73 69  .    printf(" si
3dd0: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
3de0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3df0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
3e00: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
3e10: 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29  i:%lld", p->u.i)
3e20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3e30: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
3e40: 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28  OINT.  }else if(
3e50: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
3e60: 52 65 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e  Real ){.    prin
3e70: 74 66 28 22 20 72 3a 25 67 22 2c 20 70 2d 3e 75  tf(" r:%g", p->u
3e80: 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  .r);.#endif.  }e
3e90: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ea0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b   & MEM_RowSet ){
3eb0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 28 72  .    printf(" (r
3ec0: 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73  owset)");.  }els
3ed0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
3ee0: 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
3ef0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
3f00: 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20  rint(p, zBuf);. 
3f10: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
3f20: 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66   zBuf);.  }.  if
3f30: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3f40: 5f 53 75 62 74 79 70 65 20 29 20 70 72 69 6e 74  _Subtype ) print
3f50: 66 28 22 20 73 75 62 74 79 70 65 3d 30 78 25 30  f(" subtype=0x%0
3f60: 32 78 22 2c 20 70 2d 3e 65 53 75 62 74 79 70 65  2x", p->eSubtype
3f70: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3f80: 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 69   registerTrace(i
3f90: 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29  nt iReg, Mem *p)
3fa0: 7b 0a 20 20 70 72 69 6e 74 66 28 22 52 45 47 5b  {.  printf("REG[
3fb0: 25 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a  %d] = ", iReg);.
3fc0: 20 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28    memTracePrint(
3fd0: 70 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  p);.  printf("\n
3fe0: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
3ff0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
4000: 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nts(p);.}.#endif
4010: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4020: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
4030: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
4040: 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c 61 67 73  ,M) if(db->flags
4050: 26 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63  &SQLITE_VdbeTrac
4060: 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65 28  e)registerTrace(
4070: 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  R,M).#else.#  de
4080: 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52  fine REGISTER_TR
4090: 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a  ACE(R,M).#endif.
40a0: 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ..#ifdef VDBE_PR
40b0: 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77  OFILE../* .** hw
40c0: 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20  time.h contains 
40d0: 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72  inline assembler
40e0: 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d   code for implem
40f0: 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d  enting .** high-
4100: 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69  performance timi
4110: 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a  ng routines..*/.
4120: 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d 65  #include "hwtime
4130: 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .h"..#endif..#if
4140: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
4150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4160: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
4170: 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 61 73  rom within an as
4180: 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
4190: 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20  n. It.** checks 
41a0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
41b0: 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 76 61  .nTransaction va
41c0: 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72 65 63  riable is correc
41d0: 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68  tly set to.** th
41e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  e number of non-
41f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
4200: 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  points currently
4210: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
4220: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
4230: 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53 61 76   at sqlite3.pSav
4240: 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55  epoint..** .** U
4250: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sage:.**.**     
4260: 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76  assert( checkSav
4270: 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20  epointCount(db) 
4280: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  );.*/.static int
4290: 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
42a0: 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ount(sqlite3 *db
42b0: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
42c0: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a    Savepoint *p;.
42d0: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76    for(p=db->pSav
42e0: 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e  epoint; p; p=p->
42f0: 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73  pNext) n++;.  as
4300: 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53  sert( n==(db->nS
4310: 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69  avepoint + db->i
4320: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
4330: 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65 74 75  point) );.  retu
4340: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
4350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4360: 20 72 65 67 69 73 74 65 72 20 6f 66 20 70 4f 70   register of pOp
4370: 2d 3e 70 32 20 61 66 74 65 72 20 66 69 72 73 74  ->p2 after first
4380: 20 70 72 65 70 61 72 69 6e 67 20 69 74 20 74 6f   preparing it to
4390: 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74   be.** overwritt
43a0: 65 6e 20 77 69 74 68 20 61 6e 20 69 6e 74 65 67  en with an integ
43b0: 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  er value..*/.sta
43c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
43d0: 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65  INE Mem *out2Pre
43e0: 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72  releaseWithClear
43f0: 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a 20 20 73  (Mem *pOut){.  s
4400: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
4410: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 70 4f  Null(pOut);.  pO
4420: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
4430: 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  Int;.  return pO
4440: 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20 4d 65 6d  ut;.}.static Mem
4450: 20 2a 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65   *out2Prerelease
4460: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 4f 70  (Vdbe *p, VdbeOp
4470: 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d 20 2a 70   *pOp){.  Mem *p
4480: 4f 75 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Out;.  assert( p
4490: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73  Op->p2>0 );.  as
44a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
44b0: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
44c0: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75  Cursor) );.  pOu
44d0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  t = &p->aMem[pOp
44e0: 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p2];.  memAbou
44f0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
4500: 74 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65  t);.  if( VdbeMe
4510: 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29  mDynamic(pOut) )
4520: 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  { /*OPTIMIZATION
4530: 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
4540: 72 65 74 75 72 6e 20 6f 75 74 32 50 72 65 72 65  return out2Prere
4550: 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72 28 70  leaseWithClear(p
4560: 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
4570: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
4580: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 72 65   MEM_Int;.    re
4590: 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d  turn pOut;.  }.}
45a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
45b0: 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 56 44   as much of a VD
45c0: 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 77 65  BE program as we
45d0: 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73 20 69 73   can..** This is
45e0: 20 74 68 65 20 63 6f 72 65 20 6f 66 20 73 71 6c   the core of sql
45f0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 0a 2a  ite3_step().  .*
4600: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4610: 65 45 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70  eExec(.  Vdbe *p
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
4640: 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61 4f 70 20  */.){.  Op *aOp 
4650: 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20  = p->aOp;       
4660: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d     /* Copy of p-
4670: 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f  >aOp */.  Op *pO
4680: 70 20 3d 20 61 4f 70 3b 20 20 20 20 20 20 20 20  p = aOp;        
4690: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
46a0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  operation */.#if
46b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
46c0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
46d0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
46e0: 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70 3b 20 20    Op *pOrigOp;  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4700: 56 61 6c 75 65 20 6f 66 20 70 4f 70 20 61 74 20  Value of pOp at 
4710: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
4720: 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  oop */.#endif.#i
4730: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4740: 47 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 44 65  G.  int nExtraDe
4750: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  lete = 0;      /
4760: 2a 20 56 65 72 69 66 69 65 73 20 46 4f 52 44 45  * Verifies FORDE
4770: 4c 45 54 45 20 61 6e 64 20 41 55 58 44 45 4c 45  LETE and AUXDELE
4780: 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23 65 6e 64  TE flags */.#end
4790: 69 66 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  if.  int rc = SQ
47a0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
47b0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
47c0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rn */.  sqlite3 
47d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
47e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
47f0: 73 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74  se */.  u8 reset
4800: 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
4810: 30 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65  0; /* Reset sche
4820: 6d 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ma after an erro
4830: 72 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  r if positive */
4840: 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d  .  u8 encoding =
4850: 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a   ENC(db);     /*
4860: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
4870: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
4880: 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 20 20  iCompare = 0;   
4890: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
48a0: 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70 61 72 69   of last compari
48b0: 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  son */.  unsigne
48c0: 64 20 6e 56 6d 53 74 65 70 20 3d 20 30 3b 20 20  d nVmStep = 0;  
48d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
48e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
48f0: 20 73 74 65 70 73 20 2a 2f 0a 23 69 66 6e 64 65   steps */.#ifnde
4900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
4910: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
4920: 20 20 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67    unsigned nProg
4930: 72 65 73 73 4c 69 6d 69 74 3b 20 20 20 2f 2a 20  ressLimit;   /* 
4940: 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72 65 73 73  Invoke xProgress
4950: 28 29 20 77 68 65 6e 20 6e 56 6d 53 74 65 70 20  () when nVmStep 
4960: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
4970: 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d  #endif.  Mem *aM
4980: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20  em = p->aMem;   
4990: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
49a0: 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20  ->aMem */.  Mem 
49b0: 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20 20 20 20  *pIn1 = 0;      
49c0: 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 69 6e         /* 1st in
49d0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
49e0: 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20   Mem *pIn2 = 0; 
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
4a00: 6e 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  nd input operand
4a10: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20   */.  Mem *pIn3 
4a20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
4a30: 20 2f 2a 20 33 72 64 20 69 6e 70 75 74 20 6f 70   /* 3rd input op
4a40: 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erand */.  Mem *
4a50: 70 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pOut = 0;       
4a60: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
4a70: 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69 66 64 65  operand */.#ifde
4a80: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4a90: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4ab0: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
4ac0: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
4ad0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  e */.#endif.  /*
4ae0: 2a 2a 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20  ** INSERT STACK 
4af0: 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a  UNION HERE ***/.
4b00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4b10: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4b20: 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74  RUN );  /* sqlit
4b30: 65 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69  e3_step() verifi
4b40: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c  es this */.  sql
4b50: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
4b60: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
4b70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
4b80: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
4b90: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
4ba0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
4bb0: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
4bc0: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
4bd0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
4be0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
4bf0: 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e  .  */.    goto n
4c00: 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73  o_mem;.  }.  ass
4c10: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
4c20: 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
4c30: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xff)==SQLITE_BU
4c40: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
4c50: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 7c 7c 20  p->bIsReader || 
4c60: 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29  p->readOnly!=0 )
4c70: 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  ;.  p->iCurrentT
4c80: 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ime = 0;.  asser
4c90: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  t( p->explain==0
4ca0: 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   );.  p->pResult
4cb0: 53 65 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  Set = 0;.  db->b
4cc0: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
4cd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = 0;.  if( db->
4ce0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
4cf0: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
4d00: 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a  e_to_interrupt;.
4d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54    sqlite3VdbeIOT
4d20: 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e  raceSql(p);.#ifn
4d30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4d40: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
4d50: 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  K.  if( db->xPro
4d60: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 75 33 32  gress ){.    u32
4d70: 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f   iPrior = p->aCo
4d80: 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
4d90: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d  TSTATUS_VM_STEP]
4da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  ;.    assert( 0 
4db0: 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f  < db->nProgressO
4dc0: 70 73 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72  ps );.    nProgr
4dd0: 65 73 73 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e  essLimit = db->n
4de0: 50 72 6f 67 72 65 73 73 4f 70 73 20 2d 20 28 69  ProgressOps - (i
4df0: 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f  Prior % db->nPro
4e00: 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 7d 65 6c  gressOps);.  }el
4e10: 73 65 7b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73  se{.    nProgres
4e20: 73 4c 69 6d 69 74 20 3d 20 30 78 66 66 66 66 66  sLimit = 0xfffff
4e30: 66 66 66 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  fff;.  }.#endif.
4e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4e50: 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67  BUG.  sqlite3Beg
4e60: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
4e70: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30  ;.  if( p->pc==0
4e80: 0a 20 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e 66  .   && (p->db->f
4e90: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 56  lags & (SQLITE_V
4ea0: 64 62 65 4c 69 73 74 69 6e 67 7c 53 51 4c 49 54  dbeListing|SQLIT
4eb0: 45 5f 56 64 62 65 45 51 50 7c 53 51 4c 49 54 45  E_VdbeEQP|SQLITE
4ec0: 5f 56 64 62 65 54 72 61 63 65 29 29 21 3d 30 0a  _VdbeTrace))!=0.
4ed0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
4ee0: 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
4ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f00: 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20  ePrintSql(p);.  
4f10: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
4f20: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
4f30: 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20 20 20 20  Listing ){.     
4f40: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
4f50: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
4f60: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
4f70: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
4f80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4f90: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
4fa0: 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d  dout, i, &aOp[i]
4fb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4fc0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
4fd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4fe0: 64 62 65 45 51 50 20 29 7b 0a 20 20 20 20 20 20  dbeEQP ){.      
4ff0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5000: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
5010: 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f   if( aOp[i].opco
5020: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
5030: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5040: 6f 6e 63 65 20 29 20 70 72 69 6e 74 66 28 22 56  once ) printf("V
5050: 44 42 45 20 51 75 65 72 79 20 50 6c 61 6e 3a 5c  DBE Query Plan:\
5060: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n");.          p
5070: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 4f  rintf("%s\n", aO
5080: 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20 20 20 20  p[i].p4.z);.    
5090: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
50a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
50b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
50c0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
50d0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 20  QLITE_VdbeTrace 
50e0: 29 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20  )  printf("VDBE 
50f0: 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 7d 0a  Trace:\n");.  }.
5100: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
5110: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64  gnMalloc();.#end
5120: 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f  if.  for(pOp=&aO
5130: 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20 70 4f 70  p[p->pc]; 1; pOp
5140: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45 72 72 6f  ++){.    /* Erro
5150: 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  rs are detected 
5160: 62 79 20 69 6e 64 69 76 69 64 75 61 6c 20 6f 70  by individual op
5170: 63 6f 64 65 73 2c 20 77 69 74 68 20 61 6e 20 69  codes, with an i
5180: 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20  mmediate.    ** 
5190: 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72 74 5f 64  jumps to abort_d
51a0: 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20 2a 2f 0a  ue_to_error. */.
51b0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
51c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
51d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 3d 61    assert( pOp>=a
51e0: 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f 70 5b 70  Op && pOp<&aOp[p
51f0: 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64 65 66 20  ->nOp]);.#ifdef 
5200: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
5210: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
5220: 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66  Hwtime();.#endif
5230: 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a  .    nVmStep++;.
5240: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5250: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
5260: 41 54 55 53 0a 20 20 20 20 69 66 28 20 70 2d 3e  ATUS.    if( p->
5270: 61 6e 45 78 65 63 20 29 20 70 2d 3e 61 6e 45 78  anExec ) p->anEx
5280: 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70  ec[(int)(pOp-aOp
5290: 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )]++;.#endif..  
52a0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
52b0: 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49 54  tracing if SQLIT
52c0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
52d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65  ed..    */.#ifde
52e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
52f0: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
5300: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
5310: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ace ){.      sql
5320: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
5330: 73 74 64 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f  stdout, (int)(pO
5340: 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a  p - aOp), pOp);.
5350: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5360: 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63     ..    /* Chec
5370: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
5380: 65 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  eed to simulate 
5390: 61 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54  an interrupt.  T
53a0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
53b0: 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61  .    ** if we ha
53c0: 76 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73  ve a special tes
53d0: 74 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a  t build..    */.
53e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
53f0: 53 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ST.    if( sqlit
5400: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
5410: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  nt>0 ){.      sq
5420: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
5430: 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69  count--;.      i
5440: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  f( sqlite3_inter
5450: 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b  rupt_count==0 ){
5460: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5470: 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a  _interrupt(db);.
5480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
5490: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e  ndif..    /* San
54a0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
54b0: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20 2a  other operands *
54c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
54d0: 44 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20 20  DEBUG.    {.    
54e0: 20 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79 20    u8 opProperty 
54f0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
5500: 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63  roperty[pOp->opc
5510: 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ode];.      if( 
5520: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
5530: 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20  FLG_IN1)!=0 ){. 
5540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5550: 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20  Op->p1>0 );.    
5560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5570: 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p1<=(p->nMem+1 
5580: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5590: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
55a0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
55b0: 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20  m[pOp->p1]) );. 
55c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
55d0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
55e0: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
55f0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
5600: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
5610: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
5620: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b  &aMem[pOp->p1]);
5630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5640: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5650: 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29   OPFLG_IN2)!=0 )
5660: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5670: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
5680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5690: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p2<=(p->nMem
56a0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
56b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
56c0: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
56d0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29  aMem[pOp->p2]) )
56e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
56f0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
5700: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
5710: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20  &aMem[pOp->p2]) 
5720: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
5730: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
5740: 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  2, &aMem[pOp->p2
5750: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5760: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5770: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d  y & OPFLG_IN3)!=
5780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
5790: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
57a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
57b0: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
57c0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
57d0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  or) );.        a
57e0: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
57f0: 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  d(&aMem[pOp->p3]
5800: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
5810: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
5820: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
5830: 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  ts(&aMem[pOp->p3
5840: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ]) );.        RE
5850: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
5860: 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p3, &aMem[pOp-
5870: 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p3]);.      }. 
5880: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
5890: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54  erty & OPFLG_OUT
58a0: 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)!=0 ){.       
58b0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
58c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
58d0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
58e0: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
58f0: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
5900: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5910: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
5920: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ->p2]);.      }.
5930: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
5940: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55  perty & OPFLG_OU
5950: 54 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T3)!=0 ){.      
5960: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5970: 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  3>0 );.        a
5980: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
5990: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
59a0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
59b0: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
59c0: 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f  ange(p, &aMem[pO
59d0: 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p3]);.      }
59e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
59f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5a00: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
5a10: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
5a20: 0a 20 20 20 20 70 4f 72 69 67 4f 70 20 3d 20 70  .    pOrigOp = p
5a30: 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  Op;.#endif.  .  
5a40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
5a50: 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a  pcode ){../*****
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74  ********.** What
5ab0: 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61   follows is a ma
5ac0: 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61  ssive switch sta
5ad0: 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63  tement where eac
5ae0: 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74  h case implement
5af0: 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  s a.** separate 
5b00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  instruction in t
5b10: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
5b20: 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f  ne.  If we follo
5b30: 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69  w the usual.** i
5b40: 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65  ndentation conve
5b50: 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73  ntions, each cas
5b60: 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
5b70: 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73  nted by 6 spaces
5b80: 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69  .  But.** that i
5b90: 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65  s a lot of waste
5ba0: 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c  d space on the l
5bb0: 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20  eft margin.  So 
5bc0: 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a  the code within.
5bd0: 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74  ** the switch st
5be0: 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65  atement will bre
5bf0: 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69  ak with conventi
5c00: 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d  on and be flush-
5c10: 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a  left. Another.**
5c20: 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69   big comment (si
5c30: 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e  milar to this on
5c40: 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65  e) will mark the
5c50: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
5c60: 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74  de where.** we t
5c70: 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74  ransition back t
5c80: 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61  o normal indenta
5c90: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5ca0: 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61  formatting of ea
5cb0: 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72  ch case is impor
5cc0: 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66  tant.  The makef
5cd0: 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a  ile for SQLite.*
5ce0: 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  * generates two 
5cf0: 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73  C files "opcodes
5d00: 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73  .h" and "opcodes
5d10: 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .c" by scanning 
5d20: 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f  this.** file loo
5d30: 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74  king for lines t
5d40: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
5d50: 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20  case OP_".  The 
5d60: 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a  opcodes.h files.
5d70: 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65  ** will be fille
5d80: 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20  d with #defines 
5d90: 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65  that give unique
5da0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
5db0: 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64  to each.** opcod
5dc0: 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  e and the opcode
5dd0: 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c  s.c file is fill
5de0: 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79  ed with an array
5df0: 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72   of strings wher
5e00: 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67  e.** each string
5e10: 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63   is the symbolic
5e20: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
5e30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f  rresponding opco
5e40: 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  de.  If the.** c
5e50: 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ase statement is
5e60: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
5e70: 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  omment of the fo
5e80: 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e  rm "/# same as .
5e90: 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63  .. #/".** that c
5ea0: 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  omment is used t
5eb0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
5ec0: 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
5ed0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a   of the opcode..
5ee0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77  **.** Other keyw
5ef0: 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ords in the comm
5f00: 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ent that follows
5f10: 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75   each case are u
5f20: 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72  sed to.** constr
5f30: 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e  uct the OPFLG_IN
5f40: 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20  ITIALIZER value 
5f50: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
5f60: 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b   opcodeProperty[
5f70: 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69  ]..** Keywords i
5f80: 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32  nclude: in1, in2
5f90: 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74  , in3, out2, out
5fa0: 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d  3.  See.** the m
5fb0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
5fc0: 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ipt for addition
5fd0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
5fe0: 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74  **.** Documentat
5ff0: 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20 6f  ion about VDBE o
6000: 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72 61  pcodes is genera
6010: 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  ted by scanning 
6020: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72  this file.** for
6030: 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20 63   lines of that c
6040: 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22  ontain "Opcode:"
6050: 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e 64  .  That line and
6060: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
6070: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73  ** comment lines
6080: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
6090: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
60a0: 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64  he opcode.html d
60b0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  ocumentation.** 
60c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d  file..**.** SUMM
60d0: 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46  ARY:.**.**     F
60e0: 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d 70  ormatting is imp
60f0: 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70 74  ortant to script
6100: 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69 73  s that scan this
6110: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f   file..**     Do
6120: 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 6f   not deviate fro
6130: 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e 67  m the formatting
6140: 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c 79   style currently
6150: 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a   in use..**.****
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f  *********/../* O
61b0: 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50  pcode:  Goto * P
61c0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e  2 * * *.**.** An
61d0: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
61e0: 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50  ump to address P
61f0: 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 69  2..** The next i
6200: 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75  nstruction execu
6210: 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  ted will be .** 
6220: 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65 78  the one at index
6230: 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65 67   P2 from the beg
6240: 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
6250: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
6260: 54 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  The P1 parameter
6270: 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
6280: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70   used by this op
6290: 63 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  code.  However, 
62a0: 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d  it.** is sometim
62b0: 65 73 20 73 65 74 20 74 6f 20 31 20 69 6e 73 74  es set to 1 inst
62c0: 65 61 64 20 6f 66 20 30 20 61 73 20 61 20 68 69  ead of 0 as a hi
62d0: 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e  nt to the comman
62e0: 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20  d-line shell.** 
62f0: 74 68 61 74 20 74 68 69 73 20 47 6f 74 6f 20 69  that this Goto i
6300: 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  s the bottom of 
6310: 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68 61 74 20  a loop and that 
6320: 74 68 65 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50  the lines from P
6330: 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65  2 down.** to the
6340: 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 73 68   current line sh
6350: 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
6360: 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 75 74   for EXPLAIN out
6370: 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  put..*/.case OP_
6380: 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Goto: {         
6390: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a      /* jump */.j
63a0: 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68  ump_to_p2_and_ch
63b0: 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
63c0: 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  t:.  pOp = &aOp[
63d0: 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20  pOp->p2 - 1];.. 
63e0: 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61 74   /* Opcodes that
63f0: 20 61 72 65 20 75 73 65 64 20 61 73 20 74 68 65   are used as the
6400: 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f   bottom of a loo
6410: 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50  p (OP_Next, OP_P
6420: 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65  rev,.  ** OP_VNe
6430: 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72  xt, or OP_Sorter
6440: 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68  Next) all jump h
6450: 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f  ere upon.  ** co
6460: 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b  mpletion.  Check
6470: 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c 69 74   to see if sqlit
6480: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20 68  e3_interrupt() h
6490: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20  as been called. 
64a0: 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 72   ** or if the pr
64b0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
64c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 76 6f  needs to be invo
64d0: 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ked. .  **.  ** 
64e0: 54 68 69 73 20 63 6f 64 65 20 75 73 65 73 20 75  This code uses u
64f0: 6e 73 74 72 75 63 74 75 72 65 64 20 22 67 6f 74  nstructured "got
6500: 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  o" statements an
6510: 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20  d does not look 
6520: 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20  clean..  ** But 
6530: 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75 65 20  that is not due 
6540: 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67  to sloppy coding
6550: 20 68 61 62 69 74 73 2e 20 54 68 65 20 63 6f 64   habits. The cod
6560: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 68 69  e is written thi
6570: 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72 20 70  s.  ** way for p
6580: 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61  erformance, to a
6590: 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 72  void having to r
65a0: 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  un the interrupt
65b0: 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a 20 20   and progress.  
65c0: 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65 76 65  ** checks on eve
65d0: 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ry opcode.  This
65e0: 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33 5f 73   helps sqlite3_s
65f0: 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61 62 6f  tep() to run abo
6600: 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73  ut 1.5%.  ** fas
6610: 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ter according to
6620: 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f   "valgrind --too
6630: 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20 2a 2f  l=cachegrind" */
6640: 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  .check_for_inter
6650: 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e  rupt:.  if( db->
6660: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
6670: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
6680: 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a  e_to_interrupt;.
6690: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
66a0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
66b0: 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20  LBACK.  /* Call 
66c0: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
66d0: 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20 63  lback if it is c
66e0: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74 68  onfigured and th
66f0: 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65  e required numbe
6700: 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f  r.  ** of VDBE o
6710: 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78 65  ps have been exe
6720: 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73 69  cuted (either si
6730: 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74  nce this invocat
6740: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69  ion of.  ** sqli
6750: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 6f 72  te3VdbeExec() or
6760: 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65   since last time
6770: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
6780: 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65  llback was calle
6790: 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  d)..  ** If the 
67a0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
67b0: 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
67c0: 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76 69 72  ro, exit the vir
67d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77 69 74  tual machine wit
67e0: 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20  h.  ** a return 
67f0: 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  code SQLITE_ABOR
6800: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56  T..  */.  if( nV
6810: 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73  mStep>=nProgress
6820: 4c 69 6d 69 74 20 26 26 20 64 62 2d 3e 78 50 72  Limit && db->xPr
6830: 6f 67 72 65 73 73 21 3d 30 20 29 7b 0a 20 20 20  ogress!=0 ){.   
6840: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 50 72   assert( db->nPr
6850: 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a  ogressOps!=0 );.
6860: 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d      nProgressLim
6870: 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64  it = nVmStep + d
6880: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
6890: 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e  - (nVmStep%db->n
68a0: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
68b0: 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72    if( db->xProgr
68c0: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
68d0: 73 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sArg) ){.      r
68e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
68f0: 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
6900: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
6910: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6920: 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65 61 6b  endif.  .  break
6930: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
6940: 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20 2a   Gosub P1 P2 * *
6950: 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
6960: 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72 65  he current addre
6970: 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65 72  ss onto register
6980: 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20   P1.** and then 
6990: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
69a0: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  P2..*/.case OP_G
69b0: 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20 20  osub: {         
69c0: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
69d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
69e0: 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70  0 && pOp->p1<=(p
69f0: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
6a00: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31  ursor) );.  pIn1
6a10: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6a20: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64 62  ];.  assert( Vdb
6a30: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31  eMemDynamic(pIn1
6a40: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f  )==0 );.  memAbo
6a50: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
6a60: 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  n1);.  pIn1->fla
6a70: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6a80: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
6a90: 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45  )(pOp-aOp);.  RE
6aa0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
6ab0: 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20  ->p1, pIn1);..  
6ac0: 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65  /* Most jump ope
6ad0: 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74  rations do a got
6ae0: 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74 20 69  o to this spot i
6af0: 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74  n order to updat
6b00: 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70 20 70  e.  ** the pOp p
6b10: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f  ointer. */.jump_
6b20: 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26  to_p2:.  pOp = &
6b30: 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d  aOp[pOp->p2 - 1]
6b40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6b50: 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e   Opcode:  Return
6b60: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
6b70: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * Jump to the ne
6b80: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  xt instruction a
6b90: 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73  fter the address
6ba0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6bb0: 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a    After.** the j
6bc0: 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50 31  ump, register P1
6bd0: 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e   becomes undefin
6be0: 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ed..*/.case OP_R
6bf0: 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20  eturn: {        
6c00: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70     /* in1 */.  p
6c10: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
6c20: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
6c30: 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  pIn1->flags==MEM
6c40: 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20  _Int );.  pOp = 
6c50: 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b  &aOp[pIn1->u.i];
6c60: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6c70: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
6c80: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6c90: 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75  pcode: InitCorou
6ca0: 74 69 6e 65 20 50 31 20 50 32 20 50 33 20 2a 20  tine P1 P2 P3 * 
6cb0: 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72  *.**.** Set up r
6cc0: 65 67 69 73 74 65 72 20 50 31 20 73 6f 20 74 68  egister P1 so th
6cd0: 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65 6c 64  at it will Yield
6ce0: 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   to the coroutin
6cf0: 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74 20  e.** located at 
6d00: 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a  address P3..**.*
6d10: 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65 6e 20  * If P2!=0 then 
6d20: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  the coroutine im
6d30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d  plementation imm
6d40: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
6d50: 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  .** this opcode.
6d60: 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74    So jump over t
6d70: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70  he coroutine imp
6d80: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a  lementation to.*
6d90: 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  * address P2..**
6da0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e  .** See also: En
6db0: 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61  dCoroutine.*/.ca
6dc0: 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  se OP_InitCorout
6dd0: 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75  ine: {     /* ju
6de0: 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
6df0: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f  pOp->p1>0 &&  pO
6e00: 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
6e10: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
6e20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
6e30: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p2>=0 && pOp->
6e40: 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61  p2<p->nOp );.  a
6e50: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d  ssert( pOp->p3>=
6e60: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e  0 && pOp->p3<p->
6e70: 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  nOp );.  pOut = 
6e80: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6e90: 20 20 61 73 73 65 72 74 28 20 21 56 64 62 65 4d    assert( !VdbeM
6ea0: 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20  emDynamic(pOut) 
6eb0: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
6ec0: 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20   pOp->p3 - 1;.  
6ed0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
6ee0: 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70  M_Int;.  if( pOp
6ef0: 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ->p2 ) goto jump
6f00: 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
6f10: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
6f20: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50 31 20  EndCoroutine P1 
6f30: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
6f40: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
6f50: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e 20   the address in 
6f60: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 61  register P1 is a
6f70: 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20   Yield..** Jump 
6f80: 74 6f 20 74 68 65 20 50 32 20 70 61 72 61 6d 65  to the P2 parame
6f90: 74 65 72 20 6f 66 20 74 68 61 74 20 59 69 65 6c  ter of that Yiel
6fa0: 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  d..** After the 
6fb0: 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50  jump, register P
6fc0: 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69  1 becomes undefi
6fd0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ned..**.** See a
6fe0: 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69  lso: InitCorouti
6ff0: 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e  ne.*/.case OP_En
7000: 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20  dCoroutine: {   
7010: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
7020: 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43 61 6c  /.  VdbeOp *pCal
7030: 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  ler;.  pIn1 = &a
7040: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
7050: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
7060: 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
7070: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
7080: 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e  u.i>=0 && pIn1->
7090: 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  u.i<p->nOp );.  
70a0: 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70  pCaller = &aOp[p
70b0: 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73  In1->u.i];.  ass
70c0: 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70  ert( pCaller->op
70d0: 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29  code==OP_Yield )
70e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 6c  ;.  assert( pCal
70f0: 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43  ler->p2>=0 && pC
7100: 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  aller->p2<p->nOp
7110: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70   );.  pOp = &aOp
7120: 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31  [pCaller->p2 - 1
7130: 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ];.  pIn1->flags
7140: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
7150: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7160: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
7170: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
7180: 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72  * Swap the progr
7190: 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20  am counter with 
71a0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
71b0: 69 73 74 65 72 20 50 31 2e 20 20 54 68 69 73 0a  ister P1.  This.
71c0: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
71d0: 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20 74 6f  t of yielding to
71e0: 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a   a coroutine..**
71f0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72 6f 75  .** If the corou
7200: 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c 61 75  tine that is lau
7210: 6e 63 68 65 64 20 62 79 20 74 68 69 73 20 69 6e  nched by this in
7220: 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 77  struction ends w
7230: 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20  ith.** Yield or 
7240: 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74  Return then cont
7250: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
7260: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42   instruction.  B
7270: 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72  ut if.** the cor
7280: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 64 20  outine launched 
7290: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  by this instruct
72a0: 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a  ion ends with.**
72b0: 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74   EndCoroutine, t
72c0: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20 72  hen jump to P2 r
72d0: 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  ather than conti
72e0: 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a  nuing with the.*
72f0: 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  * next instructi
7300: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
7310: 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  so: InitCoroutin
7320: 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65  e.*/.case OP_Yie
7330: 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ld: {           
7340: 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f   /* in1, jump */
7350: 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20  .  int pcDest;. 
7360: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
7370: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
7380: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
7390: 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70  (pIn1)==0 );.  p
73a0: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  In1->flags = MEM
73b0: 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d  _Int;.  pcDest =
73c0: 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b   (int)pIn1->u.i;
73d0: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28  .  pIn1->u.i = (
73e0: 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
73f0: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
7400: 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29  E(pOp->p1, pIn1)
7410: 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  ;.  pOp = &aOp[p
7420: 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b  cDest];.  break;
7430: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
7440: 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50  HaltIfNull  P1 P
7450: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
7460: 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d  nopsis: if r[P3]
7470: 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a  =null halt.**.**
7480: 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
7490: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
74a0: 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c 4c 20    If it is NULL 
74b0: 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a  then Halt using.
74c0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c  ** parameter P1,
74d0: 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69   P2, and P4 as i
74e0: 66 20 74 68 69 73 20 77 65 72 65 20 61 20 48 61  f this were a Ha
74f0: 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  lt instruction. 
7500: 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   If the.** value
7510: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
7520: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
7530: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7540: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  s a no-op..** Th
7550: 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 73  e P5 parameter s
7560: 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63  hould be 1..*/.c
7570: 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  ase OP_HaltIfNul
7580: 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33  l: {      /* in3
7590: 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   */.  pIn3 = &aM
75a0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
75b0: 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
75c0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
75d0: 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c   break;.  /* Fal
75e0: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
75f0: 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20  P_Halt */.}../* 
7600: 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31  Opcode:  Halt P1
7610: 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a   P2 * P4 P5.**.*
7620: 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65  * Exit immediate
7630: 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75  ly.  All open cu
7640: 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63  rsors, etc are c
7650: 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  losed.** automat
7660: 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31  ically..**.** P1
7670: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
7680: 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
7690: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20  sqlite3_exec(), 
76a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c  sqlite3_reset(),
76b0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66  .** or sqlite3_f
76c0: 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20  inalize().  For 
76d0: 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74  a normal halt, t
76e0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51  his should be SQ
76f0: 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20  LITE_OK (0)..** 
7700: 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63  For errors, it c
7710: 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72  an be some other
7720: 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d   value.  If P1!=
7730: 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64  0 then P2 will d
7740: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
7750: 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f  her or not to ro
7760: 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  llback the curre
7770: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
7780: 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b   Do not rollback
7790: 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61  .** if P2==OE_Fa
77a0: 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62  il. Do the rollb
77b0: 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f  ack if P2==OE_Ro
77c0: 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d  llback.  If P2==
77d0: 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65  OE_Abort,.** the
77e0: 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63  n back out all c
77f0: 68 61 6e 67 65 73 20 74 68 61 74 20 68 61 76 65  hanges that have
7800: 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67   occurred during
7810: 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20   this execution 
7820: 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20  of the.** VDBE, 
7830: 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62  but do not rollb
7840: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
7850: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ion. .**.** If P
7860: 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68  4 is not null th
7870: 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f  en it is an erro
7880: 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
7890: 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 61 20  ..**.** P5 is a 
78a0: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20  value between 0 
78b0: 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69 76 65  and 4, inclusive
78c0: 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  , that modifies 
78d0: 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a  the P4 string..*
78e0: 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e 6f 20  *.**    0:  (no 
78f0: 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20 31 3a  change).**    1:
7900: 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74 72    NOT NULL contr
7910: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a  aint failed: P4.
7920: 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51 55 45  **    2:  UNIQUE
7930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
7940: 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33 3a 20  ed: P4.**    3: 
7950: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
7960: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20  t failed: P4.** 
7970: 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e 20 4b     4:  FOREIGN K
7980: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
7990: 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20 49  iled: P4.**.** I
79a0: 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P5 is not zero
79b0: 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c 4c 2c   and P4 is NULL,
79c0: 20 74 68 65 6e 20 65 76 65 72 79 74 68 69 6e 67   then everything
79d0: 20 61 66 74 65 72 20 74 68 65 20 22 3a 22 20 69   after the ":" i
79e0: 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a  s.** omitted..**
79f0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
7a00: 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20  implied "Halt 0 
7a10: 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  0 0" instruction
7a20: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
7a30: 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20   very end of.** 
7a40: 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20  every program.  
7a50: 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74  So a jump past t
7a60: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
7a70: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
7a80: 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  am.** is the sam
7a90: 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48  e as executing H
7aa0: 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
7ab0: 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65 46 72  Halt: {.  VdbeFr
7ac0: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
7ad0: 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78 20 3d  nt pcx;..  pcx =
7ae0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
7af0: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
7b00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
7b10: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
7b20: 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d  /* Halt the sub-
7b30: 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20  program. Return 
7b40: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70  control to the p
7b50: 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a  arent frame. */.
7b60: 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e      pFrame = p->
7b70: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  pFrame;.    p->p
7b80: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e  Frame = pFrame->
7b90: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e  pParent;.    p->
7ba0: 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71  nFrame--;.    sq
7bb0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
7bc0: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
7bd0: 67 65 29 3b 0a 20 20 20 20 70 63 78 20 3d 20 73  ge);.    pcx = s
7be0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
7bf0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
7c00: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
7c10: 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
7c20: 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
7c30: 6f 6e 20 70 63 78 20 69 73 20 74 68 65 20 4f 50  on pcx is the OP
7c40: 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e  _Program that in
7c50: 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72  voked the sub-pr
7c60: 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ogram .      ** 
7c70: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
7c80: 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70  halted. If the p
7c90: 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66  2 instruction of
7ca0: 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20   this OP_Halt.  
7cb0: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
7cc0: 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f  on is set to OE_
7cd0: 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65  Ignore, then the
7ce0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
7cf0: 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  throwing.      *
7d00: 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65  * an IGNORE exce
7d10: 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ption. In this c
7d20: 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  ase jump to the 
7d30: 61 64 64 72 65 73 73 20 73 70 65 63 69 66 69 65  address specifie
7d40: 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68  d.      ** as th
7d50: 65 20 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c  e p2 of the call
7d60: 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20  ing OP_Program. 
7d70: 20 2a 2f 0a 20 20 20 20 20 20 70 63 78 20 3d 20   */.      pcx = 
7d80: 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31  p->aOp[pcx].p2-1
7d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 70 20  ;.    }.    aOp 
7da0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d  = p->aOp;.    aM
7db0: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20  em = p->aMem;.  
7dc0: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78    pOp = &aOp[pcx
7dd0: 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
7de0: 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d  }.  p->rc = pOp-
7df0: 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  >p1;.  p->errorA
7e00: 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d  ction = (u8)pOp-
7e10: 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70  >p2;.  p->pc = p
7e20: 63 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  cx;.  assert( pO
7e30: 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20 69 66  p->p5<=4 );.  if
7e40: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69  ( p->rc ){.    i
7e50: 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
7e60: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7e70: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
7e80: 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20  Type[] = { "NOT 
7e90: 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c  NULL", "UNIQUE",
7ea0: 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20 20 20   "CHECK",.      
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 20 20 20 22 46 4f 52 45 49 47 4e 20         "FOREIGN 
7ee0: 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20 74 65  KEY" };.      te
7ef0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d  stcase( pOp->p5=
7f00: 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
7f10: 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 32  case( pOp->p5==2
7f20: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f30: 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33 20 29  se( pOp->p5==3 )
7f40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7f50: 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b 0a  ( pOp->p5==4 );.
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20 63 6f  eError(p, "%s co
7f80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7f90: 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e 70 35  , azType[pOp->p5
7fa0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1]);.      if( 
7fb0: 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
7fc0: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
7fd0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7fe0: 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c 20 70  (db, "%z: %s", p
7ff0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e  ->zErrMsg, pOp->
8000: 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p4.z);.      }. 
8010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8020: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
8030: 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  (p, "%s", pOp->p
8040: 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  4.z);.    }.    
8050: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d  sqlite3_log(pOp-
8060: 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25  >p1, "abort at %
8070: 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20  d in [%s]: %s", 
8080: 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d  pcx, p->zSql, p-
8090: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  >zErrMsg);.  }. 
80a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
80b0: 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65  eHalt(p);.  asse
80c0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  rt( rc==SQLITE_B
80d0: 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
80e0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
80f0: 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
8100: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
8110: 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  Y ){.    p->rc =
8120: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8130: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8140: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8150: 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
8160: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
8170: 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  INT );.    asser
8180: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8190: 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   || db->nDeferre
81a0: 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e  dCons>0 || db->n
81b0: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e  DeferredImmCons>
81c0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
81d0: 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  >rc ? SQLITE_ERR
81e0: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
81f0: 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62  ;.  }.  goto vdb
8200: 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  e_return;.}../* 
8210: 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20  Opcode: Integer 
8220: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
8230: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50  ynopsis: r[P2]=P
8240: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62  1.**.** The 32-b
8250: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
8260: 20 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69   P1 is written i
8270: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
8280: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
8290: 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ger: {         /
82a0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74  * out2 */.  pOut
82b0: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
82c0: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
82d0: 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  t->u.i = pOp->p1
82e0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
82f0: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a   Opcode: Int64 *
8300: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
8310: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34  nopsis: r[P2]=P4
8320: 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
8330: 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62  ointer to a 64-b
8340: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
8350: 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20  ..** Write that 
8360: 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73  value into regis
8370: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
8380: 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20 20  OP_Int64: {     
8390: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
83a0: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
83b0: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
83c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
83d0: 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20  >p4.pI64!=0 );. 
83e0: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f   pOut->u.i = *pO
83f0: 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72  p->p4.pI64;.  br
8400: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
8410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
8420: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
8430: 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32 20  code: Real * P2 
8440: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
8450: 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a  is: r[P2]=P4.**.
8460: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
8470: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66  er to a 64-bit f
8480: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
8490: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
84a0: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
84b0: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
84c0: 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20  se OP_Real: {   
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
84e0: 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75   as TK_FLOAT, ou
84f0: 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f  t2 */.  pOut = o
8500: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
8510: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66   pOp);.  pOut->f
8520: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
8530: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
8540: 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70  te3IsNaN(*pOp->p
8550: 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f  4.pReal) );.  pO
8560: 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e  ut->u.r = *pOp->
8570: 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61  p4.pReal;.  brea
8580: 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
8590: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20  Opcode: String8 
85a0: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  * P2 * P4 *.** S
85b0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27  ynopsis: r[P2]='
85c0: 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  P4'.**.** P4 poi
85d0: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  nts to a nul ter
85e0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
85f0: 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64  ring. This opcod
8600: 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  e is transformed
8610: 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74 72 69   .** into a Stri
8620: 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f 72 65  ng opcode before
8630: 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 20   it is executed 
8640: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
8650: 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a 20 74  me.  During.** t
8660: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
8670: 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  on, the length o
8680: 66 20 73 74 72 69 6e 67 20 50 34 20 69 73 20 63  f string P4 is c
8690: 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74 6f 72  omputed and stor
86a0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50 31 20  ed.** as the P1 
86b0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61  parameter..*/.ca
86c0: 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b  se OP_String8: {
86d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
86e0: 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f   as TK_STRING, o
86f0: 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ut2 */.  assert(
8700: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
8710: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8720: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8730: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
8740: 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70  = OP_String;.  p
8750: 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33  Op->p1 = sqlite3
8760: 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34  Strlen30(pOp->p4
8770: 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  .z);..#ifndef SQ
8780: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
8790: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d    if( encoding!=
87a0: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
87b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
87c0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75  dbeMemSetStr(pOu
87d0: 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31  t, pOp->p4.z, -1
87e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
87f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
8800: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8810: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
8820: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b  SQLITE_TOOBIG );
8830: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8840: 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43  OK!=sqlite3VdbeC
8850: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f  hangeEncoding(pO
8860: 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20  ut, encoding) ) 
8870: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
8880: 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 73   assert( pOut->s
8890: 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 4f 75  zMalloc>0 && pOu
88a0: 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f 75 74  t->zMalloc==pOut
88b0: 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ->z );.    asser
88c0: 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  t( VdbeMemDynami
88d0: 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a 20 20  c(pOut)==0 );.  
88e0: 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63    pOut->szMalloc
88f0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
8900: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61  flags |= MEM_Sta
8910: 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  tic;.    if( pOp
8920: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e  ->p4type==P4_DYN
8930: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
8940: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8950: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
8960: 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  }.    pOp->p4typ
8970: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
8980: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
8990: 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70  pOut->z;.    pOp
89a0: 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a  ->p1 = pOut->n;.
89b0: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
89c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  rc==SQLITE_TOOBI
89d0: 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  G );.#endif.  if
89e0: 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c  ( pOp->p1>db->aL
89f0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8a00: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
8a10: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
8a20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d   }.  assert( rc=
8a30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8a40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
8a50: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
8a60: 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a 7d  , OP_String */.}
8a70: 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .  ./* Opcode: S
8a80: 74 72 69 6e 67 20 50 31 20 50 32 20 50 33 20 50  tring P1 P2 P3 P
8a90: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
8aa0: 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28 6c 65  : r[P2]='P4' (le
8ab0: 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  n=P1).**.** The 
8ac0: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
8ad0: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
8ae0: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
8af0: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
8b00: 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 6e 6f  *.** If P3 is no
8b10: 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 63  t zero and the c
8b20: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
8b30: 65 72 20 50 33 20 69 73 20 65 71 75 61 6c 20 74  er P3 is equal t
8b40: 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  o P5, then.** th
8b50: 65 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68  e datatype of th
8b60: 65 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  e register P2 is
8b70: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 42 4c   converted to BL
8b80: 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  OB.  The content
8b90: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
8ba0: 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79 74 65  sequence of byte
8bb0: 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 20  s, it is merely 
8bc0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
8bd0: 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a 2a 2a   BLOB instead.**
8be0: 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20 61 73   of a string, as
8bf0: 20 69 66 20 69 74 20 68 61 64 20 62 65 65 6e 20   if it had been 
8c00: 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65 72 20  CAST.  In other 
8c10: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69 66 28  words:.**.** if(
8c20: 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67 5b 50   P3!=0 and reg[P
8c30: 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50 32 5d  3]==P5 ) reg[P2]
8c40: 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50 32 5d   := CAST(reg[P2]
8c50: 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63 61 73   as BLOB).*/.cas
8c60: 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 20 20  e OP_String: {  
8c70: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
8c80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
8c90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
8ca0: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
8cb0: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
8cc0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
8cd0: 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63  M_Str|MEM_Static
8ce0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75  |MEM_Term;.  pOu
8cf0: 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  t->z = pOp->p4.z
8d00: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f  ;.  pOut->n = pO
8d10: 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65  p->p1;.  pOut->e
8d20: 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20  nc = encoding;. 
8d30: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
8d40: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69 66 6e  SIZE(pOut);.#ifn
8d50: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
8d60: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
8d70: 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  BS.  if( pOp->p3
8d80: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
8d90: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
8da0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
8db0: 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 33 20  or) );.    pIn3 
8dc0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
8dd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
8de0: 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
8df0: 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Int );.    if( p
8e00: 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d 3e 70  In3->u.i==pOp->p
8e10: 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  5 ) pOut->flags 
8e20: 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53  = MEM_Blob|MEM_S
8e30: 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 72 65    }.#endif.  bre
8e50: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8e60: 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50 33 20  : Null P1 P2 P3 
8e70: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
8e80: 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a   r[P2..P3]=NULL.
8e90: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55  **.** Write a NU
8ea0: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
8eb0: 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72 65  s P2.  If P3 gre
8ec0: 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74 68  ater than P2, th
8ed0: 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
8ee0: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
8ef0: 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72 79  ter P3 and every
8f00: 20 72 65 67 69 73 74 65 72 20 69 6e 20 62 65 74   register in bet
8f10: 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20  ween P2 and P3. 
8f20: 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73   If P3.** is les
8f30: 73 20 74 68 61 6e 20 50 32 20 28 74 79 70 69 63  s than P2 (typic
8f40: 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29  ally P3 is zero)
8f50: 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73   then only regis
8f60: 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74  ter P2 is.** set
8f70: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
8f80: 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  If the P1 value 
8f90: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
8fa0: 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 4d  n also set the M
8fb0: 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61 67 20  EM_Cleared flag 
8fc0: 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c 20  so that.** NULL 
8fd0: 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f 74 20  values will not 
8fe0: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 65 76  compare equal ev
8ff0: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e 55 4c  en if SQLITE_NUL
9000: 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a 2a 2a  LEQ is set on.**
9010: 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45 71 2e   OP_Ne or OP_Eq.
9020: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
9030: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
9040: 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 63   out2 */.  int c
9050: 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c  nt;.  u16 nullFl
9060: 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  ag;.  pOut = out
9070: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
9080: 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70  Op);.  cnt = pOp
9090: 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20  ->p3-pOp->p2;.  
90a0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
90b0: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
90c0: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
90d0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c  Out->flags = nul
90e0: 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70 31 20  lFlag = pOp->p1 
90f0: 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  ? (MEM_Null|MEM_
9100: 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d 5f 4e  Cleared) : MEM_N
9110: 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  ull;.  pOut->n =
9120: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63 6e 74   0;.  while( cnt
9130: 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b  >0 ){.    pOut++
9140: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
9150: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
9160: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9170: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
9180: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
9190: 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20  s = nullFlag;.  
91a0: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
91b0: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20     cnt--;.  }.  
91c0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
91d0: 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20 50 31  ode: SoftNull P1
91e0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f   * * * *.** Syno
91f0: 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c 4c  psis: r[P1]=NULL
9200: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67 69 73  .**.** Set regis
9210: 74 65 72 20 50 31 20 74 6f 20 68 61 76 65 20 74  ter P1 to have t
9220: 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 61 73  he value NULL as
9230: 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f 50 5f   seen by the OP_
9240: 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20 69 6e  MakeRecord.** in
9250: 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74 20 64  struction, but d
9260: 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20 73  o not free any s
9270: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d 65  tring or blob me
9280: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
9290: 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 67 69  with.** the regi
92a0: 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20 69 66  ster, so that if
92b0: 20 74 68 65 20 76 61 6c 75 65 20 77 61 73 20 61   the value was a
92c0: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
92d0: 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76  that was.** prev
92e0: 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20 75 73  iously copied us
92f0: 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20 74 68  ing OP_SCopy, th
9300: 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20 63 6f  e copies will co
9310: 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76 61 6c  ntinue to be val
9320: 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  id..*/.case OP_S
9330: 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73 73  oftNull: {.  ass
9340: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
9350: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
9360: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9370: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
9380: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
9390: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
93a0: 28 70 4f 75 74 2d 3e 66 6c 61 67 73 26 7e 28 4d  (pOut->flags&~(M
93b0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 7c 4d 45 4d  EM_Undefined|MEM
93c0: 5f 41 66 66 4d 61 73 6b 29 29 7c 4d 45 4d 5f 4e  _AffMask))|MEM_N
93d0: 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ull;.  break;.}.
93e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62  ./* Opcode: Blob
93f0: 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
9400: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
9410: 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a  =P4 (len=P1).**.
9420: 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  ** P4 points to 
9430: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50  a blob of data P
9440: 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53  1 bytes long.  S
9450: 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f  tore this.** blo
9460: 62 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  b in register P2
9470: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f  ..*/.case OP_Blo
9480: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
9490: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
94a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
94b0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   <= SQLITE_MAX_L
94c0: 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f 75 74 20  ENGTH );.  pOut 
94d0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
94e0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69  (p, pOp);.  sqli
94f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
9500: 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a  (pOut, pOp->p4.z
9510: 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29  , pOp->p1, 0, 0)
9520: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
9530: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
9540: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
9550: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
9560: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61  }../* Opcode: Va
9570: 72 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50  riable P1 P2 * P
9580: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
9590: 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65 74 65 72   r[P2]=parameter
95a0: 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a 20 54 72  (P1,P4).**.** Tr
95b0: 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c 75 65  ansfer the value
95c0: 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72 61 6d  s of bound param
95d0: 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  eter P1 into reg
95e0: 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49  ister P2.**.** I
95f0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
9600: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
9610: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
9620: 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65 20 50 34  in P4..** The P4
9630: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62   value is used b
9640: 79 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  y sqlite3_bind_p
9650: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e  arameter_name().
9660: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69  .*/.case OP_Vari
9670: 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
9680: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
9690: 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20  Mem *pVar;      
96a0: 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20   /* Value being 
96b0: 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a  transferred */..
96c0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
96d0: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
96e0: 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73  p->nVar );.  ass
96f0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  ert( pOp->p4.z==
9700: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  0 || pOp->p4.z==
9710: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
9720: 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69 73 74 2c  oName(p->pVList,
9730: 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 70 56  pOp->p1) );.  pV
9740: 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f  ar = &p->aVar[pO
9750: 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66  p->p1 - 1];.  if
9760: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
9770: 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a  TooBig(pVar) ){.
9780: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
9790: 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26  ;.  }.  pOut = &
97a0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
97b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
97c0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
97d0: 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74 69   pVar, MEM_Stati
97e0: 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  c);.  UPDATE_MAX
97f0: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9800: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9810: 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20  Opcode: Move P1 
9820: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9830: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 5d 3d  opsis: r[P2@P3]=
9840: 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d  r[P1@P3].**.** M
9850: 6f 76 65 20 74 68 65 20 50 33 20 76 61 6c 75 65  ove the P3 value
9860: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
9870: 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69  ..P1+P3-1 over i
9880: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  nto.** registers
9890: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52   P2..P2+P3-1.  R
98a0: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
98b0: 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74  P3-1 are.** left
98c0: 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e   holding a NULL.
98d0: 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
98e0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61   for register ra
98f0: 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50  nges.** P1..P1+P
9900: 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50  3-1 and P2..P2+P
9910: 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20  3-1 to overlap. 
9920: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 0a   It is an error.
9930: 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20 62 65 20  ** for P3 to be 
9940: 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a  less than 1..*/.
9950: 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a  case OP_Move: {.
9960: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9980: 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20 74  registers left t
9990: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
99a0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p1;          /* 
99b0: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
99c0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70   from */.  int p
99d0: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  2;          /* R
99e0: 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20  egister to copy 
99f0: 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  to */..  n = pOp
9a00: 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70  ->p3;.  p1 = pOp
9a10: 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
9a20: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
9a30: 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20 70  n>0 && p1>0 && p
9a40: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
9a50: 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b   p1+n<=p2 || p2+
9a60: 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31  n<=p1 );..  pIn1
9a70: 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20   = &aMem[p1];.  
9a80: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pOut = &aMem[p2]
9a90: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
9aa0: 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b  rt( pOut<=&aMem[
9ab0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9ac0: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9ad0: 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26   assert( pIn1<=&
9ae0: 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20  aMem[(p->nMem+1 
9af0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29  - p->nCursor)] )
9b00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
9b10: 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
9b20: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
9b30: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
9b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9b50: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49  MemMove(pOut, pI
9b60: 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  n1);.#ifdef SQLI
9b70: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
9b80: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
9b90: 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20  m>=&aMem[p1] && 
9ba0: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
9bb0: 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 70  <pOut ){.      p
9bc0: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9bd0: 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 70 31 3b  += pOp->p2 - p1;
9be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9bf0: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
9c00: 28 70 4f 75 74 29 3b 0a 20 20 20 20 52 45 47 49  (pOut);.    REGI
9c10: 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c  STER_TRACE(p2++,
9c20: 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e 31   pOut);.    pIn1
9c30: 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a  ++;.    pOut++;.
9c40: 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e 20 29 3b    }while( --n );
9c50: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9c60: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
9c70: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9c80: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 2b 31  opsis: r[P2@P3+1
9c90: 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a  ]=r[P1@P3+1].**.
9ca0: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
9cb0: 66 20 72 65 67 69 73 74 65 72 73 20 50 31 2e 2e  f registers P1..
9cc0: 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67 69 73  P1+P3 into regis
9cd0: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e 0a  ters P2..P2+P3..
9ce0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
9cf0: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64  uction makes a d
9d00: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
9d10: 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69 63  value.  A duplic
9d20: 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f  ate.** is made o
9d30: 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72 20  f any string or 
9d40: 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20  blob constant.  
9d50: 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70  See also OP_SCop
9d60: 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  y..*/.case OP_Co
9d70: 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  py: {.  int n;..
9d80: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
9d90: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
9da0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
9db0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
9dc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
9dd0: 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69 6c 65  =pIn1 );.  while
9de0: 28 20 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( 1 ){.    sqlit
9df0: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
9e00: 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c  Copy(pOut, pIn1,
9e10: 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
9e20: 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
9e30: 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  pOut);.#ifdef SQ
9e40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
9e50: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9e60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
9e70: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
9e80: 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d 6e  Op->p2+pOp->p3-n
9e90: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , pOut);.    if(
9ea0: 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (n--)==0 ) brea
9eb0: 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20  k;.    pOut++;. 
9ec0: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20     pIn1++;.  }. 
9ed0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
9ee0: 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20 50  code: SCopy P1 P
9ef0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
9f00: 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  sis: r[P2]=r[P1]
9f10: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68  .**.** Make a sh
9f20: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65  allow copy of re
9f30: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
9f40: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
9f50: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
9f60: 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c  on makes a shall
9f70: 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76  ow copy of the v
9f80: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 76 61  alue.  If the va
9f90: 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  lue.** is a stri
9fa0: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e  ng or blob, then
9fb0: 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c   the copy is onl
9fc0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
9fd0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61  he.** original a
9fe0: 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68 65 20  nd hence if the 
9ff0: 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73  original changes
a000: 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70   so will the cop
a010: 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20  y..** Worse, if 
a020: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20  the original is 
a030: 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  deallocated, the
a040: 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e   copy becomes in
a050: 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74  valid..** Thus t
a060: 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20  he program must 
a070: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
a080: 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c  he original will
a090: 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64   not change.** d
a0a0: 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
a0b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20  me of the copy. 
a0c0: 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20   Use OP_Copy to 
a0d0: 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a  make a complete.
a0e0: 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  ** copy..*/.case
a0f0: 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20   OP_SCopy: {    
a100: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
a110: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
a120: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
a130: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a140: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
a150: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73  Out!=pIn1 );.  s
a160: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
a170: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
a180: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
a190: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a1a0: 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75 74 2d  EBUG.  if( pOut-
a1b0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30 20 29  >pScopyFrom==0 )
a1c0: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
a1d0: 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64 69 66  m = pIn1;.#endif
a1e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a1f0: 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f 70 79 20  Opcode: IntCopy 
a200: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
a210: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
a220: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  [P1].**.** Trans
a230: 66 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 20  fer the integer 
a240: 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 72 65  value held in re
a250: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
a260: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
a270: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
a280: 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
a290: 66 20 53 43 6f 70 79 20 74 68 61 74 20 77 6f 72  f SCopy that wor
a2a0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69 6e 74 65  ks only for inte
a2b0: 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73 2e 0a 2a  ger.** values..*
a2c0: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 43 6f 70  /.case OP_IntCop
a2d0: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
a2e0: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  /* out2 */.  pIn
a2f0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
a300: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
a310: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
a320: 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 70 4f  _Int)!=0 );.  pO
a330: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a340: 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2];.  sqlite3Vd
a350: 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
a360: 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69 29 3b 0a  ut, pIn1->u.i);.
a370: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a380: 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f 77  pcode: ResultRow
a390: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
a3a0: 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74 70 75 74  Synopsis: output
a3b0: 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a 2a 2a 20  =r[P1@P2].**.** 
a3c0: 54 68 65 20 72 65 67 69 73 74 65 72 73 20 50 31  The registers P1
a3d0: 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32 2d 31   through P1+P2-1
a3e0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c   contain a singl
a3f0: 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73 75  e row of.** resu
a400: 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  lts. This opcode
a410: 20 63 61 75 73 65 73 20 74 68 65 20 73 71 6c 69   causes the sqli
a420: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 20  te3_step() call 
a430: 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20  to terminate.** 
a440: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 52  with an SQLITE_R
a450: 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  OW return code a
a460: 6e 64 20 69 74 20 73 65 74 73 20 75 70 20 74 68  nd it sets up th
a470: 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a 2a  e sqlite3_stmt.*
a480: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 70  * structure to p
a490: 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74 6f  rovide access to
a4a0: 20 74 68 65 20 72 28 50 31 29 2e 2e 72 28 50 31   the r(P1)..r(P1
a4b0: 2b 50 32 2d 31 29 20 76 61 6c 75 65 73 20 61 73  +P2-1) values as
a4c0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 72  .** the result r
a4d0: 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ow..*/.case OP_R
a4e0: 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65  esultRow: {.  Me
a4f0: 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69  m *pMem;.  int i
a500: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
a510: 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e  ResColumn==pOp->
a520: 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p2 );.  assert( 
a530: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61  pOp->p1>0 );.  a
a540: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70  ssert( pOp->p1+p
a550: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p2<=(p->nMem
a560: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
a570: 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  +1 );..#ifndef S
a580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
a590: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f  ESS_CALLBACK.  /
a5a0: 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 67 72 65  * Run the progre
a5b0: 73 73 20 63 6f 75 6e 74 65 72 20 6a 75 73 74 20  ss counter just 
a5c0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a5d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
a5e0: 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 0a 20 20  >xProgress!=0.  
a5f0: 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72   && nVmStep>=nPr
a600: 6f 67 72 65 73 73 4c 69 6d 69 74 20 0a 20 20 20  ogressLimit .   
a610: 26 26 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73  && db->xProgress
a620: 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72  (db->pProgressAr
a630: 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  g)!=0.  ){.    r
a640: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
a650: 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61  RUPT;.    goto a
a660: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
a670: 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  r;.  }.#endif.. 
a680: 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61 74   /* If this stat
a690: 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74  ement has violat
a6a0: 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  ed immediate for
a6b0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
a6c0: 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f  ints, do.  ** no
a6d0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  t return the num
a6e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69  ber of rows modi
a6f0: 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74  fied. And do not
a700: 20 52 45 4c 45 41 53 45 20 74 68 65 20 73 74 61   RELEASE the sta
a710: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
a720: 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64  saction. It need
a730: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
a740: 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53  ack.  */.  if( S
a750: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
a760: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a770: 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20  Fk(p, 0)) ){.   
a780: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61   assert( db->fla
a790: 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  gs&SQLITE_CountR
a7a0: 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ows );.    asser
a7b0: 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  t( p->usesStmtJo
a7c0: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 67 6f 74  urnal );.    got
a7d0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
a7e0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
a7f0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f  If the SQLITE_Co
a800: 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20  untRows flag is 
a810: 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  set in sqlite3.f
a820: 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20  lags mask, then 
a830: 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d  .  ** DML statem
a840: 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73  ents invoke this
a850: 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72   opcode to retur
a860: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
a870: 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  rows .  ** modif
a880: 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ied to the user.
a890: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
a8a0: 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20  y way that a VM 
a8b0: 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20  that.  ** opens 
a8c0: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
a8d0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f  saction may invo
a8e0: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  ke this opcode..
a8f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
a900: 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61  e this is such a
a910: 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73   statement, clos
a920: 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20  e any statement 
a930: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
a940: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
a950: 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  VM before return
a960: 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  ing control to t
a970: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
a980: 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
a990: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74  that statement-t
a9a0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
a9b0: 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e  always nested, n
a9c0: 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a  ot overlapping..
a9d0: 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e    ** If the open
a9e0: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
a9f0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c  action is not cl
aa00: 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20  osed here, then 
aa10: 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61  the user.  ** ma
aa20: 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56  y step another V
aa30: 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73  M that opens its
aa40: 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74   own statement t
aa50: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
aa60: 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74  .  ** may lead t
aa70: 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74  o overlapping st
aa80: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
aa90: 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
aaa0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  The statement tr
aab0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76  ansaction is nev
aac0: 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74  er a top-level t
aad0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e  ransaction.  Hen
aae0: 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45  ce.  ** the RELE
aaf0: 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63  ASE call below c
ab00: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20  an never fail.. 
ab10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ab20: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c  >iStatement==0 |
ab30: 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  | db->flags&SQLI
ab40: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a  TE_CountRows );.
ab50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
ab60: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
ab70: 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  (p, SAVEPOINT_RE
ab80: 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
ab90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aba0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64  );..  /* Invalid
abb0: 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61  ate all ephemera
abc0: 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63  l cursor row cac
abd0: 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68  hes */.  p->cach
abe0: 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65  eCtr = (p->cache
abf0: 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f  Ctr + 2)|1;..  /
ac00: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
ac10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
ac20: 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c  urrent row are \
ac30: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  000 terminated. 
ac40: 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20   ** and have an 
ac50: 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20  assigned type.  
ac60: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
ac70: 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64  de-ephemeralized
ac80: 20 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20   as.  ** a side 
ac90: 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  effect..  */.  p
aca0: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
acb0: 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Set = &aMem[pOp-
acc0: 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >p1];.  for(i=0;
acd0: 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29   i<pOp->p2; i++)
ace0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
acf0: 6d 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69  mIsValid(&pMem[i
ad00: 5d 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65  ]) );.    Deephe
ad10: 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69  meralize(&pMem[i
ad20: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
ad30: 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26  (pMem[i].flags &
ad40: 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20   MEM_Ephem)==0. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
ad60: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28  Mem[i].flags & (
ad70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
ad80: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ))==0 );.    sql
ad90: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65  ite3VdbeMemNulTe
ada0: 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d  rminate(&pMem[i]
adb0: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
adc0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c  TRACE(pOp->p1+i,
add0: 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a   &pMem[i]);.  }.
ade0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
adf0: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  Failed ) goto no
ae00: 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20 64 62 2d  _mem;..  if( db-
ae10: 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54 45  >mTrace & SQLITE
ae20: 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b 0a 20 20  _TRACE_ROW ){.  
ae30: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
ae40: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 2c 20 64  ITE_TRACE_ROW, d
ae50: 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 70 2c  b->pTraceArg, p,
ae60: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   0);.  }..  /* R
ae70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57  eturn SQLITE_ROW
ae80: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20  .  */.  p->pc = 
ae90: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
aea0: 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c   + 1;.  rc = SQL
aeb0: 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20  ITE_ROW;.  goto 
aec0: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
aed0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61  /* Opcode: Conca
aee0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
aef0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
af00: 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a  ]=r[P2]+r[P1].**
af10: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74  .** Add the text
af20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
af30: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
af40: 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72  the text in.** r
af50: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
af60: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
af70: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
af80: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  ** If either the
af90: 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61   P1 or P2 text a
afa0: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f  re NULL then sto
afb0: 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a  re NULL in P3..*
afc0: 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c  *.**   P3 = P2 |
afd0: 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  | P1.**.** It is
afe0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20   illegal for P1 
aff0: 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65  and P3 to be the
b000: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20   same register. 
b010: 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66  Sometimes,.** if
b020: 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20   P3 is the same 
b030: 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20  register as P2, 
b040: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
b050: 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f  on is able.** to
b060: 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28   avoid a memcpy(
b070: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
b080: 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ncat: {         
b090: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
b0a0: 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32  CONCAT, in1, in2
b0b0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
b0c0: 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d  nByte;..  pIn1 =
b0d0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
b0e0: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
b0f0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
b100: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
b110: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
b120: 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28  1!=pOut );.  if(
b130: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
b140: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
b150: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
b160: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
b170: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
b180: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
b190: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
b1a0: 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28  ) || ExpandBlob(
b1b0: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
b1c0: 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  mem;.  Stringify
b1d0: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
b1e0: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
b1f0: 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n2, encoding);. 
b200: 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e   nByte = pIn1->n
b210: 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66   + pIn2->n;.  if
b220: 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
b230: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
b240: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
b250: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
b260: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
b270: 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
b280: 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f  (int)nByte+2, pO
b290: 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20  ut==pIn2) ){.   
b2a0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
b2b0: 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  }.  MemSetTypeFl
b2c0: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72  ag(pOut, MEM_Str
b2d0: 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70  );.  if( pOut!=p
b2e0: 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  In2 ){.    memcp
b2f0: 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d  y(pOut->z, pIn2-
b300: 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20  >z, pIn2->n);.  
b310: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74  }.  memcpy(&pOut
b320: 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49  ->z[pIn2->n], pI
b330: 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b  n1->z, pIn1->n);
b340: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
b350: 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e  ]=0;.  pOut->z[n
b360: 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  Byte+1] = 0;.  p
b370: 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Out->flags |= ME
b380: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
b390: 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a  n = (int)nByte;.
b3a0: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
b3b0: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
b3c0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
b3d0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
b3e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20  ./* Opcode: Add 
b3f0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
b400: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
b410: 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]+r[P2].**.*
b420: 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20  * Add the value 
b430: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
b440: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
b450: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
b460: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
b470: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b480: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b490: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b4a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b4b0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b4c0: 20 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20   Multiply P1 P2 
b4d0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b4e0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a  is: r[P3]=r[P1]*
b4f0: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d  r[P2].**.**.** M
b500: 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75  ultiply the valu
b510: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
b520: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
b530: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
b540: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
b550: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b560: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b570: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
b580: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
b590: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
b5a0: 65 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50  e: Subtract P1 P
b5b0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
b5c0: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
b5d0: 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75  ]-r[P1].**.** Su
b5e0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
b5f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b600: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
b610: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b620: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b630: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b640: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b650: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b660: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b670: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b680: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
b690: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b6a0: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
b6b0: 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76  /r[P1].**.** Div
b6c0: 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ide the value in
b6d0: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
b6e0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b6f0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
b700: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b710: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
b720: 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74  (P3=P2/P1). If t
b730: 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20  he value in .** 
b740: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
b750: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
b760: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66  sult is NULL. If
b770: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
b780: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72   .** NULL, the r
b790: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b7a0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
b7b0: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
b7c0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
b7d0: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50   r[P3]=r[P2]%r[P
b7e0: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  1].**.** Compute
b7f0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61   the remainder a
b800: 66 74 65 72 20 69 6e 74 65 67 65 72 20 72 65 67  fter integer reg
b810: 69 73 74 65 72 20 50 32 20 69 73 20 64 69 76 69  ister P2 is divi
b820: 64 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73  ded by .** regis
b830: 74 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65  ter P1 and store
b840: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
b850: 65 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20  egister P3. .** 
b860: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  If the value in 
b870: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
b880: 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69  ero the result i
b890: 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69  s NULL..** If ei
b8a0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
b8b0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b8c0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
b8d0: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b8f0: 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20  ame as TK_PLUS, 
b900: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
b910: 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61  /.case OP_Subtra
b920: 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ct:             
b930: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d   /* same as TK_M
b940: 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  INUS, in1, in2, 
b950: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
b960: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20  Multiply:       
b970: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
b980: 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20  s TK_STAR, in1, 
b990: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
b9a0: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20  e OP_Divide:    
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b9c0: 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c  ame as TK_SLASH,
b9d0: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b9e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69  */.case OP_Remai
b9f0: 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20  nder: {         
ba00: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ba10: 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  REM, in1, in2, o
ba20: 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49  ut3 */.  char bI
ba30: 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72  ntint;   /* Star
ba40: 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69  ted out as two i
ba50: 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20  nteger operands 
ba60: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20  */.  u16 flags; 
ba70: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
ba80: 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f   MEM_* flags fro
ba90: 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f  m both inputs */
baa0: 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20 20 20  .  u16 type1;   
bab0: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79     /* Numeric ty
bac0: 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61  pe of left opera
bad0: 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65  nd */.  u16 type
bae0: 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72  2;      /* Numer
baf0: 69 63 20 74 79 70 65 20 6f 66 20 72 69 67 68 74  ic type of right
bb00: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36   operand */.  i6
bb10: 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  4 iA;         /*
bb20: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f   Integer value o
bb30: 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  f left operand *
bb40: 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20  /.  i64 iB;     
bb50: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76      /* Integer v
bb60: 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70  alue of right op
bb70: 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c  erand */.  doubl
bb80: 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65  e rA;      /* Re
bb90: 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  al value of left
bba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
bbb0: 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a  uble rB;      /*
bbc0: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72   Real value of r
bbd0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
bbe0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
bbf0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65  pOp->p1];.  type
bc00: 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28  1 = numericType(
bc10: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
bc20: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
bc30: 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72 69    type2 = numeri
bc40: 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20 70  cType(pIn2);.  p
bc50: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
bc60: 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20  >p3];.  flags = 
bc70: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
bc80: 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  n2->flags;.  if(
bc90: 20 28 74 79 70 65 31 20 26 20 74 79 70 65 32 20   (type1 & type2 
bca0: 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
bcb0: 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e  .    iA = pIn1->
bcc0: 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49  u.i;.    iB = pI
bcd0: 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e  n2->u.i;.    bIn
bce0: 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 77  tint = 1;.    sw
bcf0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
bd00: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
bd10: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69 66  OP_Add:       if
bd20: 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36  ( sqlite3AddInt6
bd30: 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f  4(&iB,iA) ) goto
bd40: 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b   fp_math;  break
bd50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
bd60: 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20 73  Subtract:  if( s
bd70: 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 26  qlite3SubInt64(&
bd80: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
bd90: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
bda0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
bdb0: 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c 69  tiply:  if( sqli
bdc0: 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c  te3MulInt64(&iB,
bdd0: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
bde0: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
bdf0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
be00: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
be10: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
be20: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
be30: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
be40: 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42  if( iA==-1 && iB
be50: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
be60: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
be70: 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20 69  .        iB /= i
be80: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
be90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bea0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
beb0: 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67     if( iA==0 ) g
bec0: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
bed0: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
bee0: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d         if( iA==-
bef0: 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20  1 ) iA = 1;.    
bf00: 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20 20      iB %= iA;.  
bf10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bf30: 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20  Out->u.i = iB;. 
bf40: 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
bf50: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
bf60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66  ;.  }else if( (f
bf70: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
bf80: 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  !=0 ){.    goto 
bf90: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
bfa0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 7d 65 6c  t_is_null;.  }el
bfb0: 73 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20  se{.    bIntint 
bfc0: 3d 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20  = 0;.fp_math:.  
bfd0: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64    rA = sqlite3Vd
bfe0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31  beRealValue(pIn1
bff0: 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69  );.    rB = sqli
c000: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
c010: 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74  (pIn2);.    swit
c020: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
c030: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
c040: 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42  _Add:         rB
c050: 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72   += rA;       br
c060: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c070: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
c080: 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20  rB -= rA;       
c090: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c0a0: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
c0b0: 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20    rB *= rA;     
c0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c0d0: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
c0e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75  .        /* (dou
c0f0: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
c100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
c110: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
c120: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41  /.        if( rA
c130: 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f  ==(double)0 ) go
c140: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c150: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c160: 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a        rB /= rA;.
c170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
c190: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
c1a0: 69 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20  iA = (i64)rA;.  
c1b0: 20 20 20 20 20 20 69 42 20 3d 20 28 69 36 34 29        iB = (i64)
c1c0: 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rB;.        if( 
c1d0: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
c1e0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
c1f0: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
c200: 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20  if( iA==-1 ) iA 
c210: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20  = 1;.        rB 
c220: 3d 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20  = (double)(iB % 
c230: 69 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  iA);.        bre
c240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c250: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c260: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c270: 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  INT.    pOut->u.
c280: 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53  i = rB;.    MemS
c290: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
c2a0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65   MEM_Int);.#else
c2b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c2c0: 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20  IsNaN(rB) ){.   
c2d0: 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74     goto arithmet
c2e0: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c2f0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  l;.    }.    pOu
c300: 74 2d 3e 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20  t->u.r = rB;.   
c310: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
c320: 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pOut, MEM_Real);
c330: 0a 20 20 20 20 69 66 28 20 28 28 74 79 70 65 31  .    if( ((type1
c340: 7c 74 79 70 65 32 29 26 4d 45 4d 5f 52 65 61 6c  |type2)&MEM_Real
c350: 29 3d 3d 30 20 26 26 20 21 62 49 6e 74 69 6e 74  )==0 && !bIntint
c360: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c370: 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69  3VdbeIntegerAffi
c380: 6e 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20  nity(pOut);.    
c390: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
c3a0: 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69  reak;..arithmeti
c3b0: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c3c0: 3a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  :.  sqlite3VdbeM
c3d0: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
c3e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
c3f0: 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20  Opcode: CollSeq 
c400: 50 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20  P1 * * P4.**.** 
c410: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
c420: 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20 6f 62 6a  to a CollSeq obj
c430: 65 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74  ect. If the next
c440: 20 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20   call to a user 
c450: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61  function.** or a
c460: 67 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73  ggregate calls s
c470: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
c480: 6c 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c  lSeq(), this col
c490: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c4a0: 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72  will.** be retur
c4b0: 6e 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  ned. This is use
c4c0: 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69  d by the built-i
c4d0: 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61  n min(), max() a
c4e0: 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66  nd nullif().** f
c4f0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
c500: 49 66 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72  If P1 is not zer
c510: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  o, then it is a 
c520: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 61 20  register that a 
c530: 73 75 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29  subsequent min()
c540: 20 6f 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67   or.** max() agg
c550: 72 65 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20  regate will set 
c560: 74 6f 20 31 20 69 66 20 74 68 65 20 63 75 72 72  to 1 if the curr
c570: 65 6e 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74  ent row is not t
c580: 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a  he minimum or.**
c590: 20 6d 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50   maximum.  The P
c5a0: 31 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  1 register is in
c5b0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62  itialized to 0 b
c5c0: 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  y this instructi
c5d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  on..**.** The in
c5e0: 74 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20  terface used by 
c5f0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c600: 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d  on of the aforem
c610: 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f  entioned functio
c620: 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76  ns.** to retriev
c630: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
c640: 73 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20  sequence set by 
c650: 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  this opcode is n
c660: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
c670: 70 75 62 6c 69 63 6c 79 2e 20 20 4f 6e 6c 79 20  publicly.  Only 
c680: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c690: 6e 73 20 68 61 76 65 20 61 63 63 65 73 73 20 74  ns have access t
c6a0: 6f 20 74 68 69 73 20 66 65 61 74 75 72 65 2e 0a  o this feature..
c6b0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53  */.case OP_CollS
c6c0: 65 71 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  eq: {.  assert( 
c6d0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
c6e0: 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 69 66 28  COLLSEQ );.  if(
c6f0: 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
c700: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c710: 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70  tInt64(&aMem[pOp
c720: 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20  ->p1], 0);.  }. 
c730: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
c740: 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 30 20  code: Function0 
c750: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
c760: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
c770: 5d 3d 66 75 6e 63 28 72 5b 50 32 40 50 35 5d 29  ]=func(r[P2@P5])
c780: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20  .**.** Invoke a 
c790: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50  user function (P
c7a0: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
c7b0: 6f 20 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65  o a FuncDef obje
c7c0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e  ct that.** defin
c7d0: 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29  es the function)
c7e0: 20 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e   with P5 argumen
c7f0: 74 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  ts taken from re
c800: 67 69 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a  gister P2 and.**
c810: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68   successors.  Th
c820: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
c830: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72  function is stor
c840: 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
c850: 33 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  3..** Register P
c860: 33 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e  3 must not be on
c870: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
c880: 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20  n inputs..**.** 
c890: 50 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62  P1 is a 32-bit b
c8a0: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
c8b0: 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  g whether or not
c8c0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74   each argument t
c8d0: 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69  o the .** functi
c8e0: 6f 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65  on was determine
c8f0: 64 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  d to be constant
c900: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
c910: 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a  . If the first.*
c920: 2a 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63  * argument was c
c930: 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74  onstant then bit
c940: 20 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e   0 of P1 is set.
c950: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
c960: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
c970: 65 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20  ether meta data 
c980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c990: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  a user function 
c9a0: 61 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74  argument using t
c9b0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65  he.** sqlite3_se
c9c0: 74 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20  t_auxdata() API 
c9d0: 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65  may be safely re
c9e0: 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65  tained until the
c9f0: 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74   next.** invocat
ca00: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f  ion of this opco
ca10: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
ca20: 73 6f 3a 20 46 75 6e 63 74 69 6f 6e 2c 20 41 67  so: Function, Ag
ca30: 67 53 74 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a  gStep, AggFinal.
ca40: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75  */./* Opcode: Fu
ca50: 6e 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20  nction P1 P2 P3 
ca60: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
ca70: 73 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b  s: r[P3]=func(r[
ca80: 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e  P2@P5]).**.** In
ca90: 76 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63  voke a user func
caa0: 74 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f  tion (P4 is a po
cab0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
cac0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65  te3_context obje
cad0: 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61  ct that.** conta
cae0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
caf0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f   the function to
cb00: 20 62 65 20 72 75 6e 29 20 77 69 74 68 20 50 35   be run) with P5
cb10: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
cb20: 0a 2a 2a 20 66 72 6f 6d 20 72 65 67 69 73 74 65  .** from registe
cb30: 72 20 50 32 20 61 6e 64 20 73 75 63 63 65 73 73  r P2 and success
cb40: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
cb50: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
cb60: 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
cb70: 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 52   register P3.  R
cb80: 65 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20  egister P3 must 
cb90: 6e 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  not be one of th
cba0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74  e function input
cbb0: 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  s..**.** P1 is a
cbc0: 20 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20   32-bit bitmask 
cbd0: 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68  indicating wheth
cbe0: 65 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61  er or not each a
cbf0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a  rgument to the .
cc00: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
cc10: 64 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65  determined to be
cc20: 20 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d   constant at com
cc30: 70 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68  pile time. If th
cc40: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
cc50: 65 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74  ent was constant
cc60: 20 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50   then bit 0 of P
cc70: 31 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69  1 is set. This i
cc80: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
cc90: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d  ine.** whether m
cca0: 65 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61  eta data associa
ccb0: 74 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20  ted with a user 
ccc0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
ccd0: 74 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  t using the.** s
cce0: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61  qlite3_set_auxda
ccf0: 74 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20  ta() API may be 
cd00: 73 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20  safely retained 
cd10: 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a  until the next.*
cd20: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  * invocation of 
cd30: 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  this opcode..**.
cd40: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ** SQL functions
cd50: 20 61 72 65 20 69 6e 69 74 69 61 6c 6c 79 20 63   are initially c
cd60: 6f 64 65 64 20 61 73 20 4f 50 5f 46 75 6e 63 74  oded as OP_Funct
cd70: 69 6f 6e 30 20 77 69 74 68 20 50 34 20 70 6f 69  ion0 with P4 poi
cd80: 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 46 75  nting.** to a Fu
cd90: 6e 63 44 65 66 20 6f 62 6a 65 63 74 2e 20 20 42  ncDef object.  B
cda0: 75 74 20 6f 6e 20 66 69 72 73 74 20 65 76 61 6c  ut on first eval
cdb0: 75 61 74 69 6f 6e 2c 20 74 68 65 20 50 34 20 6f  uation, the P4 o
cdc0: 70 65 72 61 6e 64 20 69 73 0a 2a 2a 20 61 75 74  perand is.** aut
cdd0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 76 65  omatically conve
cde0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c  rted into an sql
cdf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a  ite3_context obj
ce00: 65 63 74 20 61 6e 64 20 74 68 65 20 6f 70 65 72  ect and the oper
ce10: 61 74 69 6f 6e 0a 2a 2a 20 63 68 61 6e 67 65 64  ation.** changed
ce20: 20 74 6f 20 74 68 69 73 20 4f 50 5f 46 75 6e 63   to this OP_Func
ce30: 74 69 6f 6e 20 6f 70 63 6f 64 65 2e 20 20 49 6e  tion opcode.  In
ce40: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 69   this way, the i
ce50: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
ce60: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
ce70: 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 6f  context object o
ce80: 63 63 75 72 73 20 6f 6e 6c 79 20 6f 6e 63 65 2c  ccurs only once,
ce90: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6f 6e 63   rather than onc
cea0: 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 65 76  e for each.** ev
ceb0: 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
cec0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
ced0: 53 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69  See also: Functi
cee0: 6f 6e 30 2c 20 41 67 67 53 74 65 70 2c 20 41 67  on0, AggStep, Ag
cef0: 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f  gFinal.*/.case O
cf00: 50 5f 46 75 6e 63 74 69 6f 6e 30 3a 20 7b 0a 20  P_Function0: {. 
cf10: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
cf20: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
cf30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
cf40: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
cf50: 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70  DEF );.  n = pOp
cf60: 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
cf70: 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
cf80: 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
cf90: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
cfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ;.  assert( n==0
cfb0: 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
cfc0: 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d  & pOp->p2+n<=(p-
cfd0: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
cfe0: 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73  rsor)+1) );.  as
cff0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
d000: 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
d010: 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
d020: 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
d030: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
d040: 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b   sizeof(*pCtx) +
d050: 20 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71   (n-1)*sizeof(sq
d060: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a  lite3_value*));.
d070: 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20    if( pCtx==0 ) 
d080: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
d090: 43 74 78 2d 3e 70 4f 75 74 20 3d 20 30 3b 0a 20  Ctx->pOut = 0;. 
d0a0: 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70   pCtx->pFunc = p
d0b0: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
d0c0: 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74  pCtx->iOp = (int
d0d0: 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
d0e0: 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b  pCtx->pVdbe = p;
d0f0: 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20  .  pCtx->argc = 
d100: 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  n;.  pOp->p4type
d110: 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20   = P4_FUNCCTX;. 
d120: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20   pOp->p4.pCtx = 
d130: 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  pCtx;.  pOp->opc
d140: 6f 64 65 20 3d 20 4f 50 5f 46 75 6e 63 74 69 6f  ode = OP_Functio
d150: 6e 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  n;.  /* Fall thr
d160: 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 46 75 6e  ough into OP_Fun
d170: 63 74 69 6f 6e 20 2a 2f 0a 7d 0a 63 61 73 65 20  ction */.}.case 
d180: 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20  OP_Function: {. 
d190: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
d1a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
d1b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
d1c0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
d1d0: 43 54 58 20 29 3b 0a 20 20 70 43 74 78 20 3d 20  CTX );.  pCtx = 
d1e0: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 0a 20  pOp->p4.pCtx;.. 
d1f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63   /* If this func
d200: 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f  tion is inside o
d210: 66 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  f a trigger, the
d220: 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20   register array 
d230: 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d  in aMem[].  ** m
d240: 69 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d  ight change from
d250: 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   one evaluation 
d260: 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68  to the next.  Th
d270: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
d280: 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73  code.  ** checks
d290: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
d2a0: 65 67 69 73 74 65 72 20 61 72 72 61 79 20 68 61  egister array ha
d2b0: 73 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69  s changed, and i
d2c0: 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69  f so it.  ** rei
d2d0: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72  nitializes the r
d2e0: 65 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66  elavant parts of
d2f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e   the sqlite3_con
d300: 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  text object */. 
d310: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
d320: 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 70 43  p->p3];.  if( pC
d330: 74 78 2d 3e 70 4f 75 74 20 21 3d 20 70 4f 75 74  tx->pOut != pOut
d340: 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f   ){.    pCtx->pO
d350: 75 74 20 3d 20 70 4f 75 74 3b 0a 20 20 20 20 66  ut = pOut;.    f
d360: 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72 67 63 2d  or(i=pCtx->argc-
d370: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 70 43  1; i>=0; i--) pC
d380: 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 26 61  tx->argv[i] = &a
d390: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a  Mem[pOp->p2+i];.
d3a0: 20 20 7d 0a 0a 20 20 6d 65 6d 41 62 6f 75 74 54    }..  memAboutT
d3b0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
d3c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d3d0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
d3e0: 20 69 3c 70 43 74 78 2d 3e 61 72 67 63 3b 20 69   i<pCtx->argc; i
d3f0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
d400: 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 43 74 78   memIsValid(pCtx
d410: 2d 3e 61 72 67 76 5b 69 5d 29 20 29 3b 0a 20 20  ->argv[i]) );.  
d420: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
d430: 28 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 43 74 78  (pOp->p2+i, pCtx
d440: 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a  ->argv[i]);.  }.
d450: 23 65 6e 64 69 66 0a 20 20 4d 65 6d 53 65 74 54  #endif.  MemSetT
d460: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
d470: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d  M_Null);.  pCtx-
d480: 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 3d 20 30  >fErrorOrAux = 0
d490: 3b 0a 20 20 28 2a 70 43 74 78 2d 3e 70 46 75 6e  ;.  (*pCtx->pFun
d4a0: 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74 78 2c  c->xSFunc)(pCtx,
d4b0: 20 70 43 74 78 2d 3e 61 72 67 63 2c 20 70 43 74   pCtx->argc, pCt
d4c0: 78 2d 3e 61 72 67 76 29 3b 2f 2a 20 49 4d 50 3a  x->argv);/* IMP:
d4d0: 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20 2a   R-24505-23230 *
d4e0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  /..  /* If the f
d4f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
d500: 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 72 6f 77   an error, throw
d510: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 2a 2f   an exception */
d520: 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66 45 72  .  if( pCtx->fEr
d530: 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20 20 20  rorOrAux ){.    
d540: 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f  if( pCtx->isErro
d550: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
d560: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
d570: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
d580: 75 65 5f 74 65 78 74 28 70 4f 75 74 29 29 3b 0a  ue_text(pOut));.
d590: 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d        rc = pCtx-
d5a0: 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  >isError;.    }.
d5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
d5c0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 64 62 2c  eleteAuxData(db,
d5d0: 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 70   &p->pAuxData, p
d5e0: 43 74 78 2d 3e 69 4f 70 2c 20 70 4f 70 2d 3e 70  Ctx->iOp, pOp->p
d5f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  1);.    if( rc )
d600: 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
d610: 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  to_error;.  }.. 
d620: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73   /* Copy the res
d630: 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
d640: 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ion into registe
d650: 72 20 50 33 20 2a 2f 0a 20 20 69 66 28 20 70 4f  r P3 */.  if( pO
d660: 75 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  ut->flags & (MEM
d670: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
d680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d690: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
d6a0: 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pOut, encoding);
d6b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d6c0: 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f  VdbeMemTooBig(pO
d6d0: 75 74 29 20 29 20 67 6f 74 6f 20 74 6f 6f 5f 62  ut) ) goto too_b
d6e0: 69 67 3b 0a 20 20 7d 0a 0a 20 20 52 45 47 49 53  ig;.  }..  REGIS
d6f0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
d700: 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41  3, pOut);.  UPDA
d710: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
d720: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
d730: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
d740: 74 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  tAnd P1 P2 P3 * 
d750: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d760: 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b 50 32 5d  [P3]=r[P1]&r[P2]
d770: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
d780: 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20  bit-wise AND of 
d790: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
d7a0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
d7b0: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
d7c0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
d7d0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
d7e0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
d7f0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
d800: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
d810: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20  pcode: BitOr P1 
d820: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
d830: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
d840: 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]|r[P2].**.** T
d850: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
d860: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
d870: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
d880: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
d890: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
d8a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
d8b0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
d8c0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
d8d0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
d8e0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
d8f0: 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33  iftLeft P1 P2 P3
d900: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
d910: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3c 3c 72  : r[P3]=r[P2]<<r
d920: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
d930: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
d940: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
d950: 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79  2 to the left by
d960: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
d970: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
d980: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
d990: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
d9a0: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
d9b0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
d9c0: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
d9d0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
d9e0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
d9f0: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
da00: 3a 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20  : ShiftRight P1 
da10: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
da20: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
da30: 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]>>r[P1].**.** 
da40: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
da50: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
da60: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69  ter P2 to the ri
da70: 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75  ght by the.** nu
da80: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65  mber of bits spe
da90: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e  cified by the in
daa0: 74 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65  teger in registe
dab0: 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  r P1..** Store t
dac0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
dad0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
dae0: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
daf0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
db00: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
db10: 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20  e OP_BitAnd:    
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db30: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e  same as TK_BITAN
db40: 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  D, in1, in2, out
db50: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  3 */.case OP_Bit
db60: 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Or:             
db70: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
db80: 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69  TK_BITOR, in1, i
db90: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
dba0: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20   OP_ShiftLeft:  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
dbc0: 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54  ame as TK_LSHIFT
dbd0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
dbe0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
dbf0: 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20  tRight: {       
dc00: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
dc10: 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_RSHIFT, in1, i
dc20: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36  n2, out3 */.  i6
dc30: 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a  4 iA;.  u64 uA;.
dc40: 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f    i64 iB;.  u8 o
dc50: 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  p;..  pIn1 = &aM
dc60: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
dc70: 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
dc80: 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p2];.  pOut = &
dc90: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
dca0: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
dcb0: 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29  s | pIn2->flags)
dcc0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
dcd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
dce0: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
dcf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
dd00: 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iA = sqlite3Vdb
dd10: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
dd20: 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56  .  iB = sqlite3V
dd30: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
dd40: 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f  );.  op = pOp->o
dd50: 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d  pcode;.  if( op=
dd60: 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20  =OP_BitAnd ){.  
dd70: 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65    iA &= iB;.  }e
dd80: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  lse if( op==OP_B
dd90: 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c  itOr ){.    iA |
dda0: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
ddb0: 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61  ( iB!=0 ){.    a
ddc0: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68  ssert( op==OP_Sh
ddd0: 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d  iftRight || op==
dde0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
ddf0: 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74  .    /* If shift
de00: 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76  ing by a negativ
de10: 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20  e amount, shift 
de20: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72  in the other dir
de30: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  ection */.    if
de40: 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( iB<0 ){.      
de50: 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74  assert( OP_Shift
de60: 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c  Right==OP_ShiftL
de70: 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f  eft+1 );.      o
de80: 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65  p = 2*OP_ShiftLe
de90: 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20  ft + 1 - op;.   
dea0: 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29     iB = iB>(-64)
deb0: 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20   ? -iB : 64;.   
dec0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d   }..    if( iB>=
ded0: 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d  64 ){.      iA =
dee0: 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f   (iA>=0 || op==O
def0: 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30  P_ShiftLeft) ? 0
df00: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   : -1;.    }else
df10: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
df20: 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28  uA, &iA, sizeof(
df30: 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  uA));.      if( 
df40: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
df50: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c   ){.        uA <
df60: 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c  <= iB;.      }el
df70: 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e  se{.        uA >
df80: 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f  >= iB;.        /
df90: 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e  * Sign-extend on
dfa0: 20 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f   a right shift o
dfb0: 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  f a negative num
dfc0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ber */.        i
dfd0: 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20  f( iA<0 ) uA |= 
dfe0: 28 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66  ((((u64)0xffffff
dff0: 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66  ff)<<32)|0xfffff
e000: 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b  fff) << (64-iB);
e010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
e020: 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20  emcpy(&iA, &uA, 
e030: 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20  sizeof(iA));.   
e040: 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75   }.  }.  pOut->u
e050: 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65  .i = iA;.  MemSe
e060: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
e070: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61  MEM_Int);.  brea
e080: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
e090: 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a   AddImm  P1 P2 *
e0a0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
e0b0: 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d 2b 50 32  : r[P1]=r[P1]+P2
e0c0: 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20  .** .** Add the 
e0d0: 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74  constant P2 to t
e0e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
e0f0: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20  ster P1..** The 
e100: 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
e110: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
e120: 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20  ** To force any 
e130: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 61  register to be a
e140: 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20  n integer, just 
e150: 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f  add 0..*/.case O
e160: 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20  P_AddImm: {     
e170: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
e180: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
e190: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
e1a0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
e1b0: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
e1c0: 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
e1d0: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d  y(pIn1);.  pIn1-
e1e0: 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  >u.i += pOp->p2;
e1f0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e200: 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e  Opcode: MustBeIn
e210: 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
e220: 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76   .** Force the v
e230: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
e240: 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74   P1 to be an int
e250: 65 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61  eger.  If the va
e260: 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20  lue.** in P1 is 
e270: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61  not an integer a
e280: 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  nd cannot be con
e290: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
e2a0: 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75  nteger.** withou
e2b0: 74 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65  t data loss, the
e2c0: 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
e2d0: 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20  ly to P2, or if 
e2e0: 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61  P2==0.** raise a
e2f0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  n SQLITE_MISMATC
e300: 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a  H exception..*/.
e310: 63 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e  case OP_MustBeIn
e320: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
e330: 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
e340: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
e350: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
e360: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
e370: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
e380: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
e390: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
e3a0: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
e3b0: 67 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  g);.    VdbeBran
e3c0: 63 68 54 61 6b 65 6e 28 28 70 49 6e 31 2d 3e 66  chTaken((pIn1->f
e3d0: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 3d 3d 30  lags&MEM_Int)==0
e3e0: 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 28 70  , 2);.    if( (p
e3f0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
e400: 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
e410: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30    if( pOp->p2==0
e420: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e430: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
e440: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  ;.        goto a
e450: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
e460: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
e470: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d          goto jum
e480: 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 7d  p_to_p2;.      }
e490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 65 6d  .    }.  }.  Mem
e4a0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31  SetTypeFlag(pIn1
e4b0: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
e4c0: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
e4d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e4e0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
e4f0: 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69  code: RealAffini
e500: 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ty P1 * * * *.**
e510: 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
e520: 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  P1 holds an inte
e530: 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ger convert it t
e540: 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  o a real value..
e550: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
e560: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65  e is used when e
e570: 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d  xtracting inform
e580: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c  ation from a col
e590: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
e5a0: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20  REAL affinity.  
e5b0: 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  Such column valu
e5c0: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
e5d0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74  stored as.** int
e5e0: 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65  egers, for space
e5f0: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74   efficiency, but
e600: 20 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f   after extractio
e610: 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a  n we want them.*
e620: 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61  * to have only a
e630: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a   real value..*/.
e640: 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69  case OP_RealAffi
e650: 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20  nity: {         
e660: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
e670: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
e680: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
e690: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
e6a0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  MEM_Int ){.    s
e6b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61  qlite3VdbeMemRea
e6c0: 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  lify(pIn1);.  }.
e6d0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
e6e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
e6f0: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f  E_OMIT_CAST./* O
e700: 70 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50  pcode: Cast P1 P
e710: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
e720: 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
e730: 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65  P1]).**.** Force
e740: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e750: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
e760: 74 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64  the type defined
e770: 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c   by P2..** .** <
e780: 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d  ul>.** <li> P2==
e790: 27 41 27 20 26 72 61 72 72 3b 20 42 4c 4f 42 0a  'A' &rarr; BLOB.
e7a0: 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 42 27 20  ** <li> P2=='B' 
e7b0: 26 72 61 72 72 3b 20 54 45 58 54 0a 2a 2a 20 3c  &rarr; TEXT.** <
e7c0: 6c 69 3e 20 50 32 3d 3d 27 43 27 20 26 72 61 72  li> P2=='C' &rar
e7d0: 72 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c  r; NUMERIC.** <l
e7e0: 69 3e 20 50 32 3d 3d 27 44 27 20 26 72 61 72 72  i> P2=='D' &rarr
e7f0: 3b 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c 69  ; INTEGER.** <li
e800: 3e 20 50 32 3d 3d 27 45 27 20 26 72 61 72 72 3b  > P2=='E' &rarr;
e810: 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a   REAL.** </ul>.*
e820: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
e830: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
e840: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
e850: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
e860: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  LL..*/.case OP_C
e870: 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ast: {          
e880: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
e890: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
e8a0: 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f  >p2>=SQLITE_AFF_
e8b0: 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c  BLOB && pOp->p2<
e8c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
e8d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e8e0: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
e8f0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65  AFF_TEXT );.  te
e900: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d  stcase( pOp->p2=
e910: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
e920: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e930: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
e940: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
e950: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
e960: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  p2==SQLITE_AFF_I
e970: 4e 54 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74  NTEGER );.  test
e980: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e990: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
e9a0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
e9b0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d  [pOp->p1];.  mem
e9c0: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
e9d0: 20 70 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45   pIn1);.  rc = E
e9e0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b  xpandBlob(pIn1);
e9f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
ea00: 6d 43 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d  mCast(pIn1, pOp-
ea10: 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  >p2, encoding);.
ea20: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
ea30: 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69  BSIZE(pIn1);.  i
ea40: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
ea50: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
ea60: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
ea70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ea80: 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70  T_CAST */../* Op
ea90: 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20 50  code: Eq P1 P2 P
eaa0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
eab0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72  sis: IF r[P3]==r
eac0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  [P1].**.** Compa
ead0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
eae0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
eaf0: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
eb00: 3d 3d 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  ==reg(P1) then.*
eb10: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
eb20: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
eb30: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
eb40: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
eb50: 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65  5, then.** store
eb60: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
eb70: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67  omparison in reg
eb80: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
eb90: 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  The SQLITE_AFF_M
eba0: 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50  ASK portion of P
ebb0: 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66  5 must be an aff
ebc0: 69 6e 69 74 79 20 63 68 61 72 61 63 74 65 72 20  inity character 
ebd0: 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  -.** SQLITE_AFF_
ebe0: 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46  TEXT, SQLITE_AFF
ebf0: 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f  _INTEGER, and so
ec00: 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d   forth. An attem
ec10: 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74  pt is made .** t
ec20: 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e  o coerce both in
ec30: 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74  puts according t
ec40: 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20  o this affinity 
ec50: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f  before the.** co
ec60: 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
ec70: 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  . If the SQLITE_
ec80: 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30  AFF_MASK is 0x00
ec90: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a  , then numeric.*
eca0: 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  * affinity is us
ecb0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
ecc0: 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65  e affinity conve
ecd0: 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65  rsions are store
ece0: 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74  d.** back into t
ecf0: 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
ed00: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53  rs P1 and P3.  S
ed10: 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61  o this opcode ca
ed20: 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69  n cause.** persi
ed30: 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f  stent changes to
ed40: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
ed50: 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  d P3..**.** Once
ed60: 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73   any conversions
ed70: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
ed80: 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76  e, and neither v
ed90: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a  alue is NULL, .*
eda0: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  * the values are
edb0: 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f   compared. If bo
edc0: 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c  th values are bl
edd0: 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28  obs then memcmp(
ede0: 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ) is.** used to 
edf0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65  determine the re
ee00: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d  sults of the com
ee10: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74  parison.  If bot
ee20: 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  h values.** are 
ee30: 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61  text, then the a
ee40: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
ee50: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70  ting function sp
ee60: 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34  ecified in.** P4
ee70: 20 69 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74   is used to do t
ee80: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
ee90: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65  If P4 is not spe
eea0: 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d  cified then.** m
eeb0: 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20  emcmp() is used 
eec0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20  to compare text 
eed0: 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68  string.  If both
eee0: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e   values are.** n
eef0: 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e  umeric, then a n
ef00: 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f  umeric compariso
ef10: 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68  n is used. If th
ef20: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
ef30: 61 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  are of different
ef40: 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d   types, then num
ef50: 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  bers are conside
ef60: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a  red less than.**
ef70: 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72   strings and str
ef80: 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ings are conside
ef90: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  red less than bl
efa0: 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  obs..**.** If SQ
efb0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73  LITE_NULLEQ is s
efc0: 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68  et in P5 then th
efd0: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
efe0: 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73  arison is always
eff0: 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20   either.** true 
f000: 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20  or false and is 
f010: 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20  never NULL.  If 
f020: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
f030: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  e NULL then the 
f040: 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d  result.** of com
f050: 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e  parison is true.
f060: 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72    If either oper
f070: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  and is NULL then
f080: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   the result is f
f090: 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74  alse..** If neit
f0a0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
f0b0: 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69  ULL the result i
f0c0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74  s the same as it
f0d0: 20 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20   would be if.** 
f0e0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  the SQLITE_NULLE
f0f0: 51 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74  Q flag were omit
f100: 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a  ted from P5..**.
f110: 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54  ** If both SQLIT
f120: 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51  E_STOREP2 and SQ
f130: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c  LITE_KEEPNULL fl
f140: 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65 6e  ags are set then
f150: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
f160: 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79  of r[P2] is only
f170: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
f180: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  new value is NUL
f190: 4c 20 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a  L or 0 (false)..
f1a0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
f1b0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
f1c0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
f1d0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
f1e0: 79 20 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f  y 1 (true)..*/./
f1f0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20  * Opcode: Ne P1 
f200: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
f210: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
f220: 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]!=r[P1].**.** T
f230: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
f240: 69 6b 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64  ike the Eq opcod
f250: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
f260: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
f270: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
f280: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
f290: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f  P1 and P3 are no
f2a0: 74 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68  t equal.  See th
f2b0: 65 20 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a  e Eq opcode for.
f2c0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
f2d0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
f2e0: 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f   If both SQLITE_
f2f0: 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49  STOREP2 and SQLI
f300: 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  TE_KEEPNULL flag
f310: 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74  s are set then t
f320: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f330: 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63   r[P2] is only c
f340: 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65  hanged if the ne
f350: 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20  w value is NULL 
f360: 6f 72 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20  or 1 (true)..** 
f370: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
f380: 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61  a prior r[P2] va
f390: 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lue will not be 
f3a0: 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 30  overwritten by 0
f3b0: 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20   (false)..*/./* 
f3c0: 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32  Opcode: Lt P1 P2
f3d0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
f3e0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c  opsis: IF r[P3]<
f3f0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
f400: 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69  are the values i
f410: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
f420: 64 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33  d P3.  If reg(P3
f430: 29 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  )<reg(P1) then.*
f440: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
f450: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
f460: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
f470: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
f480: 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  5 store.** the r
f490: 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
f4a0: 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e  son (0 or 1 or N
f4b0: 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74  ULL) into regist
f4c0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P2..**.** If 
f4d0: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
f4e0: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
f4f0: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
f500: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
f510: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
f520: 74 68 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68  then the take th
f530: 65 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20  e jump.  If the 
f540: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
f550: 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65  L .** bit is cle
f560: 61 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  ar then fall thr
f570: 6f 75 67 68 20 69 66 20 65 69 74 68 65 72 20 6f  ough if either o
f580: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a  perand is NULL..
f590: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
f5a0: 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f  _AFF_MASK portio
f5b0: 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20  n of P5 must be 
f5c0: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72  an affinity char
f5d0: 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54  acter -.** SQLIT
f5e0: 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49  E_AFF_TEXT, SQLI
f5f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20  TE_AFF_INTEGER, 
f600: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e  and so forth. An
f610: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
f620: 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62   .** to coerce b
f630: 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72  oth inputs accor
f640: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66  ding to this aff
f650: 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65  inity before the
f660: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
f670: 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53  s made. If the S
f680: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69  QLITE_AFF_MASK i
f690: 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d  s 0x00, then num
f6a0: 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79  eric.** affinity
f6b0: 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74   is used. Note t
f6c0: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
f6d0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
f6e0: 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20   stored.** back 
f6f0: 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  into the input r
f700: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
f710: 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63  P3.  So this opc
f720: 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a  ode can cause.**
f730: 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e   persistent chan
f740: 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ges to registers
f750: 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a   P1 and P3..**.*
f760: 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65  * Once any conve
f770: 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65  rsions have take
f780: 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69  n place, and nei
f790: 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55  ther value is NU
f7a0: 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  LL, .** the valu
f7b0: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  es are compared.
f7c0: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
f7d0: 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d  are blobs then m
f7e0: 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73  emcmp() is.** us
f7f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
f800: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
f810: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
f820: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a  If both values.*
f830: 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e  * are text, then
f840: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
f850: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
f860: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
f870: 0a 2a 2a 20 50 34 20 69 73 20 20 75 73 65 64 20  .** P4 is  used 
f880: 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72  to do the compar
f890: 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20  ison.  If P4 is 
f8a0: 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68  not specified th
f8b0: 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69  en.** memcmp() i
f8c0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
f8d0: 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20  e text string.  
f8e0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
f8f0: 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74  re.** numeric, t
f900: 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f  hen a numeric co
f910: 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64  mparison is used
f920: 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c  . If the two val
f930: 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69  ues.** are of di
f940: 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74  fferent types, t
f950: 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  hen numbers are 
f960: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f970: 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20  than.** strings 
f980: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
f990: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f9a0: 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f  than blobs..*/./
f9b0: 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20  * Opcode: Le P1 
f9c0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
f9d0: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
f9e0: 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]<=r[P1].**.** T
f9f0: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
fa00: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
fa10: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
fa20: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
fa30: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  if.** the conten
fa40: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
fa50: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
fa60: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f   equal to the co
fa70: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
fa80: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
fa90: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
faa0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fab0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
fac0: 63 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 50  code: Gt P1 P2 P
fad0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
fae0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b  sis: IF r[P3]>r[
faf0: 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P1].**.** This w
fb00: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
fb10: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
fb20: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
fb30: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
fb40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
fb50: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67  register P3 is g
fb60: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
fb70: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
fb80: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
fb90: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
fba0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
fbb0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
fbc0: 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32  Opcode: Ge P1 P2
fbd0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
fbe0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e  opsis: IF r[P3]>
fbf0: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
fc00: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
fc10: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
fc20: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
fc30: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
fc40: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
fc50: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
fc60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
fc70: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63  r equal to the c
fc80: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67  ontent of.** reg
fc90: 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74  ister P1.  See t
fca0: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
fcb0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
fcc0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  rmation..*/.case
fcd0: 20 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20   OP_Eq:         
fce0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
fcf0: 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e   TK_EQ, jump, in
fd00: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
fd10: 50 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20  P_Ne:           
fd20: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fd30: 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_NE, jump, in1,
fd40: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fd50: 4c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Lt:             
fd60: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fd70: 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  LT, jump, in1, i
fd80: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65  n3 */.case OP_Le
fd90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
fda0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45  /* same as TK_LE
fdb0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
fdc0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20   */.case OP_Gt: 
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fde0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20   same as TK_GT, 
fdf0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
fe00: 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20  /.case OP_Ge: { 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fe20: 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75  ame as TK_GE, ju
fe30: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
fe40: 20 20 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b    int res, res2;
fe50: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
fe60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
fe70: 6e 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73  n of pIn1 agains
fe80: 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72  t pIn3 */.  char
fe90: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
fea0: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
feb0: 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  se for compariso
fec0: 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  n */.  u16 flags
fed0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
fee0: 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61  py of initial va
fef0: 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61  lue of pIn1->fla
ff00: 67 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  gs */.  u16 flag
ff10: 73 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  s3;         /* C
ff20: 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76  opy of initial v
ff30: 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c  alue of pIn3->fl
ff40: 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ags */..  pIn1 =
ff50: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
ff60: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
ff70: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67  pOp->p3];.  flag
ff80: 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73  s1 = pIn1->flags
ff90: 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e  ;.  flags3 = pIn
ffa0: 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  3->flags;.  if( 
ffb0: 28 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33  (flags1 | flags3
ffc0: 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  )&MEM_Null ){.  
ffd0: 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68    /* One or both
ffe0: 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55   operands are NU
fff0: 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  LL */.    if( pO
10000 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e  p->p5 & SQLITE_N
10010 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ULLEQ ){.      /
10020 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  * If SQLITE_NULL
10030 45 51 20 69 73 20 73 65 74 20 28 77 68 69 63 68  EQ is set (which
10040 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65   will only happe
10050 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f  n if the operato
10060 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50  r is.      ** OP
10070 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68  _Eq or OP_Ne) th
10080 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
10090 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e   or not dependin
100a0 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20  g on whether.   
100b0 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74     ** or not bot
100c0 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e  h operands are n
100d0 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ull..      */.  
100e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
100f0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c  >opcode==OP_Eq |
10100 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
10110 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ne );.      as
10120 73 65 72 74 28 20 28 66 6c 61 67 73 31 20 26 20  sert( (flags1 & 
10130 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20  MEM_Cleared)==0 
10140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10150 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49   (pOp->p5 & SQLI
10160 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3d 3d  TE_JUMPIFNULL)==
10170 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
10180 66 6c 61 67 73 31 26 66 6c 61 67 73 33 26 4d 45  flags1&flags3&ME
10190 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20  M_Null)!=0.     
101a0 20 20 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d    && (flags3&MEM
101b0 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20  _Cleared)==0.   
101c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
101d0 73 20 3d 20 30 3b 20 20 2f 2a 20 4f 70 65 72 61  s = 0;  /* Opera
101e0 6e 64 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f  nds are equal */
101f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10200 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 20 20        res = 1;  
10210 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
10220 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20  not equal */.   
10230 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10240 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
10250 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20  NULLEQ is clear 
10260 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  and at least one
10270 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
10280 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
10290 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
102a0 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ways NULL..     
102b0 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20   ** The jump is 
102c0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c  taken if the SQL
102d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62  ITE_JUMPIFNULL b
102e0 69 74 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20  it is set..     
102f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
10300 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
10310 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
10320 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
10330 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20  Op->p2];.       
10340 20 69 43 6f 6d 70 61 72 65 20 3d 20 31 3b 20 20   iCompare = 1;  
10350 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72    /* Operands ar
10360 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20  e not equal */. 
10370 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
10380 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
10390 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74  ;.        MemSet
103a0 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
103b0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  EM_Null);.      
103c0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
103d0 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
103e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
103f0 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
10400 54 61 6b 65 6e 28 32 2c 33 29 3b 0a 20 20 20 20  Taken(2,3);.    
10410 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
10420 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
10430 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
10440 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
10450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10460 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10470 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
10480 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f      /* Neither o
10490 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20  perand is NULL. 
104a0 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
104b0 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69 74  . */.    affinit
104c0 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  y = pOp->p5 & SQ
104d0 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20  LITE_AFF_MASK;. 
104e0 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 3e     if( affinity>
104f0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10500 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
10510 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73   (flags1 | flags
10520 33 29 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  3)&MEM_Str ){.  
10530 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
10540 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  1 & (MEM_Int|MEM
10550 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Real|MEM_Str))=
10560 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  =MEM_Str ){.    
10570 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72        applyNumer
10580 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  icAffinity(pIn1,
10590 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  0);.          te
105a0 73 74 63 61 73 65 28 20 66 6c 61 67 73 33 21 3d  stcase( flags3!=
105b0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29 3b 20 2f  pIn3->flags ); /
105c0 2a 20 50 6f 73 73 69 62 6c 65 20 69 66 20 70 49  * Possible if pI
105d0 6e 31 3d 3d 70 49 6e 33 20 2a 2f 0a 20 20 20 20  n1==pIn3 */.    
105e0 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 70        flags3 = p
105f0 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  In3->flags;.    
10600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10610 28 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d  ( (flags3 & (MEM
10620 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45  _Int|MEM_Real|ME
10630 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72  M_Str))==MEM_Str
10640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
10650 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
10660 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20 20 20 20  ty(pIn3,0);.    
10670 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10680 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68      /* Handle th
10690 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
106a0 20 69 6e 74 65 67 65 72 20 63 6f 6d 70 61 72 69   integer compari
106b0 73 6f 6e 20 68 65 72 65 2c 20 61 73 20 61 6e 0a  son here, as an.
106c0 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a        ** optimiz
106d0 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f 69 64 20  ation, to avoid 
106e0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
106f0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 2a 2f  3MemCompare() */
10700 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 31  .      if( (pIn1
10710 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 33 2d 3e  ->flags & pIn3->
10720 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
10730 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
10740 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3e 20 70  f( pIn3->u.i > p
10750 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20  In1->u.i ){ res 
10760 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61  = +1; goto compa
10770 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20  re_op; }.       
10780 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3c   if( pIn3->u.i <
10790 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65   pIn1->u.i ){ re
107a0 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20 63 6f 6d  s = -1; goto com
107b0 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20  pare_op; }.     
107c0 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
107d0 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65      goto compare
107e0 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _op;.      }.   
107f0 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e   }else if( affin
10800 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
10810 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 69 66  TEXT ){.      if
10820 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f  ( (flags1 & MEM_
10830 53 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67  Str)==0 && (flag
10840 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  s1 & (MEM_Int|ME
10850 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20  M_Real))!=0 ){. 
10860 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
10870 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
10880 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
10890 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 31    testcase( pIn1
108a0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
108b0 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  al );.        sq
108c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
108d0 6e 67 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f  ngify(pIn1, enco
108e0 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  ding, 1);.      
108f0 20 20 74 65 73 74 63 61 73 65 28 20 28 66 6c 61    testcase( (fla
10900 67 73 31 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20  gs1&MEM_Dyn) != 
10910 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pIn1->flags&MEM
10920 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20  _Dyn) );.       
10930 20 66 6c 61 67 73 31 20 3d 20 28 70 49 6e 31 2d   flags1 = (pIn1-
10940 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79  >flags & ~MEM_Ty
10950 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73  peMask) | (flags
10960 31 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b  1 & MEM_TypeMask
10970 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10980 74 28 20 70 49 6e 31 21 3d 70 49 6e 33 20 29 3b  t( pIn1!=pIn3 );
10990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
109a0 66 28 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d  f( (flags3 & MEM
109b0 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61  _Str)==0 && (fla
109c0 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d  gs3 & (MEM_Int|M
109d0 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a  EM_Real))!=0 ){.
109e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
109f0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
10a00 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
10a10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
10a20 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  3->flags & MEM_R
10a30 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  eal );.        s
10a40 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72  qlite3VdbeMemStr
10a50 69 6e 67 69 66 79 28 70 49 6e 33 2c 20 65 6e 63  ingify(pIn3, enc
10a60 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20  oding, 1);.     
10a70 20 20 20 74 65 73 74 63 61 73 65 28 20 28 66 6c     testcase( (fl
10a80 61 67 73 33 26 4d 45 4d 5f 44 79 6e 29 20 21 3d  ags3&MEM_Dyn) !=
10a90 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45   (pIn3->flags&ME
10aa0 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20  M_Dyn) );.      
10ab0 20 20 66 6c 61 67 73 33 20 3d 20 28 70 49 6e 33    flags3 = (pIn3
10ac0 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54  ->flags & ~MEM_T
10ad0 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
10ae0 73 33 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73  s3 & MEM_TypeMas
10af0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
10b00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  }.    assert( pO
10b10 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
10b20 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34  LLSEQ || pOp->p4
10b30 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  .pColl==0 );.   
10b40 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
10b50 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70  mCompare(pIn3, p
10b60 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  In1, pOp->p4.pCo
10b70 6c 6c 29 3b 0a 20 20 7d 0a 63 6f 6d 70 61 72 65  ll);.  }.compare
10b80 5f 6f 70 3a 0a 20 20 73 77 69 74 63 68 28 20 70  _op:.  switch( p
10b90 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
10ba0 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20    case OP_Eq:   
10bb0 20 72 65 73 32 20 3d 20 72 65 73 3d 3d 30 3b 20   res2 = res==0; 
10bc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10bd0 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65  ase OP_Ne:    re
10be0 73 32 20 3d 20 72 65 73 3b 20 20 20 20 20 20 20  s2 = res;       
10bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10c00 20 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 32 20   OP_Lt:    res2 
10c10 3d 20 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72  = res<0;      br
10c20 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
10c30 5f 4c 65 3a 20 20 20 20 72 65 73 32 20 3d 20 72  _Le:    res2 = r
10c40 65 73 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es<=0;     break
10c50 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74  ;.    case OP_Gt
10c60 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3e  :    res2 = res>
10c70 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  0;      break;. 
10c80 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
10c90 20 20 72 65 73 32 20 3d 20 72 65 73 3e 3d 30 3b    res2 = res>=0;
10ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
10cb0 0a 20 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63  .  /* Undo any c
10cc0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61  hanges made by a
10cd0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74  pplyAffinity() t
10ce0 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
10cf0 73 74 65 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65  sters. */.  asse
10d00 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  rt( (pIn1->flags
10d10 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28   & MEM_Dyn) == (
10d20 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e  flags1 & MEM_Dyn
10d30 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  ) );.  pIn1->fla
10d40 67 73 20 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61  gs = flags1;.  a
10d50 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c  ssert( (pIn3->fl
10d60 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d  ags & MEM_Dyn) =
10d70 3d 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f  = (flags3 & MEM_
10d80 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e  Dyn) );.  pIn3->
10d90 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a  flags = flags3;.
10da0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
10db0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
10dc0 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61  ){.    pOut = &a
10dd0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
10de0 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 72 65 73    iCompare = res
10df0 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73  ;.    res2 = res
10e00 32 21 3d 30 3b 20 20 2f 2a 20 46 6f 72 20 74 68  2!=0;  /* For th
10e10 69 73 20 70 61 74 68 20 72 65 73 32 20 6d 75 73  is path res2 mus
10e20 74 20 62 65 20 65 78 61 63 74 6c 79 20 30 20 6f  t be exactly 0 o
10e30 72 20 31 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  r 1 */.    if( (
10e40 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
10e50 5f 4b 45 45 50 4e 55 4c 4c 29 21 3d 30 20 29 7b  _KEEPNULL)!=0 ){
10e60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4b 45  .      /* The KE
10e70 45 50 4e 55 4c 4c 20 66 6c 61 67 20 70 72 65 76  EPNULL flag prev
10e80 65 6e 74 73 20 4f 50 5f 45 71 20 66 72 6f 6d 20  ents OP_Eq from 
10e90 6f 76 65 72 77 72 69 74 69 6e 67 20 61 20 4e 55  overwriting a NU
10ea0 4c 4c 20 77 69 74 68 20 31 0a 20 20 20 20 20 20  LL with 1.      
10eb0 2a 2a 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20  ** and prevents 
10ec0 4f 50 5f 4e 65 20 66 72 6f 6d 20 6f 76 65 72 77  OP_Ne from overw
10ed0 72 69 74 69 6e 67 20 4e 55 4c 4c 20 77 69 74 68  riting NULL with
10ee0 20 30 2e 20 20 54 68 69 73 20 66 6c 61 67 0a 20   0.  This flag. 
10ef0 20 20 20 20 20 2a 2a 20 69 73 20 6f 6e 6c 79 20       ** is only 
10f00 75 73 65 64 20 69 6e 20 63 6f 6e 74 65 78 74 73  used in contexts
10f10 20 77 68 65 72 65 20 65 69 74 68 65 72 3a 0a 20   where either:. 
10f20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20 6f 70       **   (1) op
10f30 3d 3d 4f 50 5f 45 71 20 26 26 20 28 72 5b 50 32  ==OP_Eq && (r[P2
10f40 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d  ]==NULL || r[P2]
10f50 3d 3d 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ==0).      **   
10f60 28 32 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (2) op==OP_Ne &&
10f70 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c   (r[P2]==NULL ||
10f80 20 72 5b 50 32 5d 3d 3d 31 29 0a 20 20 20 20 20   r[P2]==1).     
10f90 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 69 74   ** Therefore it
10fa0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
10fb0 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 63  y to check the c
10fc0 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20  ontent of r[P2] 
10fd0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 4e 55 4c  for.      ** NUL
10fe0 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  L. */.      asse
10ff0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
11000 3d 4f 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d 3e 6f  =OP_Ne || pOp->o
11010 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a  pcode==OP_Eq );.
11020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
11030 73 32 3d 3d 30 20 7c 7c 20 72 65 73 32 3d 3d 31  s2==0 || res2==1
11040 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11050 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70  se( res2==0 && p
11060 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
11070 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  q );.      testc
11080 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20  ase( res2==1 && 
11090 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
110a0 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Eq );.      test
110b0 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26  case( res2==0 &&
110c0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
110d0 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
110e0 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26  tcase( res2==1 &
110f0 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
11100 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  P_Ne );.      if
11110 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  ( (pOp->opcode==
11120 4f 50 5f 45 71 29 3d 3d 72 65 73 32 20 29 20 62  OP_Eq)==res2 ) b
11130 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11140 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
11150 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d  (p, pOut);.    M
11160 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
11170 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
11180 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65    pOut->u.i = re
11190 73 32 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  s2;.    REGISTER
111a0 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
111b0 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pOut);.  }else{.
111c0 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
111d0 6b 65 6e 28 72 65 73 21 3d 30 2c 20 28 70 4f 70  ken(res!=0, (pOp
111e0 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55  ->p5 & SQLITE_NU
111f0 4c 4c 45 51 29 3f 32 3a 33 29 3b 0a 20 20 20 20  LLEQ)?2:3);.    
11200 69 66 28 20 72 65 73 32 20 29 7b 0a 20 20 20 20  if( res2 ){.    
11210 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
11220 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  2;.    }.  }.  b
11230 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
11240 64 65 3a 20 45 6c 73 65 4e 6f 74 45 71 20 2a 20  de: ElseNotEq * 
11250 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
11260 68 69 73 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  his opcode must 
11270 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
11280 6f 77 20 61 6e 20 4f 50 5f 4c 74 20 6f 72 20 4f  ow an OP_Lt or O
11290 50 5f 47 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  P_Gt comparison 
112a0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 66 20  operator..** If 
112b0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f  result of an OP_
112c0 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e  Eq comparison on
112d0 20 74 68 65 20 73 61 6d 65 20 74 77 6f 20 6f 70   the same two op
112e0 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20  erands.** would 
112f0 68 61 76 65 20 62 65 20 4e 55 4c 4c 20 6f 72 20  have be NULL or 
11300 66 61 6c 73 65 20 28 30 29 2c 20 74 68 65 6e 20  false (0), then 
11310 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
11320 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75   .** If the resu
11330 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63  lt of an OP_Eq c
11340 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65  omparison on the
11350 20 74 77 6f 20 70 72 65 76 69 6f 75 73 20 6f 70   two previous op
11360 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20  erands.** would 
11370 68 61 76 65 20 62 65 65 6e 20 74 72 75 65 20 28  have been true (
11380 31 29 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  1), then fall th
11390 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rough..*/.case O
113a0 50 5f 45 6c 73 65 4e 6f 74 45 71 3a 20 7b 20 20  P_ElseNotEq: {  
113b0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
113c0 54 4b 5f 45 53 43 41 50 45 2c 20 6a 75 6d 70 20  TK_ESCAPE, jump 
113d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
113e0 3e 61 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74  >aOp );.  assert
113f0 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
11400 3d 3d 4f 50 5f 4c 74 20 7c 7c 20 70 4f 70 5b 2d  ==OP_Lt || pOp[-
11410 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 47 74  1].opcode==OP_Gt
11420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
11430 70 5b 2d 31 5d 2e 70 35 20 26 20 53 51 4c 49 54  p[-1].p5 & SQLIT
11440 45 5f 53 54 4f 52 45 50 32 20 29 3b 0a 20 20 56  E_STOREP2 );.  V
11450 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 69  dbeBranchTaken(i
11460 43 6f 6d 70 61 72 65 21 3d 30 2c 20 32 29 3b 0a  Compare!=0, 2);.
11470 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65 21 3d    if( iCompare!=
11480 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
11490 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
114a0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72  ../* Opcode: Per
114b0 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50  mutation * * * P
114c0 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  4 *.**.** Set th
114d0 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73  e permutation us
114e0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d  ed by the OP_Com
114f0 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20 69 6e  pare operator in
11500 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
11510 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  truction.  The p
11520 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 73 74  ermutation is st
11530 6f 72 65 64 20 69 6e 20 74 68 65 20 50 34 20 6f  ored in the P4 o
11540 70 65 72 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  perand..**.** Th
11550 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73  e permutation is
11560 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69   only valid unti
11570 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 43 6f  l the next OP_Co
11580 6d 70 61 72 65 20 74 68 61 74 20 68 61 73 0a 2a  mpare that has.*
11590 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52  * the OPFLAG_PER
115a0 4d 55 54 45 20 62 69 74 20 73 65 74 20 69 6e 20  MUTE bit set in 
115b0 50 35 2e 20 54 79 70 69 63 61 6c 6c 79 20 74 68  P5. Typically th
115c0 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
115d0 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63 63 75   should .** occu
115e0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72  r immediately pr
115f0 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ior to the OP_Co
11600 6d 70 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mpare..**.** The
11610 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
11620 6e 20 74 68 65 20 50 34 20 69 6e 74 65 67 65 72  n the P4 integer
11630 20 61 72 72 61 79 20 69 73 20 74 68 65 20 6c 65   array is the le
11640 6e 67 74 68 20 6f 66 20 74 68 65 20 61 72 72 61  ngth of the arra
11650 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
11660 74 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f 66  t become part of
11670 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
11680 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72  ..*/.case OP_Per
11690 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73  mutation: {.  as
116a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
116b0 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29  e==P4_INTARRAY )
116c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
116d0 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 73 73 65  >p4.ai );.  asse
116e0 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64  rt( pOp[1].opcod
116f0 65 3d 3d 4f 50 5f 43 6f 6d 70 61 72 65 20 29 3b  e==OP_Compare );
11700 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31  .  assert( pOp[1
11710 5d 2e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45  ].p5 & OPFLAG_PE
11720 52 4d 55 54 45 20 29 3b 0a 20 20 62 72 65 61 6b  RMUTE );.  break
11730 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
11740 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50 33  Compare P1 P2 P3
11750 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
11760 69 73 3a 20 72 5b 50 31 40 50 33 5d 20 3c 2d 3e  is: r[P1@P3] <->
11770 20 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20   r[P2@P3].**.** 
11780 43 6f 6d 70 61 72 65 20 74 77 6f 20 76 65 63 74  Compare two vect
11790 6f 72 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ors of registers
117a0 20 69 6e 20 72 65 67 28 50 31 29 2e 2e 72 65 67   in reg(P1)..reg
117b0 28 50 31 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20  (P1+P3-1) (call 
117c0 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22  this.** vector "
117d0 41 22 29 20 61 6e 64 20 69 6e 20 72 65 67 28 50  A") and in reg(P
117e0 32 29 2e 2e 72 65 67 28 50 32 2b 50 33 2d 31 29  2)..reg(P2+P3-1)
117f0 20 28 22 42 22 29 2e 20 20 53 61 76 65 20 74 68   ("B").  Save th
11800 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74  e result of.** t
11810 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f  he comparison fo
11820 72 20 75 73 65 20 62 79 20 74 68 65 20 6e 65 78  r use by the nex
11830 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75  t OP_Jump instru
11840 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  ct..**.** If P5 
11850 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 50  has the OPFLAG_P
11860 45 52 4d 55 54 45 20 62 69 74 20 73 65 74 2c 20  ERMUTE bit set, 
11870 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72 20 6f  then the order o
11880 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a  f comparison is.
11890 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
118a0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
118b0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20   OP_Permutation 
118c0 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68  operator.  If th
118d0 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d  e.** OPFLAG_PERM
118e0 55 54 45 20 62 69 74 20 69 73 20 63 6c 65 61 72  UTE bit is clear
118f0 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  , then register 
11900 61 72 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20  are compared in 
11910 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72  sequential.** or
11920 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  der..**.** P4 is
11930 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
11940 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
11950 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
11960 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a  ences and sort.*
11970 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74 68 65  * orders for the
11980 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
11990 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 70  e permutation ap
119a0 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73 74 65  plies to registe
119b0 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65  rs.** only.  The
119c0 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74   KeyInfo element
119d0 73 20 61 72 65 20 75 73 65 64 20 73 65 71 75 65  s are used seque
119e0 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntially..**.** T
119f0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
11a00 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73   a sort comparis
11a10 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d  on, so NULLs com
11a20 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e  pare equal,.** N
11a30 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20 74 68  ULLs are less th
11a40 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62  an numbers, numb
11a50 65 72 73 20 61 72 65 20 6c 65 73 73 20 74 68 61  ers are less tha
11a60 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e  n strings,.** an
11a70 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 6c 65  d strings are le
11a80 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
11a90 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72  /.case OP_Compar
11aa0 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  e: {.  int n;.  
11ab0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b  int i;.  int p1;
11ac0 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e  .  int p2;.  con
11ad0 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
11ae0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Info;.  int idx;
11af0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
11b00 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
11b10 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
11b20 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20  se on this term 
11b30 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
11b40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11b50 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73  for DESCENDING s
11b60 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  ort order */.  i
11b70 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
11b80 20 20 2f 2a 20 54 68 65 20 70 65 72 6d 75 74 61    /* The permuta
11b90 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 28  tion */..  if( (
11ba0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
11bb0 5f 50 45 52 4d 55 54 45 29 3d 3d 30 20 29 7b 0a  _PERMUTE)==0 ){.
11bc0 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d 20 30      aPermute = 0
11bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11be0 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
11bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
11c00 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
11c10 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 29 3b 0a  _Permutation );.
11c20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
11c30 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f 49  -1].p4type==P4_I
11c40 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 20 20 61  NTARRAY );.    a
11c50 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 5b 2d 31  Permute = pOp[-1
11c60 5d 2e 70 34 2e 61 69 20 2b 20 31 3b 0a 20 20 20  ].p4.ai + 1;.   
11c70 20 61 73 73 65 72 74 28 20 61 50 65 72 6d 75 74   assert( aPermut
11c80 65 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 20  e!=0 );.  }.  n 
11c90 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 4b 65  = pOp->p3;.  pKe
11ca0 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
11cb0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65  pKeyInfo;.  asse
11cc0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73  rt( n>0 );.  ass
11cd0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
11ce0 20 29 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e   );.  p1 = pOp->
11cf0 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e  p1;.  p2 = pOp->
11d00 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p2;.#ifdef SQLIT
11d10 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61 50  E_DEBUG.  if( aP
11d20 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69 6e  ermute ){.    in
11d30 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20 20  t k, mx = 0;.   
11d40 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b   for(k=0; k<n; k
11d50 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74 65  ++) if( aPermute
11d60 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61 50  [k]>mx ) mx = aP
11d70 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20 61  ermute[k];.    a
11d80 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
11d90 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  1+mx<=(p->nMem+1
11da0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
11db0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11dc0 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 28  p2>0 && p2+mx<=(
11dd0 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
11de0 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d  Cursor)+1 );.  }
11df0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11e00 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d  ( p1>0 && p1+n<=
11e10 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
11e20 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
11e30 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26    assert( p2>0 &
11e40 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p2+n<=(p->nMem
11e50 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
11e60 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  +1 );.  }.#endif
11e70 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
11e80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11e90 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64  <n; i++){.    id
11ea0 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61  x = aPermute ? a
11eb0 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a  Permute[i] : i;.
11ec0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
11ed0 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b  sValid(&aMem[p1+
11ee0 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61 73 73  idx]) );.    ass
11ef0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
11f00 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29  &aMem[p2+idx]) )
11f10 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
11f20 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d  RACE(p1+idx, &aM
11f30 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20  em[p1+idx]);.   
11f40 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
11f50 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32  p2+idx, &aMem[p2
11f60 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65  +idx]);.    asse
11f70 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e  rt( i<pKeyInfo->
11f80 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43  nField );.    pC
11f90 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
11fa0 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52  aColl[i];.    bR
11fb0 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ev = pKeyInfo->a
11fc0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
11fd0 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c    iCompare = sql
11fe0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
11ff0 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61  aMem[p1+idx], &a
12000 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f  Mem[p2+idx], pCo
12010 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ll);.    if( iCo
12020 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69  mpare ){.      i
12030 66 28 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61  f( bRev ) iCompa
12040 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a  re = -iCompare;.
12050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12060 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
12070 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75  }../* Opcode: Ju
12080 6d 70 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  mp P1 P2 P3 * *.
12090 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68  **.** Jump to th
120a0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
120b0 20 61 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c   address P1, P2,
120c0 20 6f 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67   or P3 depending
120d0 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69   on whether.** i
120e0 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
120f0 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73  t OP_Compare ins
12100 74 72 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20  truction the P1 
12110 76 65 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20  vector was less 
12120 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  than.** equal to
12130 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
12140 6e 20 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c  n the P2 vector,
12150 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
12160 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20  /.case OP_Jump: 
12170 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
12180 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69   jump */.  if( i
12190 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20  Compare<0 ){.   
121a0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
121b0 28 30 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f  (0,3); pOp = &aO
121c0 70 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a  p[pOp->p1 - 1];.
121d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
121e0 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 56  pare==0 ){.    V
121f0 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31  dbeBranchTaken(1
12200 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b  ,3); pOp = &aOp[
12210 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20  pOp->p2 - 1];.  
12220 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
12230 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b  ranchTaken(2,3);
12240 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d   pOp = &aOp[pOp-
12250 3e 70 33 20 2d 20 31 5d 3b 0a 20 20 7d 0a 20 20  >p3 - 1];.  }.  
12260 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
12270 6f 64 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50  ode: And P1 P2 P
12280 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
12290 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20  s: r[P3]=(r[P1] 
122a0 26 26 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  && r[P2]).**.** 
122b0 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
122c0 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75   AND of the valu
122d0 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  es in registers 
122e0 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
122f0 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
12300 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
12310 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  P3..**.** If eit
12320 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20  her P1 or P2 is 
12330 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e 20 74  0 (false) then t
12340 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 20 65  he result is 0 e
12350 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 74  ven if.** the ot
12360 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
12370 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 74  L.  A NULL and t
12380 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73  rue or two NULLs
12390 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c 4c 20   give.** a NULL 
123a0 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70  output..*/./* Op
123b0 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32 20 50  code: Or P1 P2 P
123c0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
123d0 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20  s: r[P3]=(r[P1] 
123e0 7c 7c 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  || r[P2]).**.** 
123f0 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
12400 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
12410 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
12420 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
12430 74 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20  tore the answer 
12440 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
12450 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
12460 50 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a  P1 or P2 is nonz
12470 65 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20  ero (true) then 
12480 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20  the result is 1 
12490 28 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69  (true).** even i
124a0 66 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  f the other inpu
124b0 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
124c0 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20  LL and false or 
124d0 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76  two NULLs.** giv
124e0 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e  e a NULL output.
124f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a  .*/.case OP_And:
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12510 20 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c   same as TK_AND,
12520 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
12530 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b  */.case OP_Or: {
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12550 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69  same as TK_OR, i
12560 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
12570 0a 20 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a  .  int v1;    /*
12580 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20   Left operand:  
12590 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55  0==FALSE, 1==TRU
125a0 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72  E, 2==UNKNOWN or
125b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76   NULL */.  int v
125c0 32 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f  2;    /* Right o
125d0 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45  perand: 0==FALSE
125e0 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e  , 1==TRUE, 2==UN
125f0 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f  KNOWN or NULL */
12600 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
12610 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
12620 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
12630 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76  EM_Null ){.    v
12640 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 = 2;.  }else{.
12650 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
12660 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
12670 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  1)!=0;.  }.  pIn
12680 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
12690 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e  2];.  if( pIn2->
126a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
126b0 20 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a   ){.    v2 = 2;.
126c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20    }else{.    v2 
126d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
126e0 56 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a  Value(pIn2)!=0;.
126f0 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f    }.  if( pOp->o
12700 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b  pcode==OP_And ){
12710 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
12720 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12730 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20  and_logic[] = { 
12740 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32  0, 0, 0, 0, 1, 2
12750 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20  , 0, 2, 2 };.   
12760 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b   v1 = and_logic[
12770 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73  v1*3+v2];.  }els
12780 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
12790 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
127a0 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b  r or_logic[] = {
127b0 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20   0, 1, 2, 1, 1, 
127c0 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20  1, 2, 1, 2 };.  
127d0 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b    v1 = or_logic[
127e0 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20  v1*3+v2];.  }.  
127f0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
12800 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d  ->p3];.  if( v1=
12810 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74  =2 ){.    MemSet
12820 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
12830 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  EM_Null);.  }els
12840 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  e{.    pOut->u.i
12850 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65   = v1;.    MemSe
12860 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
12870 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20  MEM_Int);.  }.  
12880 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
12890 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a  ode: Not P1 P2 *
128a0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
128b0 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50 31 5d 0a  : r[P2]= !r[P1].
128c0 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  **.** Interpret 
128d0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
128e0 69 73 74 65 72 20 50 31 20 61 73 20 61 20 62 6f  ister P1 as a bo
128f0 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 53 74  olean value.  St
12900 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65  ore the.** boole
12910 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  an complement in
12920 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
12930 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
12940 65 67 69 73 74 65 72 20 50 31 20 69 73 20 0a 2a  egister P1 is .*
12950 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 4e  * NULL, then a N
12960 55 4c 4c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ULL is stored in
12970 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
12980 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Not: {          
12990 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
129a0 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75   TK_NOT, in1, ou
129b0 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
129c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
129d0 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
129e0 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
129f0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
12a00 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49  pOut);.  if( (pI
12a10 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
12a20 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Null)==0 ){.    
12a30 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
12a40 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d  M_Int;.    pOut-
12a50 3e 75 2e 69 20 3d 20 21 73 71 6c 69 74 65 33 56  >u.i = !sqlite3V
12a60 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
12a70 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
12a80 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
12a90 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
12aa0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
12ab0 50 31 5d 3d 20 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a  P1]= ~r[P1].**.*
12ac0 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
12ad0 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
12ae0 74 65 72 20 50 31 20 61 73 20 61 6e 20 69 6e 74  ter P1 as an int
12af0 65 67 65 72 2e 20 20 53 74 6f 72 65 20 74 68 65  eger.  Store the
12b00 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d  .** ones-complem
12b10 65 6e 74 20 6f 66 20 74 68 65 20 50 31 20 76 61  ent of the P1 va
12b20 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
12b30 72 20 50 32 2e 20 20 49 66 20 50 31 20 68 6f 6c  r P2.  If P1 hol
12b40 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65  ds.** a NULL the
12b50 6e 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69  n store a NULL i
12b60 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
12b70 5f 42 69 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20  _BitNot: {      
12b80 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
12b90 73 20 54 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31  s TK_BITNOT, in1
12ba0 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
12bb0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
12bc0 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
12bd0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
12be0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
12bf0 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69 66 28  ull(pOut);.  if(
12c00 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
12c10 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
12c20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
12c30 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
12c40 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e 73 71 6c 69  Out->u.i = ~sqli
12c50 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
12c60 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
12c70 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12c80 3a 20 4f 6e 63 65 20 50 31 20 50 32 20 2a 20 2a  : Once P1 P2 * *
12c90 20 2a 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68   *.**.** Fall th
12ca0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
12cb0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  t instruction th
12cc0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
12cd0 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 65  s opcode is.** e
12ce0 6e 63 6f 75 6e 74 65 72 65 64 20 6f 6e 20 65 61  ncountered on ea
12cf0 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ch invocation of
12d00 20 74 68 65 20 62 79 74 65 2d 63 6f 64 65 20 70   the byte-code p
12d10 72 6f 67 72 61 6d 2e 20 20 4a 75 6d 70 20 74 6f  rogram.  Jump to
12d20 20 50 32 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 65   P2.** on the se
12d30 63 6f 6e 64 20 61 6e 64 20 61 6c 6c 20 73 75 62  cond and all sub
12d40 73 65 71 75 65 6e 74 20 65 6e 63 6f 75 6e 74 65  sequent encounte
12d50 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 73 61  rs during the sa
12d60 6d 65 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a  me invocation..*
12d70 2a 0a 2a 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 70  *.** Top-level p
12d80 72 6f 67 72 61 6d 73 20 64 65 74 65 72 6d 69 6e  rograms determin
12d90 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
12da0 6f 6e 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 20  on by comparing 
12db0 74 68 65 20 50 31 0a 2a 2a 20 6f 70 65 72 61 6e  the P1.** operan
12dc0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 50 31  d against the P1
12dd0 20 6f 70 65 72 61 6e 64 20 6f 6e 20 74 68 65 20   operand on the 
12de0 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 20 61  OP_Init opcode a
12df0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
12e00 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
12e10 6d 2e 20 20 49 66 20 74 68 65 20 50 31 20 76 61  m.  If the P1 va
12e20 6c 75 65 73 20 64 69 66 66 65 72 2c 20 74 68 65  lues differ, the
12e30 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 61  n fall through a
12e40 6e 64 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 50  nd make.** the P
12e50 31 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  1 of this opcode
12e60 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 50 31   equal to the P1
12e70 20 6f 66 20 4f 50 5f 49 6e 69 74 2e 20 20 49 66   of OP_Init.  If
12e80 20 50 31 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   P1 values are.*
12e90 2a 20 74 68 65 20 73 61 6d 65 20 74 68 65 6e 20  * the same then 
12ea0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 0a 2a  take the jump..*
12eb0 2a 0a 2a 2a 20 46 6f 72 20 73 75 62 70 72 6f 67  *.** For subprog
12ec0 72 61 6d 73 2c 20 74 68 65 72 65 20 69 73 20 61  rams, there is a
12ed0 20 62 69 74 6d 61 73 6b 20 69 6e 20 74 68 65 20   bitmask in the 
12ee0 56 64 62 65 46 72 61 6d 65 20 74 68 61 74 20 64  VdbeFrame that d
12ef0 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65  etermines.** whe
12f00 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
12f10 6a 75 6d 70 20 73 68 6f 75 6c 64 20 62 65 20 74  jump should be t
12f20 61 6b 65 6e 2e 20 20 54 68 65 20 62 69 74 6d 61  aken.  The bitma
12f30 73 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a  sk is necessary.
12f40 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 73  ** because the s
12f50 65 6c 66 2d 61 6c 74 65 72 69 6e 67 20 63 6f 64  elf-altering cod
12f60 65 20 74 72 69 63 6b 20 64 6f 65 73 20 6e 6f 74  e trick does not
12f70 20 77 6f 72 6b 20 66 6f 72 20 72 65 63 75 72 73   work for recurs
12f80 69 76 65 0a 2a 2a 20 74 72 69 67 67 65 72 73 2e  ive.** triggers.
12f90 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 6e 63 65  .*/.case OP_Once
12fa0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
12fb0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 75 33 32  /* jump */.  u32
12fc0 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
12fd0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12fe0 73 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75  s of this instru
12ff0 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72  ction */.  asser
13000 74 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 6f 70 63  t( p->aOp[0].opc
13010 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
13020 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
13030 29 7b 0a 20 20 20 20 69 41 64 64 72 20 3d 20 28  ){.    iAddr = (
13040 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f  int)(pOp - p->aO
13050 70 29 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  p);.    if( (p->
13060 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41  pFrame->aOnce[iA
13070 64 64 72 2f 38 5d 20 26 20 28 31 3c 3c 28 69 41  ddr/8] & (1<<(iA
13080 64 64 72 20 26 20 37 29 29 29 21 3d 30 20 29 7b  ddr & 7)))!=0 ){
13090 0a 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63  .      VdbeBranc
130a0 68 54 61 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20  hTaken(1, 2);.  
130b0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
130c0 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _p2;.    }.    p
130d0 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 5b  ->pFrame->aOnce[
130e0 69 41 64 64 72 2f 38 5d 20 7c 3d 20 31 3c 3c 28  iAddr/8] |= 1<<(
130f0 69 41 64 64 72 20 26 20 37 29 3b 0a 20 20 7d 65  iAddr & 7);.  }e
13100 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
13110 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e  aOp[0].p1==pOp->
13120 70 31 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  p1 ){.      Vdbe
13130 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32  BranchTaken(1, 2
13140 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75  );.      goto ju
13150 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a  mp_to_p2;.    }.
13160 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68    }.  VdbeBranch
13170 54 61 6b 65 6e 28 30 2c 20 32 29 3b 0a 20 20 70  Taken(0, 2);.  p
13180 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e 61 4f 70 5b  Op->p1 = p->aOp[
13190 30 5d 2e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a  0].p1;.  break;.
131a0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
131b0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
131c0 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
131d0 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
131e0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 74 72  egister P1 is tr
131f0 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a  ue.  The value.*
13200 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
13210 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 75  true if it is nu
13220 6d 65 72 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65  meric and non-ze
13230 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ro.  If the valu
13240 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55  e.** in P1 is NU
13250 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  LL then take the
13260 20 6a 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c   jump if and onl
13270 79 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a  y if P3 is non-z
13280 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ero..*/./* Opcod
13290 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20 50  e: IfNot P1 P2 P
132a0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
132b0 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
132c0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
132d0 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20 54 68  P1 is False.  Th
132e0 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f  e value.** is co
132f0 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65 20 69  nsidered false i
13300 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65 72  f it has a numer
13310 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f  ic value of zero
13320 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
13330 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c  ** in P1 is NULL
13340 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
13350 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  ump if and only 
13360 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72  if P3 is non-zer
13370 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  o..*/.case OP_If
13380 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
13390 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
133a0 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a  /.case OP_IfNot:
133b0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
133c0 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
133d0 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20 3d 20  int c;.  pIn1 = 
133e0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
133f0 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
13400 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
13410 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b      c = pOp->p3;
13420 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
13430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13440 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
13450 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
13460 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30  ntValue(pIn1)!=0
13470 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d 20  ;.#else.    c = 
13480 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
13490 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b  alue(pIn1)!=0.0;
134a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
134b0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
134c0 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a  IfNot ) c = !c;.
134d0 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68    }.  VdbeBranch
134e0 54 61 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a  Taken(c!=0, 2);.
134f0 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 67    if( c ){.    g
13500 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
13510 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
13520 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c  /* Opcode: IsNul
13530 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
13540 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
13550 50 31 5d 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50  P1]==NULL goto P
13560 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  2.**.** Jump to 
13570 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
13580 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
13590 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
135a0 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20  OP_IsNull: {    
135b0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
135c0 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75  as TK_ISNULL, ju
135d0 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
135e0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
135f0 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  1];.  VdbeBranch
13600 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c  Taken( (pIn1->fl
13610 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21  ags & MEM_Null)!
13620 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 70  =0, 2);.  if( (p
13630 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
13640 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Null)!=0 ){.   
13650 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
13660 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
13670 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  ../* Opcode: Not
13680 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a  Null P1 P2 * * *
13690 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
136a0 20 72 5b 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f 74   r[P1]!=NULL got
136b0 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20  o P2.**.** Jump 
136c0 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
136d0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
136e0 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20  1 is not NULL.  
136f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e  .*/.case OP_NotN
13700 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
13710 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
13720 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69  NOTNULL, jump, i
13730 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
13740 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
13750 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
13760 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
13770 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 32   MEM_Null)==0, 2
13780 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
13790 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
137a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )==0 ){.    goto
137b0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
137c0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
137d0 4f 70 63 6f 64 65 3a 20 49 66 4e 75 6c 6c 52 6f  Opcode: IfNullRo
137e0 77 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  w P1 P2 P3 * *.*
137f0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 50  * Synopsis: if P
13800 31 2e 6e 75 6c 6c 52 6f 77 20 74 68 65 6e 20 72  1.nullRow then r
13810 5b 50 33 5d 3d 4e 55 4c 4c 2c 20 67 6f 74 6f 20  [P3]=NULL, goto 
13820 50 32 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  P2.**.** Check t
13830 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  he cursor P1 to 
13840 73 65 65 20 69 66 20 69 74 20 69 73 20 63 75 72  see if it is cur
13850 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
13860 61 74 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  at a NULL row..*
13870 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
13880 20 73 65 74 20 72 65 67 69 73 74 65 72 20 50 33   set register P3
13890 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 6a 75 6d   to NULL and jum
138a0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
138b0 20 50 32 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73   P2..** If P1 is
138c0 20 6e 6f 74 20 6f 6e 20 61 20 4e 55 4c 4c 20 72   not on a NULL r
138d0 6f 77 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  ow, then fall th
138e0 72 6f 75 67 68 20 77 69 74 68 6f 75 74 20 6d 61  rough without ma
138f0 6b 69 6e 67 20 61 6e 79 0a 2a 2a 20 63 68 61 6e  king any.** chan
13900 67 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ges..*/.case OP_
13910 49 66 4e 75 6c 6c 52 6f 77 3a 20 7b 20 20 20 20  IfNullRow: {    
13920 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
13930 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
13940 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
13950 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
13960 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
13970 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a  [pOp->p1]!=0 );.
13980 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 70    if( p->apCsr[p
13990 4f 70 2d 3e 70 31 5d 2d 3e 6e 75 6c 6c 52 6f 77  Op->p1]->nullRow
139a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
139b0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 61 4d  dbeMemSetNull(aM
139c0 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  em + pOp->p3);. 
139d0 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
139e0 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
139f0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
13a00 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50  olumn P1 P2 P3 P
13a10 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
13a20 3a 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a  : r[P3]=PX.**.**
13a30 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64   Interpret the d
13a40 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20  ata that cursor 
13a50 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20  P1 points to as 
13a60 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c  a structure buil
13a70 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d  t using.** the M
13a80 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
13a90 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65  ction.  (See the
13aa0 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f   MakeRecord opco
13ab0 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
13ac0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
13ad0 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61   about the forma
13ae0 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20  t of the data.) 
13af0 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32 2d   Extract the P2-
13b00 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f  th column.** fro
13b10 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20  m this record.  
13b20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  If there are les
13b30 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a  s that (P2+1) .*
13b40 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
13b50 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20  record, extract 
13b60 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  a NULL..**.** Th
13b70 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  e value extracte
13b80 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  d is stored in r
13b90 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
13ba0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
13bb0 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
13bc0 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74  han P2 fields, t
13bd0 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55  hen extract a NU
13be0 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74  LL.  Or,.** if t
13bf0 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69  he P4 argument i
13c00 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74  s a P4_MEM use t
13c10 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13c20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  P4 argument as.*
13c30 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  * the result..**
13c40 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
13c50 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69 74  G_CLEARCACHE bit
13c60 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61 6e   is set on P5 an
13c70 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f  d P1 is a pseudo
13c80 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a 2a  -table cursor,.*
13c90 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65  * then the cache
13ca0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   of the cursor i
13cb0 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74 6f  s reset prior to
13cc0 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   extracting the 
13cd0 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 66  column..** The f
13ce0 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61  irst OP_Column a
13cf0 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f 2d  gainst a pseudo-
13d00 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65 20  table after the 
13d10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e  value of the con
13d20 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  tent.** register
13d30 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68 6f   has changed sho
13d40 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62 69  uld have this bi
13d50 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t set..**.** If 
13d60 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  the OPFLAG_LENGT
13d70 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47 5f  HARG and OPFLAG_
13d80 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20 61  TYPEOFARG bits a
13d90 72 65 20 73 65 74 20 6f 6e 20 50 35 20 74 68 65  re set on P5 the
13da0 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  n.** the result 
13db0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
13dc0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73   only be used as
13dd0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f 66   the argument of
13de0 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20 6f   a length().** o
13df0 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  r typeof() funct
13e00 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
13e10 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67 20  y.  The loading 
13e20 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20 63  of large blobs c
13e30 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65 64  an be.** skipped
13e40 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   for length() an
13e50 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c 6f  d all content lo
13e60 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b 69  ading can be ski
13e70 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66 28  pped for typeof(
13e80 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
13e90 6c 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70 32  lumn: {.  int p2
13ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13eb0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f  column number to
13ec0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 56   retrieve */.  V
13ed0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
13ee0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
13ef0 72 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72 73  rsor */.  BtCurs
13f00 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20  or *pCrsr;   /* 
13f10 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72  The BTree cursor
13f20 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73   */.  u32 *aOffs
13f30 65 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66  et;      /* aOff
13f40 73 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74  set[i] is offset
13f50 20 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74   to start of dat
13f60 61 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d  a for i-th colum
13f70 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20  n */.  int len; 
13f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13f90 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
13fa0 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66  erialized data f
13fb0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  or the column */
13fc0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13fd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13fe0 75 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a  unter */.  Mem *
13ff0 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  pDest;        /*
14000 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
14010 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76 61  the extracted va
14020 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65  lue */.  Mem sMe
14030 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
14040 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72  or storing the r
14050 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
14060 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ded */.  const u
14070 38 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20 50  8 *zData;   /* P
14080 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
14090 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
140a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
140b0 48 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  Hdr;    /* Next 
140c0 75 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f 66  unparsed byte of
140d0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
140e0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64 48   const u8 *zEndH
140f0 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  dr; /* Pointer t
14100 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  o first byte aft
14110 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  er the header */
14120 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20  .  u32 offset;  
14130 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
14140 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f  into the data */
14150 0a 20 20 75 36 34 20 6f 66 66 73 65 74 36 34 3b  .  u64 offset64;
14160 20 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74 20        /* 64-bit 
14170 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
14180 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20 20 2f  avail;         /
14190 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
141a0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 64  s of available d
141b0 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74 3b 20  ata */.  u32 t; 
141c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
141d0 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f 6d 20   type code from 
141e0 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65  the record heade
141f0 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 67  r */.  Mem *pReg
14200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65  ;         /* Pse
14210 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 20 72  udoTable input r
14220 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 70 43  egister */..  pC
14230 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
14240 3e 70 31 5d 3b 0a 20 20 70 32 20 3d 20 70 4f 70  >p1];.  p2 = pOp
14250 2d 3e 70 32 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->p2;..  /* If t
14260 68 65 20 63 75 72 73 6f 72 20 63 61 63 68 65 20  he cursor cache 
14270 69 73 20 73 74 61 6c 65 20 28 6d 65 61 6e 69 6e  is stale (meanin
14280 67 20 69 74 20 69 73 20 6e 6f 74 20 63 75 72 72  g it is not curr
14290 65 6e 74 6c 79 20 70 6f 69 6e 74 20 61 74 0a 20  ently point at. 
142a0 20 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20   ** the correct 
142b0 72 6f 77 29 20 74 68 65 6e 20 62 72 69 6e 67 20  row) then bring 
142c0 69 74 20 75 70 2d 74 6f 2d 64 61 74 65 20 62 79  it up-to-date by
142d0 20 64 6f 69 6e 67 20 74 68 65 20 6e 65 63 65 73   doing the neces
142e0 73 61 72 79 20 0a 20 20 2a 2a 20 42 2d 54 72 65  sary .  ** B-Tre
142f0 65 20 73 65 65 6b 2e 20 2a 2f 0a 20 20 72 63 20  e seek. */.  rc 
14300 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14310 73 6f 72 4d 6f 76 65 74 6f 28 26 70 43 2c 20 26  sorMoveto(&pC, &
14320 70 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  p2);.  if( rc ) 
14330 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
14340 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  o_error;..  asse
14350 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
14360 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
14370 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
14380 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20  r) );.  pDest = 
14390 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
143a0 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
143b0 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  ge(p, pDest);.  
143c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
143d0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
143e0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
143f0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
14400 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e   assert( p2<pC->
14410 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 4f 66 66  nField );.  aOff
14420 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65  set = pC->aOffse
14430 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  t;.  assert( pC-
14440 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
14450 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73  PE_VTAB );.  ass
14460 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
14470 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44  e!=CURTYPE_PSEUD
14480 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  O || pC->nullRow
14490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
144a0 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
144b0 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 0a 20  YPE_SORTER );.. 
144c0 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74   if( pC->cacheSt
144d0 61 74 75 73 21 3d 70 2d 3e 63 61 63 68 65 43 74  atus!=p->cacheCt
144e0 72 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  r ){            
144f0 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49      /*OPTIMIZATI
14500 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
14510 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
14520 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  w ){.      if( p
14530 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
14540 54 59 50 45 5f 50 53 45 55 44 4f 20 29 7b 0a 20  TYPE_PSEUDO ){. 
14550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14560 43 2d 3e 75 63 2e 70 73 65 75 64 6f 54 61 62 6c  C->uc.pseudoTabl
14570 65 52 65 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  eReg>0 );.      
14580 20 20 70 52 65 67 20 3d 20 26 61 4d 65 6d 5b 70    pReg = &aMem[p
14590 43 2d 3e 75 63 2e 70 73 65 75 64 6f 54 61 62 6c  C->uc.pseudoTabl
145a0 65 52 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 61  eReg];.        a
145b0 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c 61  ssert( pReg->fla
145c0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
145d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
145e0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 67   memIsValid(pReg
145f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ) );.        pC-
14600 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70  >payloadSize = p
14610 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76 61 69 6c  C->szRow = avail
14620 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20 20   = pReg->n;.    
14630 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28      pC->aRow = (
14640 75 38 2a 29 70 52 65 67 2d 3e 7a 3b 0a 20 20 20  u8*)pReg->z;.   
14650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14660 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
14670 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a  SetNull(pDest);.
14680 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
14690 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
146a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
146b0 20 20 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d       pCrsr = pC-
146c0 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20  >uc.pCursor;.   
146d0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65     assert( pC->e
146e0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
146f0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
14700 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b  assert( pCrsr );
14710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14720 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
14730 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20  rIsValid(pCrsr) 
14740 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 70 61 79  );.      pC->pay
14750 6c 6f 61 64 53 69 7a 65 20 3d 20 73 71 6c 69 74  loadSize = sqlit
14760 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
14770 7a 65 28 70 43 72 73 72 29 3b 0a 20 20 20 20 20  ze(pCrsr);.     
14780 20 70 43 2d 3e 61 52 6f 77 20 3d 20 73 71 6c 69   pC->aRow = sqli
14790 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
147a0 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76 61  etch(pCrsr, &ava
147b0 69 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  il);.      asser
147c0 74 28 20 61 76 61 69 6c 3c 3d 36 35 35 33 36 20  t( avail<=65536 
147d0 29 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70  );  /* Maximum p
147e0 61 67 65 20 73 69 7a 65 20 69 73 20 36 34 4b 69  age size is 64Ki
147f0 42 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  B */.      if( p
14800 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3c  C->payloadSize <
14810 3d 20 28 75 33 32 29 61 76 61 69 6c 20 29 7b 0a  = (u32)avail ){.
14820 20 20 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f          pC->szRo
14830 77 20 3d 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53  w = pC->payloadS
14840 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
14850 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61 64   if( pC->payload
14860 53 69 7a 65 20 3e 20 28 75 33 32 29 64 62 2d 3e  Size > (u32)db->
14870 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
14880 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
14890 20 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f         goto too_
148a0 62 69 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  big;.      }else
148b0 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 73 7a  {.        pC->sz
148c0 52 6f 77 20 3d 20 61 76 61 69 6c 3b 0a 20 20 20  Row = avail;.   
148d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
148e0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
148f0 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20 20   p->cacheCtr;.  
14900 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74    pC->iHdrOffset
14910 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70   = getVarint32(p
14920 43 2d 3e 61 52 6f 77 2c 20 6f 66 66 73 65 74 29  C->aRow, offset)
14930 3b 0a 20 20 20 20 70 43 2d 3e 6e 48 64 72 50 61  ;.    pC->nHdrPa
14940 72 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 4f  rsed = 0;.    aO
14950 66 66 73 65 74 5b 30 5d 20 3d 20 6f 66 66 73 65  ffset[0] = offse
14960 74 3b 0a 0a 0a 20 20 20 20 69 66 28 20 61 76 61  t;...    if( ava
14970 69 6c 3c 6f 66 66 73 65 74 20 29 7b 20 20 20 20  il<offset ){    
14980 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e    /*OPTIMIZATION
14990 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
149a0 20 20 2f 2a 20 70 43 2d 3e 61 52 6f 77 20 64 6f    /* pC->aRow do
149b0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 68  es not have to h
149c0 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 72  old the entire r
149d0 6f 77 2c 20 62 75 74 20 69 74 20 64 6f 65 73 20  ow, but it does 
149e0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 2a  at least.      *
149f0 2a 20 6e 65 65 64 20 74 6f 20 63 6f 76 65 72 20  * need to cover 
14a00 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
14a10 65 20 72 65 63 6f 72 64 2e 20 20 49 66 20 70 43  e record.  If pC
14a20 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20  ->aRow does not 
14a30 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a  contain.      **
14a40 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 68 65   the complete he
14a50 61 64 65 72 2c 20 74 68 65 6e 20 73 65 74 20 69  ader, then set i
14a60 74 20 74 6f 20 7a 65 72 6f 2c 20 66 6f 72 63 69  t to zero, forci
14a70 6e 67 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  ng the header to
14a80 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e   be.      ** dyn
14a90 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
14aa0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 2d  ed. */.      pC-
14ab0 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20  >aRow = 0;.     
14ac0 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a   pC->szRow = 0;.
14ad0 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
14ae0 75 72 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  ure a corrupt da
14af0 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 67  tabase has not g
14b00 69 76 65 6e 20 75 73 20 61 6e 20 6f 76 65 72 73  iven us an overs
14b10 69 7a 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  ize header..    
14b20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e 6f 77    ** Do this now
14b30 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f 76 65   to avoid an ove
14b40 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  rsize memory all
14b50 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
14b60 2a 0a 20 20 20 20 20 20 2a 2a 20 54 79 70 65 20  *.      ** Type 
14b70 65 6e 74 72 69 65 73 20 63 61 6e 20 62 65 20 62  entries can be b
14b80 65 74 77 65 65 6e 20 31 20 61 6e 64 20 35 20 62  etween 1 and 5 b
14b90 79 74 65 73 20 65 61 63 68 2e 20 20 42 75 74 20  ytes each.  But 
14ba0 34 20 61 6e 64 20 35 20 62 79 74 65 0a 20 20 20  4 and 5 byte.   
14bb0 20 20 20 2a 2a 20 74 79 70 65 73 20 75 73 65 20     ** types use 
14bc0 73 6f 20 6d 75 63 68 20 64 61 74 61 20 73 70 61  so much data spa
14bd0 63 65 20 74 68 61 74 20 74 68 65 72 65 20 63 61  ce that there ca
14be0 6e 20 6f 6e 6c 79 20 62 65 20 34 30 39 36 20 61  n only be 4096 a
14bf0 6e 64 20 33 32 20 6f 66 0a 20 20 20 20 20 20 2a  nd 32 of.      *
14c00 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63 74 69  * them, respecti
14c10 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20 6d 61  vely.  So the ma
14c20 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c 65 6e  ximum header len
14c30 67 74 68 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  gth results from
14c40 20 61 0a 20 20 20 20 20 20 2a 2a 20 33 2d 62 79   a.      ** 3-by
14c50 74 65 20 74 79 70 65 20 66 6f 72 20 65 61 63 68  te type for each
14c60 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   of the maximum 
14c70 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73  of 32768 columns
14c80 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20 20 20   plus three.    
14c90 20 20 2a 2a 20 65 78 74 72 61 20 62 79 74 65 73    ** extra bytes
14ca0 20 66 6f 72 20 74 68 65 20 68 65 61 64 65 72 20   for the header 
14cb0 6c 65 6e 67 74 68 20 69 74 73 65 6c 66 2e 20 20  length itself.  
14cc0 33 32 37 36 38 2a 33 20 2b 20 33 20 3d 20 39 38  32768*3 + 3 = 98
14cd0 33 30 37 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  307..      */.  
14ce0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20 3e      if( offset >
14cf0 20 39 38 33 30 37 20 7c 7c 20 6f 66 66 73 65 74   98307 || offset
14d00 20 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69   > pC->payloadSi
14d10 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
14d20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
14d30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
14d40 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
14d50 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
14d60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
14d70 66 66 73 65 74 3e 30 20 29 7b 20 2f 2a 4f 50 54  ffset>0 ){ /*OPT
14d80 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55  IMIZATION-IF-TRU
14d90 45 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  E*/.      /* The
14da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6f 74 6f 20   following goto 
14db0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
14dc0 6f 6e 2e 20 20 49 74 20 63 61 6e 20 62 65 20 6f  on.  It can be o
14dd0 6d 69 74 74 65 64 20 61 6e 64 0a 20 20 20 20 20  mitted and.     
14de0 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 77   ** everything w
14df0 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 2e 20  ill still work. 
14e00 20 42 75 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69   But OP_Column i
14e10 73 20 6d 65 61 73 75 72 61 62 6c 79 20 66 61 73  s measurably fas
14e20 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ter.      ** by 
14e30 73 6b 69 70 70 69 6e 67 20 74 68 65 20 73 75 62  skipping the sub
14e40 73 65 71 75 65 6e 74 20 63 6f 6e 64 69 74 69 6f  sequent conditio
14e50 6e 61 6c 2c 20 77 68 69 63 68 20 69 73 20 61 6c  nal, which is al
14e60 77 61 79 73 20 74 72 75 65 2e 0a 20 20 20 20 20  ways true..     
14e70 20 2a 2f 0a 20 20 20 20 20 20 7a 44 61 74 61 20   */.      zData 
14e80 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20  = pC->aRow;.    
14e90 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 48    assert( pC->nH
14ea0 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29 3b 20  drParsed<=p2 ); 
14eb0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
14ec0 74 69 6f 6e 61 6c 20 73 6b 69 70 70 65 64 20 2a  tional skipped *
14ed0 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f  /.      goto op_
14ee0 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64  column_read_head
14ef0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
14f00 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 74   /* Make sure at
14f10 20 6c 65 61 73 74 20 74 68 65 20 66 69 72 73 74   least the first
14f20 20 70 32 2b 31 20 65 6e 74 72 69 65 73 20 6f 66   p2+1 entries of
14f30 20 74 68 65 20 68 65 61 64 65 72 20 68 61 76 65   the header have
14f40 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 72 73 65   been.  ** parse
14f50 64 20 61 6e 64 20 76 61 6c 69 64 20 69 6e 66 6f  d and valid info
14f60 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e 20 61 4f  rmation is in aO
14f70 66 66 73 65 74 5b 5d 20 61 6e 64 20 70 43 2d 3e  ffset[] and pC->
14f80 61 54 79 70 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20  aType[]..  */.  
14f90 69 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73  if( pC->nHdrPars
14fa0 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 2f 2a  ed<=p2 ){.    /*
14fb0 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
14fc0 65 20 68 65 61 64 65 72 20 61 76 61 69 6c 61 62  e header availab
14fd0 6c 65 20 66 6f 72 20 70 61 72 73 69 6e 67 20 69  le for parsing i
14fe0 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 74 72  n the record, tr
14ff0 79 0a 20 20 20 20 2a 2a 20 74 6f 20 65 78 74 72  y.    ** to extr
15000 61 63 74 20 61 64 64 69 74 69 6f 6e 61 6c 20 66  act additional f
15010 69 65 6c 64 73 20 75 70 20 74 68 72 6f 75 67 68  ields up through
15020 20 74 68 65 20 70 32 2b 31 2d 74 68 20 66 69 65   the p2+1-th fie
15030 6c 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ld .    */.    i
15040 66 28 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65  f( pC->iHdrOffse
15050 74 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b 0a  t<aOffset[0] ){.
15060 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
15070 72 65 20 7a 44 61 74 61 20 70 6f 69 6e 74 73 20  re zData points 
15080 74 6f 20 65 6e 6f 75 67 68 20 6f 66 20 74 68 65  to enough of the
15090 20 72 65 63 6f 72 64 20 74 6f 20 63 6f 76 65 72   record to cover
150a0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
150b0 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52        if( pC->aR
150c0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
150d0 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30   memset(&sMem, 0
150e0 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b  , sizeof(sMem));
150f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15100 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
15110 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75  Btree(pC->uc.pCu
15120 72 73 6f 72 2c 20 30 2c 20 61 4f 66 66 73 65 74  rsor, 0, aOffset
15130 5b 30 5d 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20  [0], &sMem);.   
15140 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15150 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
15160 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
15170 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20  ;.        zData 
15180 3d 20 28 75 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20  = (u8*)sMem.z;. 
15190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
151a0 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e      zData = pC->
151b0 61 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  aRow;.      }.  
151c0 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
151d0 6e 20 70 43 2d 3e 61 54 79 70 65 5b 69 5d 20 61  n pC->aType[i] a
151e0 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d 20 76 61  nd aOffset[i] va
151f0 6c 75 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  lues through the
15200 20 70 32 2d 74 68 20 66 69 65 6c 64 2e 20 2a 2f   p2-th field. */
15210 0a 20 20 20 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72  .    op_column_r
15220 65 61 64 5f 68 65 61 64 65 72 3a 0a 20 20 20 20  ead_header:.    
15230 20 20 69 20 3d 20 70 43 2d 3e 6e 48 64 72 50 61    i = pC->nHdrPa
15240 72 73 65 64 3b 0a 20 20 20 20 20 20 6f 66 66 73  rsed;.      offs
15250 65 74 36 34 20 3d 20 61 4f 66 66 73 65 74 5b 69  et64 = aOffset[i
15260 5d 3b 0a 20 20 20 20 20 20 7a 48 64 72 20 3d 20  ];.      zHdr = 
15270 7a 44 61 74 61 20 2b 20 70 43 2d 3e 69 48 64 72  zData + pC->iHdr
15280 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 7a 45  Offset;.      zE
15290 6e 64 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20  ndHdr = zData + 
152a0 61 4f 66 66 73 65 74 5b 30 5d 3b 0a 20 20 20 20  aOffset[0];.    
152b0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
152c0 28 20 28 74 20 3d 20 7a 48 64 72 5b 30 5d 29 3c  ( (t = zHdr[0])<
152d0 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x80 ){.        
152e0 20 20 7a 48 64 72 2b 2b 3b 0a 20 20 20 20 20 20    zHdr++;.      
152f0 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20      offset64 += 
15300 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79  sqlite3VdbeOneBy
15310 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  teSerialTypeLen(
15320 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
15330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64  e{.          zHd
15340 72 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  r += sqlite3GetV
15350 61 72 69 6e 74 33 32 28 7a 48 64 72 2c 20 26 74  arint32(zHdr, &t
15360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  );.          off
15370 73 65 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33  set64 += sqlite3
15380 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15390 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n(t);.        }.
153a0 20 20 20 20 20 20 20 20 70 43 2d 3e 61 54 79 70          pC->aTyp
153b0 65 5b 69 2b 2b 5d 20 3d 20 74 3b 0a 20 20 20 20  e[i++] = t;.    
153c0 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d      aOffset[i] =
153d0 20 28 75 33 32 29 28 6f 66 66 73 65 74 36 34 20   (u32)(offset64 
153e0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
153f0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 3d       }while( i<=
15400 70 32 20 26 26 20 7a 48 64 72 3c 7a 45 6e 64 48  p2 && zHdr<zEndH
15410 64 72 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  dr );..      /* 
15420 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  The record is co
15430 72 72 75 70 74 20 69 66 20 61 6e 79 20 6f 66 20  rrupt if any of 
15440 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
15450 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 2a 2a  e true:.      **
15460 20 28 31 29 20 74 68 65 20 62 79 74 65 73 20 6f   (1) the bytes o
15470 66 20 74 68 65 20 68 65 61 64 65 72 20 65 78 74  f the header ext
15480 65 6e 64 20 70 61 73 74 20 74 68 65 20 64 65 63  end past the dec
15490 6c 61 72 65 64 20 68 65 61 64 65 72 20 73 69 7a  lared header siz
154a0 65 0a 20 20 20 20 20 20 2a 2a 20 28 32 29 20 74  e.      ** (2) t
154b0 68 65 20 65 6e 74 69 72 65 20 68 65 61 64 65 72  he entire header
154c0 20 77 61 73 20 75 73 65 64 20 62 75 74 20 6e 6f   was used but no
154d0 74 20 61 6c 6c 20 64 61 74 61 20 77 61 73 20 75  t all data was u
154e0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 28 33 29  sed.      ** (3)
154f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15500 64 61 74 61 20 65 78 74 65 6e 64 73 20 62 65 79  data extends bey
15510 6f 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ond the end of t
15520 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
15530 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 7a   */.      if( (z
15540 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 26 26 20  Hdr>=zEndHdr && 
15550 28 7a 48 64 72 3e 7a 45 6e 64 48 64 72 20 7c 7c  (zHdr>zEndHdr ||
15560 20 6f 66 66 73 65 74 36 34 21 3d 70 43 2d 3e 70   offset64!=pC->p
15570 61 79 6c 6f 61 64 53 69 7a 65 29 29 0a 20 20 20  ayloadSize)).   
15580 20 20 20 20 7c 7c 20 28 6f 66 66 73 65 74 36 34      || (offset64
15590 20 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69   > pC->payloadSi
155a0 7a 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ze).      ){.   
155b0 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f       if( pC->aRo
155c0 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  w==0 ) sqlite3Vd
155d0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
155e0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  em);.        rc 
155f0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
15600 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
15610 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
15620 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
15630 0a 20 20 20 20 20 20 70 43 2d 3e 6e 48 64 72 50  .      pC->nHdrP
15640 61 72 73 65 64 20 3d 20 69 3b 0a 20 20 20 20 20  arsed = i;.     
15650 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 20   pC->iHdrOffset 
15660 3d 20 28 75 33 32 29 28 7a 48 64 72 20 2d 20 7a  = (u32)(zHdr - z
15670 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
15680 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73   pC->aRow==0 ) s
15690 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
156a0 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20  ease(&sMem);.   
156b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 20   }else{.      t 
156c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
156d0 2f 2a 20 49 66 20 61 66 74 65 72 20 74 72 79 69  /* If after tryi
156e0 6e 67 20 74 6f 20 65 78 74 72 61 63 74 20 6e 65  ng to extract ne
156f0 77 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  w entries from t
15700 68 65 20 68 65 61 64 65 72 2c 20 6e 48 64 72 50  he header, nHdrP
15710 61 72 73 65 64 20 69 73 0a 20 20 20 20 2a 2a 20  arsed is.    ** 
15720 73 74 69 6c 6c 20 6e 6f 74 20 75 70 20 74 6f 20  still not up to 
15730 70 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  p2, that means t
15740 68 61 74 20 74 68 65 20 72 65 63 6f 72 64 20 68  hat the record h
15750 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 70 32  as fewer than p2
15760 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 2e  .    ** columns.
15770 20 20 53 6f 20 74 68 65 20 72 65 73 75 6c 74 20    So the result 
15780 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 74  will be either t
15790 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
157a0 20 6f 72 20 61 20 4e 55 4c 4c 2e 0a 20 20 20 20   or a NULL..    
157b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e  */.    if( pC->n
157c0 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b  HdrParsed<=p2 ){
157d0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
157e0 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d 20 29  p4type==P4_MEM )
157f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15800 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
15810 6f 70 79 28 70 44 65 73 74 2c 20 70 4f 70 2d 3e  opy(pDest, pOp->
15820 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53 74 61  p4.pMem, MEM_Sta
15830 74 69 63 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tic);.      }els
15840 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
15850 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
15860 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  (pDest);.      }
15870 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63  .      goto op_c
15880 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  olumn_out;.    }
15890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 20  .  }else{.    t 
158a0 3d 20 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d 3b  = pC->aType[p2];
158b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61  .  }..  /* Extra
158c0 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ct the content f
158d0 6f 72 20 74 68 65 20 70 32 2b 31 2d 74 68 20 63  or the p2+1-th c
158e0 6f 6c 75 6d 6e 2e 20 20 43 6f 6e 74 72 6f 6c 20  olumn.  Control 
158f0 63 61 6e 20 6f 6e 6c 79 0a 20 20 2a 2a 20 72 65  can only.  ** re
15900 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ach this point i
15910 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 61  f aOffset[p2], a
15920 4f 66 66 73 65 74 5b 70 32 2b 31 5d 2c 20 61 6e  Offset[p2+1], an
15930 64 20 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20  d pC->aType[p2] 
15940 61 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 76 61 6c  are.  ** all val
15950 69 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  id..  */.  asser
15960 74 28 20 70 32 3c 70 43 2d 3e 6e 48 64 72 50 61  t( p2<pC->nHdrPa
15970 72 73 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  rsed );.  assert
15980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
159a0 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
159b0 49 6e 76 61 72 69 61 6e 74 73 28 70 44 65 73 74  Invariants(pDest
159c0 29 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d  ) );.  if( VdbeM
159d0 65 6d 44 79 6e 61 6d 69 63 28 70 44 65 73 74 29  emDynamic(pDest)
159e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
159f0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44  dbeMemSetNull(pD
15a00 65 73 74 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  est);.  }.  asse
15a10 72 74 28 20 74 3d 3d 70 43 2d 3e 61 54 79 70 65  rt( t==pC->aType
15a20 5b 70 32 5d 20 29 3b 0a 20 20 69 66 28 20 70 43  [p2] );.  if( pC
15a30 2d 3e 73 7a 52 6f 77 3e 3d 61 4f 66 66 73 65 74  ->szRow>=aOffset
15a40 5b 70 32 2b 31 5d 20 29 7b 0a 20 20 20 20 2f 2a  [p2+1] ){.    /*
15a50 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d   This is the com
15a60 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
15a70 68 65 20 64 65 73 69 72 65 64 20 63 6f 6e 74 65  he desired conte
15a80 6e 74 20 66 69 74 73 20 6f 6e 20 74 68 65 20 6f  nt fits on the o
15a90 72 69 67 69 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  riginal.    ** p
15aa0 61 67 65 20 2d 20 77 68 65 72 65 20 74 68 65 20  age - where the 
15ab0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 6f  content is not o
15ac0 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  n an overflow pa
15ad0 67 65 20 2a 2f 0a 20 20 20 20 7a 44 61 74 61 20  ge */.    zData 
15ae0 3d 20 70 43 2d 3e 61 52 6f 77 20 2b 20 61 4f 66  = pC->aRow + aOf
15af0 66 73 65 74 5b 70 32 5d 3b 0a 20 20 20 20 69 66  fset[p2];.    if
15b00 28 20 74 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ( t<12 ){.      
15b10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15b20 6c 47 65 74 28 7a 44 61 74 61 2c 20 74 2c 20 70  lGet(zData, t, p
15b30 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Dest);.    }else
15b40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
15b50 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
15b60 73 20 61 20 73 74 72 69 6e 67 2c 20 77 65 20 6e  s a string, we n
15b70 65 65 64 20 61 20 70 65 72 73 69 73 74 65 6e 74  eed a persistent
15b80 20 76 61 6c 75 65 2c 20 6e 6f 74 0a 20 20 20 20   value, not.    
15b90 20 20 2a 2a 20 61 20 4d 45 4d 5f 45 70 68 65 6d    ** a MEM_Ephem
15ba0 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 62 72   value.  This br
15bb0 61 6e 63 68 20 69 73 20 61 20 66 61 73 74 20 73  anch is a fast s
15bc0 68 6f 72 74 2d 63 75 74 20 74 68 61 74 20 69 73  hort-cut that is
15bd0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
15be0 20 20 2a 2a 20 74 6f 20 63 61 6c 6c 69 6e 67 20    ** to calling 
15bf0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15c00 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
15c10 65 33 56 64 62 65 44 65 65 70 68 65 6d 65 72 61  e3VdbeDeephemera
15c20 6c 69 7a 65 28 29 2e 0a 20 20 20 20 20 20 2a 2f  lize()..      */
15c30 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
15c40 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
15c50 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 2c 20 4d 45  = { MEM_Blob, ME
15c60 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 20 7d  M_Str|MEM_Term }
15c70 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e  ;.      pDest->n
15c80 20 3d 20 6c 65 6e 20 3d 20 28 74 2d 31 32 29 2f   = len = (t-12)/
15c90 32 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  2;.      pDest->
15ca0 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
15cb0 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
15cc0 3e 73 7a 4d 61 6c 6c 6f 63 20 3c 20 6c 65 6e 2b  >szMalloc < len+
15cd0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  2 ){.        pDe
15ce0 73 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  st->flags = MEM_
15cf0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  Null;.        if
15d00 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
15d10 47 72 6f 77 28 70 44 65 73 74 2c 20 6c 65 6e 2b  Grow(pDest, len+
15d20 32 2c 20 30 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  2, 0) ) goto no_
15d30 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mem;.      }else
15d40 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
15d50 3e 7a 20 3d 20 70 44 65 73 74 2d 3e 7a 4d 61 6c  >z = pDest->zMal
15d60 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  loc;.      }.   
15d70 20 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d     memcpy(pDest-
15d80 3e 7a 2c 20 7a 44 61 74 61 2c 20 6c 65 6e 29 3b  >z, zData, len);
15d90 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b  .      pDest->z[
15da0 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  len] = 0;.      
15db0 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 2b 31 5d 20  pDest->z[len+1] 
15dc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73 74  = 0;.      pDest
15dd0 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
15de0 74 26 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t&1];.    }.  }e
15df0 6c 73 65 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  lse{.    pDest->
15e00 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
15e10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
15e20 63 68 20 68 61 70 70 65 6e 73 20 6f 6e 6c 79 20  ch happens only 
15e30 77 68 65 6e 20 63 6f 6e 74 65 6e 74 20 69 73 20  when content is 
15e40 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
15e50 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  s */.    if( ((p
15e60 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47  Op->p5 & (OPFLAG
15e70 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
15e80 47 5f 54 59 50 45 4f 46 41 52 47 29 29 21 3d 30  G_TYPEOFARG))!=0
15e90 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28  .          && ((
15ea0 74 3e 3d 31 32 20 26 26 20 28 74 26 31 29 3d 3d  t>=12 && (t&1)==
15eb0 30 29 20 7c 7c 20 28 70 4f 70 2d 3e 70 35 20 26  0) || (pOp->p5 &
15ec0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
15ed0 47 29 21 3d 30 29 29 0a 20 20 20 20 20 7c 7c 20  G)!=0)).     || 
15ee0 28 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  (len = sqlite3Vd
15ef0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
15f00 74 29 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  t))==0.    ){.  
15f10 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69      /* Content i
15f20 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
15f30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 31 2e 20  .      **    1. 
15f40 74 68 65 20 74 79 70 65 6f 66 28 29 20 66 75 6e  the typeof() fun
15f50 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 2a 2a 20  ction,.      ** 
15f60 20 20 20 32 2e 20 74 68 65 20 6c 65 6e 67 74 68     2. the length
15f70 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  (X) function if 
15f80 58 20 69 73 20 61 20 62 6c 6f 62 2c 20 61 6e 64  X is a blob, and
15f90 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 33 2e 20  .      **    3. 
15fa0 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6c  if the content l
15fb0 65 6e 67 74 68 20 69 73 20 7a 65 72 6f 2e 0a 20  ength is zero.. 
15fc0 20 20 20 20 20 2a 2a 20 53 6f 20 77 65 20 6d 69       ** So we mi
15fd0 67 68 74 20 61 73 20 77 65 6c 6c 20 75 73 65 20  ght as well use 
15fe0 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20 72 61  bogus content ra
15ff0 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 69 6e  ther than readin
16000 67 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 65  g.      ** conte
16010 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 0a 20  nt from disk. . 
16020 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16030 20 41 6c 74 68 6f 75 67 68 20 73 71 6c 69 74 65   Although sqlite
16040 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16050 20 6d 61 79 20 72 65 61 64 20 61 74 20 6d 6f 73   may read at mos
16060 74 20 38 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t 8 bytes from t
16070 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  he.      ** buff
16080 65 72 20 70 61 73 73 65 64 20 74 6f 20 69 74 2c  er passed to it,
16090 20 64 65 62 75 67 67 69 6e 67 20 66 75 6e 63 74   debugging funct
160a0 69 6f 6e 20 56 64 62 65 4d 65 6d 50 72 65 74 74  ion VdbeMemPrett
160b0 79 50 72 69 6e 74 28 29 20 6d 61 79 0a 20 20 20  yPrint() may.   
160c0 20 20 20 2a 2a 20 72 65 61 64 20 75 70 20 74 6f     ** read up to
160d0 20 31 36 2e 20 53 6f 20 31 36 20 62 79 74 65 73   16. So 16 bytes
160e0 20 6f 66 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e   of bogus conten
160f0 74 20 69 73 20 73 75 70 70 6c 69 65 64 2e 0a 20  t is supplied.. 
16100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16110 61 74 69 63 20 75 38 20 61 5a 65 72 6f 5b 31 36  atic u8 aZero[16
16120 5d 3b 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74  ];  /* This is t
16130 68 65 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74  he bogus content
16140 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
16150 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 61  3VdbeSerialGet(a
16160 5a 65 72 6f 2c 20 74 2c 20 70 44 65 73 74 29 3b  Zero, t, pDest);
16170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
16190 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
161a0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 61  C->uc.pCursor, a
161b0 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c  Offset[p2], len,
161c0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 69   pDest);.      i
161d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
161e0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
161f0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
16200 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
16210 69 61 6c 47 65 74 28 28 63 6f 6e 73 74 20 75 38  ialGet((const u8
16220 2a 29 70 44 65 73 74 2d 3e 7a 2c 20 74 2c 20 70  *)pDest->z, t, p
16230 44 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65  Dest);.      pDe
16240 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45  st->flags &= ~ME
16250 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d 0a 20  M_Ephem;.    }. 
16260 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75   }..op_column_ou
16270 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  t:.  UPDATE_MAX_
16280 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b  BLOBSIZE(pDest);
16290 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
162a0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74  E(pOp->p3, pDest
162b0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
162c0 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e 69  * Opcode: Affini
162d0 74 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ty P1 P2 * P4 *.
162e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66  ** Synopsis: aff
162f0 69 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29 0a  inity(r[P1@P2]).
16300 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66 69  **.** Apply affi
16310 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e 67  nities to a rang
16320 65 20 6f 66 20 50 32 20 72 65 67 69 73 74 65 72  e of P2 register
16330 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
16340 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  P1..**.** P4 is 
16350 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
16360 20 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c   P2 characters l
16370 6f 6e 67 2e 20 54 68 65 20 4e 2d 74 68 20 63 68  ong. The N-th ch
16380 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a  aracter of the.*
16390 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74  * string indicat
163a0 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  es the column af
163b0 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
163c0 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
163d0 68 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65 6d 6f 72  he N-th.** memor
163e0 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61  y cell in the ra
163f0 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  nge..*/.case OP_
16400 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f  Affinity: {.  co
16410 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  nst char *zAffin
16420 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66  ity;   /* The af
16430 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70  finity to be app
16440 6c 69 65 64 20 2a 2f 0a 0a 20 20 7a 41 66 66 69  lied */..  zAffi
16450 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
16460 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
16470 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73  inity!=0 );.  as
16480 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
16490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  );.  assert( zAf
164a0 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d  finity[pOp->p2]=
164b0 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26  =0 );.  pIn1 = &
164c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
164d0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
164e0 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65   pIn1 <= &p->aMe
164f0 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  m[(p->nMem+1 - p
16500 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20  ->nCursor)] );. 
16510 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
16520 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20  Valid(pIn1) );. 
16530 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
16540 28 70 49 6e 31 2c 20 2a 28 7a 41 66 66 69 6e 69  (pIn1, *(zAffini
16550 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29  ty++), encoding)
16560 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20  ;.    pIn1++;.  
16570 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74  }while( zAffinit
16580 79 5b 30 5d 20 29 3b 0a 20 20 62 72 65 61 6b 3b  y[0] );.  break;
16590 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
165a0 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20  akeRecord P1 P2 
165b0 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
165c0 73 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65 63  sis: r[P3]=mkrec
165d0 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a  (r[P1@P2]).**.**
165e0 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69   Convert P2 regi
165f0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
16600 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65  with P1 into the
16610 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d   [record format]
16620 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74  .** use as a dat
16630 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61  a record in a da
16640 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
16650 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61  as a key.** in a
16660 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50  n index.  The OP
16670 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63  _Column opcode c
16680 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65  an decode the re
16690 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a  cord later..**.*
166a0 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74  * P4 may be a st
166b0 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20  ring that is P2 
166c0 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e  characters long.
166d0 20 20 54 68 65 20 4e 2d 74 68 20 63 68 61 72 61    The N-th chara
166e0 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73  cter of the.** s
166f0 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20  tring indicates 
16700 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
16710 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
16720 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
16730 4e 2d 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  N-th.** field of
16740 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a   the index key..
16750 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e  **.** The mappin
16760 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72  g from character
16770 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20   to affinity is 
16780 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c  given by the SQL
16790 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72  ITE_AFF_.** macr
167a0 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  os defined in sq
167b0 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a  liteInt.h..**.**
167c0 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74   If P4 is NULL t
167d0 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69  hen all index fi
167e0 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66  elds have the af
167f0 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f 0a  finity BLOB..*/.
16800 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  case OP_MakeReco
16810 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77  rd: {.  u8 *zNew
16820 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f  Record;        /
16830 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
16840 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ld the data for 
16850 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
16860 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20  /.  Mem *pRec;  
16870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16880 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
16890 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20    u64 nData;    
168a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
168b0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
168c0 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  ata space */.  i
168d0 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20  nt nHdr;        
168e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
168f0 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64  of bytes of head
16900 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36  er space */.  i6
16910 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
16920 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61       /* Data spa
16930 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
16940 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20  this record */. 
16950 20 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20   i64 nZero;     
16960 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16970 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20  r of zero bytes 
16980 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
16990 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
169a0 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20  t nVarint;      
169b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
169c0 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72  f bytes in a var
169d0 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  int */.  u32 ser
169e0 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20  ial_type;       
169f0 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f  /* Type field */
16a00 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20  .  Mem *pData0; 
16a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
16a20 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63  st field to be c
16a30 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65  ombined into the
16a40 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d   record */.  Mem
16a50 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20   *pLast;        
16a60 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c      /* Last fiel
16a70 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
16a80 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
16a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16aa0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
16ab0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  in the record */
16ac0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69  .  char *zAffini
16ad0 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ty;       /* The
16ae0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
16af0 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
16b00 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f  */.  int file_fo
16b10 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46  rmat;       /* F
16b20 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73  ile format to us
16b30 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a  e for encoding *
16b40 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
16b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
16b60 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77  ace used in zNew
16b70 52 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72 20  Record[] header 
16b80 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
16b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16ba0 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65  pace used in zNe
16bb0 77 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 6e  wRecord[] conten
16bc0 74 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  t */.  u32 len; 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16be0 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69 65   Length of a fie
16bf0 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75  ld */..  /* Assu
16c00 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ming the record 
16c10 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
16c20 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  s, the record fo
16c30 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20  rmat looks.  ** 
16c40 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
16c50 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    ** -----------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
16ca0 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20  ** | hdr-size | 
16cb0 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31 20  type 0 | type 1 
16cc0 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31  | ... | type N-1
16cd0 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c   | data0 | ... |
16ce0 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a   data N-1 | .  *
16cf0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a  ----------.  **.
16d40 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20    ** Data(0) is 
16d50 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73  taken from regis
16d60 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31 29  ter P1.  Data(1)
16d70 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69   comes from regi
16d80 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61  ster P1+1.  ** a
16d90 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
16da0 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65  *.  ** Each type
16db0 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72 69   field is a vari
16dc0 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  nt representing 
16dd0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
16de0 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72  of the .  ** cor
16df0 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20  responding data 
16e00 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c  element (see sql
16e10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16e20 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20  pe()). The.  ** 
16e30 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  hdr-size field i
16e40 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20  s also a varint 
16e50 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 66  which is the off
16e60 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67  set from the beg
16e70 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
16e80 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74  he record to dat
16e90 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61  a0..  */.  nData
16ea0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
16eb0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16ec0 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 2a   of data space *
16ed0 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 20  /.  nHdr = 0;   
16ee0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16ef0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61   of bytes of hea
16f00 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e  der space */.  n
16f10 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
16f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
16f30 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
16f40 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
16f50 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  rd */.  nField =
16f60 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66   pOp->p1;.  zAff
16f70 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e  inity = pOp->p4.
16f80 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69  z;.  assert( nFi
16f90 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32  eld>0 && pOp->p2
16fa0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46  >0 && pOp->p2+nF
16fb0 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ield<=(p->nMem+1
16fc0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
16fd0 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20 26   );.  pData0 = &
16fe0 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  aMem[nField];.  
16ff0 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32  nField = pOp->p2
17000 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44 61  ;.  pLast = &pDa
17010 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20  ta0[nField-1];. 
17020 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70   file_format = p
17030 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
17040 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  rmat;..  /* Iden
17050 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74 20  tify the output 
17060 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61 73  register */.  as
17070 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
17080 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p1 || pOp->p3
17090 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  >=pOp->p1+pOp->p
170a0 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  2 );.  pOut = &a
170b0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
170c0 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
170d0 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a  (p, pOut);..  /*
170e0 20 41 70 70 6c 79 20 74 68 65 20 72 65 71 75 65   Apply the reque
170f0 73 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 6f  sted affinity to
17100 20 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f   all inputs.  */
17110 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
17120 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69 66  0<=pLast );.  if
17130 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( zAffinity ){. 
17140 20 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30     pRec = pData0
17150 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
17160 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  applyAffinity(pR
17170 65 63 2b 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74  ec++, *(zAffinit
17180 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  y++), encoding);
17190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
171a0 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c  Affinity[0]==0 |
171b0 7c 20 70 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b  | pRec<=pLast );
171c0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 41 66  .    }while( zAf
171d0 66 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d  finity[0] );.  }
171e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
171f0 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d  ENABLE_NULL_TRIM
17200 0a 20 20 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e 20  .  /* NULLs can 
17210 62 65 20 73 61 66 65 6c 79 20 74 72 69 6d 6d 65  be safely trimme
17220 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
17230 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 73  f the record, as
17240 20 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a 20 61 73   long as.  ** as
17250 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 6d   the schema form
17260 61 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  at is 2 or more 
17270 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  and none of the 
17280 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73 0a  omitted columns.
17290 20 20 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d    ** have a non-
172a0 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c  NULL default val
172b0 75 65 2e 20 20 41 6c 73 6f 2c 20 74 68 65 20 72  ue.  Also, the r
172c0 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 6c 65  ecord must be le
172d0 66 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 74 20  ft with.  ** at 
172e0 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 2e  least one field.
172f0 20 20 49 66 20 50 35 3e 30 20 74 68 65 6e 20 69    If P5>0 then i
17300 74 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f  t will be one mo
17310 72 65 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  re than the.  **
17320 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 69   index of the ri
17330 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
17340 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  with a non-NULL 
17350 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  default value */
17360 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29  .  if( pOp->p5 )
17370 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 4c  {.    while( (pL
17380 61 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ast->flags & MEM
17390 5f 4e 75 6c 6c 29 21 3d 30 20 26 26 20 6e 46 69  _Null)!=0 && nFi
173a0 65 6c 64 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  eld>pOp->p5 ){. 
173b0 20 20 20 20 20 70 4c 61 73 74 2d 2d 3b 0a 20 20       pLast--;.  
173c0 20 20 20 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20      nField--;.  
173d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
173e0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
173f0 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 74  h the elements t
17400 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70  hat will make up
17410 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 66   the record to f
17420 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68  igure.  ** out h
17430 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
17440 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
17450 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20 20  e new record..  
17460 2a 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61 73  */.  pRec = pLas
17470 74 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  t;.  do{.    ass
17480 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
17490 70 52 65 63 29 20 29 3b 0a 20 20 20 20 70 52 65  pRec) );.    pRe
174a0 63 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72 69 61  c->uTemp = seria
174b0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
174c0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
174d0 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Rec, file_format
174e0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  , &len);.    if(
174f0 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
17500 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
17510 20 69 66 28 20 6e 44 61 74 61 20 29 7b 0a 20 20   if( nData ){.  
17520 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17530 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c  3VdbeMemExpandBl
17540 6f 62 28 70 52 65 63 29 20 29 20 67 6f 74 6f 20  ob(pRec) ) goto 
17550 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65  no_mem;.      }e
17560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65  lse{.        nZe
17570 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a  ro += pRec->u.nZ
17580 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ero;.        len
17590 20 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72   -= pRec->u.nZer
175a0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
175b0 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65  .    nData += le
175c0 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  n;.    testcase(
175d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
175e0 37 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  7 );.    testcas
175f0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
17600 31 32 38 20 29 3b 0a 20 20 20 20 6e 48 64 72 20  128 );.    nHdr 
17610 2b 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  += serial_type<=
17620 31 32 37 20 3f 20 31 20 3a 20 73 71 6c 69 74 65  127 ? 1 : sqlite
17630 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
17640 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
17650 20 70 52 65 63 3d 3d 70 44 61 74 61 30 20 29 20   pRec==pData0 ) 
17660 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 65 63 2d  break;.    pRec-
17670 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  -;.  }while(1);.
17680 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
17690 46 3a 20 52 2d 32 32 35 36 34 2d 31 31 36 34 37  F: R-22564-11647
176a0 20 54 68 65 20 68 65 61 64 65 72 20 62 65 67 69   The header begi
176b0 6e 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ns with a single
176c0 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 77 68 69   varint.  ** whi
176d0 63 68 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ch determines th
176e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
176f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 68  f bytes in the h
17700 65 61 64 65 72 2e 20 54 68 65 20 76 61 72 69 6e  eader. The varin
17710 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20  t.  ** value is 
17720 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
17730 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
17740 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73 69  including the si
17750 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 69  ze varint.  ** i
17760 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74 65 73 74  tself. */.  test
17770 63 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 36 20  case( nHdr==126 
17780 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
17790 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20 20 69 66  Hdr==127 );.  if
177a0 28 20 6e 48 64 72 3c 3d 31 32 36 20 29 7b 0a 20  ( nHdr<=126 ){. 
177b0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e     /* The common
177c0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e 48 64   case */.    nHd
177d0 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  r += 1;.  }else{
177e0 0a 20 20 20 20 2f 2a 20 52 61 72 65 20 63 61 73  .    /* Rare cas
177f0 65 20 6f 66 20 61 20 72 65 61 6c 6c 79 20 6c 61  e of a really la
17800 72 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  rge header */.  
17810 20 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69    nVarint = sqli
17820 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
17830 72 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20  r);.    nHdr += 
17840 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20 69 66 28  nVarint;.    if(
17850 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69 74 65 33   nVarint<sqlite3
17860 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20  VarintLen(nHdr) 
17870 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ) nHdr++;.  }.  
17880 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61  nByte = nHdr+nDa
17890 74 61 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 2b  ta;.  if( nByte+
178a0 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74  nZero>db->aLimit
178b0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
178c0 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
178d0 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a  o too_big;.  }..
178e0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
178f0 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
17900 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72 20  er has a buffer 
17910 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
17920 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20  store .  ** the 
17930 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20  new record. The 
17940 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
17950 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74  (pOp->p3) is not
17960 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a   allowed to.  **
17970 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
17980 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 28  nput registers (
17990 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c  because the foll
179a0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20  owing call to.  
179b0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ** sqlite3VdbeMe
179c0 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
179d0 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20  ) could clobber 
179e0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
179f0 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20 20   it is used)..  
17a00 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
17a10 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
17a20 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e 74  esize(pOut, (int
17a30 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 67  )nByte) ){.    g
17a40 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
17a50 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20 28    zNewRecord = (
17a60 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20  u8 *)pOut->z;.. 
17a70 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
17a80 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70 75  cord */.  i = pu
17a90 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52 65  tVarint32(zNewRe
17aa0 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20 6a  cord, nHdr);.  j
17ab0 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73 73 65 72   = nHdr;.  asser
17ac0 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73 74  t( pData0<=pLast
17ad0 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 70 44 61   );.  pRec = pDa
17ae0 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  ta0;.  do{.    s
17af0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 70 52 65  erial_type = pRe
17b00 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20 20 2f 2a  c->uTemp;.    /*
17b10 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17b20 30 36 35 32 39 2d 34 37 33 36 32 20 46 6f 6c 6c  06529-47362 Foll
17b30 6f 77 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76  owing the size v
17b40 61 72 69 6e 74 20 61 72 65 20 6f 6e 65 20 6f 72  arint are one or
17b50 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 61 64 64   more.    ** add
17b60 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e 74 73 2c  itional varints,
17b70 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75 6d 6e 2e   one per column.
17b80 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 70 75 74   */.    i += put
17b90 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52 65  Varint32(&zNewRe
17ba0 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f  cord[i], serial_
17bb0 74 79 70 65 29 3b 20 20 20 20 20 20 20 20 20 20  type);          
17bc0 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70 65    /* serial type
17bd0 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   */.    /* EVIDE
17be0 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 33 36 2d  NCE-OF: R-64536-
17bf0 35 31 37 32 38 20 54 68 65 20 76 61 6c 75 65 73  51728 The values
17c00 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
17c10 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 0a 20   in the record. 
17c20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
17c30 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 68 65 61  y follow the hea
17c40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b 3d  der. */.    j +=
17c50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17c60 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f 72  alPut(&zNewRecor
17c70 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73 65 72 69  d[j], pRec, seri
17c80 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20 63 6f 6e  al_type); /* con
17c90 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68 69 6c 65  tent */.  }while
17ca0 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70 4c 61 73  ( (++pRec)<=pLas
17cb0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
17cc0 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61 73 73 65  ==nHdr );.  asse
17cd0 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20 29 3b 0a  rt( j==nByte );.
17ce0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
17cf0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
17d00 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
17d10 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
17d20 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42  Out->n = (int)nB
17d30 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  yte;.  pOut->fla
17d40 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  gs = MEM_Blob;. 
17d50 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20   if( nZero ){.  
17d60 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20    pOut->u.nZero 
17d70 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75  = nZero;.    pOu
17d80 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
17d90 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 52 45 47 49  Zero;.  }.  REGI
17da0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
17db0 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44  p3, pOut);.  UPD
17dc0 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
17dd0 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
17de0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
17df0 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  ount P1 P2 * * *
17e00 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
17e10 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a 2a  P2]=count().**.*
17e20 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62  * Store the numb
17e30 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61  er of entries (a
17e40 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
17e50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
17e60 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65   index .** opene
17e70 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20 69  d by cursor P1 i
17e80 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f  n register P2.*/
17e90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17ea0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
17eb0 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b  case OP_Count: {
17ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
17ed0 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79   */.  i64 nEntry
17ee0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
17ef0 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rsr;..  assert( 
17f00 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
17f10 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  ]->eCurType==CUR
17f20 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17f30 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73 72  pCrsr = p->apCsr
17f40 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70 43  [pOp->p1]->uc.pC
17f50 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
17f60 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e 74   pCrsr );.  nEnt
17f70 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  ry = 0;  /* Not 
17f80 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73  needed.  Only us
17f90 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20  ed to silence a 
17fa0 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  warning. */.  rc
17fb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
17fc0 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45 6e  ount(pCrsr, &nEn
17fd0 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  try);.  if( rc )
17fe0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
17ff0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
18000 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
18010 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
18020 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b  t->u.i = nEntry;
18030 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
18040 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
18050 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20  avepoint P1 * * 
18060 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c  P4 *.**.** Open,
18070 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
18080 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f 69  back the savepoi
18090 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61  nt named by para
180a0 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e 64  meter P4, depend
180b0 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61  ing.** on the va
180c0 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70  lue of P1. To op
180d0 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69  en a new savepoi
180e0 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72 65  nt, P1==0. To re
180f0 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
18100 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61  n.** existing sa
18110 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c 20  vepoint, P1==1, 
18120 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  or to rollback a
18130 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70  n existing savep
18140 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63  oint P1==2..*/.c
18150 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  ase OP_Savepoint
18160 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20  : {.  int p1;   
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
18190 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  f P1 operand */.
181a0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76    /* Name of sav
181d0 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  epoint */.  int 
181e0 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f 69  nName;.  Savepoi
181f0 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76 65  nt *pNew;.  Save
18200 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
18210 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  t;.  Savepoint *
18220 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61 76  pTmp;.  int iSav
18230 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69  epoint;.  int ii
18240 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70  ;..  p1 = pOp->p
18250 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f 70  1;.  zName = pOp
18260 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73  ->p4.z;..  /* As
18270 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70 31  sert that the p1
18280 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76 61   parameter is va
18290 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20 69  lid. Also that i
182a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  f there is no op
182b0 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  en.  ** transact
182c0 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ion, then there 
182d0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73 61  cannot be any sa
182e0 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a  vepoints. .  */.
182f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53    assert( db->pS
18300 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64  avepoint==0 || d
18310 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
18320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31   );.  assert( p1
18330 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  ==SAVEPOINT_BEGI
18340 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  N||p1==SAVEPOINT
18350 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41  _RELEASE||p1==SA
18360 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
18370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
18380 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20  ->pSavepoint || 
18390 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
183a0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b  nSavepoint==0 );
183b0 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b  .  assert( check
183c0 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
183d0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
183e0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
183f0 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50  .  if( p1==SAVEP
18400 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20  OINT_BEGIN ){.  
18410 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57    if( db->nVdbeW
18420 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  rite>0 ){.      
18430 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f 69  /* A new savepoi
18440 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72 65  nt cannot be cre
18450 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ated if there ar
18460 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20 0a  e active write .
18470 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
18480 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20 72  nts (i.e. open r
18490 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65 6d  ead/write increm
184a0 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64 6c  ental blob handl
184b0 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  es)..      */.  
184c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
184d0 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20  rror(p, "cannot 
184e0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d  open savepoint -
184f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
18500 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20  in progress");. 
18510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18520 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
18530 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
18540 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18550 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66  zName);..#ifndef
18560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18570 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
18580 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
18590 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  Ok even if this 
185a0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
185b0 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63 74  ually a transact
185c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  ion.      ** sav
185d0 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65 72  epoint (and ther
185e0 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74  efore should not
185f0 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f 69   prompt xSavepoi
18600 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e  nt()) callbacks.
18610 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
18620 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
18630 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  on savepoint bei
18640 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69 73  ng opened, it is
18650 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20 20   guaranteed.    
18660 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64 62    ** that the db
18670 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
18680 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a  y is empty.  */.
18690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
186a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
186b0 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d  || db->nVTrans==
186c0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
186d0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
186e0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
186f0 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20 20  NT_BEGIN,.      
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
18720 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
18730 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
18740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18750 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
18760 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e  ue_to_error;.#en
18770 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  dif..      /* Cr
18780 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70  eate a new savep
18790 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  oint structure. 
187a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  */.      pNew = 
187b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
187c0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
187d0 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65  Savepoint)+nName
187e0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
187f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  New ){.        p
18800 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
18810 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  ar *)&pNew[1];. 
18820 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
18830 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ew->zName, zName
18840 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  , nName+1);.    
18850 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
18860 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
18870 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18880 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61  n mark this as a
18890 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20   special.       
188a0 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e   ** "transaction
188b0 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a   savepoint". */.
188c0 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
188d0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
188e0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
188f0 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
18900 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e        db->isTran
18910 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
18920 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
18930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
18940 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b  b->nSavepoint++;
18950 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18960 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
18970 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e  new savepoint in
18980 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18990 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a  handle's list. *
189a0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
189b0 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76  pNext = db->pSav
189c0 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
189d0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
189e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
189f0 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  New->nDeferredCo
18a00 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72  ns = db->nDeferr
18a10 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20  edCons;.        
18a20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 49  pNew->nDeferredI
18a30 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  mmCons = db->nDe
18a40 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20  ferredImmCons;. 
18a50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18a60 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65 70  else{.    iSavep
18a70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  oint = 0;..    /
18a80 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 64  * Find the named
18a90 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 74   savepoint. If t
18aa0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
18ab0 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
18ac0 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  an.    ** an err
18ad0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
18ae0 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f 0a  o the user.  */.
18af0 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 70      for(.      p
18b00 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e  Savepoint = db->
18b10 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20 20  pSavepoint; .   
18b20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26     pSavepoint &&
18b30 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
18b40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61 6d  pSavepoint->zNam
18b50 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
18b60 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53   pSavepoint = pS
18b70 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 0a  avepoint->pNext.
18b80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53 61      ){.      iSa
18b90 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  vepoint++;.    }
18ba0 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65 70  .    if( !pSavep
18bb0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  oint ){.      sq
18bc0 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
18bd0 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65 70  , "no such savep
18be0 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  oint: %s", zName
18bf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
18c00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
18c10 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e 56  }else if( db->nV
18c20 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70 31  dbeWrite>0 && p1
18c30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
18c40 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ASE ){.      /* 
18c50 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18c60 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28 63  le to release (c
18c70 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
18c80 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65 20  nt if there are 
18c90 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76 65  .      ** active
18ca0 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e 74   write statement
18cb0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
18cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
18cd0 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72 65  or(p, "cannot re
18ce0 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20  lease savepoint 
18cf0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
18d10 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
18d20 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
18d30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
18d40 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
18d50 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
18d60 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
18d70 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72 61  ot this is a tra
18d80 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
18d90 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  nt. If so,.     
18da0 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73 20   ** and this is 
18db0 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61 6e  a RELEASE comman
18dc0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  d, then the curr
18dd0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
18de0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 6d  .      ** is com
18df0 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20 2a  mitted. .      *
18e00 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
18e10 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61 76  ansaction = pSav
18e20 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30  epoint->pNext==0
18e30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73 61   && db->isTransa
18e40 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  ctionSavepoint;.
18e50 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61 6e        if( isTran
18e60 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53  saction && p1==S
18e70 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
18e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
18e90 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
18ea0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21  eCheckFk(p, 1))!
18eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ec0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
18ed0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
18ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e    }.        db->
18ef0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
18f00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
18f10 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d  te3VdbeHalt(p)==
18f20 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
18f30 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d           p->pc =
18f40 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
18f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
18f60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b  >autoCommit = 0;
18f70 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
18f80 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
18f90 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  USY;.          g
18fa0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
18fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18fc0 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63     db->isTransac
18fd0 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
18fe0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
18ff0 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  p->rc;.      }el
19000 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
19010 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  isSchemaChange;.
19020 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f 69          iSavepoi
19030 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f  nt = db->nSavepo
19040 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e 74  int - iSavepoint
19050 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   - 1;.        if
19060 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
19070 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
19080 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43 68        isSchemaCh
19090 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ange = (db->flag
190a0 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
190b0 6e 43 68 61 6e 67 65 73 29 21 3d 30 3b 0a 20 20  nChanges)!=0;.  
190c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
190d0 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
190e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
190f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19100 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
19110 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
19120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19150 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 2c 0a  ABORT_ROLLBACK,.
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
19190 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20 20 20 20  hange==0);.     
191a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
191b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
191c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
191d0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
191e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
191f0 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d           isSchem
19200 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  aChange = 0;.   
19210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
19220 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e  or(ii=0; ii<db->
19230 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
19240 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19250 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
19260 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
19270 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74  , p1, iSavepoint
19280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
192a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
192b0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
192c0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
192d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
192e0 20 20 20 20 20 69 66 28 20 69 73 53 63 68 65 6d       if( isSchem
192f0 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  aChange ){.     
19300 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
19310 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
19320 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ents(db);.      
19330 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
19340 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
19350 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
19360 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
19370 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
19380 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
19390 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ges);.        }.
193a0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
193b0 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
193c0 66 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  f whether this i
193d0 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72 20 52  s a RELEASE or R
193e0 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 6f 79  OLLBACK, destroy
193f0 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73   all .      ** s
19400 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 65 64  avepoints nested
19410 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73   inside of the s
19420 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f  avepoint being o
19430 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  perated on. */. 
19440 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e       while( db->
19450 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 61 76  pSavepoint!=pSav
19460 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
19470 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61    pTmp = db->pSa
19480 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
19490 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
194a0 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
194b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
194c0 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
194d0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
194e0 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  epoint--;.      
194f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  }..      /* If i
19500 74 20 69 73 20 61 20 52 45 4c 45 41 53 45 2c 20  t is a RELEASE, 
19510 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68 65  then destroy the
19520 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
19530 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a 20 20   operated on .  
19540 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69      ** too. If i
19550 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20  t is a ROLLBACK 
19560 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  TO, then set the
19570 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72   number of defer
19580 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  red .      ** co
19590 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
195a0 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ons present in t
195b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  he database to t
195c0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a  he value stored.
195d0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
195e0 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  e savepoint was 
195f0 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  created.  */.   
19600 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50     if( p1==SAVEP
19610 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
19620 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19630 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e  pSavepoint==db->
19640 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  pSavepoint );.  
19650 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70        db->pSavep
19660 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
19670 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
19680 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19690 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  db, pSavepoint);
196a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
196b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
196c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61           db->nSa
196d0 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20  vepoint--;.     
196e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
196f0 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44  {.        db->nD
19700 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 53  eferredCons = pS
19710 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72  avepoint->nDefer
19720 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
19730 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
19740 6d 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  mCons = pSavepoi
19750 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  nt->nDeferredImm
19760 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Cons;.      }.. 
19770 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e       if( !isTran
19780 73 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d 53  saction || p1==S
19790 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
197a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
197b0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
197c0 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20 69  epoint(db, p1, i
197d0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
197e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
197f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
19800 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
19810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19820 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
19830 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
19840 65 72 72 6f 72 3b 0a 0a 20 20 62 72 65 61 6b 3b  error;..  break;
19850 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
19860 75 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20  utoCommit P1 P2 
19870 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20  * * *.**.** Set 
19880 74 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74  the database aut
19890 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f  o-commit flag to
198a0 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66   P1 (1 or 0). If
198b0 20 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c   P2 is true, rol
198c0 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75  l.** back any cu
198d0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62  rrently active b
198e0 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
198f0 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  s. If there are 
19900 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d  any active.** VM
19910 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68  s (apart from th
19920 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20  is one), then a 
19930 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20  ROLLBACK fails. 
19940 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20   A COMMIT fails 
19950 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  if.** there are 
19960 61 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56  active writing V
19970 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73  Ms or active VMs
19980 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
19990 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
199a0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
199b0 61 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20  auses the VM to 
199c0 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  halt..*/.case OP
199d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20  _AutoCommit: {. 
199e0 20 69 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f   int desiredAuto
199f0 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52  Commit;.  int iR
19a00 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 64 65 73 69  ollback;..  desi
19a10 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  redAutoCommit = 
19a20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c  pOp->p1;.  iRoll
19a30 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  back = pOp->p2;.
19a40 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
19a50 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c  dAutoCommit==1 |
19a60 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  | desiredAutoCom
19a70 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
19a80 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
19a90 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c  ommit==1 || iRol
19aa0 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  lback==0 );.  as
19ab0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
19ac0 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20 41  ctive>0 );  /* A
19ad0 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65  t least this one
19ae0 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f   VM is active */
19af0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
19b00 73 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66  sReader );..  if
19b10 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19b20 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d  mit!=db->autoCom
19b30 6d 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20 69  mit ){.    if( i
19b40 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
19b50 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
19b60 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29  dAutoCommit==1 )
19b70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19b80 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
19b90 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
19ba0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d  BACK);.      db-
19bb0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
19bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
19bd0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
19be0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
19bf0 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  te>0 ){.      /*
19c00 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   If this instruc
19c10 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tion implements 
19c20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68  a COMMIT and oth
19c30 65 72 20 56 4d 73 20 61 72 65 20 77 72 69 74 69  er VMs are writi
19c40 6e 67 0a 20 20 20 20 20 20 2a 2a 20 72 65 74 75  ng.      ** retu
19c50 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
19c60 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
19c70 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 63  other VMs must c
19c80 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20 0a  omplete first. .
19c90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
19ca0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
19cb0 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69  p, "cannot commi
19cc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20  t transaction - 
19cd0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
19cf0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
19d00 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20  rogress");.     
19d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
19d20 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  Y;.      goto ab
19d30 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
19d40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19d50 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
19d60 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21  eCheckFk(p, 1))!
19d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19d80 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
19d90 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
19da0 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
19db0 6f 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69  ommit = (u8)desi
19dc0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
19dd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
19de0 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
19df0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
19e00 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69        p->pc = (i
19e10 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
19e20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
19e30 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65  mmit = (u8)(1-de
19e40 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29  siredAutoCommit)
19e50 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
19e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
19e70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
19e80 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  e_return;.    }.
19e90 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
19ea0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
19eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  .    sqlite3Clos
19ec0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
19ed0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
19ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19ef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
19f00 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ONE;.    }else{.
19f10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19f20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
19f30 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
19f40 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  urn;.  }else{.  
19f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
19f60 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20 28 21  or(p,.        (!
19f70 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
19f80 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74 61 72 74  t)?"cannot start
19f90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
19fa0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
19fb0 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20 20 20 28  ion":(.        (
19fc0 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63 61 6e 6e  iRollback)?"cann
19fd0 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
19fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19ff0 61 63 74 69 76 65 22 3a 0a 20 20 20 20 20 20 20  active":.       
1a000 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
1a010 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20  not commit - no 
1a020 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1a030 63 74 69 76 65 22 29 29 3b 0a 20 20 20 20 20 20  ctive"));.      
1a040 20 20 20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c     .    rc = SQL
1a050 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67  ITE_ERROR;.    g
1a060 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1a070 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
1a080 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1a090 65 3a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 50  e: Transaction P
1a0a0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
1a0b0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
1a0c0 73 61 63 74 69 6f 6e 20 6f 6e 20 64 61 74 61 62  saction on datab
1a0d0 61 73 65 20 50 31 20 69 66 20 61 20 74 72 61 6e  ase P1 if a tran
1a0e0 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  saction is not a
1a0f0 6c 72 65 61 64 79 0a 2a 2a 20 61 63 74 69 76 65  lready.** active
1a100 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f  ..** If P2 is no
1a110 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 77  n-zero, then a w
1a120 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a130 20 69 73 20 73 74 61 72 74 65 64 2c 20 6f 72 20   is started, or 
1a140 69 66 20 61 20 0a 2a 2a 20 72 65 61 64 2d 74 72  if a .** read-tr
1a150 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
1a160 65 61 64 79 20 61 63 74 69 76 65 2c 20 69 74 20  eady active, it 
1a170 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1a180 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a190 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  on..** If P2 is 
1a1a0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 72 65 61  zero, then a rea
1a1b0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
1a1c0 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   started..**.** 
1a1d0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
1a1e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a1f0 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
1a200 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1a210 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49 6e  .** started.  In
1a220 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61 69  dex 0 is the mai
1a230 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1a240 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20 74  and index 1 is t
1a250 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64 20  he.** file used 
1a260 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
1a270 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20 6f  bles.  Indices o
1a280 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65 20  f 2 or more are 
1a290 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61  used for.** atta
1a2a0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  ched databases..
1a2b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65  **.** If a write
1a2c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1a2d0 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20  started and the 
1a2e0 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75  Vdbe.usesStmtJou
1a2f0 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20  rnal flag is.** 
1a300 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20  true (this flag 
1a310 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64  is set if the Vd
1a320 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f  be may modify mo
1a330 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
1a340 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  and may.** throw
1a350 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
1a360 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e  ion), a statemen
1a370 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
1a380 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64  y also be opened
1a390 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  ..** More specif
1a3a0 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d  ically, a statem
1a3b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1a3c0 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68  is opened iff th
1a3d0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
1a3e0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nnection is curr
1a3f0 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74  ently not in aut
1a400 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72  ocommit mode, or
1a410 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
1a420 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74  her.** active st
1a430 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74  atements. A stat
1a440 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a450 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 61  n allows the cha
1a460 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
1a470 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20  s.** VDBE to be 
1a480 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
1a490 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f  r an error witho
1a4a0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1a4b0 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e  l back the.** en
1a4c0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1a4d0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73  . If no error is
1a4e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a4f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1a500 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1a510 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
1a520 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56 44  mmit when the VD
1a530 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  BE halts..**.** 
1a540 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20 74 68  If P5!=0 then th
1a550 69 73 20 6f 70 63 6f 64 65 20 61 6c 73 6f 20 63  is opcode also c
1a560 68 65 63 6b 73 20 74 68 65 20 73 63 68 65 6d 61  hecks the schema
1a570 20 63 6f 6f 6b 69 65 20 61 67 61 69 6e 73 74 20   cookie against 
1a580 50 33 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 63  P3.** and the sc
1a590 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e 20  hema generation 
1a5a0 63 6f 75 6e 74 65 72 20 61 67 61 69 6e 73 74 20  counter against 
1a5b0 50 34 2e 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69  P4..** The cooki
1a5c0 65 20 63 68 61 6e 67 65 73 20 69 74 73 20 76 61  e changes its va
1a5d0 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  lue whenever the
1a5e0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1a5f0 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69   changes..** Thi
1a600 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75  s operation is u
1a610 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 77 68  sed to detect wh
1a620 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b  en that the cook
1a630 69 65 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ie has changed.*
1a640 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63  * and that the c
1a650 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e  urrent process n
1a660 65 65 64 73 20 74 6f 20 72 65 72 65 61 64 20 74  eeds to reread t
1a670 68 65 20 73 63 68 65 6d 61 2e 20 20 49 66 20 74  he schema.  If t
1a680 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 63 6f 6f  he schema.** coo
1a690 6b 69 65 20 69 6e 20 50 33 20 64 69 66 66 65 72  kie in P3 differ
1a6a0 73 20 66 72 6f 6d 20 74 68 65 20 73 63 68 65 6d  s from the schem
1a6b0 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74 68 65 20  a cookie in the 
1a6c0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
1a6d0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63 68  or.** if the sch
1a6e0 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e 20 63  ema generation c
1a6f0 6f 75 6e 74 65 72 20 69 6e 20 50 34 20 64 69 66  ounter in P4 dif
1a700 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 75  fers from the cu
1a710 72 72 65 6e 74 0a 2a 2a 20 67 65 6e 65 72 61 74  rrent.** generat
1a720 69 6f 6e 20 63 6f 75 6e 74 65 72 2c 20 74 68 65  ion counter, the
1a730 6e 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45  n an SQLITE_SCHE
1a740 4d 41 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  MA error is rais
1a750 65 64 20 61 6e 64 20 65 78 65 63 75 74 69 6f 6e  ed and execution
1a760 0a 2a 2a 20 68 61 6c 74 73 2e 20 20 54 68 65 20  .** halts.  The 
1a770 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
1a780 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
1a790 6d 69 67 68 74 20 74 68 65 6e 20 72 65 70 72 65  might then repre
1a7a0 70 61 72 65 20 74 68 65 0a 2a 2a 20 73 74 61 74  pare the.** stat
1a7b0 65 6d 65 6e 74 20 61 6e 64 20 72 65 72 75 6e 20  ement and rerun 
1a7c0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  it from the begi
1a7d0 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f  nning..*/.case O
1a7e0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b  P_Transaction: {
1a7f0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
1a800 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
1a810 74 20 69 47 65 6e 3b 0a 0a 20 20 61 73 73 65 72  t iGen;..  asser
1a820 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
1a830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1a840 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70  readOnly==0 || p
1a850 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 61  Op->p2==0 );.  a
1a860 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1a870 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
1a880 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1a890 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1a8a0 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
1a8b0 70 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  p1) );.  if( pOp
1a8c0 2d 3e 70 32 20 26 26 20 28 64 62 2d 3e 66 6c 61  ->p2 && (db->fla
1a8d0 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65 72  gs & SQLITE_Quer
1a8e0 79 4f 6e 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20  yOnly)!=0 ){.   
1a8f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1a900 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1a910 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a920 6f 72 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20  or;.  }.  pBt = 
1a930 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1a940 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 42 74  .pBt;..  if( pBt
1a950 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a960 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a970 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e 70 32  ans(pBt, pOp->p2
1a980 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1a990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1a9a0 5f 53 4e 41 50 53 48 4f 54 20 29 3b 0a 20 20 20  _SNAPSHOT );.   
1a9b0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
1a9c0 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
1a9d0 45 52 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ERY );.    if( r
1a9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a9f0 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30 78        if( (rc&0x
1aa00 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  ff)==SQLITE_BUSY
1aa10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
1aa20 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  c = (int)(pOp - 
1aa30 61 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aOp);.        p-
1aa40 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
1aa50 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
1aa60 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1aa70 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1aa80 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
1aa90 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
1aaa0 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  2 && p->usesStmt
1aab0 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26 26  Journal .     &&
1aac0 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   (db->autoCommit
1aad0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65  ==0 || db->nVdbe
1aae0 52 65 61 64 3e 31 29 20 0a 20 20 20 20 29 7b 0a  Read>1) .    ){.
1aaf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1ab00 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
1ab10 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 20 20  ans(pBt) );.    
1ab20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 65 6d    if( p->iStatem
1ab30 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
1ab40 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
1ab50 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 20 64  tatement>=0 && d
1ab60 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 3d 30  b->nSavepoint>=0
1ab70 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   );.        db->
1ab80 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a 20  nStatement++; . 
1ab90 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 74 65         p->iState
1aba0 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  ment = db->nSave
1abb0 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 74 61  point + db->nSta
1abc0 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 7d 0a  tement;.      }.
1abd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1abe0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
1abf0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42  (db, SAVEPOINT_B
1ac00 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 65 6d  EGIN, p->iStatem
1ac10 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  ent-1);.      if
1ac20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ac30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ac40 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1ac50 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53  nStmt(pBt, p->iS
1ac60 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
1ac70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f   }..      /* Sto
1ac80 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  re the current v
1ac90 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1aca0 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
1acb0 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
1acc0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65  .      ** counte
1acd0 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  r. If the statem
1ace0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1acf0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
1ad00 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 20 2a  ed back,.      *
1ad10 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1ad20 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 65 64  his counter need
1ad30 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
1ad40 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20   too.  */.      
1ad50 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 20  p->nStmtDefCons 
1ad60 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  = db->nDeferredC
1ad70 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ons;.      p->nS
1ad80 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 20 3d 20  tmtDefImmCons = 
1ad90 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
1ada0 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cons;.    }..   
1adb0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 73   /* Gather the s
1adc0 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 6e 75  chema version nu
1add0 6d 62 65 72 20 66 6f 72 20 63 68 65 63 6b 69 6e  mber for checkin
1ade0 67 3a 0a 20 20 20 20 2a 2a 20 49 4d 50 4c 45 4d  g:.    ** IMPLEM
1adf0 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1ae00 33 31 38 39 2d 35 31 31 33 35 20 41 73 20 65 61  3189-51135 As ea
1ae10 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
1ae20 20 72 75 6e 73 2c 20 74 68 65 20 73 63 68 65 6d   runs, the schem
1ae30 61 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  a.    ** version
1ae40 20 69 73 20 63 68 65 63 6b 65 64 20 74 6f 20 65   is checked to e
1ae50 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
1ae60 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
1ae70 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 0a  anged since the.
1ae80 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65      ** SQL state
1ae90 6d 65 6e 74 20 77 61 73 20 70 72 65 70 61 72 65  ment was prepare
1aea0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
1aeb0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
1aec0 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48  a(pBt, BTREE_SCH
1aed0 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33  EMA_VERSION, (u3
1aee0 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 20  2 *)&iMeta);.   
1aef0 20 69 47 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b   iGen = db->aDb[
1af00 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61  pOp->p1].pSchema
1af10 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20  ->iGeneration;. 
1af20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e   }else{.    iGen
1af30 20 3d 20 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20   = iMeta = 0;.  
1af40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  }.  assert( pOp-
1af50 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  >p5==0 || pOp->p
1af60 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1af70 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  );.  if( pOp->p5
1af80 20 26 26 20 28 69 4d 65 74 61 21 3d 70 4f 70 2d   && (iMeta!=pOp-
1af90 3e 70 33 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70  >p3 || iGen!=pOp
1afa0 2d 3e 70 34 2e 69 29 20 29 7b 0a 20 20 20 20 73  ->p4.i) ){.    s
1afb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1afc0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1afd0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
1afe0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1aff0 62 2c 20 22 64 61 74 61 62 61 73 65 20 73 63 68  b, "database sch
1b000 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
1b010 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
1b020 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66   schema-cookie f
1b030 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1b040 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68   file matches th
1b050 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a  e cookie .    **
1b060 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
1b070 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
1b080 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1b090 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20   schema, do.    
1b0a0 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68  ** not reload th
1b0b0 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68  e schema from th
1b0c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b0d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1b0e0 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73  f virtual-tables
1b0f0 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69   are in use, thi
1b100 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e  s is not just an
1b110 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
1b120 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74     ** Often, v-t
1b130 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69  ables store thei
1b140 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20  r data in other 
1b150 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77  SQLite tables, w
1b160 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20  hich.    ** are 
1b170 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74  queried from wit
1b180 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20  hin xNext() and 
1b190 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65  other v-table me
1b1a0 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20  thods using.    
1b1b0 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75 65 72  ** prepared quer
1b1c0 69 65 73 2e 20 49 66 20 73 75 63 68 20 61 20 71  ies. If such a q
1b1d0 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64  uery is out-of-d
1b1e0 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77  ate, we do not w
1b1f0 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  ant to.    ** di
1b200 73 63 61 72 64 20 74 68 65 20 64 61 74 61 62 61  scard the databa
1b210 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68  se schema, as th
1b220 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c  e user code impl
1b230 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20  ementing the.   
1b240 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c   ** v-table woul
1b250 64 20 68 61 76 65 20 74 6f 20 62 65 20 72 65 61  d have to be rea
1b260 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  dy for the sqlit
1b270 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
1b280 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20  e itself.    ** 
1b290 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
1b2a0 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  d whenever sqlit
1b2b0 65 33 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c  e3_step() is cal
1b2c0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
1b2d0 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c  .    ** a v-tabl
1b2e0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f  e method..    */
1b2f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
1b300 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d  [pOp->p1].pSchem
1b310 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1b320 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20  !=iMeta ){.     
1b330 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
1b340 53 63 68 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e  Schema(db, pOp->
1b350 70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  p1);.    }.    p
1b360 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1b370 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
1b380 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 69 66 28  CHEMA;.  }.  if(
1b390 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1b3a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1b3b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1b3c0 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69 65  code: ReadCookie
1b3d0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1b3e0 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69 65 20  .** Read cookie 
1b3f0 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d 20 64  number P3 from d
1b400 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 77  atabase P1 and w
1b410 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72 65 67  rite it into reg
1b420 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50 33 3d  ister P2..** P3=
1b430 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1b440 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d 3d 32   version.  P3==2
1b450 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1b460 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d 3d   format..** P3==
1b470 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1b480 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1b490 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f   size, and so fo
1b4a0 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a  rth.  P1==0 is.*
1b4b0 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
1b4c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
1b4d0 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =1 is the databa
1b4e0 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
1b4f0 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
1b500 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
1b510 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1b520 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1b530 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  e database (eith
1b540 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  er a transaction
1b550 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61 72  .** must be star
1b560 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75 73  ted or there mus
1b570 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1b580 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65  sor) before.** e
1b590 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69 6e  xecuting this in
1b5a0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
1b5b0 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  se OP_ReadCookie
1b5c0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
1b5d0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
1b5e0 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20  nt iMeta;.  int 
1b5f0 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  iDb;.  int iCook
1b600 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ie;..  assert( p
1b610 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
1b620 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a   iDb = pOp->p1;.
1b630 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d    iCookie = pOp-
1b640 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p3;.  assert( p
1b650 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f  Op->p3<SQLITE_N_
1b660 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20  BTREE_META );.  
1b670 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1b680 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1b690 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
1b6a0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29  Db[iDb].pBt!=0 )
1b6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
1b6c0 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
1b6d0 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 0a 20 20  ask, iDb) );..  
1b6e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
1b6f0 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  eta(db->aDb[iDb]
1b700 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28  .pBt, iCookie, (
1b710 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20  u32 *)&iMeta);. 
1b720 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
1b730 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
1b740 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
1b750 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eta;.  break;.}.
1b760 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74 43  ./* Opcode: SetC
1b770 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a  ookie P1 P2 P3 *
1b780 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
1b790 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
1b7a0 20 50 33 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20   P3 into cookie 
1b7b0 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
1b7c0 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d  abase P1..** P2=
1b7d0 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1b7e0 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 32   version.  P2==2
1b7f0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1b800 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d   format..** P2==
1b810 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1b820 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1b830 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73   .** size, and s
1b840 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
1b850 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
1b860 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
1b870 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64  ==1 is the .** d
1b880 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
1b890 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f  d to store tempo
1b8a0 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
1b8b0 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
1b8c0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b8d0 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e   before executin
1b8e0 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
1b8f0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f  /.case OP_SetCoo
1b900 6b 69 65 3a 20 7b 0a 20 20 44 62 20 2a 70 44 62  kie: {.  Db *pDb
1b910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b920 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p2<SQLITE_N_BTR
1b930 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
1b940 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1b950 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
1b960 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1b970 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
1b980 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31  reeMask, pOp->p1
1b990 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1b9a0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
1b9b0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
1b9c0 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
1b9d0 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
1b9e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1b9f0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1ba00 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70  xHeld(db, pOp->p
1ba10 31 2c 20 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65  1, 0) );.  /* Se
1ba20 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64  e note about ind
1ba30 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f  ex shifting on O
1ba40 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a  P_ReadCookie */.
1ba50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ba60 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44  reeUpdateMeta(pD
1ba70 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c  b->pBt, pOp->p2,
1ba80 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28   pOp->p3);.  if(
1ba90 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f   pOp->p2==BTREE_
1baa0 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29  SCHEMA_VERSION )
1bab0 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  {.    /* When th
1bac0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1bad0 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20  changes, record 
1bae0 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69  the new cookie i
1baf0 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20  nternally */.   
1bb00 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
1bb10 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70  chema_cookie = p
1bb20 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e  Op->p3;.    db->
1bb30 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1bb40 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
1bb50 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1bb60 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46  p2==BTREE_FILE_F
1bb70 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20  ORMAT ){.    /* 
1bb80 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69  Record changes i
1bb90 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  n the file forma
1bba0 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53  t */.    pDb->pS
1bbb0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1bbc0 61 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  at = pOp->p3;.  
1bbd0 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d  }.  if( pOp->p1=
1bbe0 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76  =1 ){.    /* Inv
1bbf0 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70  alidate all prep
1bc00 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
1bc10 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d  whenever the TEM
1bc20 50 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  P database.    *
1bc30 2a 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e  * schema is chan
1bc40 67 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ged.  Ticket #16
1bc50 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  44 */.    sqlite
1bc60 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1bc70 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
1bc80 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
1bc90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  0;.  }.  if( rc 
1bca0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1bcb0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1bcc0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1bcd0 3a 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32  : OpenRead P1 P2
1bce0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1bcf0 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1bd00 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  Db=P3.**.** Open
1bd10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1bd20 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
1bd30 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65  base table whose
1bd40 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a   root page is.**
1bd50 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61 73   P2 in a databas
1bd60 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74  e file.  The dat
1bd70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64 65  abase file is de
1bd80 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20  termined by P3. 
1bd90 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20  .** P3==0 means 
1bda0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1bdb0 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74  e, P3==1 means t
1bdc0 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 64  he database used
1bdd0 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61   for .** tempora
1bde0 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50  ry tables, and P
1bdf0 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74  3>1 means used t
1be00 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1be10 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74   attached.** dat
1be20 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68 65  abase.  Give the
1be30 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69   new cursor an i
1be40 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e  dentifier of P1.
1be50 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75    The P1.** valu
1be60 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63  es need not be c
1be70 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c  ontiguous but al
1be80 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75  l P1 values shou
1be90 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65  ld be small inte
1bea0 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61  gers..** It is a
1beb0 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74  n error for P1 t
1bec0 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a  o be negative..*
1bed0 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68  *.** If P5!=0 th
1bee0 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  en use the conte
1bef0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1bf00 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61  2 as the root pa
1bf10 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76  ge, not.** the v
1bf20 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c  alue of P2 itsel
1bf30 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77  f..**.** There w
1bf40 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f  ill be a read lo
1bf50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bf60 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 72  se whenever ther
1bf70 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e is an.** open 
1bf80 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20  cursor.  If the 
1bf90 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c  database was unl
1bfa0 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ocked prior to t
1bfb0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
1bfc0 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c  ** then a read l
1bfd0 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 20  ock is acquired 
1bfe0 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1bff0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20  instruction.  A 
1c000 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c  read.** lock all
1c010 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ows other proces
1c020 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65 20  ses to read the 
1c030 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72 6f  database but pro
1c040 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74  hibits.** any ot
1c050 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d  her process from
1c060 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64   modifying the d
1c070 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
1c080 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65  ad lock is.** re
1c090 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20  leased when all 
1c0a0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73  cursors are clos
1c0b0 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73  ed.  If this ins
1c0c0 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  truction attempt
1c0d0 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65  s.** to get a re
1c0e0 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c  ad lock but fail
1c0f0 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74 65  s, the script te
1c100 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e  rminates with an
1c110 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1c120 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1c130 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1c140 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1c150 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1c160 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1c170 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1c180 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1c190 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1c1a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c1b0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
1c1c0 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
1c1d0 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1c1e0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
1c1f0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
1c200 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1c210 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
1c220 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1c230 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1c240 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
1c250 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1c260 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1c270 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
1c280 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1c290 4f 70 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65  OpenWrite, Reope
1c2a0 6e 49 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  nIdx.*/./* Opcod
1c2b0 65 3a 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20  e: ReopenIdx P1 
1c2c0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
1c2d0 79 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32  ynopsis: root=P2
1c2e0 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68   iDb=P3.**.** Th
1c2f0 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f  e ReopenIdx opco
1c300 64 65 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79  de works exactly
1c310 20 6c 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65   like ReadOpen e
1c320 78 63 65 70 74 20 74 68 61 74 20 69 74 20 66 69  xcept that it fi
1c330 72 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f  rst.** checks to
1c340 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72 73   see if the curs
1c350 6f 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65  or on P1 is alre
1c360 61 64 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20  ady open with a 
1c370 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d  root page.** num
1c380 62 65 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66  ber of P2 and if
1c390 20 69 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f   it is this opco
1c3a0 64 65 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d  de becomes a no-
1c3b0 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
1c3c0 72 64 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63  rds,.** if the c
1c3d0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1c3e0 20 6f 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65   open, do not re
1c3f0 6f 70 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  open it..**.** T
1c400 68 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63  he ReopenIdx opc
1c410 6f 64 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ode may only be 
1c420 75 73 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20  used with P5==0 
1c430 61 6e 64 20 77 69 74 68 20 50 34 20 62 65 69 6e  and with P4 bein
1c440 67 0a 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46  g.** a P4_KEYINF
1c450 4f 20 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68  O object.  Furth
1c460 65 72 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76  ermore, the P3 v
1c470 61 6c 75 65 20 6d 75 73 74 20 62 65 20 74 68 65  alue must be the
1c480 20 73 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72   same as.** ever
1c490 79 20 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64  y other ReopenId
1c4a0 78 20 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f  x or OpenRead fo
1c4b0 72 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  r the same curso
1c4c0 72 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  r number..**.** 
1c4d0 53 65 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64  See the OpenRead
1c4e0 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74   opcode document
1c4f0 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
1c500 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1c510 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1c520 4f 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20  OpenWrite P1 P2 
1c530 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
1c540 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44  psis: root=P2 iD
1c550 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  b=P3.**.** Open 
1c560 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  a read/write cur
1c570 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20  sor named P1 on 
1c580 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1c590 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a  ex whose root.**
1c5a0 20 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72   page is P2.  Or
1c5b0 20 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68   if P5!=0 use th
1c5c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1c5d0 69 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64  ister P2 to find
1c5e0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1c5f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
1c600 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
1c610 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
1c620 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
1c630 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
1c640 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c650 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
1c660 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
1c670 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
1c680 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
1c690 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
1c6a0 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
1c6b0 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1c6c0 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1c6d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
1c6e0 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
1c6f0 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
1c700 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
1c710 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
1c720 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1c730 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1c740 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65  table, or to the
1c750 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65  .** largest inde
1c760 78 20 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  x of any column 
1c770 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
1c780 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73  t is actually us
1c790 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ed..**.** This i
1c7a0 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73  nstruction works
1c7b0 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52   just like OpenR
1c7c0 65 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20  ead except that 
1c7d0 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72  it opens the cur
1c7e0 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77  sor.** in read/w
1c7f0 72 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rite mode.  For 
1c800 61 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74  a given table, t
1c810 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20  here can be one 
1c820 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c  or more read-onl
1c830 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20  y.** cursors or 
1c840 61 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72  a single read/wr
1c850 69 74 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e  ite cursor but n
1c860 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53  ot both..**.** S
1c870 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64  ee also OpenRead
1c880 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f  ..*/.case OP_Reo
1c890 70 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20  penIdx: {.  int 
1c8a0 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
1c8b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
1c8c0 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
1c8d0 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
1c8e0 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
1c8f0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
1c900 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
1c910 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1c920 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50  0 || pOp->p5==OP
1c930 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20  FLAG_SEEKEQ );. 
1c940 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1c950 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1c960 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e   );.  pCur = p->
1c970 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1c980 20 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43    if( pCur && pC
1c990 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75  ur->pgnoRoot==(u
1c9a0 33 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20  32)pOp->p2 ){.  
1c9b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c9c0 69 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20  iDb==pOp->p3 ); 
1c9d0 20 20 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65       /* Guarante
1c9e0 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 67  ed by the code g
1c9f0 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  enerator */.    
1ca00 67 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72  goto open_cursor
1ca10 5f 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a  _set_hints;.  }.
1ca20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1ca30 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1ca40 74 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f  tly open or is o
1ca50 70 65 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65  pen on a differe
1ca60 6e 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  nt.  ** index, t
1ca70 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1ca80 20 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61   into OP_OpenRea
1ca90 64 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f  d to force a reo
1caa0 70 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  pen */.case OP_O
1cab0 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50  penRead:.case OP
1cac0 5f 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61  _OpenWrite:..  a
1cad0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1cae0 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
1caf0 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c   || pOp->p5==0 |
1cb00 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41  | pOp->p5==OPFLA
1cb10 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73  G_SEEKEQ );.  as
1cb20 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1cb30 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1cb40 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1cb50 4f 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d  OpenRead || pOp-
1cb60 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70  >opcode==OP_Reop
1cb70 65 6e 49 64 78 0a 20 20 20 20 20 20 20 20 20 20  enIdx.          
1cb80 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  || p->readOnly==
1cb90 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  0 );..  if( p->e
1cba0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63  xpired ){.    rc
1cbb0 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f   = SQLITE_ABORT_
1cbc0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f  ROLLBACK;.    go
1cbd0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1cbe0 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46  error;.  }..  nF
1cbf0 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79  ield = 0;.  pKey
1cc00 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d  Info = 0;.  p2 =
1cc10 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20   pOp->p2;.  iDb 
1cc20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
1cc30 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1cc40 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1cc50 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
1cc60 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
1cc70 20 69 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d   iDb) );.  pDb =
1cc80 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
1cc90 20 20 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b    pX = pDb->pBt;
1cca0 0a 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30  .  assert( pX!=0
1ccb0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f   );.  if( pOp->o
1ccc0 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72  pcode==OP_OpenWr
1ccd0 69 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ite ){.    asser
1cce0 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  t( OPFLAG_FORDEL
1ccf0 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45  ETE==BTREE_FORDE
1cd00 4c 45 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c  LETE );.    wrFl
1cd10 61 67 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52  ag = BTREE_WRCSR
1cd20 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50   | (pOp->p5 & OP
1cd30 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b  FLAG_FORDELETE);
1cd40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1cd50 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1cd60 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1cd70 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  );.    if( pDb->
1cd80 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
1cd90 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69  rmat < p->minWri
1cda0 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a  teFileFormat ){.
1cdb0 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74        p->minWrit
1cdc0 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44  eFileFormat = pD
1cdd0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1cde0 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20  _format;.    }. 
1cdf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c   }else{.    wrFl
1ce00 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ag = 0;.  }.  if
1ce10 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
1ce20 41 47 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20  AG_P2ISREG ){.  
1ce30 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29    assert( p2>0 )
1ce40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
1ce50 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
1ce60 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
1ce70 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
1ce80 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
1ce90 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29  memIsValid(pIn2)
1cea0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ceb0 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
1cec0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
1ced0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cee0 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
1cef0 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29  ;.    p2 = (int)
1cf00 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f  pIn2->u.i;.    /
1cf10 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61  * The p2 value a
1cf20 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d  lways comes from
1cf30 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61   a prior OP_Crea
1cf40 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61  teTable opcode a
1cf50 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  nd.    ** that o
1cf60 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1cf70 73 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c  s set the p2 val
1cf80 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20  ue to 2 or more 
1cf90 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20  or else fail..  
1cfa0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65    ** If there we
1cfb0 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  re a failure, th
1cfc0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1cfd0 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20  ment would have 
1cfe0 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65  halted.    ** be
1cff0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
1d000 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
1d010 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d020 32 3e 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66  2>=2 );.  }.  if
1d030 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1d040 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
1d050 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
1d060 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
1d070 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1d080 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
1d090 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d0a0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1d0b0 20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d   );.    nField =
1d0c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1d0d0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1d0e0 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eld;.  }else if(
1d0f0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1d100 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46  _INT32 ){.    nF
1d110 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
1d120 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d130 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1d140 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d  assert( nField>=
1d150 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d160 20 6e 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f   nField==0 );  /
1d170 2a 20 54 61 62 6c 65 20 77 69 74 68 20 49 4e 54  * Table with INT
1d180 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1d190 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73   and nothing els
1d1a0 65 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c  e */.  pCur = al
1d1b0 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1d1c0 70 4f 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c  pOp->p1, nField,
1d1d0 20 69 44 62 2c 20 43 55 52 54 59 50 45 5f 42 54   iDb, CURTYPE_BT
1d1e0 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 75 72  REE);.  if( pCur
1d1f0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1d200 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52  m;.  pCur->nullR
1d210 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ow = 1;.  pCur->
1d220 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
1d230 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1d240 3d 20 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c  = p2;.#ifdef SQL
1d250 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 75 72  ITE_DEBUG.  pCur
1d260 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
1d270 67 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d  g;.#endif.  rc =
1d280 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d290 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
1d2a0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1d2b0 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  ur->uc.pCursor);
1d2c0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1d2d0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1d2e0 2f 2a 20 53 65 74 20 74 68 65 20 56 64 62 65 43  /* Set the VdbeC
1d2f0 75 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 76 61  ursor.isTable va
1d300 72 69 61 62 6c 65 2e 20 50 72 65 76 69 6f 75 73  riable. Previous
1d310 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a   versions of.  *
1d320 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
1d330 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f   check if the ro
1d340 6f 74 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65  ot-page flags we
1d350 72 65 20 73 61 6e 65 20 61 74 20 74 68 69 73 20  re sane at this 
1d360 70 6f 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72  point.  ** and r
1d370 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20 63  eport database c
1d380 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65  orruption if the
1d390 79 20 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20  y were not, but 
1d3a0 74 68 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20  this check has. 
1d3b0 20 2a 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20   ** since moved 
1d3c0 69 6e 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c  into the btree l
1d3d0 61 79 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43  ayer.  */  .  pC
1d3e0 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f  ur->isTable = pO
1d3f0 70 2d 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45  p->p4type!=P4_KE
1d400 59 49 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72  YINFO;..open_cur
1d410 73 6f 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20  sor_set_hints:. 
1d420 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
1d430 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42  BULKCSR==BTREE_B
1d440 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73  ULKLOAD );.  ass
1d450 65 72 74 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b  ert( OPFLAG_SEEK
1d460 45 51 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45  EQ==BTREE_SEEK_E
1d470 51 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Q );.  testcase(
1d480 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
1d490 47 5f 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66  G_BULKCSR );.#if
1d4a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d4b0 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
1d4c0 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
1d4d0 70 32 20 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b  p2 & OPFLAG_SEEK
1d4e0 45 51 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  EQ );.#endif.  s
1d4f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d500 72 48 69 6e 74 46 6c 61 67 73 28 70 43 75 72 2d  rHintFlags(pCur-
1d510 3e 75 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20  >uc.pCursor,.   
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4f 70              (pOp
1d540 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 42  ->p5 & (OPFLAG_B
1d550 55 4c 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45  ULKCSR|OPFLAG_SE
1d560 45 4b 45 51 29 29 29 3b 0a 20 20 69 66 28 20 72  EKEQ)));.  if( r
1d570 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1d580 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
1d590 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1d5a0 64 65 3a 20 4f 70 65 6e 44 75 70 20 50 31 20 50  de: OpenDup P1 P
1d5b0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70  2 * * *.**.** Op
1d5c0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1d5d0 50 31 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  P1 that points t
1d5e0 6f 20 74 68 65 20 73 61 6d 65 20 65 70 68 65 6d  o the same ephem
1d5f0 65 72 61 6c 20 74 61 62 6c 65 20 61 73 0a 2a 2a  eral table as.**
1d600 20 63 75 72 73 6f 72 20 50 32 2e 20 20 54 68 65   cursor P2.  The
1d610 20 50 32 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P2 cursor must 
1d620 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1d630 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1d640 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 2a 2a 20  penEphemeral.** 
1d650 6f 70 63 6f 64 65 2e 20 20 4f 6e 6c 79 20 65 70  opcode.  Only ep
1d660 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20  hemeral cursors 
1d670 6d 61 79 20 62 65 20 64 75 70 6c 69 63 61 74 65  may be duplicate
1d680 64 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  d..**.** Duplica
1d690 74 65 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  te ephemeral cur
1d6a0 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
1d6b0 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 6f 66 20  r self-joins of 
1d6c0 6d 61 74 65 72 69 61 6c 69 7a 65 64 20 76 69 65  materialized vie
1d6d0 77 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ws..*/.case OP_O
1d6e0 70 65 6e 44 75 70 3a 20 7b 0a 20 20 56 64 62 65  penDup: {.  Vdbe
1d6f0 43 75 72 73 6f 72 20 2a 70 4f 72 69 67 3b 20 20  Cursor *pOrig;  
1d700 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
1d710 6c 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 64  l cursor to be d
1d720 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 20 20 56  uplicated */.  V
1d730 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 20  dbeCursor *pCx; 
1d740 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1d750 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 70 4f 72  cursor */..  pOr
1d760 69 67 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ig = p->apCsr[pO
1d770 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
1d780 28 20 70 4f 72 69 67 2d 3e 70 42 74 78 21 3d 30  ( pOrig->pBtx!=0
1d790 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 65 70 68   );  /* Only eph
1d7a0 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20 63  emeral cursors c
1d7b0 61 6e 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  an be duplicated
1d7c0 20 2a 2f 0a 0a 20 20 70 43 78 20 3d 20 61 6c 6c   */..  pCx = all
1d7d0 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1d7e0 4f 70 2d 3e 70 31 2c 20 70 4f 72 69 67 2d 3e 6e  Op->p1, pOrig->n
1d7f0 46 69 65 6c 64 2c 20 2d 31 2c 20 43 55 52 54 59  Field, -1, CURTY
1d800 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28  PE_BTREE);.  if(
1d810 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1d820 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1d830 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1d840 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20  ->isEphemeral = 
1d850 31 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e  1;.  pCx->pKeyIn
1d860 66 6f 20 3d 20 70 4f 72 69 67 2d 3e 70 4b 65 79  fo = pOrig->pKey
1d870 49 6e 66 6f 3b 0a 20 20 70 43 78 2d 3e 69 73 54  Info;.  pCx->isT
1d880 61 62 6c 65 20 3d 20 70 4f 72 69 67 2d 3e 69 73  able = pOrig->is
1d890 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71  Table;.  rc = sq
1d8a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d8b0 28 70 4f 72 69 67 2d 3e 70 42 74 78 2c 20 4d 41  (pOrig->pBtx, MA
1d8c0 53 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45  STER_ROOT, BTREE
1d8d0 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20  _WRCSR,.        
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c    pCx->pKeyInfo,
1d900 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
1d910 29 3b 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  );.  /* The sqli
1d920 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
1d930 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6f 6e 6c   routine can onl
1d940 79 20 66 61 69 6c 20 66 6f 72 20 74 68 65 20 66  y fail for the f
1d950 69 72 73 74 20 63 75 72 73 6f 72 0a 20 20 2a 2a  irst cursor.  **
1d960 20 6f 70 65 6e 65 64 20 66 6f 72 20 61 20 64 61   opened for a da
1d970 74 61 62 61 73 65 2e 20 20 53 69 6e 63 65 20 74  tabase.  Since t
1d980 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1d990 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
1d9a0 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 70  hen this.  ** op
1d9b0 63 6f 64 65 20 69 73 20 72 75 6e 2c 20 74 68 65  code is run, the
1d9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d9d0 73 6f 72 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  sor() cannot fai
1d9e0 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72  l */.  assert( r
1d9f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1da00 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
1da10 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65  Opcode: OpenEphe
1da20 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34  meral P1 P2 * P4
1da30 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1da40 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a   nColumn=P2.**.*
1da50 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72  * Open a new cur
1da60 73 6f 72 20 50 31 20 74 6f 20 61 20 74 72 61 6e  sor P1 to a tran
1da70 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20  sient table..** 
1da80 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  The cursor is al
1da90 77 61 79 73 20 6f 70 65 6e 65 64 20 72 65 61 64  ways opened read
1daa0 2f 77 72 69 74 65 20 65 76 65 6e 20 69 66 20 0a  /write even if .
1dab0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
1dac0 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
1dad0 79 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  y.  The ephemera
1dae0 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 64 65  l.** table is de
1daf0 6c 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  leted automatica
1db00 6c 6c 79 20 77 68 65 6e 20 74 68 65 20 63 75 72  lly when the cur
1db10 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1db20 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e  *.** P2 is the n
1db30 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1db40 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61   in the ephemera
1db50 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  l table..** The 
1db60 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
1db70 20 61 20 42 54 72 65 65 20 74 61 62 6c 65 20 69   a BTree table i
1db80 66 20 50 34 3d 3d 30 20 61 6e 64 20 74 6f 20 61  f P4==0 and to a
1db90 20 42 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20   BTree index.** 
1dba0 69 66 20 50 34 20 69 73 20 6e 6f 74 20 30 2e 20  if P4 is not 0. 
1dbb0 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
1dbc0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
1dbd0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
1dbe0 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 64 65 66  ture.** that def
1dbf0 69 6e 65 73 20 74 68 65 20 66 6f 72 6d 61 74 20  ines the format 
1dc00 6f 66 20 6b 65 79 73 20 69 6e 20 74 68 65 20 69  of keys in the i
1dc10 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
1dc20 50 35 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  P5 parameter can
1dc30 20 62 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68   be a mask of th
1dc40 65 20 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20  e BTREE_* flags 
1dc50 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74  defined.** in bt
1dc60 72 65 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c  ree.h.  These fl
1dc70 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65  ags control aspe
1dc80 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61  cts of the opera
1dc90 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62  tion of.** the b
1dca0 74 72 65 65 2e 20 20 54 68 65 20 42 54 52 45 45  tree.  The BTREE
1dcb0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1dcc0 64 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66  d BTREE_SINGLE f
1dcd0 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65  lags are.** adde
1dce0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
1dcf0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1dd00 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20  penAutoindex P1 
1dd10 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
1dd20 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50  opsis: nColumn=P
1dd30 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  2.**.** This opc
1dd40 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61  ode works the sa
1dd50 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68  me as OP_OpenEph
1dd60 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20  emeral.  It has 
1dd70 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e  a.** different n
1dd80 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ame to distingui
1dd90 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61 62  sh its use.  Tab
1dda0 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
1ddb0 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63  g.** by this opc
1ddc0 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ode will be used
1ddd0 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c   for automatical
1dde0 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e 73  ly created trans
1ddf0 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20  ient.** indices 
1de00 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73  in joins..*/.cas
1de10 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  e OP_OpenAutoind
1de20 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ex: .case OP_Ope
1de30 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20  nEphemeral: {.  
1de40 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1de50 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1de60 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74 69 63 20  Info;..  static 
1de70 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61  const int vfsFla
1de80 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49  gs = .      SQLI
1de90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1dea0 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1deb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1dec0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ded0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1dee0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1def0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1df00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1df10 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 20  _TRANSIENT_DB;. 
1df20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1df30 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1df40 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
1df50 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1df60 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1df70 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43  , pOp->p2, -1, C
1df80 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20  URTYPE_BTREE);. 
1df90 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f   if( pCx==0 ) go
1dfa0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78  to no_mem;.  pCx
1dfb0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
1dfc0 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61   pCx->isEphemera
1dfd0 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  l = 1;.  rc = sq
1dfe0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
1dff0 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
1e000 26 70 43 78 2d 3e 70 42 74 78 2c 20 0a 20 20 20  &pCx->pBtx, .   
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f       BTREE_OMIT_
1e030 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f  JOURNAL | BTREE_
1e040 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35  SINGLE | pOp->p5
1e050 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69  , vfsFlags);.  i
1e060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e070 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e080 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1e090 61 6e 73 28 70 43 78 2d 3e 70 42 74 78 2c 20 31  ans(pCx->pBtx, 1
1e0a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1e0b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e0c0 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69    /* If a transi
1e0d0 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71  ent index is req
1e0e0 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74  uired, create it
1e0f0 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20   by calling.    
1e100 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1e110 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74  reateTable() wit
1e120 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42  h the BTREE_BLOB
1e130 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a  KEY flag before.
1e140 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69      ** opening i
1e150 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e  t. If a transien
1e160 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69  t table is requi
1e170 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68  red, just use th
1e180 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  e.    ** automat
1e190 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74  ically created t
1e1a0 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
1e1b0 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49  age 1 (an BLOB_I
1e1c0 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20  NTKEY table)..  
1e1d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
1e1e0 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  x->pKeyInfo = pK
1e1f0 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
1e200 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b  .pKeyInfo)!=0 ){
1e210 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
1e220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e230 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b  Op->p4type==P4_K
1e240 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  EYINFO );.      
1e250 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e260 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78  eCreateTable(pCx
1e270 2d 3e 70 42 74 78 2c 20 26 70 67 6e 6f 2c 20 42  ->pBtx, &pgno, B
1e280 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70  TREE_BLOBKEY | p
1e290 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20  Op->p5); .      
1e2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e2b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1e2c0 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45  ert( pgno==MASTE
1e2d0 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20  R_ROOT+1 );.    
1e2e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1e2f0 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  Info->db==db );.
1e300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e310 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45  pKeyInfo->enc==E
1e320 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20  NC(db) );.      
1e330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e340 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  reeCursor(pCx->p
1e350 42 74 78 2c 20 70 67 6e 6f 2c 20 42 54 52 45 45  Btx, pgno, BTREE
1e360 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20  _WRCSR,.        
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
1e390 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  , pCx->uc.pCurso
1e3a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1e3b0 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d    pCx->isTable =
1e3c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1e3d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e3e0 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
1e3f0 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52  ->pBtx, MASTER_R
1e400 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
1e410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  0, pCx->uc.pCurs
1e440 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e  or);.      pCx->
1e450 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  isTable = 1;.   
1e460 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
1e470 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1e480 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78  _to_error;.  pCx
1e490 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70  ->isOrdered = (p
1e4a0 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e  Op->p5!=BTREE_UN
1e4b0 4f 52 44 45 52 45 44 29 3b 0a 20 20 62 72 65 61  ORDERED);.  brea
1e4c0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1e4d0 20 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50   SorterOpen P1 P
1e4e0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
1e4f0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1e500 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70  s like OP_OpenEp
1e510 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74  hemeral except t
1e520 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20  hat it opens.** 
1e530 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
1e540 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69 66  x that is specif
1e550 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20  ically designed 
1e560 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a  to sort large.**
1e570 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e   tables using an
1e580 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d   external merge-
1e590 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  sort algorithm..
1e5a0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1e5b0 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t P3 is non-zero
1e5c0 2c 20 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61  , then it indica
1e5d0 74 65 73 20 74 68 61 74 20 74 68 65 20 73 6f 72  tes that the sor
1e5e0 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d  ter may.** assum
1e5f0 65 20 74 68 61 74 20 61 20 73 74 61 62 6c 65 20  e that a stable 
1e600 73 6f 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  sort considering
1e610 20 74 68 65 20 66 69 72 73 74 20 50 33 20 66 69   the first P3 fi
1e620 65 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20  elds of each.** 
1e630 6b 65 79 20 69 73 20 73 75 66 66 69 63 69 65 6e  key is sufficien
1e640 74 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65  t to produce the
1e650 20 72 65 71 75 69 72 65 64 20 72 65 73 75 6c 74   required result
1e660 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  s..*/.case OP_So
1e670 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64  rterOpen: {.  Vd
1e680 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a  beCursor *pCx;..
1e690 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e6a0 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1e6b0 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
1e6c0 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1e6d0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1e6e0 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20  1, pOp->p2, -1, 
1e6f0 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b  CURTYPE_SORTER);
1e700 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
1e710 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1e720 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  Cx->pKeyInfo = p
1e730 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
1e740 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
1e750 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1e760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e770 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  x->pKeyInfo->enc
1e780 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72  ==ENC(db) );.  r
1e790 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
1e7a0 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f  orterInit(db, pO
1e7b0 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69  p->p3, pCx);.  i
1e7c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1e7d0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1e7e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1e7f0 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65  Opcode: Sequence
1e800 54 65 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Test P1 P2 * * *
1e810 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
1e820 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ( cursor[P1].ctr
1e830 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a  ++ ) pc = P2.**.
1e840 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65  ** P1 is a sorte
1e850 72 20 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65  r cursor. If the
1e860 20 73 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65   sequence counte
1e870 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a  r is currently z
1e880 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  ero, jump.** to 
1e890 50 32 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  P2. Regardless o
1e8a0 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
1e8b0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1e8c0 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  en, increment th
1e8d0 65 0a 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63  e.** the sequenc
1e8e0 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65  e value..*/.case
1e8f0 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
1e900 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1e910 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20   *pC;.  assert( 
1e920 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1e930 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1e940 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1e950 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1e960 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
1e970 28 70 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70  (pC) );.  if( (p
1e980 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d  C->seqCount++)==
1e990 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
1e9a0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
1e9b0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1e9c0 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20  ode: OpenPseudo 
1e9d0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
1e9e0 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c  Synopsis: P3 col
1e9f0 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a  umns in r[P2].**
1ea00 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
1ea10 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  ursor that point
1ea20 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c  s to a fake tabl
1ea30 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1ea40 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
1ea50 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f  of data.  The co
1ea60 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e  ntent of that on
1ea70 65 20 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e  e row is the con
1ea80 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  tent of memory.*
1ea90 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20  * register P2.  
1eaa0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1eab0 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65  cursor P1 become
1eac0 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  s an alias for t
1ead0 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20  he .** MEM_Blob 
1eae0 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65  content containe
1eaf0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
1eb00 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f  ..**.** A pseudo
1eb10 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62  -table created b
1eb20 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  y this opcode is
1eb30 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
1eb40 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75  single.** row ou
1eb50 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f  tput from the so
1eb60 72 74 65 72 20 73 6f 20 74 68 61 74 20 74 68 65  rter so that the
1eb70 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f   row can be deco
1eb80 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69  mposed into.** i
1eb90 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e  ndividual column
1eba0 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43  s using the OP_C
1ebb0 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54  olumn opcode.  T
1ebc0 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1ebd0 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e  ode.** is the on
1ebe0 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65  ly cursor opcode
1ebf0 20 74 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68   that works with
1ec00 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
1ec10 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65  .**.** P3 is the
1ec20 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1ec30 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73  s in the records
1ec40 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
1ec50 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70  ored by.** the p
1ec60 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a  seudo-table..*/.
1ec70 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75  case OP_OpenPseu
1ec80 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  do: {.  VdbeCurs
1ec90 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65  or *pCx;..  asse
1eca0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1ecb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1ecc0 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p3>=0 );.  pCx 
1ecd0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1ece0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1ecf0 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p3, -1, CURTYP
1ed00 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28  E_PSEUDO);.  if(
1ed10 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1ed20 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1ed30 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1ed40 2d 3e 75 63 2e 70 73 65 75 64 6f 54 61 62 6c 65  ->uc.pseudoTable
1ed50 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  Reg = pOp->p2;. 
1ed60 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1ed70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  1;.  assert( pOp
1ed80 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65  ->p5==0 );.  bre
1ed90 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1eda0 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a  : Close P1 * * *
1edb0 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61   *.**.** Close a
1edc0 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73   cursor previous
1edd0 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e  ly opened as P1.
1ede0 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a    If P1 is not.*
1edf0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  * currently open
1ee00 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  , this instructi
1ee10 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1ee20 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a  /.case OP_Close:
1ee30 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
1ee40 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1ee50 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1ee60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  .  sqlite3VdbeFr
1ee70 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61  eeCursor(p, p->a
1ee80 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a  pCsr[pOp->p1]);.
1ee90 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e    p->apCsr[pOp->
1eea0 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  p1] = 0;.  break
1eeb0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1eec0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1eed0 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70  _USED_MASK./* Op
1eee0 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65  code: ColumnsUse
1eef0 64 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  d P1 * * P4 *.**
1ef00 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1ef10 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73  (which only exis
1ef20 74 73 20 69 66 20 53 51 4c 69 74 65 20 77 61 73  ts if SQLite was
1ef30 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a   compiled with.*
1ef40 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ef50 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
1ef60 29 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 69  ) identifies whi
1ef70 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ch columns of th
1ef80 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1ef90 64 65 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50  dex for cursor P
1efa0 31 20 61 72 65 20 75 73 65 64 2e 20 20 50 34 20  1 are used.  P4 
1efb0 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  is a 64-bit inte
1efc0 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34  ger.** (P4_INT64
1efd0 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 66  ) in which the f
1efe0 69 72 73 74 20 36 33 20 62 69 74 73 20 61 72 65  irst 63 bits are
1eff0 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66   one for each of
1f000 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33   the.** first 63
1f010 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1f020 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1f030 68 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hat are actually
1f040 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
1f050 63 75 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67  cursor.  The hig
1f060 68 2d 6f 72 64 65 72 20 62 69 74 20 69 73 20 73  h-order bit is s
1f070 65 74 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  et if any column
1f080 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34   after.** the 64
1f090 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63  th is used..*/.c
1f0a0 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  ase OP_ColumnsUs
1f0b0 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  ed: {.  VdbeCurs
1f0c0 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70  or *pC;.  pC = p
1f0d0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1f0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1f0f0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
1f100 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d  E_BTREE );.  pC-
1f110 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36  >maskUsed = *(u6
1f120 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b  4*)pOp->p4.pI64;
1f130 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
1f140 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
1f150 65 65 6b 47 45 20 50 31 20 50 32 20 50 33 20 50  eekGE P1 P2 P3 P
1f160 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1f170 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
1f180 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1f190 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1f1a0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1f1b0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1f1c0 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1f1d0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1f1e0 67 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65  gister P3 as the
1f1f0 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72   key.  If cursor
1f200 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1f210 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1f220 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1f230 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1f240 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1f250 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1f260 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1f270 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1f280 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1f290 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1f2a0 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1f2b0 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1f2c0 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1f2d0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1f2e0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
1f2f0 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1f300 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a  re no records .*
1f310 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  * greater than o
1f320 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1f330 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1f340 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1f350 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66   to P2..**.** If
1f360 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77   the cursor P1 w
1f370 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  as opened using 
1f380 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  the OPFLAG_SEEKE
1f390 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69  Q flag, then thi
1f3a0 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c  s.** opcode will
1f3b0 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20   always land on 
1f3c0 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71  a record that eq
1f3d0 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65  ually equals the
1f3e0 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65   key, or.** else
1f3f0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
1f400 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74  y to P2.  When t
1f410 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46  he cursor is OPF
1f420 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73  LAG_SEEKEQ, this
1f430 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  .** opcode must 
1f440 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  be followed by a
1f450 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77  n IdxLE opcode w
1f460 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67  ith the same arg
1f470 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49  uments..** The I
1f480 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxLE opcode will
1f490 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74   be skipped if t
1f4a0 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65  his opcode succe
1f4b0 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20  eds, but the.** 
1f4c0 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxLE opcode wil
1f4d0 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62  l be used on sub
1f4e0 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65  sequent loop ite
1f4f0 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
1f500 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
1f510 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
1f520 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
1f530 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  in forward order
1f540 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65  ,.** from the be
1f550 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74  ginning toward t
1f560 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65  he end.  In othe
1f570 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
1f580 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
1f590 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74  ured to use Next
1f5a0 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a  , not Prev..**.*
1f5b0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1f5c0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
1f5d0 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  kLt, SeekGt, See
1f5e0 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kLe.*/./* Opcode
1f5f0 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32 20 50  : SeekGT P1 P2 P
1f600 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
1f610 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
1f620 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1f630 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1f640 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1f650 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1f660 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1f670 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1f680 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1f690 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1f6a0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1f6b0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1f6c0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1f6d0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1f6e0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1f6f0 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1f700 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1f710 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1f720 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1f730 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1f740 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1f750 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1f760 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1f770 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b  eater than the k
1f780 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  ey value. If the
1f790 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
1f7a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  s greater than .
1f7b0 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  ** the key and P
1f7c0 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1f7d0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1f7e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1f7f0 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  e leaves the cur
1f800 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74  sor configured t
1f810 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72  o move in forwar
1f820 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d  d order,.** from
1f830 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74   the beginning t
1f840 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20  oward the end.  
1f850 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1f860 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  the cursor is.**
1f870 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
1f880 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65  se Next, not Pre
1f890 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  v..**.** See als
1f8a0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1f8b0 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b  nd, SeekLt, Seek
1f8c0 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1f8d0 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20   Opcode: SeekLT 
1f8e0 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a  P1 P2 P3 P4 * .*
1f8f0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1f900 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1f910 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1f920 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1f930 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1f940 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1f950 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1f960 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1f970 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1f980 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1f990 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1f9a0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1f9b0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1f9c0 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1f9d0 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1f9e0 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1f9f0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1fa00 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1fa10 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1fa20 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69   so that  it poi
1fa30 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65  nts to the large
1fa40 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
1fa50 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  * is less than t
1fa60 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1fa70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1fa80 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20  cords less than 
1fa90 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1faa0 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1fab0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1fac0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
1fad0 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
1fae0 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20  rsor configured 
1faf0 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72  to move in rever
1fb00 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f  se order,.** fro
1fb10 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64  m the end toward
1fb20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
1fb30 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1fb40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
1fb50 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  * configured to 
1fb60 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65  use Prev, not Ne
1fb70 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  xt..**.** See al
1fb80 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
1fb90 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  und, SeekGt, See
1fba0 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGe, SeekLe.*/./
1fbb0 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45  * Opcode: SeekLE
1fbc0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1fbd0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1fbe0 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1fbf0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fc00 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1fc10 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1fc20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1fc30 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1fc40 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1fc50 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1fc60 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fc70 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1fc80 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1fc90 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1fca0 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1fcb0 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1fcc0 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1fcd0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1fce0 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1fcf0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1fd00 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1fd10 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ts to the larges
1fd20 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1fd30 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1fd40 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1fd50 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1fd60 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1fd70 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f   .** less than o
1fd80 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1fd90 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1fda0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1fdb0 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
1fdc0 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
1fdd0 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66   the cursor conf
1fde0 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69  igured to move i
1fdf0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c  n reverse order,
1fe00 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  .** from the end
1fe10 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69   toward the begi
1fe20 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72  nning.  In other
1fe30 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73   words, the curs
1fe40 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75  or is.** configu
1fe50 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c  red to use Prev,
1fe60 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a   not Next..**.**
1fe70 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50   If the cursor P
1fe80 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  1 was opened usi
1fe90 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45  ng the OPFLAG_SE
1fea0 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20  EKEQ flag, then 
1feb0 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77  this.** opcode w
1fec0 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20  ill always land 
1fed0 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74  on a record that
1fee0 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20   equally equals 
1fef0 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65  the key, or.** e
1ff00 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  lse jump immedia
1ff10 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65  tely to P2.  Whe
1ff20 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1ff30 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74  OPFLAG_SEEKEQ, t
1ff40 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75  his.** opcode mu
1ff50 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62  st be followed b
1ff60 79 20 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64  y an IdxGE opcod
1ff70 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
1ff80 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68  arguments..** Th
1ff90 65 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77  e IdxGE opcode w
1ffa0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69  ill be skipped i
1ffb0 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75  f this opcode su
1ffc0 63 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a  cceeds, but the.
1ffd0 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  ** IdxGE opcode 
1ffe0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20  will be used on 
1fff0 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20  subsequent loop 
20000 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  iterations..**.*
20010 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
20020 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
20030 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65  kGt, SeekGe, See
20040 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  kLt.*/.case OP_S
20050 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f  eekLT:         /
20060 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
20070 61 73 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20  ase OP_SeekLE:  
20080 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
20090 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  in3 */.case OP_S
200a0 65 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f  eekGE:         /
200b0 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
200c0 61 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b  ase OP_SeekGT: {
200d0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
200e0 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  in3 */.  int res
200f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
20100 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
20110 20 2a 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20   */.  int oc;   
20120 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
20130 64 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  de */.  VdbeCurs
20140 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68  or *pC;    /* Th
20150 65 20 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b  e cursor to seek
20160 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20170 63 6f 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20  cord r;  /* The 
20180 6b 65 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20  key to seek for 
20190 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
201a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
201b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20  r of columns or 
201c0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65  fields in the ke
201d0 79 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b  y */.  i64 iKey;
201e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
201f0 20 72 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f   rowid we are to
20200 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e   seek to */.  in
20210 74 20 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20  t eqOnly;       
20220 20 2f 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73   /* Only interes
20230 74 65 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74  ted in == result
20240 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
20250 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
20260 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
20270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
20280 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43  p->p2!=0 );.  pC
20290 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
202a0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
202b0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
202c0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
202d0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
202e0 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
202f0 65 65 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekLE == OP_Seek
20300 4c 54 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74  LT+1 );.  assert
20310 28 20 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f  ( OP_SeekGE == O
20320 50 5f 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20  P_SeekLT+2 );.  
20330 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
20340 54 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33  T == OP_SeekLT+3
20350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20360 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20  ->isOrdered );. 
20370 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
20380 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
20390 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  oc = pOp->opcode
203a0 3b 0a 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a  ;.  eqOnly = 0;.
203b0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
203c0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
203d0 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
203e0 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  kOp = pOp->opcod
203f0 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  e;.#endif..  if(
20400 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a   pC->isTable ){.
20410 20 20 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45      /* The BTREE
20420 5f 53 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73  _SEEK_EQ flag is
20430 20 6f 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64   only set on ind
20440 65 78 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  ex cursors */.  
20450 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20460 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48  3BtreeCursorHasH
20470 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  int(pC->uc.pCurs
20480 6f 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  or, BTREE_SEEK_E
20490 51 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Q)==0.          
204a0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
204b0 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  B );..    /* The
204c0 20 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20   input value in 
204d0 50 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61  P3 might be of a
204e0 6e 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72  ny type: integer
204f0 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a  , real, string,.
20500 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20      ** blob, or 
20510 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65  NULL.  But it ne
20520 65 64 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74  eds to be an int
20530 65 67 65 72 20 62 65 66 6f 72 65 20 77 65 20 63  eger before we c
20540 61 6e 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65  an do.    ** the
20550 20 73 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72   seek, so conver
20560 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e  t it. */.    pIn
20570 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
20580 33 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e  3];.    if( (pIn
20590 33 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  3->flags & (MEM_
205a0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
205b0 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20  _Str))==MEM_Str 
205c0 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75  ){.      applyNu
205d0 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
205e0 6e 33 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n3, 0);.    }.  
205f0 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    iKey = sqlite3
20600 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
20610 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  3);..    /* If t
20620 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c  he P3 value coul
20630 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  d not be convert
20640 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
20650 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  er without.    *
20660 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d  * loss of inform
20670 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63  ation, then spec
20680 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ial processing i
20690 73 20 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f  s required... */
206a0 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e  .    if( (pIn3->
206b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
206c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
206d0 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
206e0 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a  MEM_Real)==0 ){.
206f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
20700 65 20 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f  e P3 value canno
20710 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
20720 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  nto any kind of 
20730 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20  a number,.      
20740 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65    ** then the se
20750 65 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ek is not possib
20760 6c 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50  le, so jump to P
20770 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62  2 */.        Vdb
20780 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32  eBranchTaken(1,2
20790 29 3b 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f  ); goto jump_to_
207a0 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
207b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
207c0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72    /* If the appr
207d0 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69  oximation iKey i
207e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
207f0 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65  e actual real se
20800 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65  arch.      ** te
20810 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20 3e  rm, substitute >
20820 3d 20 66 6f 72 20 3e 20 61 6e 64 20 3c 20 66 6f  = for > and < fo
20830 72 20 3c 3d 2e 20 65 2e 67 2e 20 69 66 20 74 68  r <=. e.g. if th
20840 65 20 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20  e search term.  
20850 20 20 20 20 2a 2a 20 69 73 20 34 2e 39 20 61 6e      ** is 4.9 an
20860 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 70  d the integer ap
20870 70 72 6f 78 69 6d 61 74 69 6f 6e 20 35 3a 0a 20  proximation 5:. 
20880 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20890 20 20 20 20 20 20 20 20 28 78 20 3e 20 20 34 2e          (x >  4.
208a0 39 29 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20  9)    ->     (x 
208b0 3e 3d 20 35 29 0a 20 20 20 20 20 20 2a 2a 20 20  >= 5).      **  
208c0 20 20 20 20 20 20 28 78 20 3c 3d 20 34 2e 39 29        (x <= 4.9)
208d0 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3c 20      ->     (x < 
208e0 20 35 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   5).      */.   
208f0 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72     if( pIn3->u.r
20900 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b  <(double)iKey ){
20910 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20920 20 4f 50 5f 53 65 65 6b 47 45 3d 3d 28 4f 50 5f   OP_SeekGE==(OP_
20930 53 65 65 6b 47 54 2d 31 29 20 29 3b 0a 20 20 20  SeekGT-1) );.   
20940 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
20950 53 65 65 6b 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b  SeekLT==(OP_Seek
20960 4c 45 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  LE-1) );.       
20970 20 61 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65   assert( (OP_See
20980 6b 4c 45 20 26 20 30 78 30 30 30 31 29 3d 3d 28  kLE & 0x0001)==(
20990 4f 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30  OP_SeekGT & 0x00
209a0 30 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  01) );.        i
209b0 66 28 20 28 6f 63 20 26 20 30 78 30 30 30 31 29  f( (oc & 0x0001)
209c0 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30  ==(OP_SeekGT & 0
209d0 78 30 30 30 31 29 20 29 20 6f 63 2d 2d 3b 0a 20  x0001) ) oc--;. 
209e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
209f0 20 49 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d   If the approxim
20a00 61 74 69 6f 6e 20 69 4b 65 79 20 69 73 20 73 6d  ation iKey is sm
20a10 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 61  aller than the a
20a20 63 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63  ctual real searc
20a30 68 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c  h.      ** term,
20a40 20 73 75 62 73 74 69 74 75 74 65 20 3c 3d 20 66   substitute <= f
20a50 6f 72 20 3c 20 61 6e 64 20 3e 20 66 6f 72 20 3e  or < and > for >
20a60 3d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73  =.  */.      els
20a70 65 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3e  e if( pIn3->u.r>
20a80 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a  (double)iKey ){.
20a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20aa0 4f 50 5f 53 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53  OP_SeekLE==(OP_S
20ab0 65 65 6b 4c 54 2b 31 29 20 29 3b 0a 20 20 20 20  eekLT+1) );.    
20ac0 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53      assert( OP_S
20ad0 65 65 6b 47 54 3d 3d 28 4f 50 5f 53 65 65 6b 47  eekGT==(OP_SeekG
20ae0 45 2b 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  E+1) );.        
20af0 61 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b  assert( (OP_Seek
20b00 4c 54 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f  LT & 0x0001)==(O
20b10 50 5f 53 65 65 6b 47 45 20 26 20 30 78 30 30 30  P_SeekGE & 0x000
20b20 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  1) );.        if
20b30 28 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d  ( (oc & 0x0001)=
20b40 3d 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78  =(OP_SeekLT & 0x
20b50 30 30 30 31 29 20 29 20 6f 63 2b 2b 3b 0a 20 20  0001) ) oc++;.  
20b60 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20      }.    } .   
20b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20b80 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
20b90 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
20ba0 20 30 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30   0, (u64)iKey, 0
20bb0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d  , &res);.    pC-
20bc0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20  >movetoTarget = 
20bd0 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62  iKey;  /* Used b
20be0 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20  y OP_Delete */. 
20bf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
20c10 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
20c20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
20c30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
20c40 20 61 20 63 75 72 73 6f 72 20 77 69 74 68 20 74   a cursor with t
20c50 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  he BTREE_SEEK_EQ
20c60 20 68 69 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 20   hint, only the 
20c70 4f 50 5f 53 65 65 6b 47 45 20 61 6e 64 0a 20 20  OP_SeekGE and.  
20c80 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 4c 45 20 6f    ** OP_SeekLE o
20c90 70 63 6f 64 65 73 20 61 72 65 20 61 6c 6c 6f 77  pcodes are allow
20ca0 65 64 2c 20 61 6e 64 20 74 68 65 73 65 20 6d 75  ed, and these mu
20cb0 73 74 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  st be immediatel
20cc0 79 20 66 6f 6c 6c 6f 77 65 64 0a 20 20 20 20 2a  y followed.    *
20cd0 2a 20 62 79 20 61 6e 20 4f 50 5f 49 64 78 47 54  * by an OP_IdxGT
20ce0 20 6f 72 20 4f 50 5f 49 64 78 4c 54 20 6f 70 63   or OP_IdxLT opc
20cf0 6f 64 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ode, respectivel
20d00 79 2c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  y, with the same
20d10 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
20d20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
20d30 65 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70  eCursorHasHint(p
20d40 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42  C->uc.pCursor, B
20d50 54 52 45 45 5f 53 45 45 4b 5f 45 51 29 20 29 7b  TREE_SEEK_EQ) ){
20d60 0a 20 20 20 20 20 20 65 71 4f 6e 6c 79 20 3d 20  .      eqOnly = 
20d70 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
20d80 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20d90 5f 53 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e  _SeekGE || pOp->
20da0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c  opcode==OP_SeekL
20db0 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
20dc0 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65  t( pOp[1].opcode
20dd0 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f  ==OP_IdxLT || pO
20de0 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[1].opcode==OP_
20df0 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 61  IdxGT );.      a
20e00 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 31  ssert( pOp[1].p1
20e10 3d 3d 70 4f 70 5b 30 5d 2e 70 31 20 29 3b 0a 20  ==pOp[0].p1 );. 
20e20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20e30 5b 31 5d 2e 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70  [1].p2==pOp[0].p
20e40 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  2 );.      asser
20e50 74 28 20 70 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f  t( pOp[1].p3==pO
20e60 70 5b 30 5d 2e 70 33 20 29 3b 0a 20 20 20 20 20  p[0].p3 );.     
20e70 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
20e80 70 34 2e 69 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e  p4.i==pOp[0].p4.
20e90 69 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  i );.    }..    
20ea0 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34  nField = pOp->p4
20eb0 2e 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  .i;.    assert( 
20ec0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
20ed0 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73  INT32 );.    ass
20ee0 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b  ert( nField>0 );
20ef0 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
20f00 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
20f10 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
20f20 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20  u16)nField;..   
20f30 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e   /* The next lin
20f40 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74  e of code comput
20f50 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f  es as follows, o
20f60 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20  nly faster:.    
20f70 2a 2a 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f  **   if( oc==OP_
20f80 53 65 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGT || oc==OP
20f90 5f 53 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a  _SeekLE ){.    *
20fa0 2a 20 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  *     r.default_
20fb0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20  rc = -1;.    ** 
20fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
20fd0 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63      r.default_rc
20fe0 20 3d 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20   = +1;.    **   
20ff0 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64  }.    */.    r.d
21000 65 66 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20  efault_rc = ((1 
21010 26 20 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c  & (oc - OP_SeekL
21020 54 29 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a  T)) ? -1 : +1);.
21030 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
21040 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64  OP_SeekGT || r.d
21050 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b  efault_rc==-1 );
21060 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21  .    assert( oc!
21070 3d 4f 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e  =OP_SeekLE || r.
21080 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29  default_rc==-1 )
21090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63  ;.    assert( oc
210a0 21 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72  !=OP_SeekGE || r
210b0 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20  .default_rc==+1 
210c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
210d0 63 21 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20  c!=OP_SeekLT || 
210e0 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31  r.default_rc==+1
210f0 20 29 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20   );..    r.aMem 
21100 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
21110 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21120 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20  DEBUG.    { int 
21130 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e  i; for(i=0; i<r.
21140 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73  nField; i++) ass
21150 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
21160 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d  &r.aMem[i]) ); }
21170 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 2e 65 71  .#endif.    r.eq
21180 53 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63  Seen = 0;.    rc
21190 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
211a0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
211b0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72  ->uc.pCursor, &r
211c0 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
211d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
211e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
211f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
21200 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
21210 20 69 66 28 20 65 71 4f 6e 6c 79 20 26 26 20 72   if( eqOnly && r
21220 2e 65 71 53 65 65 6e 3d 3d 30 20 29 7b 0a 20 20  .eqSeen==0 ){.  
21230 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
21240 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 );.      goto
21250 20 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b   seek_not_found;
21260 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 2d  .    }.  }.  pC-
21270 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
21280 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
21290 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
212a0 54 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  TALE;.#ifdef SQL
212b0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
212c0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
212d0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  +;.#endif.  if( 
212e0 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b  oc>=OP_SeekGE ){
212f0 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50    assert( oc==OP
21300 5f 53 65 65 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f  _SeekGE || oc==O
21310 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20  P_SeekGT );.    
21320 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65  if( res<0 || (re
21330 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
21340 65 65 6b 47 54 29 20 29 7b 0a 20 20 20 20 20 20  eekGT) ){.      
21350 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  res = 0;.      r
21360 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21370 4e 65 78 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  Next(pC->uc.pCur
21380 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  sor, 0);.      i
21390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
213a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
213b0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
213c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
213d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
213e0 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a         res = 1;.
213f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21400 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
21410 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
21420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21430 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
21440 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
21450 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21460 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
21470 53 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekLT || oc==OP
21480 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69  _SeekLE );.    i
21490 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73  f( res>0 || (res
214a0 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
214b0 65 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72  ekLT) ){.      r
214c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
214d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
214e0 72 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70  revious(pC->uc.p
214f0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
21500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
21520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
21530 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
21540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21550 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
21560 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
21570 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
21580 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
21590 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ror;.        }. 
215a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
215b0 7b 0a 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d  {.      /* res m
215c0 69 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65  ight be negative
215d0 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
215e0 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68  le is empty.  Ch
215f0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
21600 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 74  see if this is t
21610 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a  he case..      *
21620 2f 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 71  /.      res = sq
21630 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43  lite3BtreeEof(pC
21640 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
21650 20 20 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f     }.  }.seek_no
21660 74 5f 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72  t_found:.  asser
21670 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
21680 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
21690 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
216a0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  f( res ){.    go
216b0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
216c0 20 7d 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c   }else if( eqOnl
216d0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
216e0 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
216f0 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b  OP_IdxLT || pOp[
21700 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
21710 78 47 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b  xGT );.    pOp++
21720 3b 20 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50  ; /* Skip the OP
21730 5f 49 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78  _IdxLt or OP_Idx
21740 47 54 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  GT that follows 
21750 2a 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  */.  }.  break;.
21760 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f  }../* Opcode: Fo
21770 75 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20  und P1 P2 P3 P4 
21780 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
21790 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
217a0 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
217b0 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
217c0 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
217d0 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
217e0 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
217f0 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
21800 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
21810 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
21820 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
21830 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
21840 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69  *.** Cursor P1 i
21850 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
21860 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
21870 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21880 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21890 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
218a0 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
218b0 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
218c0 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50  e to P2 and.** P
218d0 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
218e0 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69  ng at the matchi
218f0 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
21900 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c  This operation l
21910 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
21920 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
21930 65 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61  e it can be.** a
21940 64 76 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66  dvanced in the f
21950 6f 72 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e  orward direction
21960 2e 20 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74  .  The Next inst
21970 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72  ruction will wor
21980 6b 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68  k,.** but not th
21990 65 20 50 72 65 76 20 69 6e 73 74 72 75 63 74 69  e Prev instructi
219a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
219b0 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  so: NotFound, No
219c0 43 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69  Conflict, NotExi
219d0 73 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f  sts. SeekGe.*/./
219e0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75  * Opcode: NotFou
219f0 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  nd P1 P2 P3 P4 *
21a00 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
21a10 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
21a20 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
21a30 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
21a40 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
21a50 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
21a60 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
21a70 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21a80 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
21a90 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
21aa0 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
21ab0 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
21ac0 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
21ad0 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
21ae0 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
21af0 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21b00 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21b10 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78  s not the prefix
21b20 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e   of any entry in
21b30 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20   P1 then a jump 
21b40 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20  is made to P2.  
21b50 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63  If P1 .** does c
21b60 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20  ontain an entry 
21b70 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74  whose prefix mat
21b80 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72  ches the P3/P4 r
21b90 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72  ecord then contr
21ba0 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f  ol.** falls thro
21bb0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
21bc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
21bd0 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
21be0 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61  ing at the.** ma
21bf0 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a  tching entry..**
21c00 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
21c10 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  on leaves the cu
21c20 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
21c30 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
21c40 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69  be.** advanced i
21c50 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
21c60 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
21c70 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
21c80 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65  d Prev.** opcode
21c90 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66  s do not work af
21ca0 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  ter this operati
21cb0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21cc0 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78  so: Found, NotEx
21cd0 69 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74  ists, NoConflict
21ce0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
21cf0 6f 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20  oConflict P1 P2 
21d00 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
21d10 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
21d20 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30  ].**.** If P4==0
21d30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
21d40 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63  3 holds a blob c
21d50 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61  onstructed by Ma
21d60 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a  keRecord.  If.**
21d70 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73   P4>0 then regis
21d80 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69  ter P3 is the fi
21d90 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74  rst of P4 regist
21da0 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e  ers that form an
21db0 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63   unpacked.** rec
21dc0 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73  ord..** .** Curs
21dd0 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69  or P1 is on an i
21de0 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66 20  ndex btree.  If 
21df0 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74  the record ident
21e00 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64 20  ified by P3 and 
21e10 50 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  P4.** contains a
21e20 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a  ny NULL value, j
21e30 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
21e40 74 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74  to P2.  If all t
21e50 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72  erms of the.** r
21e60 65 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55  ecord are not-NU
21e70 4c 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20  LL then a check 
21e80 69 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72  is done to deter
21e90 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20  mine if any row 
21ea0 69 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64  in the.** P1 ind
21eb0 65 78 20 62 74 72 65 65 20 68 61 73 20 61 20 6d  ex btree has a m
21ec0 61 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66  atching key pref
21ed0 69 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ix.  If there ar
21ee0 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75  e no matches, ju
21ef0 6d 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  mp.** immediatel
21f00 79 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  y to P2.  If the
21f10 72 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66  re is a match, f
21f20 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20  all through and 
21f30 6c 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20  leave the P1.** 
21f40 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
21f50 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
21f60 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
21f70 6f 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61  opcode is simila
21f80 72 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  r to OP_NotFound
21f90 20 77 69 74 68 20 74 68 65 20 65 78 63 65 70 74   with the except
21fa0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  ions that the.**
21fb0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79   branch is alway
21fc0 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70  s taken if any p
21fd0 61 72 74 20 6f 66 20 74 68 65 20 73 65 61 72 63  art of the searc
21fe0 68 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e  h key input is N
21ff0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
22000 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73  operation leaves
22010 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
22020 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
22030 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76  cannot be.** adv
22040 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72 20  anced in either 
22050 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
22060 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
22070 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a  Next and Prev.**
22080 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20   opcodes do not 
22090 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73 20  work after this 
220a0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
220b0 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
220c0 75 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45  und, Found, NotE
220d0 78 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50  xists.*/.case OP
220e0 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20  _NoConflict:    
220f0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
22100 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e  .case OP_NotFoun
22110 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  d:       /* jump
22120 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
22130 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20  _Found: {       
22140 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
22150 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78  .  int alreadyEx
22160 69 73 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65  ists;.  int take
22170 4a 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  Jump;.  int ii;.
22180 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
22190 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55  ;.  int res;.  U
221a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
221b0 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64  Free;.  Unpacked
221c0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
221d0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
221e0 64 20 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d r;..#ifdef SQL
221f0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
22200 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e  Op->opcode!=OP_N
22210 6f 43 6f 6e 66 6c 69 63 74 20 29 20 73 71 6c 69  oConflict ) sqli
22220 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b  te3_found_count+
22230 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  +;.#endif..  ass
22240 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
22250 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
22260 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
22270 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
22280 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43  P4_INT32 );.  pC
22290 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
222a0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
222b0 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  pC!=0 );.#ifdef 
222c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
222d0 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d  C->seekOp = pOp-
222e0 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  >opcode;.#endif.
222f0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
22300 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72  Op->p3];.  asser
22310 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
22320 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
22330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
22340 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
22350 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
22360 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 69  sTable==0 );.  i
22370 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29  f( pOp->p4.i>0 )
22380 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  {.    r.pKeyInfo
22390 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
223a0 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
223b0 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a  (u16)pOp->p4.i;.
223c0 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e      r.aMem = pIn
223d0 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  3;.#ifdef SQLITE
223e0 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69  _DEBUG.    for(i
223f0 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65 6c 64  i=0; ii<r.nField
22400 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
22410 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
22420 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 20 29  d(&r.aMem[ii]) )
22430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22440 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67  (r.aMem[ii].flag
22450 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
22460 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e   || r.aMem[ii].n
22470 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22480 20 69 69 20 29 20 52 45 47 49 53 54 45 52 5f 54   ii ) REGISTER_T
22490 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69 69 2c  RACE(pOp->p3+ii,
224a0 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20   &r.aMem[ii]);. 
224b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
224c0 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20  pIdxKey = &r;.  
224d0 20 20 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d    pFree = 0;.  }
224e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
224f0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
22500 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
22510 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
22520 70 49 6e 33 29 3b 0a 20 20 20 20 61 73 73 65 72  pIn3);.    asser
22530 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
22540 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
22550 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
22560 72 63 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  rc ) goto no_mem
22570 3b 0a 20 20 20 20 70 46 72 65 65 20 3d 20 70 49  ;.    pFree = pI
22580 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
22590 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
225a0 52 65 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49  Record(pC->pKeyI
225b0 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49  nfo);.    if( pI
225c0 64 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  dxKey==0 ) goto 
225d0 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  no_mem;.    sqli
225e0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
225f0 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  ack(pC->pKeyInfo
22600 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d  , pIn3->n, pIn3-
22610 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  >z, pIdxKey);.  
22620 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  }.  pIdxKey->def
22630 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74  ault_rc = 0;.  t
22640 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69  akeJump = 0;.  i
22650 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
22660 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b  OP_NoConflict ){
22670 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20  .    /* For the 
22680 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70  OP_NoConflict op
22690 63 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a  code, take the j
226a0 75 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ump if any of th
226b0 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66  e.    ** input f
226c0 69 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20  ields are NULL, 
226d0 73 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69  since any key wi
226e0 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e  th a NULL will n
226f0 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69  ot.    ** confli
22700 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  ct */.    for(ii
22710 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e  =0; ii<pIdxKey->
22720 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20  nField; ii++){. 
22730 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
22740 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73  ->aMem[ii].flags
22750 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
22760 20 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20         takeJump 
22770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
22780 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22790 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
227a0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
227b0 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70  npacked(pC->uc.p
227c0 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c  Cursor, pIdxKey,
227d0 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
227e0 69 66 28 20 70 46 72 65 65 20 29 20 73 71 6c 69  if( pFree ) sqli
227f0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
22800 70 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63  pFree);.  if( rc
22810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22820 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
22830 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
22840 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
22850 20 3d 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64   = res;.  alread
22860 79 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d  yExists = (res==
22870 30 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  0);.  pC->nullRo
22880 77 20 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69  w = 1-alreadyExi
22890 73 74 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  sts;.  pC->defer
228a0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
228b0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
228c0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
228d0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
228e0 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20  e==OP_Found ){. 
228f0 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
22900 65 6e 28 61 6c 72 65 61 64 79 45 78 69 73 74 73  en(alreadyExists
22910 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20  !=0,2);.    if( 
22920 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20  alreadyExists ) 
22930 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
22940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
22950 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61  beBranchTaken(ta
22960 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45  keJump||alreadyE
22970 78 69 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20  xists==0,2);.   
22980 20 69 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c   if( takeJump ||
22990 20 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20   !alreadyExists 
229a0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
229b0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
229c0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
229d0 65 6b 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ekRowid P1 P2 P3
229e0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
229f0 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a  : intkey=r[P3].*
22a00 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
22a10 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72  ndex of a cursor
22a20 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20   open on an SQL 
22a30 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74  table btree (wit
22a40 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  h integer.** key
22a50 73 29 2e 20 20 49 66 20 72 65 67 69 73 74 65 72  s).  If register
22a60 20 50 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   P3 does not con
22a70 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  tain an integer 
22a80 6f 72 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f  or if P1 does no
22a90 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72  t.** contain a r
22aa0 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64  ecord with rowid
22ab0 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
22ac0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
22ad0 20 20 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20    .** Or, if P2 
22ae0 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53  is 0, raise an S
22af0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
22b00 72 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20  ror. If P1 does 
22b10 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63  contain.** a rec
22b20 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50  ord with rowid P
22b30 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65  3 then .** leave
22b40 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
22b50 74 69 6e 67 20 61 74 20 74 68 61 74 20 72 65 63  ting at that rec
22b60 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72  ord and fall thr
22b70 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
22b80 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
22b90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f  .**.** The OP_No
22ba0 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70  tExists opcode p
22bb0 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65  erforms the same
22bc0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20   operation, but 
22bd0 77 69 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74  with OP_NotExist
22be0 73 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69  s.** the P3 regi
22bf0 73 74 65 72 20 6d 75 73 74 20 62 65 20 67 75 61  ster must be gua
22c00 72 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61  ranteed to conta
22c10 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  in an integer va
22c20 6c 75 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a  lue.  With this.
22c30 2a 2a 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73  ** opcode, regis
22c40 74 65 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74  ter P3 might not
22c50 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
22c60 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ger..**.** The O
22c70 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64  P_NotFound opcod
22c80 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73  e performs the s
22c90 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ame operation on
22ca0 20 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a   index btrees.**
22cb0 20 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79   (with arbitrary
22cc0 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79   multi-value key
22cd0 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  s)..**.** This o
22ce0 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
22cf0 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
22d00 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
22d10 6f 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a  ot be advanced.*
22d20 2a 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  * in either dire
22d30 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
22d40 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
22d50 20 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65   and Prev opcode
22d60 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
22d70 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  rk following thi
22d80 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  s opcode..**.** 
22d90 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
22da0 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e   NotFound, NoCon
22db0 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64  flict, SeekRowid
22dc0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
22dd0 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50  otExists P1 P2 P
22de0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
22df0 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a  s: intkey=r[P3].
22e00 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
22e10 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f  index of a curso
22e20 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c  r open on an SQL
22e30 20 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69   table btree (wi
22e40 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  th integer.** ke
22e50 79 73 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69  ys).  P3 is an i
22e60 6e 74 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49  nteger rowid.  I
22e70 66 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f  f P1 does not co
22e80 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
22e90 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20  ith.** rowid P3 
22ea0 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
22eb0 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72  ately to P2.  Or
22ec0 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20 72 61  , if P2 is 0, ra
22ed0 69 73 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ise an.** SQLITE
22ee0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
22ef0 49 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61  If P1 does conta
22f00 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  in a record with
22f10 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a   rowid P3 then .
22f20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75 72  ** leave the cur
22f30 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  sor pointing at 
22f40 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20  that record and 
22f50 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
22f60 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74  the next.** inst
22f70 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
22f80 68 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20  he OP_SeekRowid 
22f90 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
22fa0 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
22fb0 6f 6e 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f  on but also allo
22fc0 77 73 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67  ws the.** P3 reg
22fd0 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
22fe0 20 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76   a non-integer v
22ff0 61 6c 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63  alue, in which c
23000 61 73 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a  ase the jump is.
23010 2a 2a 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e  ** always taken.
23020 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65    This opcode re
23030 71 75 69 72 65 73 20 74 68 61 74 20 50 33 20 61  quires that P3 a
23040 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e  lways contain an
23050 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
23060 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  The OP_NotFound 
23070 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
23080 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
23090 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65  on on index btre
230a0 65 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69  es.** (with arbi
230b0 74 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75  trary multi-valu
230c0 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  e keys)..**.** T
230d0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
230e0 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
230f0 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
23100 20 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e   cannot be advan
23110 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72  ced.** in either
23120 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
23130 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23140 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f   Next and Prev o
23150 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  pcodes will.** n
23160 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e  ot work followin
23170 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
23180 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
23190 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
231a0 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b  NoConflict, Seek
231b0 52 6f 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50  Rowid.*/.case OP
231c0 5f 53 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20  _SeekRowid: {   
231d0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
231e0 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  3 */.  VdbeCurso
231f0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
23200 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
23210 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b  res;.  u64 iKey;
23220 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ..  pIn3 = &aMem
23230 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
23240 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
23250 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
23260 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
23270 28 70 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46  (pIn3, SQLITE_AF
23280 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64  F_NUMERIC, encod
23290 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ing);.    if( (p
232a0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
232b0 5f 49 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20  _Int)==0 ) goto 
232c0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
232d0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
232e0 68 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69  h into OP_NotExi
232f0 73 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  sts */.case OP_N
23300 6f 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20  otExists:       
23310 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
23320 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  */.  pIn3 = &aMe
23330 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
23340 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
23350 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
23360 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
23370 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
23380 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
23390 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
233a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
233b0 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66   pC!=0 );.#ifdef
233c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
233d0 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a  pC->seekOp = 0;.
233e0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
233f0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
23400 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
23410 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
23420 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72  BTREE );.  pCrsr
23430 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
23440 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  r;.  assert( pCr
23450 73 72 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d  sr!=0 );.  res =
23460 20 30 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e   0;.  iKey = pIn
23470 33 2d 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73  3->u.i;.  rc = s
23480 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
23490 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c  oUnpacked(pCrsr,
234a0 20 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65   0, iKey, 0, &re
234b0 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  s);.  assert( rc
234c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
234d0 65 73 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d  es==0 );.  pC->m
234e0 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b  ovetoTarget = iK
234f0 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20  ey;  /* Used by 
23500 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70  OP_Delete */.  p
23510 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
23520 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
23530 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
23540 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
23550 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62  oveto = 0;.  Vdb
23560 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
23570 21 3d 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65  !=0,2);.  pC->se
23580 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
23590 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a    if( res!=0 ){.
235a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
235b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
235c0 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20   if( pOp->p2==0 
235d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
235e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
235f0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
23600 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
23610 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _p2;.    }.  }. 
23620 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
23630 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
23640 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
23650 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e  * Opcode: Sequen
23660 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ce P1 P2 * * *.*
23670 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
23680 5d 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ]=cursor[P1].ctr
23690 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  ++.**.** Find th
236a0 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  e next available
236b0 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
236c0 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a   for cursor P1..
236d0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71  ** Write the seq
236e0 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74  uence number int
236f0 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
23700 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e  * The sequence n
23710 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72  umber on the cur
23720 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  sor is increment
23730 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a  ed after this.**
23740 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a   instruction.  .
23750 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65  */.case OP_Seque
23760 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
23770 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
23780 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
23790 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
237a0 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
237b0 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  rt( p->apCsr[pOp
237c0 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73  ->p1]!=0 );.  as
237d0 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
237e0 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70  Op->p1]->eCurTyp
237f0 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e!=CURTYPE_VTAB 
23800 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
23810 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
23820 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
23830 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
23840 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b  p1]->seqCount++;
23850 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
23860 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69   Opcode: NewRowi
23870 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
23880 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
23890 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65  ]=rowid.**.** Ge
238a0 74 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20  t a new integer 
238b0 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61  record number (a
238c0 2e 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73  .k.a "rowid") us
238d0 65 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f  ed as the key to
238e0 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65   a table..** The
238f0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
23900 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
23910 20 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69   used as a key i
23920 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
23930 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72  * table that cur
23940 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f  sor P1 points to
23950 2e 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72  .  The new recor
23960 64 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74  d number is writ
23970 74 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  ten.** written t
23980 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
23990 2a 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65  *.** If P3>0 the
239a0 6e 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74  n P3 is a regist
239b0 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
239c0 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42  rame of this VDB
239d0 45 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a  E that holds .**
239e0 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65   the largest pre
239f0 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
23a00 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  d record number.
23a10 20 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e   No new record n
23a20 75 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c  umbers are.** al
23a30 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73  lowed to be less
23a40 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
23a50 2e 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75  . When this valu
23a60 65 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61  e reaches its ma
23a70 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51  ximum, .** an SQ
23a80 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
23a90 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68  is generated. Th
23aa0 65 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73  e P3 register is
23ab0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
23ac0 65 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  e '.** generated
23ad0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
23ae0 54 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73  This P3 mechanis
23af0 6d 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c  m is used to hel
23b00 70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  p implement the.
23b10 2a 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  ** AUTOINCREMENT
23b20 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73   feature..*/.cas
23b30 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b  e OP_NewRowid: {
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
23b50 74 32 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20  t2 */.  i64 v;  
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b70 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20  * The new rowid 
23b80 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23b90 2a 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  *pC;        /* C
23ba0 75 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74  ursor of table t
23bb0 6f 20 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f  o get the new ro
23bc0 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  wid */.  int res
23bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23be0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20  /* Result of an 
23bf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
23c00 28 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  () */.  int cnt;
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c20 2a 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d  * Counter to lim
23c30 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  it the number of
23c40 20 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d   searches */.  M
23c50 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
23c60 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23c70 72 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73  r holding larges
23c80 74 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f  t rowid for AUTO
23c90 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56  INCREMENT */.  V
23ca0 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
23cb0 3b 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72  ;     /* Root fr
23cc0 61 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a  ame of VDBE */..
23cd0 20 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d    v = 0;.  res =
23ce0 20 30 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   0;.  pOut = out
23cf0 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
23d00 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
23d10 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23d20 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23d30 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
23d40 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
23d50 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
23d60 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
23d70 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
23d80 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
23d90 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
23da0 72 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20  r!=0 );.  {.    
23db0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69  /* The next rowi
23dc0 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  d or record numb
23dd0 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65  er (different te
23de0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  rms for the same
23df0 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69  .    ** thing) i
23e00 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20  s obtained in a 
23e10 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74  two-step algorit
23e20 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  hm..    **.    *
23e30 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d  * First we attem
23e40 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  pt to find the l
23e50 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
23e60 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e  rowid and add on
23e70 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74  e.    ** to that
23e80 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61  .  But if the la
23e90 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
23ea0 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20  owid is already 
23eb0 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20  the maximum.    
23ec0 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  ** positive inte
23ed0 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ger, we have to 
23ee0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
23ef0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
23f00 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20  * probabilistic 
23f10 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a  algorithm.    **
23f20 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
23f30 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  nd algorithm is 
23f40 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69  to select a rowi
23f50 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20  d at random and 
23f60 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  see if.    ** it
23f70 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
23f80 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
23f90 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
23fa0 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20  ist, we have.   
23fb0 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20   ** succeeded.  
23fc0 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f  If the random ro
23fd0 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20  wid does exist, 
23fe0 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20  we select a new 
23ff0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  one.    ** and t
24000 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20  ry again, up to 
24010 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a  100 times..    *
24020 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
24030 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69  ->isTable );..#i
24040 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49  fdef SQLITE_32BI
24050 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69  T_ROWID.#   defi
24060 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37  ne MAX_ROWID 0x7
24070 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20  fffffff.#else.  
24080 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c    /* Some compil
24090 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f  ers complain abo
240a0 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20  ut constants of 
240b0 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66  the form 0x7ffff
240c0 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20  fffffffffff..   
240d0 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c   ** Others compl
240e0 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66  ain about 0x7fff
240f0 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e  fffffffffffffLL.
24100 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
24110 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20  macro seems.    
24120 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ** to provide th
24130 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65  e constant while
24140 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70   making all comp
24150 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20  ilers happy..   
24160 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
24170 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28  AX_ROWID  (i64)(
24180 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66   (((u64)0x7fffff
24190 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29  ff)<<32) | (u64)
241a0 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e  0xffffffff ).#en
241b0 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43  dif..    if( !pC
241c0 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
241d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
241e0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
241f0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
24200 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
24210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24220 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
24230 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
24240 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
24250 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
24260 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20      v = 1;   /* 
24270 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30  IMP: R-61914-480
24280 37 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  74 */.      }els
24290 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
242a0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
242b0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d  ursorIsValid(pC-
242c0 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a  >uc.pCursor) );.
242d0 20 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69          v = sqli
242e0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
242f0 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ey(pC->uc.pCurso
24300 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
24310 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a  v>=MAX_ROWID ){.
24320 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73            pC->us
24330 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31  eRandomRowid = 1
24340 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24350 0a 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20  .          v++; 
24360 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33    /* IMP: R-2953
24370 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20  8-34987 */.     
24380 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24390 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
243a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
243b0 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f  EMENT.    if( pO
243c0 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f  p->p3 ){.      /
243d0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
243e0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
243f0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
24400 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24410 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  3>0 );.      if(
24420 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
24430 20 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65        for(pFrame
24440 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
24450 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
24460 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
24470 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ent);.        /*
24480 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
24490 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
244a0 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
244b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
244c0 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  p3<=pFrame->nMem
244d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
244e0 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
244f0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
24500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24510 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
24520 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
24530 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
24540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
24550 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
24560 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
24570 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  ;.        pMem =
24580 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
24590 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  .        memAbou
245a0 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65  tToChange(p, pMe
245b0 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
245c0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
245d0 61 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  alid(pMem) );.. 
245e0 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
245f0 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65  ACE(pOp->p3, pMe
24600 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
24610 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
24620 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  fy(pMem);.      
24630 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
24640 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
24650 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33  =0 );  /* mem(P3
24660 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  ) holds an integ
24670 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
24680 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52  pMem->u.i==MAX_R
24690 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52  OWID || pC->useR
246a0 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20  andomRowid ){.  
246b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
246c0 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
246d0 3a 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20  : R-17817-00630 
246e0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
246f0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
24700 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
24710 20 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e    if( v<pMem->u.
24720 69 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76  i+1 ){.        v
24730 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31   = pMem->u.i + 1
24740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24750 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20  pMem->u.i = v;. 
24760 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24770 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f  if( pC->useRando
24780 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
24790 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
247a0 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31  N-OF: R-07677-41
247b0 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65  881 If the large
247c0 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61  st ROWID is equa
247d0 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  l to the.      *
247e0 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * largest possib
247f0 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33  le integer (9223
24800 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
24810 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
24820 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69  se.      ** engi
24830 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e  ne starts pickin
24840 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69  g positive candi
24850 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72  date ROWIDs at r
24860 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20  andom until.    
24870 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e    ** it finds on
24880 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72  e that is not pr
24890 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a  eviously used. *
248a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
248b0 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f  pOp->p3==0 );  /
248c0 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69  * We cannot be i
248d0 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d  n random rowid m
248e0 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20  ode if this is. 
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
24910 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
24920 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
24930 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  cnt = 0;.      d
24940 6f 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o{.        sqlit
24950 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
24960 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20  zeof(v), &v);.  
24970 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
24980 52 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20  ROWID>>1); v++; 
24990 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20   /* Ensure that 
249a0 76 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  v is greater tha
249b0 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n zero */.      
249c0 7d 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20  }while(  ((rc = 
249d0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
249e0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
249f0 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  c.pCursor, 0, (u
24a00 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20  64)v,.          
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29         0, &res))
24a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
24a50 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73           && (res
24a60 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
24a70 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29   && (++cnt<100))
24a80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
24a90 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
24aa0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
24ab0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
24ac0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24ad0 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
24ae0 3a 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20  : R-38219-53002 
24af0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
24b00 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
24b10 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
24b20 20 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b    assert( v>0 );
24b30 20 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32    /* EV: R-40812
24b40 2d 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a  -03570 */.    }.
24b50 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
24b60 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
24b70 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
24b80 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
24b90 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
24ba0 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   v;.  break;.}..
24bb0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72  /* Opcode: Inser
24bc0 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
24bd0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e  .** Synopsis: in
24be0 74 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d  tkey=r[P3] data=
24bf0 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74  r[P2].**.** Writ
24c00 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
24c10 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72  the table of cur
24c20 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65  sor P1.  A new e
24c30 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74  ntry is.** creat
24c40 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  ed if it doesn't
24c50 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f   already exist o
24c60 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61  r the data for a
24c70 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e  n existing.** en
24c80 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74  try is overwritt
24c90 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73  en.  The data is
24ca0 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42   the value MEM_B
24cb0 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lob stored in re
24cc0 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  gister.** number
24cd0 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20   P2. The key is 
24ce0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
24cf0 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d  er P3. The key m
24d00 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f  ust.** be a MEM_
24d10 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Int..**.** If th
24d20 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
24d30 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73   flag of P5 is s
24d40 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
24d50 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
24d60 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  .** incremented 
24d70 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
24d80 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f    If the OPFLAG_
24d90 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f  LASTROWID flag o
24da0 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20  f P5 is set,.** 
24db0 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74  then rowid is st
24dc0 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
24dd0 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68  ent return by th
24de0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73  e.** sqlite3_las
24df0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
24e00 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72   function (other
24e10 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64  wise it is unmod
24e20 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ified)..**.** If
24e30 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
24e40 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
24e50 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
24e60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24e70 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73  might.** run fas
24e80 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20  ter by avoiding 
24e90 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  an unnecessary s
24ea0 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  eek on cursor P1
24eb0 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  .  However,.** t
24ec0 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
24ed0 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73  KRESULT flag mus
24ee0 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66  t only be set if
24ef0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
24f00 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65   no prior.** see
24f10 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ks on the cursor
24f20 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20   or if the most 
24f30 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64  recent seek used
24f40 20 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20   a key equal to 
24f50 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
24f60 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45   OPFLAG_ISUPDATE
24f70 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24f80 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  en this opcode i
24f90 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20  s part of an.** 
24fa0 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
24fb0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66  .  Otherwise (if
24fc0 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65   the flag is cle
24fd0 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70  ar) then this op
24fe0 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20  code.** is part 
24ff0 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65  of an INSERT ope
25000 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66  ration.  The dif
25010 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20  ference is only 
25020 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20  important to.** 
25030 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e  the update hook.
25040 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
25050 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   P4 may point to
25060 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
25070 72 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55  re, or may be NU
25080 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a  LL. If it is .**
25090 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
250a0 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
250b0 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65  (sqlite3.xUpdate
250c0 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76  Callback) is inv
250d0 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  oked .** followi
250e0 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
250f0 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57  insert..**.** (W
25100 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20  ARNING/TODO: If 
25110 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63  P1 is a pseudo-c
25120 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
25130 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
25140 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f  llocated, then o
25150 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69  wnership of P2 i
25160 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f  s transferred to
25170 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73   the pseudo-curs
25180 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74  or.** and regist
25190 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70  er P2 becomes ep
251a0 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65  hemeral.  If the
251b0 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67   cursor is chang
251c0 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ed, the.** value
251d0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
251e0 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65  will then change
251f0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
25200 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61  s does not.** ca
25210 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
25220 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  .).**.** This in
25230 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77  struction only w
25240 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20  orks on tables. 
25250 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
25260 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
25270 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50  or indices is OP
25280 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f  _IdxInsert..*/./
25290 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74  * Opcode: Insert
252a0 49 6e 74 20 50 31 20 50 32 20 50 33 20 50 34 20  Int P1 P2 P3 P4 
252b0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
252c0 69 6e 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72  intkey=P3 data=r
252d0 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  [P2].**.** This 
252e0 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69  works exactly li
252f0 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63  ke OP_Insert exc
25300 65 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79  ept that the key
25310 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67   is the.** integ
25320 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74  er value P3, not
25330 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
25340 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64  e integer stored
25350 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
25360 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  .*/.case OP_Inse
25370 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73  rt: .case OP_Ins
25380 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20  ertInt: {.  Mem 
25390 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a  *pData;       /*
253a0 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e   MEM cell holdin
253b0 67 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  g data for the r
253c0 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
253d0 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rted */.  Mem *p
253e0 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  Key;        /* M
253f0 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20  EM cell holding 
25400 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63  key  for the rec
25410 6f 72 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ord */.  VdbeCur
25420 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75  sor *pC;   /* Cu
25430 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e  rsor to table in
25440 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20  to which insert 
25450 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  is written */.  
25460 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20  int seekResult; 
25470 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70    /* Result of p
25480 72 69 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69  rior seek or 0 i
25490 66 20 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55  f no USESEEKRESU
254a0 4c 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e  LT flag */.  con
254b0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f  st char *zDb;  /
254c0 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
254d0 2d 20 75 73 65 64 20 62 79 20 74 68 65 20 75 70  - used by the up
254e0 64 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54  date hook */.  T
254f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
25500 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
25510 75 72 65 20 2d 20 75 73 65 64 20 62 79 20 75 70  ure - used by up
25520 64 61 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64  date and pre-upd
25530 61 74 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69  ate hooks */.  i
25540 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
25550 20 2f 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 75   /* Opcode for u
25560 70 64 61 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49  pdate hook: SQLI
25570 54 45 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c  TE_UPDATE or SQL
25580 49 54 45 5f 49 4e 53 45 52 54 20 2a 2f 0a 20 20  ITE_INSERT */.  
25590 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 20  BtreePayload x; 
255a0 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20    /* Payload to 
255b0 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  be inserted */..
255c0 20 20 6f 70 20 3d 20 30 3b 0a 20 20 70 44 61 74    op = 0;.  pDat
255d0 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  a = &aMem[pOp->p
255e0 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
255f0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
25600 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
25610 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ;.  assert( memI
25620 73 56 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b  sValid(pData) );
25630 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
25640 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
25650 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
25660 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
25670 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
25680 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
25690 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
256a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
256b0 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
256c0 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d  G_ISNOOP) || pC-
256d0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73  >isTable );.  as
256e0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
256f0 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70  e==P4_TABLE || p
25700 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53  Op->p4type>=P4_S
25710 54 41 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53  TATIC );.  REGIS
25720 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
25730 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66  2, pData);..  if
25740 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
25750 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  P_Insert ){.    
25760 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pKey = &aMem[pOp
25770 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72  ->p3];.    asser
25780 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26  t( pKey->flags &
25790 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
257a0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
257b0 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  id(pKey) );.    
257c0 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
257d0 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20  Op->p3, pKey);. 
257e0 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79     x.nKey = pKey
257f0 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->u.i;.  }else{.
25800 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
25810 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
25820 72 74 49 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e  rtInt );.    x.n
25830 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  Key = pOp->p3;. 
25840 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   }..  if( pOp->p
25850 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
25860 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f  && HAS_UPDATE_HO
25870 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73  OK(db) ){.    as
25880 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30  sert( pC->iDb>=0
25890 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62   );.    zDb = db
258a0 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a  ->aDb[pC->iDb].z
258b0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61  DbSName;.    pTa
258c0 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  b = pOp->p4.pTab
258d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
258e0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
258f0 49 53 4e 4f 4f 50 29 20 7c 7c 20 48 61 73 52 6f  ISNOOP) || HasRo
25900 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20 20 20  wid(pTab) );.   
25910 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20   op = ((pOp->p5 
25920 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
25930 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
25940 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
25950 52 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RT);.  }else{.  
25960 20 20 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e    pTab = 0; /* N
25970 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65  ot needed.  Sile
25980 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77  nce a compiler w
25990 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a  arning. */.    z
259a0 44 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  Db = 0;  /* Not 
259b0 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65  needed.  Silence
259c0 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e   a compiler warn
259d0 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66  ing. */.  }..#if
259e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
259f0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
25a00 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
25a10 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
25a20 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66  , if any */.  if
25a30 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
25a40 43 61 6c 6c 62 61 63 6b 20 0a 20 20 20 26 26 20  Callback .   && 
25a50 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
25a60 54 41 42 4c 45 0a 20 20 20 26 26 20 21 28 70 4f  TABLE.   && !(pO
25a70 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
25a80 53 55 50 44 41 54 45 29 0a 20 20 29 7b 0a 20 20  SUPDATE).  ){.  
25a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65    sqlite3VdbePre
25aa0 55 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43  UpdateHook(p, pC
25ab0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
25ac0 20 7a 44 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b   zDb, pTab, x.nK
25ad0 65 79 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  ey, pOp->p2);.  
25ae0 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  }.  if( pOp->p5 
25af0 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
25b00 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ) break;.#endif.
25b10 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
25b20 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
25b30 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a  ) p->nChange++;.
25b40 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
25b50 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44  OPFLAG_LASTROWID
25b60 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   ) db->lastRowid
25b70 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 69 66 28   = x.nKey;.  if(
25b80 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
25b90 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
25ba0 78 2e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  x.pData = 0;.   
25bb0 20 78 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20   x.nData = 0;.  
25bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
25bd0 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20  t( pData->flags 
25be0 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  & (MEM_Blob|MEM_
25bf0 53 74 72 29 20 29 3b 0a 20 20 20 20 78 2e 70 44  Str) );.    x.pD
25c00 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a 3b 0a  ata = pData->z;.
25c10 20 20 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44      x.nData = pD
25c20 61 74 61 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 73 65  ata->n;.  }.  se
25c30 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70  ekResult = ((pOp
25c40 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
25c50 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
25c60 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
25c70 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d  0);.  if( pData-
25c80 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
25c90 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f  o ){.    x.nZero
25ca0 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72   = pData->u.nZer
25cb0 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
25cc0 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  x.nZero = 0;.  }
25cd0 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30 3b 0a 20  .  x.pKey = 0;. 
25ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25cf0 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e  eeInsert(pC->uc.
25d00 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20  pCursor, &x,.   
25d10 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
25d20 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46  PFLAG_APPEND|OPF
25d30 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
25d40 29 29 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20  )), seekResult. 
25d50 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72   );.  pC->deferr
25d60 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
25d70 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
25d80 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
25d90 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
25da0 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
25db0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
25dc0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
25dd0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
25de0 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
25df0 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 6f 70 20  eCallback && op 
25e00 29 7b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61  ){.    db->xUpda
25e10 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
25e20 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a  UpdateArg, op, z
25e30 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Db, pTab->zName,
25e40 20 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20   x.nKey);.  }.  
25e50 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
25e60 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50  ode: Delete P1 P
25e70 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
25e80 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f   Delete the reco
25e90 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20  rd at which the 
25ea0 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72  P1 cursor is cur
25eb0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
25ec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
25ed0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
25ee0 4e 20 62 69 74 20 6f 66 20 74 68 65 20 50 35 20  N bit of the P5 
25ef0 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
25f00 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
25f10 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66  rsor will be lef
25f20 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65  t pointing at  e
25f30 69 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f  ither the next o
25f40 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  r the previous.*
25f50 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * record in the 
25f60 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20  table. If it is 
25f70 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25f80 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
25f90 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  , then.** the ne
25fa0 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  xt Next instruct
25fb0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ion will be a no
25fc0 2d 6f 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74  -op. As a result
25fd0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  , in this case.*
25fe0 2a 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65  * it is ok to de
25ff0 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72  lete a record fr
26000 6f 6d 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74  om within a Next
26010 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50   loop. If .** OP
26020 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
26030 4e 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 63  N bit of P5 is c
26040 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
26050 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a  ursor will be.**
26060 20 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65   left in an unde
26070 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  fined state..**.
26080 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
26090 5f 41 55 58 44 45 4c 45 54 45 20 62 69 74 20 69  _AUXDELETE bit i
260a0 73 20 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61  s set on P5, tha
260b0 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
260c0 20 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20   this.** delete 
260d0 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61  one of several a
260e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
260f0 65 6c 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20  eleting a table 
26100 72 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a  row and all its.
26110 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ** associated in
26120 64 65 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78  dex entries.  Ex
26130 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f  actly one of tho
26140 73 65 20 64 65 6c 65 74 65 73 20 69 73 20 74 68  se deletes is th
26150 65 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64  e "primary".** d
26160 65 6c 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65  elete.  The othe
26170 72 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50  rs are all on OP
26180 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63  FLAG_FORDELETE c
26190 75 72 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61  ursors or else a
261a0 72 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74  re.** marked wit
261b0 68 20 74 68 65 20 41 55 58 44 45 4c 45 54 45 20  h the AUXDELETE 
261c0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  flag..**.** If t
261d0 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
261e0 45 20 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42  E flag of P2 (NB
261f0 3a 20 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20  : P2 not P5) is 
26200 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
26210 77 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e  w.** change coun
26220 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
26230 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
26240 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20  ..**.** P1 must 
26250 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61  not be pseudo-ta
26260 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20  ble.  It has to 
26270 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20  be a real table 
26280 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65  with.** multiple
26290 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   rows..**.** If 
262a0 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  P4 is not NULL t
262b0 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hen it points to
262c0 20 61 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e   a Table object.
262d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69   In this case ei
262e0 74 68 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64  ther .** the upd
262f0 61 74 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74  ate or pre-updat
26300 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c  e hook, or both,
26310 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e   may be invoked.
26320 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
26330 75 73 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ust.** have been
26340 20 70 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e   positioned usin
26350 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72  g OP_NotFound pr
26360 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
26370 74 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a  this opcode in .
26380 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 53 70  ** this case. Sp
26390 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f  ecifically, if o
263a0 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
263b0 2c 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  , the pre-update
263c0 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76   hook is .** inv
263d0 6f 6b 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f  oked if P4 is no
263e0 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61  t NULL. The upda
263f0 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te-hook is invok
26400 65 64 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e  ed if one is con
26410 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20  figured, .** P4 
26420 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
26430 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
26440 4e 47 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  NGE flag is set 
26450 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  in P2..**.** If 
26460 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
26470 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ATE flag is set 
26480 69 6e 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63  in P2, then P3 c
26490 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
264a0 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65  ess.** of the me
264b0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
264c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
264d0 65 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  e that the rowid
264e0 20 6f 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c   of the row will
264f0 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79  .** be set to by
26500 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a   the update..*/.
26510 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20  case OP_Delete: 
26520 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
26530 70 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pC;.  const char
26540 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a   *zDb;.  Table *
26550 70 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c  pTab;.  int opfl
26560 61 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20  ags;..  opflags 
26570 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
26580 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
26590 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
265a0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
265b0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
265c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
265d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
265e0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
265f0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
26600 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
26610 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
26620 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
26630 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
26640 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26650 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d  DEBUG.  if( pOp-
26660 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
26670 45 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f  E && HasRowid(pO
26680 70 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70  p->p4.pTab) && p
26690 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20  Op->p5==0 ){.   
266a0 20 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72   /* If p5 is zer
266b0 6f 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72  o, the seek oper
266c0 61 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74  ation that posit
266d0 69 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72  ioned the cursor
266e0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
266f0 20 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20   OP_Delete will 
26700 68 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68  have also set th
26710 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  e pC->movetoTarg
26720 65 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  et field to the 
26730 72 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20  rowid of.    ** 
26740 74 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  the row that is 
26750 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
26760 0a 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20  .    i64 iKey = 
26770 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
26780 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
26790 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65  ursor);.    asse
267a0 72 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  rt( pC->movetoTa
267b0 72 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20  rget==iKey );.  
267c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
267d0 66 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  f the update-hoo
267e0 6b 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d  k or pre-update-
267f0 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76  hook will be inv
26800 6f 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f  oked, set zDb to
26810 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
26820 66 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73  f the db to pass
26830 20 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20   as to it. Also 
26840 73 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74  set local pTab t
26850 6f 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66  o a copy.  ** of
26860 20 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c   p4.pTab. Finall
26870 79 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65  y, if p5 is true
26880 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
26890 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  t this cursor wa
268a0 73 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65  s.  ** last move
268b0 64 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f  d with OP_Next o
268c0 72 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53  r OP_Prev, not S
268d0 65 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c  eek or NotFound,
268e0 20 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43   set .  ** VdbeC
268f0 75 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67  ursor.movetoTarg
26900 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
26910 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69  t rowid.  */.  i
26920 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
26930 50 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f  P4_TABLE && HAS_
26940 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20  UPDATE_HOOK(db) 
26950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26960 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  C->iDb>=0 );.   
26970 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
26980 2e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  .pTab!=0 );.    
26990 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43  zDb = db->aDb[pC
269a0 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  ->iDb].zDbSName;
269b0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d  .    pTab = pOp-
269c0 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66  >p4.pTab;.    if
269d0 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
269e0 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
269f0 29 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61  )!=0 && pC->isTa
26a00 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d  ble ){.      pC-
26a10 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20  >movetoTarget = 
26a20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
26a30 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
26a40 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
26a50 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
26a60 20 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65   0;   /* Not nee
26a70 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
26a80 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
26a90 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  . */.    pTab = 
26aa0 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  0;  /* Not neede
26ab0 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f  d.  Silence a co
26ac0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20  mpiler warning. 
26ad0 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  */.  }..#ifdef S
26ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
26af0 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a  UPDATE_HOOK.  /*
26b00 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
26b10 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
26b20 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
26b30 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
26b40 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
26b50 3e 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20  >p4.pTab ){.    
26b60 61 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67  assert( !(opflag
26b70 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  s & OPFLAG_ISUPD
26b80 41 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ATE) .         |
26b90 7c 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  | HasRowid(pTab)
26ba0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
26bb0 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e   (aMem[pOp->p3].
26bc0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
26bd0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c   .    );.    sql
26be0 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
26bf0 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20  eHook(p, pC,.   
26c00 20 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20       (opflags & 
26c10 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
26c20 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
26c30 20 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45   : SQLITE_DELETE
26c40 2c 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20  , .        zDb, 
26c50 70 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f  pTab, pC->moveto
26c60 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  Target,.        
26c70 70 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20  pOp->p3.    );. 
26c80 20 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73   }.  if( opflags
26c90 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50   & OPFLAG_ISNOOP
26ca0 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66   ) break;.#endif
26cb0 0a 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61  . .  /* Only fla
26cc0 67 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  gs that can be s
26cd0 65 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54  et are SAVEPOIST
26ce0 49 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54  ION and AUXDELET
26cf0 45 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20  E */ .  assert( 
26d00 28 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46  (pOp->p5 & ~(OPF
26d10 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
26d20 7c 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54  |OPFLAG_AUXDELET
26d30 45 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  E))==0 );.  asse
26d40 72 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  rt( OPFLAG_SAVEP
26d50 4f 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53  OSITION==BTREE_S
26d60 41 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20  AVEPOSITION );. 
26d70 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
26d80 41 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45  AUXDELETE==BTREE
26d90 5f 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23  _AUXDELETE );..#
26da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26db0 55 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  UG.  if( p->pFra
26dc0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
26dd0 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c   pC->isEphemeral
26de0 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
26df0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
26e00 5f 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20  _AUXDELETE)==0. 
26e10 20 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77         && (pC->w
26e20 72 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46  rFlag & OPFLAG_F
26e30 4f 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20  ORDELETE)==0.   
26e40 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74     ){.      nExt
26e50 72 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20  raDelete++;.    
26e60 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  }.    if( pOp->p
26e70 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  2 & OPFLAG_NCHAN
26e80 47 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  GE ){.      nExt
26e90 72 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20  raDelete--;.    
26ea0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
26ec0 65 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70  eDelete(pC->uc.p
26ed0 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29  Cursor, pOp->p5)
26ee0 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
26ef0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
26f00 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73  E;.  pC->seekRes
26f10 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ult = 0;.  if( r
26f20 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
26f30 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
26f40 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
26f50 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
26f60 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
26f70 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
26f80 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
26f90 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
26fa0 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
26fb0 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73  eCallback && Has
26fc0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
26fd0 20 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65       db->xUpdate
26fe0 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
26ff0 64 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f  dateArg, SQLITE_
27000 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61  DELETE, zDb, pTa
27010 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
27020 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61      pC->movetoTa
27030 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
27040 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
27050 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
27060 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f  break;.}./* Opco
27070 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a  de: ResetCount *
27080 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
27090 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
270a0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
270b0 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
270c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
270d0 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
270e0 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73  r (returned by s
270f0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
27100 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  to sqlite3_chang
27110 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74  es())..** Then t
27120 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20  he VMs internal 
27130 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72  change counter r
27140 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54  esets to 0..** T
27150 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
27160 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
27170 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
27180 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69  tCount: {.  sqli
27190 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
271a0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
271b0 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  );.  p->nChange 
271c0 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
271d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
271e0 65 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  erCompare P1 P2 
271f0 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69  P3 P4.** Synopsi
27200 73 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74  s: if key(P1)!=t
27210 72 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f  rim(r[P3],P4) go
27220 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69  to P2.**.** P1 i
27230 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
27240 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
27250 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70  ion compares a p
27260 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
27270 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72  record blob in r
27280 65 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e  egister P3 again
27290 73 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  st a prefix of t
272a0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  he entry that .*
272b0 2a 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  * the sorter cur
272c0 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
272d0 69 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74  ints to.  Only t
272e0 68 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c  he first P4 fiel
272f0 64 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61  ds.** of r[P3] a
27300 6e 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  nd the sorter re
27310 63 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65  cord are compare
27320 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  d..**.** If eith
27330 65 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72  er P3 or the sor
27340 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  ter contains a N
27350 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  ULL in one of th
27360 65 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  eir significant.
27370 2a 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63  ** fields (not c
27380 6f 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66  ounting the P4 f
27390 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
273a0 20 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72   which are ignor
273b0 65 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed) then.** the 
273c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  comparison is as
273d0 73 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61  sumed to be equa
273e0 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68  l..**.** Fall th
273f0 72 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e  rough to next in
27400 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65  struction if the
27410 20 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d   two records com
27420 70 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a  pare equal to.**
27430 20 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75   each other.  Ju
27440 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79  mp to P2 if they
27450 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a   are different..
27460 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
27470 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64  rCompare: {.  Vd
27480 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
27490 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
274a0 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20  KeyCol;..  pC = 
274b0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
274c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
274d0 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61  orter(pC) );.  a
274e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
274f0 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
27500 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
27510 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43  Op->p3];.  nKeyC
27520 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ol = pOp->p4.i;.
27530 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
27540 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
27550 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70  terCompare(pC, p
27560 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72  In3, nKeyCol, &r
27570 65 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  es);.  VdbeBranc
27580 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
27590 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
275a0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
275b0 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20  rror;.  if( res 
275c0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
275d0 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a  2;.  break;.};..
275e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
275f0 72 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a  rData P1 P2 P3 *
27600 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
27610 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a  r[P2]=data.**.**
27620 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
27630 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72  ster P2 the curr
27640 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20  ent sorter data 
27650 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f  for sorter curso
27660 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c  r P1..** Then cl
27670 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  ear the column h
27680 65 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63  eader cache on c
27690 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ursor P3..**.** 
276a0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  This opcode is n
276b0 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d  ormally use to m
276c0 6f 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74  ove a record out
276d0 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61   of the sorter a
276e0 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67  nd into.** a reg
276f0 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68  ister that is th
27700 65 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70  e source for a p
27710 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73  seudo-table curs
27720 6f 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  or created using
27730 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20  .** OpenPseudo. 
27740 20 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62   That pseudo-tab
27750 6c 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  le cursor is the
27760 20 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65   one that is ide
27770 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
27780 72 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65  rameter P3.  Cle
27790 61 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c  aring the P3 col
277a0 75 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72  umn cache as par
277b0 74 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  t of this opcode
277c0 20 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f   saves.** us fro
277d0 6d 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75  m having to issu
277e0 65 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c  e a separate Nul
277f0 6c 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  lRow instruction
27800 20 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63   to clear that c
27810 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ache..*/.case OP
27820 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20  _SorterData: {. 
27830 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
27840 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ..  pOut = &aMem
27850 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20  [pOp->p2];.  pC 
27860 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
27870 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69  p1];.  assert( i
27880 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20  sSorter(pC) );. 
27890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
278a0 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43  eSorterRowkey(pC
278b0 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72  , pOut);.  asser
278c0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
278d0 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73   || (pOut->flags
278e0 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a   & MEM_Blob) );.
278f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
27900 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
27910 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
27920 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
27930 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
27940 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  ;.  p->apCsr[pOp
27950 2d 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74  ->p3]->cacheStat
27960 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
27970 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
27980 20 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61   Opcode: RowData
27990 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
279a0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
279b0 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74  =data.**.** Writ
279c0 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
279d0 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  P2 the complete 
279e0 72 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  row content for 
279f0 74 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77  the row at .** w
27a00 68 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69  hich cursor P1 i
27a10 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27a20 74 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69  ting..** There i
27a30 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
27a40 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
27a50 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74    .** It is just
27a60 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
27a70 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61   P2 register exa
27a80 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
27a90 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
27aa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
27ab0 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
27ac0 20 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   is an index, th
27ad0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  en the content i
27ae0 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
27af0 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73   row..** If curs
27b00 6f 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65  or P2 is a table
27b10 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27b20 6e 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20  nt extracted is 
27b30 74 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  the data..**.** 
27b40 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  If the P1 cursor
27b50 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
27b60 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
27b70 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77   (not a NULL row
27b80 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74  ).** of a real t
27b90 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
27ba0 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  do-table..**.** 
27bb0 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68  If P3!=0 then th
27bc0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c  is opcode is all
27bd0 6f 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20  owed to make an 
27be0 65 70 68 65 72 6d 65 72 61 6c 20 70 6f 69 6e 74  ephermeral point
27bf0 65 72 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64  er.** into the d
27c00 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
27c10 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
27c20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
27c30 65 20 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69  e output.** regi
27c40 73 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76  ster will be inv
27c50 61 6c 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e  alidated as soon
27c60 20 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d   as the cursor m
27c70 6f 76 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67  oves - including
27c80 0a 2a 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64  .** moves caused
27c90 20 62 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72   by other cursor
27ca0 73 20 74 68 61 74 20 22 73 61 76 65 22 20 74 68  s that "save" th
27cb0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
27cc0 72 73 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f  rsors.** positio
27cd0 6e 20 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20  n in order that 
27ce0 74 68 65 79 20 63 61 6e 20 77 72 69 74 65 20 74  they can write t
27cf0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
27d00 2e 20 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74  .  If P3==0.** t
27d10 68 65 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  hen a copy of th
27d20 65 20 64 61 74 61 20 69 73 20 6d 61 64 65 20 69  e data is made i
27d30 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21  nto memory.  P3!
27d40 3d 30 20 69 73 20 66 61 73 74 65 72 2c 20 62 75  =0 is faster, bu
27d50 74 0a 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61  t.** P3==0 is sa
27d60 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33  fer..**.** If P3
27d70 21 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  !=0 then the con
27d80 74 65 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72  tent of the P2 r
27d90 65 67 69 73 74 65 72 20 69 73 20 75 6e 73 75 69  egister is unsui
27da0 74 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  table for use.**
27db0 20 69 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e   in OP_Result an
27dc0 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20  d any OP_Result 
27dd0 77 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20  will invalidate 
27de0 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  the P2 register 
27df0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  content..** The 
27e00 50 32 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  P2 register cont
27e10 65 6e 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74  ent is invalidat
27e20 65 64 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69  ed by opcodes li
27e30 6b 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  ke OP_Function o
27e40 72 0a 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20  r.** by any use 
27e50 6f 66 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f  of another curso
27e60 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
27e70 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f  e same table..*/
27e80 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61  .case OP_RowData
27e90 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
27ea0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
27eb0 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e   *pCrsr;.  u32 n
27ec0 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
27ed0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
27ee0 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
27ef0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27f00 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
27f10 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
27f20 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
27f30 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
27f40 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
27f50 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
27f60 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
27f70 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d  t( isSorter(pC)=
27f80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27f90 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29  pC->nullRow==0 )
27fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
27fb0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
27fc0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
27fd0 63 2e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  c.pCursor;..  /*
27fe0 20 54 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20   The OP_RowData 
27ff0 6f 70 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66  opcodes always f
28000 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73  ollow OP_NotExis
28010 74 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65  ts or.  ** OP_Se
28020 65 6b 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65  ekRowid or OP_Re
28030 77 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74  wind/Op_Next wit
28040 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67  h no intervening
28050 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
28060 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e  ** that might in
28070 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
28080 73 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69  sor..  ** If thi
28090 73 20 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20  s where not the 
280a0 63 61 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20  case, on of the 
280b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
280c0 28 29 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66  ()s.  ** would f
280d0 61 69 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69  ail.  Should thi
280e0 73 20 65 76 65 72 20 63 68 61 6e 67 65 20 28 62  s ever change (b
280f0 65 63 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65  ecause of change
28100 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20  s in the code.  
28110 2a 2a 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68  ** generator) th
28120 65 6e 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64  en the fix would
28130 20 62 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20   be to insert a 
28140 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
28150 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
28160 76 65 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  veto()..  */.  a
28170 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
28180 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
28190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
281a0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
281b0 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69  lid(pCrsr) );.#i
281c0 66 20 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75  f 0  /* Not requ
281d0 69 72 65 64 20 64 75 65 20 74 6f 20 74 68 65 20  ired due to the 
281e0 70 72 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65  previous to asse
281f0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
28200 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
28210 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
28220 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21  o(pC);.  if( rc!
28230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28240 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
28250 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rror;.#endif..  
28260 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
28270 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73  PayloadSize(pCrs
28280 72 29 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32  r);.  if( n>(u32
28290 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  )db->aLimit[SQLI
282a0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
282b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
282c0 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74  _big;.  }.  test
282d0 63 61 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20  case( n==0 );.  
282e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
282f0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72  MemFromBtree(pCr
28300 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b  sr, 0, n, pOut);
28310 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
28320 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
28330 72 6f 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d  ror;.  if( !pOp-
28340 3e 70 33 20 29 20 44 65 65 70 68 65 6d 65 72 61  >p3 ) Deephemera
28350 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50  lize(pOut);.  UP
28360 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
28370 45 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53  E(pOut);.  REGIS
28380 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
28390 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  2, pOut);.  brea
283a0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
283b0 20 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a   Rowid P1 P2 * *
283c0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
283d0 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
283e0 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73  * Store in regis
283f0 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65  ter P2 an intege
28400 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6b  r which is the k
28410 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ey of the table 
28420 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31  entry that.** P1
28430 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
28440 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31  int to..**.** P1
28450 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
28460 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
28470 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
28480 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73 65 64  ble.  There used
28490 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61   to.** be a sepa
284a0 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f  rate OP_VRowid o
284b0 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69  pcode for use wi
284c0 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
284d0 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f  s, but this.** o
284e0 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f  ne opcode now wo
284f0 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62  rks for both tab
28500 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73  le types..*/.cas
28510 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20  e OP_Rowid: {   
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28530 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43   out2 */.  VdbeC
28540 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34  ursor *pC;.  i64
28550 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   v;.  sqlite3_vt
28560 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e  ab *pVtab;.  con
28570 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
28580 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70  e *pModule;..  p
28590 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
285a0 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
285b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
285c0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
285d0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
285e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
285f0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
28600 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
28610 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  t( pC->eCurType!
28620 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
28630 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  || pC->nullRow )
28640 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c  ;.  if( pC->null
28650 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  Row ){.    pOut-
28660 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
28670 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l;.    break;.  
28680 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65  }else if( pC->de
28690 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
286a0 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65      v = pC->move
286b0 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  toTarget;.#ifnde
286c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
286d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c  RTUALTABLE.  }el
286e0 73 65 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  se if( pC->eCurT
286f0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41  ype==CURTYPE_VTA
28700 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
28710 20 70 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30   pC->uc.pVCur!=0
28720 20 29 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20   );.    pVtab = 
28730 70 43 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56  pC->uc.pVCur->pV
28740 74 61 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  tab;.    pModule
28750 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
28760 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
28770 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29  Module->xRowid )
28780 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75  ;.    rc = pModu
28790 6c 65 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75  le->xRowid(pC->u
287a0 63 2e 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20  c.pVCur, &v);.  
287b0 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
287c0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
287d0 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ab);.    if( rc 
287e0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
287f0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69  _to_error;.#endi
28800 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28810 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
28820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
28830 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
28840 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
28850 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
28860 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
28870 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
28880 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
28890 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20  Restore(pC);.   
288a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
288b0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
288c0 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e  r;.    if( pC->n
288d0 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
288e0 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
288f0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
28900 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  eak;.    }.    v
28910 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
28920 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63  ntegerKey(pC->uc
28930 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  .pCursor);.  }. 
28940 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pOut->u.i = v;.
28950 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
28960 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50  pcode: NullRow P
28970 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
28980 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28990 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  P1 to a null row
289a0 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e  .  Any OP_Column
289b0 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74   operations.** t
289c0 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20  hat occur while 
289d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  the cursor is on
289e0 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69   the null row wi
289f0 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69  ll always.** wri
28a00 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  te a NULL..*/.ca
28a10 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b  se OP_NullRow: {
28a20 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
28a30 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
28a40 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
28a50 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
28a60 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
28a70 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
28a80 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
28a90 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
28aa0 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
28ab0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
28ac0 45 3b 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75  E;.  if( pC->eCu
28ad0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
28ae0 54 52 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65  TREE ){.    asse
28af0 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
28b00 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  or!=0 );.    sql
28b10 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28b20 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72  rsor(pC->uc.pCur
28b30 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  sor);.  }.  brea
28b40 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
28b50 20 4c 61 73 74 20 50 31 20 50 32 20 50 33 20 2a   Last P1 P2 P3 *
28b60 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78   *.**.** The nex
28b70 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77  t use of the Row
28b80 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20  id or Column or 
28b90 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e  Prev instruction
28ba0 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c   for P1 .** will
28bb0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61   refer to the la
28bc0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
28bd0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
28be0 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74  r index..** If t
28bf0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
28c00 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50  x is empty and P
28c10 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  2>0, then jump i
28c20 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
28c30 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20  ..** If P2 is 0 
28c40 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
28c50 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  or index is not 
28c60 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f  empty, fall thro
28c70 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
28c80 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
28c90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
28ca0 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
28cb0 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
28cc0 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72  red to move in r
28cd0 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a  everse order,.**
28ce0 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f   from the end to
28cf0 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69  ward the beginni
28d00 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ng.  In other wo
28d10 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
28d20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
28d30 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f   to use Prev, no
28d40 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t Next..**.** If
28d50 20 50 33 20 69 73 20 2d 31 2c 20 74 68 65 6e 20   P3 is -1, then 
28d60 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
28d70 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
28d80 65 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65 65  end of the btree
28d90 0a 2a 2a 20 66 6f 72 20 74 68 65 20 70 75 72 70  .** for the purp
28da0 6f 73 65 20 6f 66 20 61 70 70 65 6e 64 69 6e 67  ose of appending
28db0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e 74   a new entry ont
28dc0 6f 20 74 68 65 20 62 74 72 65 65 2e 20 20 49 6e  o the btree.  In
28dd0 20 74 68 61 74 0a 2a 2a 20 63 61 73 65 20 50 32   that.** case P2
28de0 20 6d 75 73 74 20 62 65 20 30 2e 20 20 49 74 20   must be 0.  It 
28df0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
28e00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  the cursor is us
28e10 65 64 20 6f 6e 6c 79 20 66 6f 72 0a 2a 2a 20 61  ed only for.** a
28e20 70 70 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f 20  ppending and so 
28e30 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
28e40 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65   valid, then the
28e50 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 72   cursor must alr
28e60 65 61 64 79 0a 2a 2a 20 62 65 20 70 6f 69 6e 74  eady.** be point
28e70 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ing at the end o
28e80 66 20 74 68 65 20 62 74 72 65 65 20 61 6e 64 20  f the btree and 
28e90 73 6f 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  so no changes ar
28ea0 65 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 74 68 65  e made to.** the
28eb0 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 63 61 73 65   cursor..*/.case
28ec0 20 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20   OP_Last: {     
28ed0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
28ee0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
28ef0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
28f00 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
28f10 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
28f20 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
28f30 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
28f40 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
28f50 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
28f60 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
28f70 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
28f80 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
28f90 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
28fa0 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72  >uc.pCursor;.  r
28fb0 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  es = 0;.  assert
28fc0 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20  ( pCrsr!=0 );.  
28fd0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
28fe0 20 70 4f 70 2d 3e 70 33 3b 0a 23 69 66 64 65 66   pOp->p3;.#ifdef
28ff0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29000 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f  pC->seekOp = OP_
29010 4c 61 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Last;.#endif.  i
29020 66 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c  f( pOp->p3==0 ||
29030 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   !sqlite3BtreeCu
29040 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 70 43  rsorIsValidNN(pC
29050 72 73 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  rsr) ){.    rc =
29060 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
29070 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
29080 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
29090 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 20 20 70  = (u8)res;.    p
290a0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
290b0 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
290c0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
290d0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 69 66  HE_STALE;.    if
290e0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
290f0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
29100 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
29110 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42  0 ){.      VdbeB
29120 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
29130 30 2c 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0,2);.      if( 
29140 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  res ) goto jump_
29150 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  to_p2;.    }.  }
29160 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
29170 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a  ( pOp->p2==0 );.
29180 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
29190 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 53 6d 61  /* Opcode: IfSma
291a0 6c 6c 65 72 20 50 31 20 50 32 20 50 33 20 2a 20  ller P1 P2 P3 * 
291b0 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  *.**.** Estimate
291c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
291d0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
291e0 20 50 31 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32   P1.  Jump to P2
291f0 20 69 66 20 74 68 61 74 0a 2a 2a 20 65 73 74 69   if that.** esti
29200 6d 61 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  mate is less tha
29210 6e 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  n approximately 
29220 32 2a 2a 28 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a  2**(0.1*P3)..*/.
29230 63 61 73 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65  case OP_IfSmalle
29240 72 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  r: {        /* j
29250 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
29260 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
29270 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
29280 74 20 72 65 73 3b 0a 20 20 69 36 34 20 73 7a 3b  t res;.  i64 sz;
29290 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
292a0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
292b0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
292c0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
292d0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
292e0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
292f0 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
29300 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
29310 20 70 43 72 73 72 20 29 3b 0a 20 20 72 63 20 3d   pCrsr );.  rc =
29320 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
29330 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
29340 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
29350 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
29360 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  ror;.  if( res==
29370 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 73 71  0 ){.    sz = sq
29380 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
29390 6e 74 45 73 74 28 70 43 72 73 72 29 3b 0a 20 20  ntEst(pCrsr);.  
293a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 7a 3e    if( ALWAYS(sz>
293b0 3d 30 29 20 26 26 20 73 71 6c 69 74 65 33 4c 6f  =0) && sqlite3Lo
293c0 67 45 73 74 28 28 75 36 34 29 73 7a 29 3c 70 4f  gEst((u64)sz)<pO
293d0 70 2d 3e 70 33 20 29 20 72 65 73 20 3d 20 31 3b  p->p3 ) res = 1;
293e0 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63  .  }.  VdbeBranc
293f0 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
29400 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f  ;.  if( res ) go
29410 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
29420 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
29430 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 53 6f 72  pcode: SorterSor
29440 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
29450 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 72 65  .** After all re
29460 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20  cords have been 
29470 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
29480 65 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a  e Sorter object.
29490 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
294a0 20 50 31 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73   P1, invoke this
294b0 20 6f 70 63 6f 64 65 20 74 6f 20 61 63 74 75 61   opcode to actua
294c0 6c 6c 79 20 64 6f 20 74 68 65 20 73 6f 72 74 69  lly do the sorti
294d0 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  ng..** Jump to P
294e0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  2 if there are n
294f0 6f 20 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20  o records to be 
29500 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  sorted..**.** Th
29510 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6e 20  is opcode is an 
29520 61 6c 69 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72  alias for OP_Sor
29530 74 20 61 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20  t and OP_Rewind 
29540 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  that is used.** 
29550 66 6f 72 20 53 6f 72 74 65 72 20 6f 62 6a 65 63  for Sorter objec
29560 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ts..*/./* Opcode
29570 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a  : Sort P1 P2 * *
29580 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
29590 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c  code does exactl
295a0 79 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  y the same thing
295b0 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78   as OP_Rewind ex
295c0 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20  cept that.** it 
295d0 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e  increments an un
295e0 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61  documented globa
295f0 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  l variable used 
29600 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a  for testing..**.
29610 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63  ** Sorting is ac
29620 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72  complished by wr
29630 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  iting records in
29640 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
29650 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69  ex,.** then rewi
29660 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  nding that index
29670 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20   and playing it 
29680 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e  back from beginn
29690 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20  ing to.** end.  
296a0 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f  We use the OP_So
296b0 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61  rt opcode instea
296c0 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74  d of OP_Rewind t
296d0 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69  o do the.** rewi
296e0 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68  nding so that th
296f0 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
29700 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d  e will be increm
29710 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67  ented and.** reg
29720 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61  ression tests ca
29730 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  n determine whet
29740 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f  her or not the o
29750 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63  ptimizer is.** c
29760 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a  orrectly optimiz
29770 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a  ing out sorts..*
29780 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
29790 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Sort:    /* jump
297a0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74   */.case OP_Sort
297b0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
297c0 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
297d0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
297e0 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
297f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
29800 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
29810 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
29820 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
29830 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20  S_SORT]++;.  /* 
29840 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
29850 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d  o OP_Rewind */.}
29860 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69  ./* Opcode: Rewi
29870 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nd P1 P2 * * *.*
29880 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
29890 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f  e of the Rowid o
298a0 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
298b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
298c0 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
298d0 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
298e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
298f0 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
29900 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
29910 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
29920 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d  s empty, jump im
29930 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
29940 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
29950 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
29960 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
29970 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ough to the foll
29980 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75  owing .** instru
29990 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ction..**.** Thi
299a0 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
299b0 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
299c0 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
299d0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
299e0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
299f0 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
29a00 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
29a10 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
29a20 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
29a30 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
29a40 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73  not Prev..*/.cas
29a50 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
29a60 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
29a70 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
29a80 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
29a90 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
29aa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
29ab0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
29ac0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
29ad0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
29ae0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
29af0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
29b00 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
29b10 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
29b20 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  e==OP_SorterSort
29b30 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a  ) );.  res = 1;.
29b40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29b50 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
29b60 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 23 65   = OP_Rewind;.#e
29b70 6e 64 69 66 0a 20 20 69 66 28 20 69 73 53 6f 72  ndif.  if( isSor
29b80 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 72  ter(pC) ){.    r
29b90 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
29ba0 6f 72 74 65 72 52 65 77 69 6e 64 28 70 43 2c 20  orterRewind(pC, 
29bb0 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  &res);.  }else{.
29bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
29bd0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
29be0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 70  E_BTREE );.    p
29bf0 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
29c00 75 72 73 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  ursor;.    asser
29c10 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20  t( pCrsr );.    
29c20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
29c30 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72  eFirst(pCrsr, &r
29c40 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  es);.    pC->def
29c50 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
29c60 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
29c70 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
29c80 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  LE;.  }.  if( rc
29c90 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
29ca0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43  e_to_error;.  pC
29cb0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
29cc0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  res;.  assert( p
29cd0 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
29ce0 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
29cf0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
29d00 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
29d10 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70   res ) goto jump
29d20 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
29d30 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
29d40 65 78 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ext P1 P2 P3 P4 
29d50 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  P5.**.** Advance
29d60 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
29d70 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
29d80 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74  the next key/dat
29d90 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a  a pair in its.**
29da0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
29db0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
29dc0 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65  o more key/value
29dd0 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
29de0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
29df0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
29e00 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
29e10 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76  f the cursor adv
29e20 61 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73  ance was success
29e30 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d  ful,.** jump imm
29e40 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
29e50 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65 78 74 20 6f  **.** The Next o
29e60 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61  pcode is only va
29e70 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  lid following an
29e80 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
29e90 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65 77 69 6e 64   or.** OP_Rewind
29ea0 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20   opcode used to 
29eb0 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
29ec0 73 6f 72 2e 20 20 4e 65 78 74 20 69 73 20 6e 6f  sor.  Next is no
29ed0 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  t allowed.** to 
29ee0 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c 20 53  follow SeekLT, S
29ef0 65 65 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c 61 73  eekLE, or OP_Las
29f00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20  t..**.** The P1 
29f10 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66  cursor must be f
29f20 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  or a real table,
29f30 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
29f40 62 6c 65 2e 20 20 50 31 20 6d 75 73 74 20 68 61  ble.  P1 must ha
29f50 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 70 65 6e 65  ve.** been opene
29f60 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
29f70 6f 70 63 6f 64 65 20 6f 72 20 74 68 65 20 70 72  opcode or the pr
29f80 6f 67 72 61 6d 20 77 69 6c 6c 20 73 65 67 66 61  ogram will segfa
29f90 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ult..**.** The P
29fa0 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e  3 value is a hin
29fb0 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  t to the btree i
29fc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49  mplementation. I
29fd0 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a  f P3==1, that.**
29fe0 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20   means P1 is an 
29ff0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2a000 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  at this instruct
2a010 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
2a020 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69  een.** omitted i
2a030 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 61 64  f that index had
2a040 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50   been unique.  P
2a050 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20  3 is usually 0. 
2a060 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73   P3 is.** always
2a070 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
2a080 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
2a090 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
2a0a0 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
2a0b0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
2a0c0 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
2a0d0 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a  BtreeNext()..**.
2a0e0 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73 69  ** If P5 is posi
2a0f0 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d  tive and the jum
2a100 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e  p is taken, then
2a110 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a   event counter.*
2a120 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e  * number P5-1 in
2a130 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
2a140 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65  atement is incre
2a150 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  mented..**.** Se
2a160 65 20 61 6c 73 6f 3a 20 50 72 65 76 2c 20 4e 65  e also: Prev, Ne
2a170 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f  xtIfOpen.*/./* O
2a180 70 63 6f 64 65 3a 20 4e 65 78 74 49 66 4f 70 65  pcode: NextIfOpe
2a190 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
2a1a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
2a1b0 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
2a1c0 6b 65 20 4e 65 78 74 20 65 78 63 65 70 74 20 74  ke Next except t
2a1d0 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
2a1e0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
2a1f0 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
2a200 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
2a210 3a 20 50 72 65 76 20 50 31 20 50 32 20 50 33 20  : Prev P1 P2 P3 
2a220 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b  P4 P5.**.** Back
2a230 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f   up cursor P1 so
2a240 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2a250 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2a260 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e  key/data pair in
2a270 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   its.** table or
2a280 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72   index.  If ther
2a290 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73  e is no previous
2a2a0 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
2a2b0 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
2a2c0 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
2a2d0 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
2a2e0 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  on.  But if the 
2a2f0 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61  cursor backup wa
2a300 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
2a310 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
2a320 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a  y to P2..**.**.*
2a330 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64  * The Prev opcod
2a340 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
2a350 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
2a360 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 0a  kLT, SeekLE, or.
2a370 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f 64  ** OP_Last opcod
2a380 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
2a390 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  on the cursor.  
2a3a0 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  Prev is not allo
2a3b0 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77  wed.** to follow
2a3c0 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
2a3d0 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a   or OP_Rewind..*
2a3e0 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
2a3f0 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
2a400 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
2a410 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
2a420 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e 6f    If P1 is.** no
2a430 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68 65 20  t open then the 
2a440 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65  behavior is unde
2a450 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fined..**.** The
2a460 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20 68   P3 value is a h
2a470 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65 65  int to the btree
2a480 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
2a490 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a   If P3==1, that.
2a4a0 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61  ** means P1 is a
2a4b0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
2a4c0 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72 75  that this instru
2a4d0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ction could have
2a4e0 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64   been.** omitted
2a4f0 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20 68   if that index h
2a500 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20  ad been unique. 
2a510 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30   P3 is usually 0
2a520 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61  .  P3 is.** alwa
2a530 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 31  ys either 0 or 1
2a540 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c  ..**.** P4 is al
2a550 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f  ways of type P4_
2a560 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e  ADVANCE. The fun
2a570 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f  ction pointer po
2a580 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  ints to.** sqlit
2a590 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2a5a0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  )..**.** If P5 i
2a5b0 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
2a5c0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
2a5d0 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
2a5e0 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
2a5f0 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
2a600 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
2a610 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
2a620 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76  ./* Opcode: Prev
2a630 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20  IfOpen P1 P2 P3 
2a640 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
2a650 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75   opcode works ju
2a660 73 74 20 6c 69 6b 65 20 50 72 65 76 20 65 78 63  st like Prev exc
2a670 65 70 74 20 74 68 61 74 20 69 66 20 63 75 72 73  ept that if curs
2a680 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  or P1 is not.** 
2a690 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 73 20  open it behaves 
2a6a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f  a no-op..*/./* O
2a6b0 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4e 65 78  pcode: SorterNex
2a6c0 74 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a  t P1 P2 * * P5.*
2a6d0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2a6e0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
2a6f0 20 4f 50 5f 4e 65 78 74 20 65 78 63 65 70 74 20   OP_Next except 
2a700 74 68 61 74 20 50 31 20 6d 75 73 74 20 62 65 20  that P1 must be 
2a710 61 0a 2a 2a 20 73 6f 72 74 65 72 20 6f 62 6a 65  a.** sorter obje
2a720 63 74 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ct for which the
2a730 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 20 6f   OP_SorterSort o
2a740 70 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a  pcode has been.*
2a750 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 69 73  * invoked.  This
2a760 20 6f 70 63 6f 64 65 20 61 64 76 61 6e 63 65 73   opcode advances
2a770 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2a780 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a  he next sorted.*
2a790 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 6a 75 6d  * record, or jum
2a7a0 70 73 20 74 6f 20 50 32 20 69 66 20 74 68 65 72  ps to P2 if ther
2a7b0 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 73 6f  e are no more so
2a7c0 72 74 65 64 20 72 65 63 6f 72 64 73 2e 0a 2a 2f  rted records..*/
2a7d0 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e  .case OP_SorterN
2a7e0 65 78 74 3a 20 7b 20 20 2f 2a 20 6a 75 6d 70 20  ext: {  /* jump 
2a7f0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2a800 2a 70 43 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e  *pC;..  pC = p->
2a810 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2a820 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
2a830 65 72 28 70 43 29 20 29 3b 0a 20 20 72 63 20 3d  er(pC) );.  rc =
2a840 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
2a850 65 72 4e 65 78 74 28 64 62 2c 20 70 43 29 3b 0a  erNext(db, pC);.
2a860 20 20 67 6f 74 6f 20 6e 65 78 74 5f 74 61 69 6c    goto next_tail
2a870 3b 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66  ;.case OP_PrevIf
2a880 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Open:    /* jump
2a890 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74   */.case OP_Next
2a8a0 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75  IfOpen:    /* ju
2a8b0 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61  mp */.  if( p->a
2a8c0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30  pCsr[pOp->p1]==0
2a8d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46   ) break;.  /* F
2a8e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 63  all through */.c
2a8f0 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20  ase OP_Prev:    
2a900 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2a910 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 20  .case OP_Next:  
2a920 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2a930 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
2a940 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2a950 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2a960 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a970 70 35 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  p5<ArraySize(p->
2a980 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20 70  aCounter) );.  p
2a990 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2a9a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2a9b0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2a9c0 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
2a9d0 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61  Moveto==0 );.  a
2a9e0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2a9f0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2aa00 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
2aa10 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
2aa20 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  Next || pOp->p4.
2aa30 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65  xAdvance==sqlite
2aa40 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20  3BtreeNext );.  
2aa50 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2aa60 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20  ode!=OP_Prev || 
2aa70 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
2aa80 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
2aa90 65 76 69 6f 75 73 20 29 3b 0a 20 20 61 73 73 65  evious );.  asse
2aaa0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
2aab0 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 20 7c  =OP_NextIfOpen |
2aac0 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  | pOp->p4.xAdvan
2aad0 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ce==sqlite3Btree
2aae0 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Next );.  assert
2aaf0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
2ab00 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 7c 7c 20  P_PrevIfOpen || 
2ab10 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
2ab20 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
2ab30 65 76 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a 20 54  evious);..  /* T
2ab40 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69  he Next opcode i
2ab50 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65  s only used afte
2ab60 72 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45  r SeekGT, SeekGE
2ab70 2c 20 61 6e 64 20 52 65 77 69 6e 64 2e 0a 20 20  , and Rewind..  
2ab80 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f  ** The Prev opco
2ab90 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  de is only used 
2aba0 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20 53 65  after SeekLT, Se
2abb0 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e 20  ekLE, and Last. 
2abc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
2abd0 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78  ->opcode!=OP_Nex
2abe0 74 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  t || pOp->opcode
2abf0 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 0a  !=OP_NextIfOpen.
2ac00 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
2ac10 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ekOp==OP_SeekGT 
2ac20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2ac30 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20 20  P_SeekGE.       
2ac40 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2ac50 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43 2d 3e  P_Rewind || pC->
2ac60 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64  seekOp==OP_Found
2ac70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2ac80 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
2ac90 76 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  v || pOp->opcode
2aca0 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 0a  !=OP_PrevIfOpen.
2acb0 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
2acc0 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ekOp==OP_SeekLT 
2acd0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2ace0 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20 20 20  P_SeekLE.       
2acf0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2ad00 50 5f 4c 61 73 74 20 29 3b 0a 0a 20 20 72 63 20  P_Last );..  rc 
2ad10 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  = pOp->p4.xAdvan
2ad20 63 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ce(pC->uc.pCurso
2ad30 72 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 6e 65 78  r, pOp->p3);.nex
2ad40 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d 3e 63 61  t_tail:.  pC->ca
2ad50 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2ad60 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64 62 65 42  E_STALE;.  VdbeB
2ad70 72 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d 3d 53  ranchTaken(rc==S
2ad80 51 4c 49 54 45 5f 4f 4b 2c 32 29 3b 0a 20 20 69  QLITE_OK,2);.  i
2ad90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ada0 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c   ){.    pC->null
2adb0 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Row = 0;.    p->
2adc0 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35  aCounter[pOp->p5
2add0 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ]++;.#ifdef SQLI
2ade0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
2adf0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
2ae00 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 67  ++;.#endif.    g
2ae10 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61  oto jump_to_p2_a
2ae20 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  nd_check_for_int
2ae30 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 69 66  errupt;.  }.  if
2ae40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
2ae50 45 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  E ) goto abort_d
2ae60 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72  ue_to_error;.  r
2ae70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ae80 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
2ae90 3b 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  ;.  goto check_f
2aea0 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
2aeb0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49  ./* Opcode: IdxI
2aec0 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50  nsert P1 P2 P3 P
2aed0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2aee0 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a  : key=r[P2].**.*
2aef0 2a 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f  * Register P2 ho
2af00 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  lds an SQL index
2af10 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20   key made using 
2af20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72  the.** MakeRecor
2af30 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  d instructions. 
2af40 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69   This opcode wri
2af50 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20  tes that key.** 
2af60 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50  into the index P
2af70 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65  1.  Data for the
2af80 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a   entry is nil..*
2af90 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
2afa0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  t zero, then it 
2afb0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2afc0 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 75   values in the u
2afd0 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f  npacked.** key o
2afe0 66 20 72 65 67 28 50 32 29 2e 20 20 49 6e 20 74  f reg(P2).  In t
2aff0 68 61 74 20 63 61 73 65 2c 20 50 33 20 69 73 20  hat case, P3 is 
2b000 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2b010 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 0a   first register.
2b020 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e 70 61 63  ** for the unpac
2b030 6b 65 64 20 6b 65 79 2e 20 20 54 68 65 20 61 76  ked key.  The av
2b040 61 69 6c 61 62 69 6c 69 74 79 20 6f 66 20 74 68  ailability of th
2b050 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 63  e unpacked key c
2b060 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  an sometimes.** 
2b070 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  be an optimizati
2b080 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  on..**.** If P5 
2b090 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 41  has the OPFLAG_A
2b0a0 50 50 45 4e 44 20 62 69 74 20 73 65 74 2c 20 74  PPEND bit set, t
2b0b0 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
2b0c0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
2b0d0 72 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  r.** that this i
2b0e0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
2b0f0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
2b100 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73  .**.** If P5 has
2b110 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
2b120 4e 47 45 20 62 69 74 20 73 65 74 2c 20 74 68 65  NGE bit set, the
2b130 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  n the change cou
2b140 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65  nter is.** incre
2b150 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 69  mented by this i
2b160 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
2b170 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
2b180 47 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c  GE bit is clear,
2b190 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61  .** then the cha
2b1a0 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75  nge counter is u
2b1b0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
2b1c0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
2b1d0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
2b1e0 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74   of P5 is set, t
2b1f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2b200 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66  n might.** run f
2b210 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
2b220 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  g an unnecessary
2b230 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20   seek on cursor 
2b240 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  P1.  However,.**
2b250 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
2b260 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d  EEKRESULT flag m
2b270 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  ust only be set 
2b280 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
2b290 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73  en no prior.** s
2b2a0 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73  eeks on the curs
2b2b0 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73  or or if the mos
2b2c0 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73  t recent seek us
2b2d0 65 64 20 61 20 6b 65 79 20 65 71 75 69 76 61 6c  ed a key equival
2b2e0 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a  ent.** to P2. .*
2b2f0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
2b300 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
2b310 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54   for indices.  T
2b320 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
2b330 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
2b340 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e   tables is OP_In
2b350 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sert..*/./* Opco
2b360 64 65 3a 20 53 6f 72 74 65 72 49 6e 73 65 72 74  de: SorterInsert
2b370 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2b380 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2b390 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  P2].**.** Regist
2b3a0 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53  er P2 holds an S
2b3b0 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64  QL index key mad
2b3c0 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d  e using the.** M
2b3d0 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
2b3e0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70  ctions.  This op
2b3f0 63 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74  code writes that
2b400 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65   key.** into the
2b410 20 73 6f 72 74 65 72 20 50 31 2e 20 20 44 61 74   sorter P1.  Dat
2b420 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  a for the entry 
2b430 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20  is nil..*/.case 
2b440 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
2b450 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
2b460 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65  .case OP_IdxInse
2b470 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
2b480 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in2 */.  VdbeCur
2b490 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 72 65 65  sor *pC;.  Btree
2b4a0 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20 20 61 73  Payload x;..  as
2b4b0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2b4c0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2b4d0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2b4e0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2b4f0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2b500 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2b510 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 28   isSorter(pC)==(
2b520 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2b530 53 6f 72 74 65 72 49 6e 73 65 72 74 29 20 29 3b  SorterInsert) );
2b540 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
2b550 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
2b560 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20  rt( pIn2->flags 
2b570 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
2b580 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
2b590 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
2b5a0 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 61  ->nChange++;.  a
2b5b0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2b5c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2b5d0 45 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  EE || pOp->opcod
2b5e0 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2b5f0 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rt );.  assert( 
2b600 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
2b610 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42  ;.  rc = ExpandB
2b620 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 69 66 28  lob(pIn2);.  if(
2b630 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2b640 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2b650 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2b660 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  ==OP_SorterInser
2b670 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
2b680 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57  lite3VdbeSorterW
2b690 72 69 74 65 28 70 43 2c 20 70 49 6e 32 29 3b 0a  rite(pC, pIn2);.
2b6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e    }else{.    x.n
2b6b0 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20  Key = pIn2->n;. 
2b6c0 20 20 20 78 2e 70 4b 65 79 20 3d 20 70 49 6e 32     x.pKey = pIn2
2b6d0 2d 3e 7a 3b 0a 20 20 20 20 78 2e 61 4d 65 6d 20  ->z;.    x.aMem 
2b6e0 3d 20 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33  = aMem + pOp->p3
2b6f0 3b 0a 20 20 20 20 78 2e 6e 4d 65 6d 20 3d 20 28  ;.    x.nMem = (
2b700 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
2b710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b720 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75  treeInsert(pC->u
2b730 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20  c.pCursor, &x,. 
2b740 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35          (pOp->p5
2b750 20 26 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e   & (OPFLAG_APPEN
2b760 44 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  D|OPFLAG_SAVEPOS
2b770 49 54 49 4f 4e 29 29 2c 20 0a 20 20 20 20 20 20  ITION)), .      
2b780 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
2b790 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
2b7a0 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
2b7b0 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
2b7c0 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
2b7d0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2b7e0 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43  eto==0 );.    pC
2b7f0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
2b800 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
2b810 0a 20 20 69 66 28 20 72 63 29 20 67 6f 74 6f 20  .  if( rc) goto 
2b820 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2b830 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
2b840 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65  /* Opcode: IdxDe
2b850 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 2a 20  lete P1 P2 P3 * 
2b860 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
2b870 65 79 3d 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a  ey=r[P2@P3].**.*
2b880 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2b890 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
2b8a0 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
2b8b0 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
2b8c0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2b8d0 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
2b8e0 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
2b8f0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
2b900 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
2b910 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
2b920 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
2b930 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
2b940 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
2b950 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
2b960 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
2b970 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
2b980 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
2b990 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2b9a0 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
2b9b0 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
2b9c0 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
2b9d0 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
2b9e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2b9f0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2ba00 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2ba10 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2ba20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2ba30 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2ba40 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2ba50 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73  _BTREE );.  pCrs
2ba60 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
2ba70 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  or;.  assert( pC
2ba80 72 73 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rsr!=0 );.  asse
2ba90 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29  rt( pOp->p5==0 )
2baa0 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d  ;.  r.pKeyInfo =
2bab0 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
2bac0 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
2bad0 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65  )pOp->p3;.  r.de
2bae0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
2baf0 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  r.aMem = &aMem[p
2bb00 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20  Op->p2];.  rc = 
2bb10 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2bb20 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72  toUnpacked(pCrsr
2bb30 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73  , &r, 0, 0, &res
2bb40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2bb50 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2bb60 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2bb70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2bb80 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2bb90 74 65 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f  te(pCrsr, BTREE_
2bba0 41 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20  AUXDELETE);.    
2bbb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2bbc0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2bbd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2bbe0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
2bbf0 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63  to==0 );.  pC->c
2bc00 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2bc10 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e  HE_STALE;.  pC->
2bc20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a  seekResult = 0;.
2bc30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2bc40 70 63 6f 64 65 3a 20 44 65 66 65 72 72 65 64 53  pcode: DeferredS
2bc50 65 65 6b 20 50 31 20 2a 20 50 33 20 50 34 20 2a  eek P1 * P3 P4 *
2bc60 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f  .** Synopsis: Mo
2bc70 76 65 20 50 33 20 74 6f 20 50 31 2e 72 6f 77 69  ve P3 to P1.rowi
2bc80 64 20 69 66 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a  d if needed.**.*
2bc90 2a 20 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20  * P1 is an open 
2bca0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64  index cursor and
2bcb0 20 50 33 20 69 73 20 61 20 63 75 72 73 6f 72 20   P3 is a cursor 
2bcc0 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
2bcd0 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  ding.** table.  
2bce0 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  This opcode does
2bcf0 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65 6b   a deferred seek
2bd00 20 6f 66 20 74 68 65 20 50 33 20 74 61 62 6c 65   of the P3 table
2bd10 20 63 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68   cursor.** to th
2bd20 65 20 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65  e row that corre
2bd30 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75  sponds to the cu
2bd40 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e  rrent row of P1.
2bd50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
2bd60 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20   deferred seek. 
2bd70 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c   Nothing actuall
2bd80 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a  y happens until.
2bd90 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
2bda0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
2bdb0 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61  record.  That wa
2bdc0 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a  y, if no reads.*
2bdd0 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65  * occur, no unne
2bde0 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70  cessary I/O happ
2bdf0 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61  ens..**.** P4 ma
2be00 79 20 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66  y be an array of
2be10 20 69 6e 74 65 67 65 72 73 20 28 74 79 70 65 20   integers (type 
2be20 50 34 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e  P4_INTARRAY) con
2be30 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
2be40 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f  ntry for each co
2be50 6c 75 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74  lumn in the P3 t
2be60 61 62 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20  able.  If array 
2be70 65 6e 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73  entry a(i).** is
2be80 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2be90 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  reading column a
2bea0 28 69 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f  (i)-1 from curso
2beb0 72 20 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69  r P3 is .** equi
2bec0 76 61 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72  valent to perfor
2bed0 6d 69 6e 67 20 74 68 65 20 64 65 66 65 72 72 65  ming the deferre
2bee0 64 20 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20  d seek and then 
2bef0 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  reading column i
2bf00 20 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54   .** from P1.  T
2bf10 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2bf20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20  is stored in P3 
2bf30 61 6e 64 20 75 73 65 64 20 74 6f 20 72 65 64 69  and used to redi
2bf40 72 65 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67  rect.** reads ag
2bf50 61 69 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f  ainst P3 over to
2bf60 20 50 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62   P1, thus possib
2bf70 6c 79 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20  ly avoiding the 
2bf80 6e 65 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20  need to.** seek 
2bf90 61 6e 64 20 72 65 61 64 20 63 75 72 73 6f 72 20  and read cursor 
2bfa0 50 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  P3..*/./* Opcode
2bfb0 3a 20 49 64 78 52 6f 77 69 64 20 50 31 20 50 32  : IdxRowid P1 P2
2bfc0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
2bfd0 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a  is: r[P2]=rowid.
2bfe0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  **.** Write into
2bff0 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20   register P2 an 
2c000 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
2c010 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2c020 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61 74  in the record at
2c030 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
2c040 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69  he index key poi
2c050 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f  nted to by curso
2c060 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65  r P1.  This inte
2c070 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  ger should be.**
2c080 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
2c090 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f  e table entry to
2c0a0 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64 65   which this inde
2c0b0 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a  x entry points..
2c0c0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2c0d0 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72  Rowid, MakeRecor
2c0e0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  d..*/.case OP_De
2c0f0 66 65 72 72 65 64 53 65 65 6b 3a 0a 63 61 73 65  ferredSeek:.case
2c100 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20   OP_IdxRowid: { 
2c110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
2c120 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  2 */.  VdbeCurso
2c130 72 20 2a 70 43 3b 20 20 20 20 20 20 20 20 20 20  r *pC;          
2c140 20 20 20 2f 2a 20 54 68 65 20 50 31 20 69 6e 64     /* The P1 ind
2c150 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56  ex cursor */.  V
2c160 64 62 65 43 75 72 73 6f 72 20 2a 70 54 61 62 43  dbeCursor *pTabC
2c170 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ur;        /* Th
2c180 65 20 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f  e P2 table curso
2c190 72 20 28 4f 50 5f 44 65 66 65 72 72 65 64 53 65  r (OP_DeferredSe
2c1a0 65 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36  ek only) */.  i6
2c1b0 34 20 72 6f 77 69 64 3b 20 20 20 20 20 20 20 20  4 rowid;        
2c1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2c1d0 69 64 20 74 68 61 74 20 50 31 20 63 75 72 72 65  id that P1 curre
2c1e0 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  nt points to */.
2c1f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2c200 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2c210 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
2c220 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
2c230 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2c240 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
2c250 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2c260 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2c270 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
2c280 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
2c290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c2a0 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
2c2b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
2c2c0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
2c2d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 43  );.  assert( !pC
2c2e0 2d 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70  ->nullRow || pOp
2c2f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2c300 52 6f 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54  Rowid );..  /* T
2c310 68 65 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20  he IdxRowid and 
2c320 53 65 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65  Seek opcodes are
2c330 20 63 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73   combined becaus
2c340 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61  e of the commona
2c350 6c 69 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c  lity.  ** of sql
2c360 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
2c370 73 74 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69  store() and sqli
2c380 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
2c390 29 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  ). */.  rc = sql
2c3a0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
2c3b0 73 74 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a  store(pC);..  /*
2c3c0 20 73 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f   sqlite3VbeCurso
2c3d0 72 52 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f  rRestore() can o
2c3e0 6e 6c 79 20 66 61 69 6c 20 69 66 20 74 68 65 20  nly fail if the 
2c3f0 72 65 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20  record has been 
2c400 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74  deleted.  ** out
2c410 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
2c420 63 75 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69  cursor.  That wi
2c430 6c 6c 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73  ll never happens
2c440 20 66 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64   for an IdxRowid
2c450 0a 20 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70  .  ** or Seek op
2c460 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45  code */.  if( NE
2c470 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  VER(rc!=SQLITE_O
2c480 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  K) ) goto abort_
2c490 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
2c4a0 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f   if( !pC->nullRo
2c4b0 77 20 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d  w ){.    rowid =
2c4c0 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
2c4d0 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74  ed.  Only used t
2c4e0 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e  o silence a warn
2c4f0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
2c500 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
2c510 6f 77 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e  owid(db, pC->uc.
2c520 70 43 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29  pCursor, &rowid)
2c530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c550 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2c560 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
2c570 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2c580 6f 64 65 3d 3d 4f 50 5f 44 65 66 65 72 72 65 64  ode==OP_Deferred
2c590 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20 61 73  Seek ){.      as
2c5a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30  sert( pOp->p3>=0
2c5b0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e   && pOp->p3<p->n
2c5c0 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
2c5d0 70 54 61 62 43 75 72 20 3d 20 70 2d 3e 61 70 43  pTabCur = p->apC
2c5e0 73 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  sr[pOp->p3];.   
2c5f0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43     assert( pTabC
2c600 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ur!=0 );.      a
2c610 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e  ssert( pTabCur->
2c620 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
2c630 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  E_BTREE );.     
2c640 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2c650 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
2c660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c670 20 70 54 61 62 43 75 72 2d 3e 69 73 54 61 62 6c   pTabCur->isTabl
2c680 65 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43  e );.      pTabC
2c690 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  ur->nullRow = 0;
2c6a0 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e  .      pTabCur->
2c6b0 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 72  movetoTarget = r
2c6c0 6f 77 69 64 3b 0a 20 20 20 20 20 20 70 54 61 62  owid;.      pTab
2c6d0 43 75 72 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  Cur->deferredMov
2c6e0 65 74 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  eto = 1;.      a
2c6f0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
2c700 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20  pe==P4_INTARRAY 
2c710 7c 7c 20 70 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30  || pOp->p4.ai==0
2c720 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75   );.      pTabCu
2c730 72 2d 3e 61 41 6c 74 4d 61 70 20 3d 20 70 4f 70  r->aAltMap = pOp
2c740 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 70  ->p4.ai;.      p
2c750 54 61 62 43 75 72 2d 3e 70 41 6c 74 43 75 72 73  TabCur->pAltCurs
2c760 6f 72 20 3d 20 70 43 3b 0a 20 20 20 20 7d 65 6c  or = pC;.    }el
2c770 73 65 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d  se{.      pOut =
2c780 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
2c790 70 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 70  p, pOp);.      p
2c7a0 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64  Out->u.i = rowid
2c7b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2c7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2c7d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2c7e0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Rowid );.    sql
2c7f0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
2c800 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  ll(&aMem[pOp->p2
2c810 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ]);.  }.  break;
2c820 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2c830 64 78 47 45 20 50 31 20 50 32 20 50 33 20 50 34  dxGE P1 P2 P3 P4
2c840 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
2c850 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
2c860 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
2c870 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
2c880 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
2c890 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
2c8a0 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
2c8b0 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41   omits the PRIMA
2c8c0 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65  RY KEY.  Compare
2c8d0 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
2c8e0 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
2c8f0 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73  x .** that P1 is
2c900 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2c910 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
2c920 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2c930 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69   or ROWID .** fi
2c940 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e  elds at the end.
2c950 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31  .**.** If the P1
2c960 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20   index entry is 
2c970 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
2c980 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
2c990 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a   value.** then j
2c9a0 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65  ump to P2.  Othe
2c9b0 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75  rwise fall throu
2c9c0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
2c9d0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f  nstruction..*/./
2c9e0 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20  * Opcode: IdxGT 
2c9f0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
2ca00 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
2ca10 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54  r[P3@P4].**.** T
2ca20 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76  he P4 register v
2ca30 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  alues beginning 
2ca40 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20  with P3 form an 
2ca50 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a  unpacked index .
2ca60 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74  ** key that omit
2ca70 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
2ca80 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73  Y.  Compare this
2ca90 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e   key value again
2caa0 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  st the index .**
2cab0 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72 72   that P1 is curr
2cac0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
2cad0 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20  o, ignoring the 
2cae0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52  PRIMARY KEY or R
2caf0 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20  OWID .** fields 
2cb00 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
2cb10 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2cb20 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61 74  x entry is great
2cb30 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  er than the key 
2cb40 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
2cb50 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
2cb60 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
2cb70 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2cb80 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  struction..*/./*
2cb90 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54 20 50   Opcode: IdxLT P
2cba0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
2cbb0 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
2cbc0 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68  [P3@P4].**.** Th
2cbd0 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
2cbe0 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
2cbf0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
2cc00 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
2cc10 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
2cc20 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2cc30 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70   or ROWID.  Comp
2cc40 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c  are this key val
2cc50 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  ue against.** th
2cc60 65 20 69 6e 64 65 78 20 74 68 61 74 20 50 31 20  e index that P1 
2cc70 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2cc80 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2cc90 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2cca0 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f  EY or.** ROWID o
2ccb0 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
2ccc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
2ccd0 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c  index entry is l
2cce0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ess than the key
2ccf0 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70   value then jump
2cd00 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72   to P2..** Other
2cd10 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
2cd20 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2cd30 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  struction..*/./*
2cd40 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 45 20 50   Opcode: IdxLE P
2cd50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
2cd60 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
2cd70 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68  [P3@P4].**.** Th
2cd80 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
2cd90 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
2cda0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
2cdb0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
2cdc0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
2cdd0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2cde0 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70   or ROWID.  Comp
2cdf0 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c  are this key val
2ce00 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  ue against.** th
2ce10 65 20 69 6e 64 65 78 20 74 68 61 74 20 50 31 20  e index that P1 
2ce20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2ce30 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2ce40 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2ce50 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f  EY or.** ROWID o
2ce60 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
2ce70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
2ce80 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c  index entry is l
2ce90 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2cea0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
2ceb0 75 65 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20  ue then jump.** 
2cec0 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  to P2. Otherwise
2ced0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2cee0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2cef0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
2cf00 50 5f 49 64 78 4c 45 3a 20 20 20 20 20 20 20 20  P_IdxLE:        
2cf10 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
2cf20 65 20 4f 50 5f 49 64 78 47 54 3a 20 20 20 20 20  e OP_IdxGT:     
2cf30 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
2cf40 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20 20  case OP_IdxLT:  
2cf50 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2cf60 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 45  */.case OP_IdxGE
2cf70 3a 20 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75  :  {       /* ju
2cf80 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  mp */.  VdbeCurs
2cf90 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65  or *pC;.  int re
2cfa0 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  s;.  UnpackedRec
2cfb0 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74  ord r;..  assert
2cfc0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2cfd0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
2cfe0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
2cff0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2d000 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2d010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2d020 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20  >isOrdered );.  
2d030 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2d040 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2d050 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
2d060 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
2d070 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  =0);.  assert( p
2d080 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2d090 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
2d0a0 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20  ( pOp->p5==0 || 
2d0b0 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20  pOp->p5==1 );.  
2d0c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
2d0d0 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
2d0e0 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  .  r.pKeyInfo = 
2d0f0 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  pC->pKeyInfo;.  
2d100 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
2d110 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 69 66 28  pOp->p4.i;.  if(
2d120 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f   pOp->opcode<OP_
2d130 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 61 73 73  IdxLT ){.    ass
2d140 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2d150 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f  ==OP_IdxLE || pO
2d160 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2d170 78 47 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66  xGT );.    r.def
2d180 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20  ault_rc = -1;.  
2d190 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2d1a0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
2d1b0 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d  OP_IdxGE || pOp-
2d1c0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  >opcode==OP_IdxL
2d1d0 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75  T );.    r.defau
2d1e0 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  lt_rc = 0;.  }. 
2d1f0 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b   r.aMem = &aMem[
2d200 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66  pOp->p3];.#ifdef
2d210 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2d220 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
2d230 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
2d240 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
2d250 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
2d260 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
2d270 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  res = 0;  /* Not
2d280 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
2d290 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
2d2a0 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72   warning. */.  r
2d2b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
2d2c0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 64 62 2c  dxKeyCompare(db,
2d2d0 20 70 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a   pC, &r, &res);.
2d2e0 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f 49 64    assert( (OP_Id
2d2f0 78 4c 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c  xLE&1)==(OP_IdxL
2d300 54 26 31 29 20 26 26 20 28 4f 50 5f 49 64 78 47  T&1) && (OP_IdxG
2d310 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 47 54 26  E&1)==(OP_IdxGT&
2d320 31 29 20 29 3b 0a 20 20 69 66 28 20 28 70 4f 70  1) );.  if( (pOp
2d330 2d 3e 6f 70 63 6f 64 65 26 31 29 3d 3d 28 4f 50  ->opcode&1)==(OP
2d340 5f 49 64 78 4c 54 26 31 29 20 29 7b 0a 20 20 20  _IdxLT&1) ){.   
2d350 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2d360 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c  code==OP_IdxLE |
2d370 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2d380 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72  P_IdxLT );.    r
2d390 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 7d 65 6c  es = -res;.  }el
2d3a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2d3b0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2d3c0 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  IdxGE || pOp->op
2d3d0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
2d3e0 3b 0a 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 7d  ;.    res++;.  }
2d3f0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
2d400 65 6e 28 72 65 73 3e 30 2c 32 29 3b 0a 20 20 69  en(res>0,2);.  i
2d410 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2d420 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2d430 0a 20 20 69 66 28 20 72 65 73 3e 30 20 29 20 67  .  if( res>0 ) g
2d440 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
2d450 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2d460 70 63 6f 64 65 3a 20 44 65 73 74 72 6f 79 20 50  pcode: Destroy P
2d470 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
2d480 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
2d490 72 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  re database tabl
2d4a0 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65  e or index whose
2d4b0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2d4c0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
2d4d0 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 50  le is given by P
2d4e0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  1..**.** The tab
2d4f0 6c 65 20 62 65 69 6e 67 20 64 65 73 74 72 6f 79  le being destroy
2d500 65 64 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69  ed is in the mai
2d510 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2d520 69 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a  if P3==0.  If.**
2d530 20 50 33 3d 3d 31 20 74 68 65 6e 20 74 68 65 20   P3==1 then the 
2d540 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61  table to be clea
2d550 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69  r is in the auxi
2d560 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
2d570 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75  ile.** that is u
2d580 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62  sed to store tab
2d590 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67  les create using
2d5a0 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52   CREATE TEMPORAR
2d5b0 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49  Y TABLE..**.** I
2d5c0 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2d5d0 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 69 74 20  enabled then it 
2d5e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
2d5f0 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20 70 61   another root pa
2d600 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d  ge.** might be m
2d610 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 6e 65  oved into the ne
2d620 77 6c 79 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  wly deleted root
2d630 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74   page in order t
2d640 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f  o keep all.** ro
2d650 6f 74 20 70 61 67 65 73 20 63 6f 6e 74 69 67 75  ot pages contigu
2d660 6f 75 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ous at the begin
2d670 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2d680 62 61 73 65 2e 20 20 54 68 65 20 66 6f 72 6d 65  base.  The forme
2d690 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  r.** value of th
2d6a0 65 20 72 6f 6f 74 20 70 61 67 65 20 74 68 61 74  e root page that
2d6b0 20 6d 6f 76 65 64 20 2d 20 69 74 73 20 76 61 6c   moved - its val
2d6c0 75 65 20 62 65 66 6f 72 65 20 74 68 65 20 6d 6f  ue before the mo
2d6d0 76 65 20 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a  ve occurred -.**
2d6e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
2d6f0 67 69 73 74 65 72 20 50 32 2e 20 49 66 20 6e 6f  gister P2. If no
2d700 20 70 61 67 65 20 6d 6f 76 65 6d 65 6e 74 20 77   page movement w
2d710 61 73 20 72 65 71 75 69 72 65 64 20 28 62 65 63  as required (bec
2d720 61 75 73 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  ause the.** tabl
2d730 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
2d740 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 20  was already the 
2d750 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20  last one in the 
2d760 64 61 74 61 62 61 73 65 29 20 74 68 65 6e 20 61  database) then a
2d770 20 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 73 74 6f   .** zero is sto
2d780 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
2d790 50 32 2e 20 20 49 66 20 41 55 54 4f 56 41 43 55  P2.  If AUTOVACU
2d7a0 55 4d 20 69 73 20 64 69 73 61 62 6c 65 64 20 74  UM is disabled t
2d7b0 68 65 6e 20 61 20 7a 65 72 6f 20 0a 2a 2a 20 69  hen a zero .** i
2d7c0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
2d7d0 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
2d7e0 68 69 73 20 6f 70 63 6f 64 65 20 74 68 72 6f 77  his opcode throw
2d7f0 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
2d800 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69  ere are any acti
2d810 76 65 20 72 65 61 64 65 72 20 56 4d 73 20 77 68  ve reader VMs wh
2d820 65 6e 0a 2a 2a 20 69 74 20 69 73 20 69 6e 76 6f  en.** it is invo
2d830 6b 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ked. This is don
2d840 65 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 64  e to avoid the d
2d850 69 66 66 69 63 75 6c 74 79 20 61 73 73 6f 63 69  ifficulty associ
2d860 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 75 70  ated with .** up
2d870 64 61 74 69 6e 67 20 65 78 69 73 74 69 6e 67 20  dating existing 
2d880 63 75 72 73 6f 72 73 20 77 68 65 6e 20 61 20 72  cursors when a r
2d890 6f 6f 74 20 70 61 67 65 20 69 73 20 6d 6f 76 65  oot page is move
2d8a0 64 20 69 6e 20 61 6e 20 41 55 54 4f 56 41 43 55  d in an AUTOVACU
2d8b0 55 4d 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  UM .** database.
2d8c0 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20 74   This error is t
2d8d0 68 72 6f 77 6e 20 65 76 65 6e 20 69 66 20 74 68  hrown even if th
2d8e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
2d8f0 74 20 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20  t an AUTOVACUUM 
2d900 0a 2a 2a 20 64 62 20 69 6e 20 6f 72 64 65 72 20  .** db in order 
2d910 74 6f 20 61 76 6f 69 64 20 69 6e 74 72 6f 64 75  to avoid introdu
2d920 63 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  cing an incompat
2d930 69 62 69 6c 69 74 79 20 62 65 74 77 65 65 6e 20  ibility between 
2d940 61 75 74 6f 76 61 63 75 75 6d 20 0a 2a 2a 20 61  autovacuum .** a
2d950 6e 64 20 6e 6f 6e 2d 61 75 74 6f 76 61 63 75 75  nd non-autovacuu
2d960 6d 20 6d 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  m modes..**.** S
2d970 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a  ee also: Clear.*
2d980 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73 74 72 6f  /.case OP_Destro
2d990 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32  y: {     /* out2
2d9a0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64   */.  int iMoved
2d9b0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
2d9c0 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
2d9d0 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
2d9e0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 31 20 29 3b  rt( pOp->p1>1 );
2d9f0 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
2da00 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
2da10 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
2da20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66  = MEM_Null;.  if
2da30 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ( db->nVdbeRead 
2da40 3e 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b  > db->nVDestroy+
2da50 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
2da60 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
2da70 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
2da80 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
2da90 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2daa0 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  o_error;.  }else
2dab0 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d  {.    iDb = pOp-
2dac0 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >p3;.    assert(
2dad0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
2dae0 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29  treeMask, iDb) )
2daf0 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20 3d 20 30  ;.    iMoved = 0
2db00 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
2db10 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c 65 6e  .  Only to silen
2db20 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f  ce a warning. */
2db30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2db40 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
2db50 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
2db60 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76  , pOp->p1, &iMov
2db70 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ed);.    pOut->f
2db80 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
2db90 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
2dba0 69 4d 6f 76 65 64 3b 0a 20 20 20 20 69 66 28 20  iMoved;.    if( 
2dbb0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2dbc0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 69  due_to_error;.#i
2dbd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2dbe0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2dbf0 20 69 66 28 20 69 4d 6f 76 65 64 21 3d 30 20 29   if( iMoved!=0 )
2dc00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
2dc10 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64 62 2c  ootPageMoved(db,
2dc20 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70 4f   iDb, iMoved, pO
2dc30 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f 2a  p->p1);.      /*
2dc40 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20   All OP_Destroy 
2dc50 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
2dc60 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
2dc70 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  ee */.      asse
2dc80 72 74 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f  rt( resetSchemaO
2dc90 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65 73  nFault==0 || res
2dca0 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d  etSchemaOnFault=
2dcb0 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20 20 20  =iDb+1 );.      
2dcc0 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
2dcd0 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20 20  lt = iDb+1;.    
2dce0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
2dcf0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2dd00 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50 32 20  de: Clear P1 P2 
2dd10 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  P3.**.** Delete 
2dd20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  all contents of 
2dd30 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
2dd40 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
2dd50 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
2dd60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2dd70 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
2dd80 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65  P1.  But, unlike
2dd90 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74   Destroy, do not
2dda0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 74  .** remove the t
2ddb0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72  able or index fr
2ddc0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ddd0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2dde0 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61  table being clea
2ddf0 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  r is in the main
2de00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2de10 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20  f P2==0.  If.** 
2de20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74  P2==1 then the t
2de30 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72  able to be clear
2de40 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c   is in the auxil
2de50 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2de60 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73  le.** that is us
2de70 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c  ed to store tabl
2de80 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67 20  es create using 
2de90 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59  CREATE TEMPORARY
2dea0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66   TABLE..**.** If
2deb0 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 69 73   the P3 value is
2dec0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2ded0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
2dee0 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20 61 6e  ed to must be an
2def0 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  .** intkey table
2df00 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c 20   (an SQL table, 
2df10 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e 20 49  not an index). I
2df20 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2df30 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63  row change .** c
2df40 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  ount is incremen
2df50 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2df60 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2df70 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
2df80 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33 20  ared. .** If P3 
2df90 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2dfa0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 76  zero, then the v
2dfb0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 72  alue stored in r
2dfc0 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a  egister P3 is.**
2dfd0 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74 65   also incremente
2dfe0 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2dff0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2e000 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
2e010 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
2e020 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a 63  so: Destroy.*/.c
2e030 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a  ase OP_Clear: {.
2e040 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20    int nChange;. 
2e050 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  .  nChange = 0;.
2e060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2e070 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
2e080 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
2e090 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
2e0a0 4f 70 2d 3e 70 32 29 20 29 3b 0a 20 20 72 63 20  Op->p2) );.  rc 
2e0b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2e0c0 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20  earTable(.      
2e0d0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d  db->aDb[pOp->p2]
2e0e0 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28  .pBt, pOp->p1, (
2e0f0 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e  pOp->p3 ? &nChan
2e100 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69  ge : 0).  );.  i
2e110 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20  f( pOp->p3 ){.  
2e120 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20    p->nChange += 
2e130 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28  nChange;.    if(
2e140 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20   pOp->p3>0 ){.  
2e150 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
2e160 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
2e170 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p3]) );.      
2e180 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
2e190 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
2e1a0 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b  3]);.      aMem[
2e1b0 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20  pOp->p3].u.i += 
2e1c0 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20  nChange;.    }. 
2e1d0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
2e1e0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2e1f0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
2e200 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
2e210 73 65 74 53 6f 72 74 65 72 20 50 31 20 2a 20 2a  setSorter P1 * *
2e220 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74   * *.**.** Delet
2e230 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 66  e all contents f
2e240 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65 72 61  rom the ephemera
2e250 6c 20 74 61 62 6c 65 20 6f 72 20 73 6f 72 74 65  l table or sorte
2e260 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6f 70 65  r.** that is ope
2e270 6e 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 0a  n on cursor P1..
2e280 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
2e290 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  e only works for
2e2a0 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 66 6f   cursors used fo
2e2b0 72 20 73 6f 72 74 69 6e 67 20 61 6e 64 0a 2a 2a  r sorting and.**
2e2c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 4f 50 5f   opened with OP_
2e2d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 72  OpenEphemeral or
2e2e0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2e 0a   OP_SorterOpen..
2e2f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
2e300 53 6f 72 74 65 72 3a 20 7b 0a 20 20 56 64 62 65  Sorter: {.  Vdbe
2e310 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 0a 20 20  Cursor *pC;. .  
2e320 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2e330 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2e340 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2e350 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2e360 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2e370 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  pC!=0 );.  if( i
2e380 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
2e390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
2e3a0 72 74 65 72 52 65 73 65 74 28 64 62 2c 20 70 43  rterReset(db, pC
2e3b0 2d 3e 75 63 2e 70 53 6f 72 74 65 72 29 3b 0a 20  ->uc.pSorter);. 
2e3c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2e3d0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2e3e0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2e3f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e400 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29  C->isEphemeral )
2e410 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e420 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
2e430 65 4f 66 43 75 72 73 6f 72 28 70 43 2d 3e 75 63  eOfCursor(pC->uc
2e440 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  .pCursor);.    i
2e450 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2e460 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2e470 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2e480 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
2e490 74 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20  teTable P1 P2 * 
2e4a0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
2e4b0 20 72 5b 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d   r[P2]=root iDb=
2e4c0 50 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  P1.**.** Allocat
2e4d0 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e  e a new table in
2e4e0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2e4f0 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30  se file if P1==0
2e500 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75   or in the.** au
2e510 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2e520 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f   file if P1==1 o
2e530 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64  r in an attached
2e540 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20   database if.** 
2e550 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65  P1>1.  Write the
2e560 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
2e570 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
2e580 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  le into.** regis
2e590 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65  ter P2.**.** The
2e5a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2e5b0 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20  een a table and 
2e5c0 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69 73  an index is this
2e5d0 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a  :  A table must.
2e5e0 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74 65  ** have a 4-byte
2e5f0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64   integer key and
2e600 20 63 61 6e 20 68 61 76 65 20 61 72 62 69 74 72   can have arbitr
2e610 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e  ary data.  An in
2e620 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72  dex.** has an ar
2e630 62 69 74 72 61 72 79 20 6b 65 79 20 62 75 74 20  bitrary key but 
2e640 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53  no data..**.** S
2e650 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49  ee also: CreateI
2e660 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ndex.*/./* Opcod
2e670 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20 50  e: CreateIndex P
2e680 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
2e690 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f  nopsis: r[P2]=ro
2e6a0 6f 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20  ot iDb=P1.**.** 
2e6b0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69  Allocate a new i
2e6c0 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e  ndex in the main
2e6d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2e6e0 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68  f P1==0 or in th
2e6f0 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  e.** auxiliary d
2e700 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2e710 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61  P1==1 or in an a
2e720 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
2e730 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72   if.** P1>1.  Wr
2e740 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ite the root pag
2e750 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2e760 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a  new table into.*
2e770 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  * register P2..*
2e780 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e  *.** See documen
2e790 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65  tation on OP_Cre
2e7a0 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64  ateTable for add
2e7b0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2e7c0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2e7d0 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20  CreateIndex:    
2e7e0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
2e7f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74  */.case OP_Creat
2e800 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20  eTable: {       
2e810 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
2e820 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  int pgno;.  int 
2e830 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70 44 62  flags;.  Db *pDb
2e840 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
2e850 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2e860 70 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a  p);.  pgno = 0;.
2e870 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2e880 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2e890 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
2e8a0 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
2e8b0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f  p->btreeMask, pO
2e8c0 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 65  p->p1) );.  asse
2e8d0 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
2e8e0 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  =0 );.  pDb = &d
2e8f0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b  b->aDb[pOp->p1];
2e900 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
2e910 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pBt!=0 );.  if( 
2e920 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2e930 43 72 65 61 74 65 54 61 62 6c 65 20 29 7b 0a 20  CreateTable ){. 
2e940 20 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54     /* flags = BT
2e950 52 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20  REE_INTKEY; */. 
2e960 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45     flags = BTREE
2e970 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  _INTKEY;.  }else
2e980 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54  {.    flags = BT
2e990 52 45 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d  REE_BLOBKEY;.  }
2e9a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2e9b0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2e9c0 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c  pDb->pBt, &pgno,
2e9d0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
2e9e0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2e9f0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70  ue_to_error;.  p
2ea00 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b  Out->u.i = pgno;
2ea10 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2ea20 4f 70 63 6f 64 65 3a 20 53 71 6c 45 78 65 63 20  Opcode: SqlExec 
2ea30 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
2ea40 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61   Run the SQL sta
2ea50 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65 6d  tement or statem
2ea60 65 6e 74 73 20 73 70 65 63 69 66 69 65 64 20 69  ents specified i
2ea70 6e 20 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e  n the P4 string.
2ea80 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 71 6c 45  .*/.case OP_SqlE
2ea90 78 65 63 3a 20 7b 0a 20 20 64 62 2d 3e 6e 53 71  xec: {.  db->nSq
2eaa0 6c 45 78 65 63 2b 2b 3b 0a 20 20 72 63 20 3d 20  lExec++;.  rc = 
2eab0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2eac0 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 30 2c 20 30   pOp->p4.z, 0, 0
2ead0 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c  , 0);.  db->nSql
2eae0 45 78 65 63 2d 2d 3b 0a 20 20 69 66 28 20 72 63  Exec--;.  if( rc
2eaf0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2eb00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
2eb10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2eb20 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61 20 50  e: ParseSchema P
2eb30 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2eb40 20 52 65 61 64 20 61 6e 64 20 70 61 72 73 65 20   Read and parse 
2eb50 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  all entries from
2eb60 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
2eb70 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  ER table of data
2eb80 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61 74 20  base P1.** that 
2eb90 6d 61 74 63 68 20 74 68 65 20 57 48 45 52 45 20  match the WHERE 
2eba0 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a  clause P4. .**.*
2ebb0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
2ebc0 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73 65 72  vokes the parser
2ebd0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
2ebe0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2ebf0 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74  ,.** then runs t
2ec00 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d  he new virtual m
2ec10 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74  achine.  It is t
2ec20 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74  hus a re-entrant
2ec30 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
2ec40 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a   OP_ParseSchema:
2ec50 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20   {.  int iDb;.  
2ec60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
2ec70 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  ter;.  char *zSq
2ec80 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e  l;.  InitData in
2ec90 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e  itData;..  /* An
2eca0 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
2ecb0 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b 65  ment that invoke
2ecc0 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69  s this opcode wi
2ecd0 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a  ll hold mutexes.
2ece0 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62 74    ** on every bt
2ecf0 72 65 65 2e 20 20 54 68 69 73 20 69 73 20 61 20  ree.  This is a 
2ed00 70 72 65 72 65 71 75 69 73 69 74 65 20 66 6f 72  prerequisite for
2ed10 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20   invoking .  ** 
2ed20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62  sqlite3InitCallb
2ed30 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64  ack()..  */.#ifd
2ed40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ed50 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
2ed60 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
2ed70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
2ed80 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42  b==1 || sqlite3B
2ed90 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64  treeHoldsMutex(d
2eda0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29  b->aDb[iDb].pBt)
2edb0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
2edc0 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b    iDb = pOp->p1;
2edd0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
2ede0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
2edf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
2ee00 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
2ee10 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  iDb, DB_SchemaLo
2ee20 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73  aded) );.  /* Us
2ee30 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69  ed to be a condi
2ee40 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20  tional */ {.    
2ee50 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54 45 52  zMaster = MASTER
2ee60 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69 74 44  _NAME;.    initD
2ee70 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ata.db = db;.   
2ee80 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20   initData.iDb = 
2ee90 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69  pOp->p1;.    ini
2eea0 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d  tData.pzErrMsg =
2eeb0 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20   &p->zErrMsg;.  
2eec0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2eed0 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20 20  MPrintf(db,.    
2eee0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
2eef0 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46   rootpage, sql F
2ef00 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45 52  ROM '%q'.%s WHER
2ef10 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
2ef20 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  wid",.       db-
2ef30 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
2ef40 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70  me, zMaster, pOp
2ef50 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2ef60 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2ef70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ef80 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
2ef90 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2efa0 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
2efb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  ==0 );.      db-
2efc0 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a  >init.busy = 1;.
2efd0 20 20 20 20 20 20 69 6e 69 74 44 61 74 61 2e 72        initData.r
2efe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2eff0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
2f000 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2f010 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2f020 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
2f030 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43  ql, sqlite3InitC
2f040 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61  allback, &initDa
2f050 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ta, 0);.      if
2f060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f070 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e  ) rc = initData.
2f080 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
2f090 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 7a 53  3DbFreeNN(db, zS
2f0a0 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ql);.      db->i
2f0b0 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20  nit.busy = 0;.  
2f0c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2f0d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2f0e0 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
2f0f0 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
2f100 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f110 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
2f120 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
2f130 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62     }.    goto ab
2f140 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2f150 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20  ;.  }.  break;  
2f160 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
2f170 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
2f180 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a  LYZE)./* Opcode:
2f190 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31   LoadAnalysis P1
2f1a0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52   * * * *.**.** R
2f1b0 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ead the sqlite_s
2f1c0 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64  tat1 table for d
2f1d0 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c  atabase P1 and l
2f1e0 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  oad the content.
2f1f0 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
2f200 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e   into the intern
2f210 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  al index hash ta
2f220 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ble.  This will 
2f230 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61  cause.** the ana
2f240 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64  lysis to be used
2f250 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
2f260 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71  all subsequent q
2f270 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  ueries..*/.case 
2f280 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a  OP_LoadAnalysis:
2f290 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
2f2a0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2f2b0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2f2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c  rc = sqlite3Anal
2f2d0 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70  ysisLoad(db, pOp
2f2e0 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20  ->p1);.  if( rc 
2f2f0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2f300 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
2f310 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  ak;  .}.#endif /
2f320 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2f330 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20  E_OMIT_ANALYZE) 
2f340 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  */../* Opcode: D
2f350 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20  ropTable P1 * * 
2f360 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
2f370 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
2f380 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
2f390 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
2f3a0 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
2f3b0 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69  table named P4 i
2f3c0 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
2f3d0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
2f3e0 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20  fter a table.** 
2f3f0 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
2f400 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
2f410 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
2f420 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
2f430 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
2f440 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
2f450 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
2f460 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
2f470 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
2f480 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
2f490 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c  opTable: {.  sql
2f4a0 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2f4b0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70  eteTable(db, pOp
2f4c0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
2f4d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2f4e0 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64   Opcode: DropInd
2f4f0 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  ex P1 * * P4 *.*
2f500 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2f510 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
2f520 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
2f530 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
2f540 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  be.** the index 
2f550 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61  named P4 in data
2f560 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69  base P1.  This i
2f570 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
2f580 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72  n index.** is dr
2f590 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20  opped from disk 
2f5a0 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72  (using the Destr
2f5b0 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e  oy opcode).** in
2f5c0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
2f5d0 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2f5e0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2f5f0 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2f600 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2f610 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2f620 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65  case OP_DropInde
2f630 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e  x: {.  sqlite3Un
2f640 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f650 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ex(db, pOp->p1, 
2f660 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
2f670 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2f680 65 3a 20 44 72 6f 70 54 72 69 67 67 65 72 20 50  e: DropTrigger P
2f690 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2f6a0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
2f6b0 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
2f6c0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2f6d0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
2f6e0 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  * the trigger na
2f6f0 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
2f700 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
2f710 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74  called after a t
2f720 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f  rigger.** is dro
2f730 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28  pped from disk (
2f740 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f  using the Destro
2f750 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64  y opcode) in ord
2f760 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74  er to keep .** t
2f770 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2f780 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2f790 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2f7a0 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2f7b0 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2f7c0 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69 67  case OP_DropTrig
2f7d0 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ger: {.  sqlite3
2f7e0 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
2f7f0 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e  rigger(db, pOp->
2f800 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2f810 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
2f820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f830 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2f840 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
2f850 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50 33  grityCk P1 P2 P3
2f860 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20   P4 P5.**.** Do 
2f870 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  an analysis of t
2f880 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
2f890 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f  n database.  Sto
2f8a0 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  re in.** registe
2f8b0 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66  r P1 the text of
2f8c0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2f8d0 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79  e describing any
2f8e0 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66   problems..** If
2f8f0 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65   no problems are
2f900 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20   found, store a 
2f910 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72  NULL in register
2f920 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   P1..**.** The r
2f930 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
2f940 69 6e 73 20 6f 6e 65 20 6c 65 73 73 20 74 68 61  ins one less tha
2f950 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  n the maximum nu
2f960 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20  mber of allowed 
2f970 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f  errors..** At mo
2f980 73 74 20 72 65 67 28 50 33 29 20 65 72 72 6f 72  st reg(P3) error
2f990 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
2f9a0 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  ed..** In other 
2f9b0 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79  words, the analy
2f9c0 73 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f  sis stops as soo
2f9d0 6e 20 61 73 20 72 65 67 28 50 31 29 20 65 72 72  n as reg(P1) err
2f9e0 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e  ors are .** seen
2f9f0 2e 20 20 52 65 67 28 50 31 29 20 69 73 20 75 70  .  Reg(P1) is up
2fa00 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  dated with the n
2fa10 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2fa20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  remaining..**.**
2fa30 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
2fa40 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61  umbers of all ta
2fa50 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  bles in the data
2fa60 62 61 73 65 20 61 72 65 20 69 6e 74 65 67 65 72  base are integer
2fa70 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50  s.** stored in P
2fa80 34 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75 6d  4_INTARRAY argum
2fa90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  ent..**.** If P5
2faa0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
2fab0 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20  e check is done 
2fac0 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  on the auxiliary
2fad0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2fae0 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20  e, not the main 
2faf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2fb00 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2fb10 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
2fb20 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72  ement the integr
2fb30 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61  ity_check pragma
2fb40 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74  ..*/.case OP_Int
2fb50 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e  egrityCk: {.  in
2fb60 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a  t nRoot;      /*
2fb70 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   Number of table
2fb80 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75  s to check.  (Nu
2fb90 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67  mber of root pag
2fba0 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  es.) */.  int *a
2fbb0 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72  Root;     /* Arr
2fbc0 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e  ay of rootpage n
2fbd0 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65  umbers for table
2fbe0 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20  s to be checked 
2fbf0 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20  */.  int nErr;  
2fc00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fc10 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65  f errors reporte
2fc20 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  d */.  char *z; 
2fc30 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2fc40 66 20 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f  f the error repo
2fc50 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45  rt */.  Mem *pnE
2fc60 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  rr;     /* Regis
2fc70 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63  ter keeping trac
2fc80 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61  k of errors rema
2fc90 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  ining */..  asse
2fca0 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
2fcb0 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f   );.  nRoot = pO
2fcc0 70 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20 3d  p->p2;.  aRoot =
2fcd0 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 61   pOp->p4.ai;.  a
2fce0 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29  ssert( nRoot>0 )
2fcf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f 6f  ;.  assert( aRoo
2fd00 74 5b 6e 52 6f 6f 74 5d 3d 3d 30 20 29 3b 0a 20  t[nRoot]==0 );. 
2fd10 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2fd20 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
2fd30 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
2fd40 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45  Cursor) );.  pnE
2fd50 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  rr = &aMem[pOp->
2fd60 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p3];.  assert( (
2fd70 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d  pnErr->flags & M
2fd80 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
2fd90 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e  assert( (pnErr->
2fda0 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
2fdb0 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29  |MEM_Blob))==0 )
2fdc0 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
2fdd0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2fde0 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d  ert( pOp->p5<db-
2fdf0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
2fe00 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2fe10 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2fe20 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  p5) );.  z = sql
2fe30 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
2fe40 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b  tyCheck(db->aDb[
2fe50 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52  pOp->p5].pBt, aR
2fe60 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20  oot, nRoot,.    
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2fe90 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2b 31 2c 20  t)pnErr->u.i+1, 
2fea0 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &nErr);.  sqlite
2feb0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2fec0 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72  pIn1);.  if( nEr
2fed0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  r==0 ){.    asse
2fee0 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65  rt( z==0 );.  }e
2fef0 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  lse if( z==0 ){.
2ff00 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
2ff10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 6e  .  }else{.    pn
2ff20 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72  Err->u.i -= nErr
2ff30 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -1;.    sqlite3V
2ff40 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e  dbeMemSetStr(pIn
2ff50 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
2ff60 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
2ff70 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  ree);.  }.  UPDA
2ff80 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
2ff90 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
2ffa0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
2ffb0 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  ng(pIn1, encodin
2ffc0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
2ffd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ffe0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2fff0 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  HECK */../* Opco
30000 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31  de: RowSetAdd P1
30010 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
30020 6f 70 73 69 73 3a 20 72 6f 77 73 65 74 28 50 31  opsis: rowset(P1
30030 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e  )=r[P2].**.** In
30040 73 65 72 74 20 74 68 65 20 69 6e 74 65 67 65 72  sert the integer
30050 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72   value held by r
30060 65 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20  egister P2 into 
30070 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 0a  a RowSet object.
30080 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73  ** held in regis
30090 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ter P1..**.** An
300a0 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
300b0 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e   if P2 is not an
300c0 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73   integer..*/.cas
300d0 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20  e OP_RowSetAdd: 
300e0 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20  {       /* in1, 
300f0 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in2 */.  pIn1 = 
30100 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
30110 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
30120 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
30130 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20  t( (pIn2->flags 
30140 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
30150 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
30160 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
30170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
30180 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
30190 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
301a0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
301b0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
301c0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
301d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77    }.  sqlite3Row
301e0 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
301f0 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d  u.pRowSet, pIn2-
30200 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  >u.i);.  break;.
30210 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
30220 77 53 65 74 52 65 61 64 20 50 31 20 50 32 20 50  wSetRead P1 P2 P
30230 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
30240 73 3a 20 72 5b 50 33 5d 3d 72 6f 77 73 65 74 28  s: r[P3]=rowset(
30250 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63  P1).**.** Extrac
30260 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76  t the smallest v
30270 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 52 6f  alue from the Ro
30280 77 53 65 74 20 6f 62 6a 65 63 74 20 69 6e 20 50  wSet object in P
30290 31 0a 2a 2a 20 61 6e 64 20 70 75 74 20 74 68 61  1.** and put tha
302a0 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
302b0 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 4f 72 2c  ister P3..** Or,
302c0 20 69 66 20 52 6f 77 53 65 74 20 6f 62 6a 65 63   if RowSet objec
302d0 74 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c  t P1 is initiall
302e0 79 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50  y empty, leave P
302f0 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  3.** unchanged a
30300 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  nd jump to instr
30310 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61  uction P2..*/.ca
30320 73 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  se OP_RowSetRead
30330 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
30340 70 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a  p, in1, out3 */.
30350 20 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49    i64 val;..  pI
30360 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
30370 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
30380 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
30390 77 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20  wSet)==0 .   || 
303a0 73 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78  sqlite3RowSetNex
303b0 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
303c0 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b  t, &val)==0.  ){
303d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c  .    /* The bool
303e0 65 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70  ean index is emp
303f0 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ty */.    sqlite
30400 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
30410 70 49 6e 31 29 3b 0a 20 20 20 20 56 64 62 65 42  pIn1);.    VdbeB
30420 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
30430 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
30440 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66  o_p2_and_check_f
30450 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20  or_interrupt;.  
30460 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20  }else{.    /* A 
30470 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64  value was pulled
30480 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
30490 2a 2f 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  */.    VdbeBranc
304a0 68 54 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20  hTaken(0,2);.   
304b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
304c0 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f  etInt64(&aMem[pO
304d0 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20  p->p3], val);.  
304e0 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  }.  goto check_f
304f0 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
30500 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53  ./* Opcode: RowS
30510 65 74 54 65 73 74 20 50 31 20 50 32 20 50 33 20  etTest P1 P2 P3 
30520 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P4.** Synopsis: 
30530 69 66 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73  if r[P3] in rows
30540 65 74 28 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a  et(P1) goto P2.*
30550 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  *.** Register P3
30560 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
30570 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74  old a 64-bit int
30580 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72  eger value. If r
30590 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f  egister P1.** co
305a0 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20  ntains a RowSet 
305b0 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
305c0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f  RowSet object co
305d0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
305e0 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20  lue held in P3, 
305f0 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72  jump to register
30600 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
30610 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e  insert the.** in
30620 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f  teger in P3 into
30630 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20   the RowSet and 
30640 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74  continue on to t
30650 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64  he.** next opcod
30660 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77  e..**.** The Row
30670 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  Set object is op
30680 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20  timized for the 
30690 63 61 73 65 20 77 68 65 72 65 20 73 65 74 73 20  case where sets 
306a0 6f 66 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  of integers.** a
306b0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 64  re inserted in d
306c0 69 73 74 69 6e 63 74 20 70 68 61 73 65 73 2c 20  istinct phases, 
306d0 77 68 69 63 68 20 65 61 63 68 20 73 65 74 20 63  which each set c
306e0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69  ontains no dupli
306f0 63 61 74 65 73 2e 0a 2a 2a 20 45 61 63 68 20 73  cates..** Each s
30700 65 74 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  et is identified
30710 20 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20   by a unique P4 
30720 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
30730 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76   set.** must hav
30740 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e  e P4==0, the fin
30750 61 6c 20 73 65 74 20 6d 75 73 74 20 68 61 76 65  al set must have
30760 20 50 34 3d 3d 2d 31 2c 20 61 6e 64 20 66 6f 72   P4==-1, and for
30770 20 61 6c 6c 20 6f 74 68 65 72 20 73 65 74 73 0a   all other sets.
30780 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3e  ** must have P4>
30790 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  0..**.** This al
307a0 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lows optimizatio
307b0 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d  ns: (a) when P4=
307c0 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  =0 there is no n
307d0 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  eed to test.** t
307e0 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  he RowSet object
307f0 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69   for P3, as it i
30800 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
30810 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a   to contain it,.
30820 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d  ** (b) when P4==
30830 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  -1 there is no n
30840 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  eed to insert th
30850 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77  e value, as it w
30860 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20  ill.** never be 
30870 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20  tested for, and 
30880 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65  (c) when a value
30890 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
308a0 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73   set X is.** ins
308b0 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  erted, there is 
308c0 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63  no need to searc
308d0 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  h to see if the 
308e0 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a  same value was.*
308f0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  * previously ins
30900 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  erted as part of
30910 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20   set X (only if 
30920 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  it was previousl
30930 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73  y.** inserted as
30940 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74   part of some ot
30950 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73  her set)..*/.cas
30960 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  e OP_RowSetTest:
30970 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
30980 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
30990 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  in1, in3 */.  in
309a0 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78  t iSet;.  int ex
309b0 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  ists;..  pIn1 = 
309c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
309d0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
309e0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20  Op->p3];.  iSet 
309f0 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61  = pOp->p4.i;.  a
30a00 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
30a10 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20  gs&MEM_Int );.. 
30a20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
30a30 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
30a40 68 61 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a  han a rowset obj
30a50 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ect in memory ce
30a60 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65  ll P1,.  ** dele
30a70 74 65 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e  te it now and in
30a80 69 74 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68  itialize P1 with
30a90 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
30aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e  .  */.  if( (pIn
30ab0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
30ac0 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
30ad0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
30ae0 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
30af0 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
30b00 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
30b10 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
30b20 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  mem;.  }..  asse
30b30 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
30b40 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61  =P4_INT32 );.  a
30b50 73 73 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20  ssert( iSet==-1 
30b60 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20  || iSet>=0 );.  
30b70 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20  if( iSet ){.    
30b80 65 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33  exists = sqlite3
30b90 52 6f 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d  RowSetTest(pIn1-
30ba0 3e 75 2e 70 52 6f 77 53 65 74 2c 20 69 53 65 74  >u.pRowSet, iSet
30bb0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  , pIn3->u.i);.  
30bc0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
30bd0 6e 28 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a  n(exists!=0,2);.
30be0 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
30bf0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
30c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74  ;.  }.  if( iSet
30c10 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
30c20 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
30c30 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
30c40 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a  pIn3->u.i);.  }.
30c50 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
30c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30c70 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63  _TRIGGER../* Opc
30c80 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20  ode: Program P1 
30c90 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
30ca0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72  * Execute the tr
30cb0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61  igger program pa
30cc0 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65  ssed as P4 (type
30cd0 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e   P4_SUBPROGRAM).
30ce0 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61   .**.** P1 conta
30cf0 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
30d00 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
30d10 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
30d20 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
30d30 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e  y .** cell in an
30d40 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73   array of values
30d50 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e   used as argumen
30d60 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72  ts to the sub-pr
30d70 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f  ogram. P2 .** co
30d80 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
30d90 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
30da0 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
30db0 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52   throws an IGNOR
30dc0 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  E .** exception 
30dd0 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28  using the RAISE(
30de0 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69  ) function. Regi
30df0 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
30e00 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a   the address .**
30e10 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   of a memory cel
30e20 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70  l in this (the p
30e30 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69  arent) VM that i
30e40 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
30e50 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72  te the .** memor
30e60 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  y required by th
30e70 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75  e sub-vdbe at ru
30e80 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ntime..**.** P4 
30e90 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
30ea0 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e  the VM containin
30eb0 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  g the trigger pr
30ec0 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
30ed0 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P5 is non-zero, 
30ee0 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 70  then recursive p
30ef0 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f  rogram invocatio
30f00 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f  n is enabled..*/
30f10 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d  .case OP_Program
30f20 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
30f30 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  mp */.  int nMem
30f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30f50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
30f60 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 66 6f  ory registers fo
30f70 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
30f80 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
30f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
30fa0 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73  tes of runtime s
30fb0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
30fc0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
30fd0 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20  .  Mem *pRt;    
30fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30ff0 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  gister to alloca
31000 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65  te runtime space
31010 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31030 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
31040 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20   through memory 
31050 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  cells */.  Mem *
31060 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
31070 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72     /* Last memor
31080 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72  y cell in new ar
31090 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ray */.  VdbeFra
310a0 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
310b0 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61   /* New vdbe fra
310c0 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e  me to execute in
310d0 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
310e0 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a   *pProgram;   /*
310f0 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20   Sub-program to 
31100 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69  execute */.  voi
31110 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20  d *t;           
31120 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64       /* Token id
31130 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 67 65  entifying trigge
31140 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d  r */..  pProgram
31150 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
31160 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d  ram;.  pRt = &aM
31170 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
31180 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
31190 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f  >nOp>0 );.  .  /
311a0 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c 61 67  * If the p5 flag
311b0 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
311c0 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
311d0 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
311e0 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c   is .  ** disabl
311f0 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73  ed for backwards
31200 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28   compatibility (
31210 70 35 20 69 73 20 73 65 74 20 69 66 20 74 68 69  p5 is set if thi
31220 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20  s sub-program.  
31230 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  ** is really a t
31240 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f  rigger, not a fo
31250 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
31260 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73  , and the flag s
31270 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61  et.  ** and clea
31280 72 65 64 20 62 79 20 74 68 65 20 22 50 52 41 47  red by the "PRAG
31290 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
312a0 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69  ggers" command i
312b0 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a  s clear)..  ** .
312c0 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72    ** It is recur
312d0 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
312e0 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61 74 20  of triggers, at 
312f0 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74  the SQL level, t
31300 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  hat is .  ** dis
31310 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63  abled. In some c
31320 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72  ases a single tr
31330 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61  igger may genera
31340 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  te more than one
31350 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61   .  ** SubProgra
31360 6d 20 28 69 66 20 74 68 65 20 74 72 69 67 67 65  m (if the trigge
31370 72 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  r may be execute
31380 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e  d with more than
31390 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a   one different .
313a0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
313b0 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62   algorithm). Sub
313c0 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
313d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
313e0 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  th a.  ** single
313f0 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76   trigger all hav
31400 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
31410 20 66 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67   for the SubProg
31420 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20  ram.token .  ** 
31430 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
31440 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
31450 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d     t = pProgram-
31460 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28  >token;.    for(
31470 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
31480 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46 72 61  ; pFrame && pFra
31490 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46  me->token!=t; pF
314a0 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
314b0 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
314c0 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20  Frame ) break;. 
314d0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72   }..  if( p->nFr
314e0 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ame>=db->aLimit[
314f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
31500 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20  GGER_DEPTH] ){. 
31510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
31520 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
31530 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74  3VdbeError(p, "t
31540 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
31550 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
31560 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
31570 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
31580 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  or;.  }..  /* Re
31590 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75 73  gister pRt is us
315a0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
315b0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
315c0 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61 74  to save the stat
315d0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75  e.  ** of the cu
315e0 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61  rrent program, a
315f0 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  nd the memory re
31600 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
31610 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a  e to execute.  *
31620 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  * the trigger pr
31630 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74  ogram. If this t
31640 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e 20  rigger has been 
31650 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68  fired before, th
31660 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20  en pRt .  ** is 
31670 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
31680 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
31690 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c   must be initial
316a0 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ized.  */.  if( 
316b0 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  (pRt->flags&MEM_
316c0 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Frame)==0 ){.   
316d0 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e   /* SubProgram.n
316e0 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68  Mem is set to th
316f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  e number of memo
31700 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79  ry cells used by
31710 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f   the .    ** pro
31720 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53  gram stored in S
31730 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41  ubProgram.aOp. A
31740 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c  s well as these,
31750 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   one memory.    
31760 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69  ** cell is requi
31770 72 65 64 20 66 6f 72 20 65 61 63 68 20 63 75 72  red for each cur
31780 73 6f 72 20 75 73 65 64 20 62 79 20 74 68 65 20  sor used by the 
31790 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63  program. Set loc
317a0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
317b0 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74  le nMem (and lat
317c0 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43  er, VdbeFrame.nC
317d0 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73  hildMem) to this
317e0 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
317f0 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72     nMem = pProgr
31800 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67  am->nMem + pProg
31810 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61  ram->nCsr;.    a
31820 73 73 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b  ssert( nMem>0 );
31830 0a 20 20 20 20 69 66 28 20 70 50 72 6f 67 72 61  .    if( pProgra
31840 6d 2d 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65  m->nCsr==0 ) nMe
31850 6d 2b 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  m++;.    nByte =
31860 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
31870 64 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20  dbeFrame)).     
31880 20 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20           + nMem 
31890 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20  * sizeof(Mem).  
318a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
318b0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73  rogram->nCsr * s
318c0 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
318d0 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
318e0 20 2b 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f   + (pProgram->nO
318f0 70 20 2b 20 37 29 2f 38 3b 0a 20 20 20 20 70 46  p + 7)/8;.    pF
31900 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  rame = sqlite3Db
31910 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
31920 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
31930 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  pFrame ){.      
31940 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
31950 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
31960 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74  beMemRelease(pRt
31970 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67  );.    pRt->flag
31980 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20  s = MEM_Frame;. 
31990 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65     pRt->u.pFrame
319a0 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20 20   = pFrame;..    
319b0 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20  pFrame->v = p;. 
319c0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c     pFrame->nChil
319d0 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  dMem = nMem;.   
319e0 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43   pFrame->nChildC
319f0 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  sr = pProgram->n
31a00 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Csr;.    pFrame-
31a10 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
31a20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 70 46 72 61  - aOp);.    pFra
31a30 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d  me->aMem = p->aM
31a40 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  em;.    pFrame->
31a50 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a  nMem = p->nMem;.
31a60 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73      pFrame->apCs
31a70 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20  r = p->apCsr;.  
31a80 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f    pFrame->nCurso
31a90 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a  r = p->nCursor;.
31aa0 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20      pFrame->aOp 
31ab0 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46  = p->aOp;.    pF
31ac0 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e  rame->nOp = p->n
31ad0 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  Op;.    pFrame->
31ae0 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d  token = pProgram
31af0 2d 3e 74 6f 6b 65 6e 3b 0a 23 69 66 64 65 66 20  ->token;.#ifdef 
31b00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
31b10 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
31b20 20 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63    pFrame->anExec
31b30 20 3d 20 70 2d 3e 61 6e 45 78 65 63 3b 0a 23 65   = p->anExec;.#e
31b40 6e 64 69 66 0a 0a 20 20 20 20 70 45 6e 64 20 3d  ndif..    pEnd =
31b50 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70   &VdbeFrameMem(p
31b60 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e  Frame)[pFrame->n
31b70 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66  ChildMem];.    f
31b80 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d  or(pMem=VdbeFram
31b90 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d  eMem(pFrame); pM
31ba0 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b  em!=pEnd; pMem++
31bb0 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
31bc0 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
31bd0 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ined;.      pMem
31be0 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ->db = db;.    }
31bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
31c00 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70 46  rame = pRt->u.pF
31c10 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  rame;.    assert
31c20 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d  ( pProgram->nMem
31c30 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d  +pProgram->nCsr=
31c40 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d  =pFrame->nChildM
31c50 65 6d 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  em .        || (
31c60 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d  pProgram->nCsr==
31c70 30 20 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  0 && pProgram->n
31c80 4d 65 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e 6e  Mem+1==pFrame->n
31c90 43 68 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20 20  ChildMem) );.   
31ca0 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61   assert( pProgra
31cb0 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d  m->nCsr==pFrame-
31cc0 3e 6e 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20  >nChildCsr );.  
31cd0 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 28    assert( (int)(
31ce0 70 4f 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72 61  pOp - aOp)==pFra
31cf0 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20  me->pc );.  }.. 
31d00 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20   p->nFrame++;.  
31d10 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20  pFrame->pParent 
31d20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70  = p->pFrame;.  p
31d30 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
31d40 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   = db->lastRowid
31d50 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  ;.  pFrame->nCha
31d60 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65  nge = p->nChange
31d70 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  ;.  pFrame->nDbC
31d80 68 61 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e 6e  hange = p->db->n
31d90 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
31da0 28 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  ( pFrame->pAuxDa
31db0 74 61 3d 3d 30 20 29 3b 0a 20 20 70 46 72 61 6d  ta==0 );.  pFram
31dc0 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 2d  e->pAuxData = p-
31dd0 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 2d 3e  >pAuxData;.  p->
31de0 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
31df0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
31e00 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46    p->pFrame = pF
31e10 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20  rame;.  p->aMem 
31e20 3d 20 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61  = aMem = VdbeFra
31e30 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 0a 20  meMem(pFrame);. 
31e40 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   p->nMem = pFram
31e50 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20 20  e->nChildMem;.  
31e60 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31  p->nCursor = (u1
31e70 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  6)pFrame->nChild
31e80 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20  Csr;.  p->apCsr 
31e90 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
31ea0 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 3b  )&aMem[p->nMem];
31eb0 0a 20 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65  .  pFrame->aOnce
31ec0 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 70 43 73   = (u8*)&p->apCs
31ed0 72 5b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  r[pProgram->nCsr
31ee0 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 72 61  ];.  memset(pFra
31ef0 6d 65 2d 3e 61 4f 6e 63 65 2c 20 30 2c 20 28 70  me->aOnce, 0, (p
31f00 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20 37  Program->nOp + 7
31f10 29 2f 38 29 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  )/8);.  p->aOp =
31f20 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d   aOp = pProgram-
31f30 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d  >aOp;.  p->nOp =
31f40 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a   pProgram->nOp;.
31f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
31f60 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
31f70 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63  ATUS.  p->anExec
31f80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
31f90 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a 0a  Op = &aOp[-1];..
31fa0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
31fb0 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20  pcode: Param P1 
31fc0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
31fd0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  his opcode is on
31fe0 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20  ly ever present 
31ff0 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  in sub-programs 
32000 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a  called via the .
32010 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ** OP_Program in
32020 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20  struction. Copy 
32030 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  a value currentl
32040 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65  y stored in a me
32050 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66  mory .** cell of
32060 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61   the calling (pa
32070 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63  rent) frame to c
32080 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75  ell P2 in the cu
32090 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a  rrent frames .**
320a0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
320b0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
320c0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
320d0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e   to access the n
320e0 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64  ew.* .** and old
320f0 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  .* values..**.**
32100 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
32110 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
32120 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20  parent frame is 
32130 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64  determined by ad
32140 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ding.** the valu
32150 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
32160 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75  ment to the valu
32170 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
32180 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ment to the.** c
32190 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
321a0 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  m instruction..*
321b0 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a  /.case OP_Param:
321c0 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
321d0 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 46 72  out2 */.  VdbeFr
321e0 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d  ame *pFrame;.  M
321f0 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74 20  em *pIn;.  pOut 
32200 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
32210 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72 61  (p, pOp);.  pFra
32220 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
32230 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d    pIn = &pFrame-
32240 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20  >aMem[pOp->p1 + 
32250 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61  pFrame->aOp[pFra
32260 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a  me->pc].p1];   .
32270 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
32280 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
32290 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d  , pIn, MEM_Ephem
322a0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  );.  break;.}..#
322b0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
322c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
322d0 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GGER */..#ifndef
322e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
322f0 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f  EIGN_KEY./* Opco
32300 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31  de: FkCounter P1
32310 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
32320 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b 50 31 5d  opsis: fkctr[P1]
32330 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  +=P2.**.** Incre
32340 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69  ment a "constrai
32350 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50  nt counter" by P
32360 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67  2 (P2 may be neg
32370 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76  ative or positiv
32380 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  e)..** If P1 is 
32390 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61  non-zero, the da
323a0 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
323b0 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
323c0 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65  remented .** (de
323d0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
323e0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e  ey constraints).
323f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50   Otherwise, if P
32400 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a  1 is zero, the .
32410 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75  ** statement cou
32420 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
32430 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ted (immediate f
32440 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
32450 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65  raints)..*/.case
32460 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b   OP_FkCounter: {
32470 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
32480 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46   & SQLITE_DeferF
32490 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  Ks ){.    db->nD
324a0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 2b  eferredImmCons +
324b0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c  = pOp->p2;.  }el
324c0 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  se if( pOp->p1 )
324d0 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
324e0 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e  redCons += pOp->
324f0 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p2;.  }else{.   
32500 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
32510 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  t += pOp->p2;.  
32520 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
32530 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72   Opcode: FkIfZer
32540 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  o P1 P2 * * *.**
32550 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 66 6b   Synopsis: if fk
32560 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f 20  ctr[P1]==0 goto 
32570 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P2.**.** This op
32580 63 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20  code tests if a 
32590 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
325a0 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
325b0 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f  s currently zero
325c0 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70  ..** If so, jump
325d0 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
325e0 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  P2. Otherwise, f
325f0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
32600 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74  he next .** inst
32610 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ruction..**.** I
32620 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
32630 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20  , then the jump 
32640 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
32650 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
32660 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69  int-counter.** i
32670 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20  s zero (the one 
32680 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65  that counts defe
32690 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
326a0 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20  violations). If 
326b0 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74  P1 is.** zero, t
326c0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
326d0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
326e0 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75  t constraint-cou
326f0 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  nter is zero.** 
32700 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
32710 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
32720 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a  t violations)..*
32730 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65  /.case OP_FkIfZe
32740 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  ro: {         /*
32750 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70   jump */.  if( p
32760 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56 64  Op->p1 ){.    Vd
32770 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 64 62  beBranchTaken(db
32780 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d  ->nDeferredCons=
32790 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  =0 && db->nDefer
327a0 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32  redImmCons==0, 2
327b0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  );.    if( db->n
327c0 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20  DeferredCons==0 
327d0 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
327e0 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
327f0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
32800 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
32810 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e 46  ranchTaken(p->nF
32820 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26  kConstraint==0 &
32830 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
32840 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20  mmCons==0, 2);. 
32850 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e     if( p->nFkCon
32860 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62  straint==0 && db
32870 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
32880 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  ns==0 ) goto jum
32890 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
328a0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
328b0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
328c0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
328d0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
328e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
328f0 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64  CREMENT./* Opcod
32900 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20  e: MemMax P1 P2 
32910 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
32920 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b 50  s: r[P1]=max(r[P
32930 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  1],r[P2]).**.** 
32940 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P1 is a register
32950 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
32960 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74  me of this VM (t
32970 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73  he root frame is
32980 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72  .** different fr
32990 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  om the current f
329a0 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73  rame if this ins
329b0 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  truction is bein
329c0 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69  g executed.** wi
329d0 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72  thin a sub-progr
329e0 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c  am). Set the val
329f0 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
32a00 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  1 to the maximum
32a10 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72   of .** its curr
32a20 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ent value and th
32a30 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
32a40 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
32a50 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
32a60 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
32a70 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
32a80 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
32a90 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
32aa0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
32ab0 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
32ac0 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46 72   in2 */.  VdbeFr
32ad0 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
32ae0 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
32af0 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
32b00 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
32b10 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
32b20 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
32b30 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  t);.    pIn1 = &
32b40 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
32b50 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->p1];.  }else{.
32b60 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d      pIn1 = &aMem
32b70 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20  [pOp->p1];.  }. 
32b80 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
32b90 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73  lid(pIn1) );.  s
32ba0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
32bb0 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
32bc0 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
32bd0 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
32be0 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
32bf0 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20  fy(pIn2);.  if( 
32c00 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e  pIn1->u.i<pIn2->
32c10 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e  u.i){.    pIn1->
32c20 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b  u.i = pIn2->u.i;
32c30 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
32c40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
32c50 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
32c60 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ENT */../* Opcod
32c70 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 50  e: IfPos P1 P2 P
32c80 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
32c90 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68  s: if r[P1]>0 th
32ca0 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f  en r[P1]-=P3, go
32cb0 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69  to P2.**.** Regi
32cc0 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
32cd0 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
32ce0 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
32cf0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
32d00 69 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c  is 1 or greater,
32d10 20 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f   subtract P3 fro
32d20 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  m the.** value i
32d30 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70 20 74 6f  n P1 and jump to
32d40 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
32d50 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
32d60 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
32d70 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74  s less than 1, t
32d80 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  hen the.** value
32d90 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
32da0 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65 73  d control passes
32db0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
32dc0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
32dd0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50  ..*/.case OP_IfP
32de0 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  os: {        /* 
32df0 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
32e00 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
32e10 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
32e20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
32e30 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61  Int );.  VdbeBra
32e40 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d 3e  nchTaken( pIn1->
32e50 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66 28  u.i>0, 2);.  if(
32e60 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a   pIn1->u.i>0 ){.
32e70 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d      pIn1->u.i -=
32e80 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f   pOp->p3;.    go
32e90 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
32ea0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
32eb0 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74  * Opcode: Offset
32ec0 4c 69 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a  Limit P1 P2 P3 *
32ed0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
32ee0 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20  if r[P1]>0 then 
32ef0 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28  r[P2]=r[P1]+max(
32f00 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20 72 5b  0,r[P3]) else r[
32f10 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54  P2]=(-1).**.** T
32f20 68 69 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  his opcode perfo
32f30 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75  rms a commonly u
32f40 73 65 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  sed computation 
32f50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
32f60 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ** LIMIT and OFF
32f70 53 45 54 20 70 72 6f 63 65 73 73 2e 20 20 72 5b  SET process.  r[
32f80 50 31 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c 69  P1] holds the li
32f90 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20 20 72 5b  mit counter.  r[
32fa0 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65  P3].** holds the
32fb0 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 2e   offset counter.
32fc0 20 20 54 68 65 20 6f 70 63 6f 64 65 20 63 6f 6d    The opcode com
32fd0 70 75 74 65 73 20 74 68 65 20 63 6f 6d 62 69 6e  putes the combin
32fe0 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  ed value.** of t
32ff0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
33000 53 45 54 20 61 6e 64 20 73 74 6f 72 65 73 20 74  SET and stores t
33010 68 61 74 20 76 61 6c 75 65 20 69 6e 20 72 5b 50  hat value in r[P
33020 32 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a 2a  2].  The r[P2].*
33030 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75 74 65 64  * value computed
33040 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
33050 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
33060 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
33070 65 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 6e 20  e.** visited in 
33080 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
33090 65 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a  e the query..**.
330a0 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69 73 20 7a  ** If r[P3] is z
330b0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
330c0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
330d0 65 20 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a 2a  e is no OFFSET.*
330e0 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73  * and r[P2] is s
330f0 65 74 20 74 6f 20 62 65 20 74 68 65 20 76 61 6c  et to be the val
33100 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 2c  ue of the LIMIT,
33110 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66   r[P1]..**.** if
33120 20 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20 6f   r[P1] is zero o
33130 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74  r negative, that
33140 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
33150 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64 20  no LIMIT.** and 
33160 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20  r[P2] is set to 
33170 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -1. .**.** Other
33180 77 69 73 65 2c 20 72 5b 50 32 5d 20 69 73 20 73  wise, r[P2] is s
33190 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
331a0 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33 5d   r[P1] and r[P3]
331b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66  ..*/.case OP_Off
331c0 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20 2f  setLimit: {    /
331d0 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e 33  * in1, out2, in3
331e0 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20 70   */.  i64 x;.  p
331f0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
33200 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
33210 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
33220 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
33230 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
33240 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
33250 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
33260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
33270 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
33280 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e 31  nt );.  x = pIn1
33290 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c 3d  ->u.i;.  if( x<=
332a0 30 20 7c 7c 20 73 71 6c 69 74 65 33 41 64 64 49  0 || sqlite3AddI
332b0 6e 74 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e 75  nt64(&x, pIn3->u
332c0 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30  .i>0?pIn3->u.i:0
332d0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
332e0 68 65 20 4c 49 4d 49 54 20 69 73 20 6c 65 73 73  he LIMIT is less
332f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
33300 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72  o zero, loop for
33310 65 76 65 72 2e 20 20 54 68 69 73 0a 20 20 20 20  ever.  This.    
33320 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74 65 64  ** is documented
33330 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20 69 66 20  .  But also, if 
33340 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  the LIMIT+OFFSET
33350 20 65 78 63 65 65 64 73 20 32 5e 36 33 20 74 68   exceeds 2^63 th
33360 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6c  en.    ** also l
33370 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68  oop forever.  Th
33380 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  is is undocument
33390 65 64 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f 6e  ed.  In fact, on
333a0 65 20 63 6f 75 6c 64 20 61 72 67 75 65 0a 20 20  e could argue.  
333b0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 6f    ** that the lo
333c0 6f 70 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e  op should termin
333d0 61 74 65 2e 20 20 42 75 74 20 61 73 73 75 6d 69  ate.  But assumi
333e0 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74 65  ng 1 billion ite
333f0 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 70  rations.    ** p
33400 65 72 20 73 65 63 6f 6e 64 20 28 66 61 72 20 65  er second (far e
33410 78 63 65 65 64 69 6e 67 20 74 68 65 20 63 61 70  xceeding the cap
33420 61 62 69 6c 69 74 69 65 73 20 6f 66 20 61 6e 79  abilities of any
33430 20 63 75 72 72 65 6e 74 20 68 61 72 64 77 61 72   current hardwar
33440 65 29 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  e).    ** it wou
33450 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c 79 20 33  ld take nearly 3
33460 30 30 20 79 65 61 72 73 20 74 6f 20 61 63 74 75  00 years to actu
33470 61 6c 6c 79 20 72 65 61 63 68 20 74 68 65 20 6c  ally reach the l
33480 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  imit.  So.    **
33490 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65 72   looping forever
334a0 20 69 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65   is a reasonable
334b0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e 20   approximation. 
334c0 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  */.    pOut->u.i
334d0 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
334e0 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
334f0 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  x;.  }.  break;.
33500 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
33510 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20 2a 20  NotZero P1 P2 * 
33520 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
33530 20 69 66 20 72 5b 50 31 5d 21 3d 30 20 74 68 65   if r[P1]!=0 the
33540 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20  n r[P1]--, goto 
33550 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P2.**.** Registe
33560 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69  r P1 must contai
33570 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  n an integer.  I
33580 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
33590 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 0a   register P1 is.
335a0 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67 72 65  ** initially gre
335b0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
335c0 74 68 65 6e 20 64 65 63 72 65 6d 65 6e 74 20 74  then decrement t
335d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
335e0 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20 69  ster P1..** If i
335f0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  t is non-zero (n
33600 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
33610 69 76 65 29 20 61 6e 64 20 74 68 65 6e 20 61 6c  ive) and then al
33620 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  so jump to P2.  
33630 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
33640 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
33650 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69 74 20 75  zero, leave it u
33660 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 66 61 6c  nchanged and fal
33670 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61  l through..*/.ca
33680 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a  se OP_IfNotZero:
33690 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
336a0 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
336b0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
336c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
336d0 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
336e0 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
336f0 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c  Taken(pIn1->u.i<
33700 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  0, 2);.  if( pIn
33710 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 69  1->u.i ){.     i
33720 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29  f( pIn1->u.i>0 )
33730 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20   pIn1->u.i--;.  
33740 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
33750 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
33760 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
33770 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20 50  ecrJumpZero P1 P
33780 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
33790 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31 5d  sis: if (--r[P1]
337a0 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  )==0 goto P2.**.
337b0 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 6d  ** Register P1 m
337c0 75 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74 65  ust hold an inte
337d0 67 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74 20  ger.  Decrement 
337e0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50 31 0a  the value in P1.
337f0 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50  ** and jump to P
33800 32 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c  2 if the new val
33810 75 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65  ue is exactly ze
33820 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ro..*/.case OP_D
33830 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20  ecrJumpZero: {  
33840 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
33850 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
33860 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
33870 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
33880 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  gs&MEM_Int );.  
33890 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d  if( pIn1->u.i>SM
338a0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 70  ALLEST_INT64 ) p
338b0 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64  In1->u.i--;.  Vd
338c0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49  beBranchTaken(pI
338d0 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a  n1->u.i==0, 2);.
338e0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d    if( pIn1->u.i=
338f0 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  =0 ) goto jump_t
33900 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
33910 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  .../* Opcode: Ag
33920 67 53 74 65 70 30 20 2a 20 50 32 20 50 33 20 50  gStep0 * P2 P3 P
33930 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
33940 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74  : accum=r[P3] st
33950 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a  ep(r[P2@P5]).**.
33960 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  ** Execute the s
33970 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  tep function for
33980 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
33990 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  The.** function 
339a0 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73  has P5 arguments
339b0 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .   P4 is a poin
339c0 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
339d0 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ef.** structure 
339e0 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74  that specifies t
339f0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  he function.  Re
33a00 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
33a10 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  .** accumulator.
33a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
33a30 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
33a40 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
33a50 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
33a60 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20  ccessors..*/./* 
33a70 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20  Opcode: AggStep 
33a80 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  * P2 P3 P4 P5.**
33a90 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d   Synopsis: accum
33aa0 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32  =r[P3] step(r[P2
33ab0 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63  @P5]).**.** Exec
33ac0 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
33ad0 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
33ae0 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
33af0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20  function has P5 
33b00 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20  arguments.   P4 
33b10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
33b20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  an sqlite3_conte
33b30 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  xt.** object tha
33b40 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 75 6e  t is used to run
33b50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
33b60 52 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  Register P3 is.*
33b70 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c  * as the accumul
33b80 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
33b90 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
33ba0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
33bb0 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
33bc0 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
33bd0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
33be0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f   is initially co
33bf0 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74 65  ded as OP_AggSte
33c00 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 76  p0.  On first ev
33c10 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  aluation,.** the
33c20 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64 20   FuncDef stored 
33c30 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72 74  in P4 is convert
33c40 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  ed into an sqlit
33c50 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a  e3_context and.*
33c60 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  * the opcode is 
33c70 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 69  changed.  In thi
33c80 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74 69  s way, the initi
33c90 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
33ca0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  .** sqlite3_cont
33cb0 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ext only happens
33cc0 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 6f   once, instead o
33cd0 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 74  f on each call t
33ce0 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 75  o the.** step fu
33cf0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  nction..*/.case 
33d00 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a 20  OP_AggStep0: {. 
33d10 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
33d20 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
33d30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
33d40 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
33d50 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70  DEF );.  n = pOp
33d60 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
33d70 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
33d80 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
33d90 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
33da0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ;.  assert( n==0
33db0 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
33dc0 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d  & pOp->p2+n<=(p-
33dd0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
33de0 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73  rsor)+1) );.  as
33df0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
33e00 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
33e10 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
33e20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
33e30 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
33e40 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b   sizeof(*pCtx) +
33e50 20 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71   (n-1)*sizeof(sq
33e60 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a  lite3_value*));.
33e70 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20    if( pCtx==0 ) 
33e80 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
33e90 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20  Ctx->pMem = 0;. 
33ea0 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70   pCtx->pFunc = p
33eb0 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
33ec0 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74  pCtx->iOp = (int
33ed0 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
33ee0 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b  pCtx->pVdbe = p;
33ef0 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20  .  pCtx->argc = 
33f00 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  n;.  pOp->p4type
33f10 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20   = P4_FUNCCTX;. 
33f20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20   pOp->p4.pCtx = 
33f30 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  pCtx;.  pOp->opc
33f40 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74 65 70  ode = OP_AggStep
33f50 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ;.  /* Fall thro
33f60 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53  ugh into OP_AggS
33f70 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50  tep */.}.case OP
33f80 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e  _AggStep: {.  in
33f90 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  t i;.  sqlite3_c
33fa0 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
33fb0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d  Mem *pMem;.  Mem
33fc0 20 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   t;..  assert( p
33fd0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46  Op->p4type==P4_F
33fe0 55 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74 78  UNCCTX );.  pCtx
33ff0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b   = pOp->p4.pCtx;
34000 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  .  pMem = &aMem[
34010 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20  pOp->p3];..  /* 
34020 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
34030 20 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20   is inside of a 
34040 74 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67  trigger, the reg
34050 69 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61  ister array in a
34060 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74  Mem[].  ** might
34070 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65   change from one
34080 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74   evaluation to t
34090 68 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65  he next.  The ne
340a0 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
340b0 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20  .  ** checks to 
340c0 73 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73  see if the regis
340d0 74 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68  ter array has ch
340e0 61 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anged, and if so
340f0 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69   it.  ** reiniti
34100 61 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76  alizes the relav
34110 61 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65  ant parts of the
34120 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
34130 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28   object */.  if(
34140 20 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70   pCtx->pMem != p
34150 4d 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  Mem ){.    pCtx-
34160 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20  >pMem = pMem;.  
34170 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72    for(i=pCtx->ar
34180 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  gc-1; i>=0; i--)
34190 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d   pCtx->argv[i] =
341a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69   &aMem[pOp->p2+i
341b0 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  ];.  }..#ifdef S
341c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
341d0 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61  r(i=0; i<pCtx->a
341e0 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  rgc; i++){.    a
341f0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
34200 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29  d(pCtx->argv[i])
34210 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
34220 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69  _TRACE(pOp->p2+i
34230 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29  , pCtx->argv[i])
34240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34250 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73 71 6c  pMem->n++;.  sql
34260 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
34270 26 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  &t, db, MEM_Null
34280 29 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20  );.  pCtx->pOut 
34290 3d 20 26 74 3b 0a 20 20 70 43 74 78 2d 3e 66 45  = &t;.  pCtx->fE
342a0 72 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20  rrorOrAux = 0;. 
342b0 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20   pCtx->skipFlag 
342c0 3d 20 30 3b 0a 20 20 28 70 43 74 78 2d 3e 70 46  = 0;.  (pCtx->pF
342d0 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74  unc->xSFunc)(pCt
342e0 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74  x,pCtx->argc,pCt
342f0 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d 50  x->argv); /* IMP
34300 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
34310 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66  */.  if( pCtx->f
34320 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20  ErrorOrAux ){.  
34330 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72    if( pCtx->isEr
34340 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ror ){.      sql
34350 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
34360 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
34370 61 6c 75 65 5f 74 65 78 74 28 26 74 29 29 3b 0a  alue_text(&t));.
34380 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d        rc = pCtx-
34390 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  >isError;.    }.
343a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
343b0 65 6d 52 65 6c 65 61 73 65 28 26 74 29 3b 0a 20  emRelease(&t);. 
343c0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
343d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
343e0 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
343f0 20 20 61 73 73 65 72 74 28 20 74 2e 66 6c 61 67    assert( t.flag
34400 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20  s==MEM_Null );. 
34410 20 7d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 73   }.  if( pCtx->s
34420 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61  kipFlag ){.    a
34430 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
34440 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65  pcode==OP_CollSe
34450 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70  q );.    i = pOp
34460 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28  [-1].p1;.    if(
34470 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   i ) sqlite3Vdbe
34480 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65  MemSetInt64(&aMe
34490 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  m[i], 1);.  }.  
344a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
344b0 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31  ode: AggFinal P1
344c0 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
344d0 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b  nopsis: accum=r[
344e0 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45  P1] N=P2.**.** E
344f0 78 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c  xecute the final
34500 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  izer function fo
34510 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  r an aggregate. 
34520 20 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65   P1 is.** the me
34530 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68  mory location th
34540 61 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75  at is the accumu
34550 6c 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67  lator for the ag
34560 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50  gregate..**.** P
34570 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
34580 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  of arguments tha
34590 74 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  t the step funct
345a0 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a  ion takes and.**
345b0 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
345c0 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20   to the FuncDef 
345d0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
345e0 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72  n.  The P2.** ar
345f0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73  gument is not us
34600 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
34610 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74  e.  It is only t
34620 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67  here to disambig
34630 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  uate.** function
34640 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20  s that can take 
34650 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20  varying numbers 
34660 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  of arguments.  T
34670 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e  he.** P4 argumen
34680 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  t is only needed
34690 20 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72   for the degener
346a0 61 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ate case where.*
346b0 2a 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  * the step funct
346c0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76  ion was not prev
346d0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a  iously called..*
346e0 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e  /.case OP_AggFin
346f0 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65  al: {.  Mem *pMe
34700 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  m;.  assert( pOp
34710 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
34720 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  1<=(p->nMem+1 - 
34730 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
34740 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f   pMem = &aMem[pO
34750 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
34760 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
34770 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f   ~(MEM_Null|MEM_
34780 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63  Agg))==0 );.  rc
34790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
347a0 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20  mFinalize(pMem, 
347b0 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a  pOp->p4.pFunc);.
347c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
347d0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
347e0 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  (p, "%s", sqlite
347f0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65  3_value_text(pMe
34800 6d 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  m));.    goto ab
34810 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
34820 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
34830 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
34840 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67  g(pMem, encoding
34850 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
34860 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a  BLOBSIZE(pMem);.
34870 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
34880 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29  eMemTooBig(pMem)
34890 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
348a0 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61  _big;.  }.  brea
348b0 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
348c0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
348d0 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f   Opcode: Checkpo
348e0 69 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  int P1 P2 P3 * *
348f0 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  .**.** Checkpoin
34900 74 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54  t database P1. T
34910 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
34920 66 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72  f P1 is not curr
34930 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20  ently in.** WAL 
34940 6d 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20  mode. Parameter 
34950 50 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  P2 is one of SQL
34960 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
34970 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a  ASSIVE, FULL,.**
34980 20 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55   RESTART, or TRU
34990 4e 43 41 54 45 2e 20 20 57 72 69 74 65 20 31 20  NCATE.  Write 1 
349a0 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33  or 0 into mem[P3
349b0 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  ] if the checkpo
349c0 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  int returns.** S
349d0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f  QLITE_BUSY or no
349e0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
349f0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
34a00 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
34a10 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20  he.** WAL after 
34a20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
34a30 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e  nto mem[P3+1] an
34a40 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
34a50 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  pages.** in the 
34a60 57 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65  WAL that have be
34a70 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  en checkpointed 
34a80 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70  after the checkp
34a90 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  oint.** complete
34aa0 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d  s into mem[P3+2]
34ab0 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e  .  However on an
34ac0 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31   error, mem[P3+1
34ad0 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b  ] and.** mem[P3+
34ae0 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  2] are initializ
34af0 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73  ed to -1..*/.cas
34b00 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
34b10 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20   {.  int i;     
34b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34b40 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52  nter */.  int aR
34b50 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  es[3];          
34b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
34b70 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ults */.  Mem *p
34b80 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
34b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
34ba0 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
34bb0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
34bc0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
34bd0 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20    aRes[0] = 0;. 
34be0 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b   aRes[1] = aRes[
34bf0 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72  2] = -1;.  asser
34c00 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  t( pOp->p2==SQLI
34c10 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
34c20 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20  SSIVE.       || 
34c30 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
34c40 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a  CHECKPOINT_FULL.
34c50 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
34c60 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
34c70 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20  OINT_RESTART.   
34c80 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d      || pOp->p2==
34c90 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
34ca0 54 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a  T_TRUNCATE.  );.
34cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
34cc0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70  eckpoint(db, pOp
34cd0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26  ->p1, pOp->p2, &
34ce0 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32  aRes[1], &aRes[2
34cf0 5d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ]);.  if( rc ){.
34d00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34d10 54 45 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61  TE_BUSY ) goto a
34d20 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
34d30 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
34d40 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b  TE_OK;.    aRes[
34d50 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  0] = 1;.  }.  fo
34d60 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61  r(i=0, pMem = &a
34d70 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c  Mem[pOp->p3]; i<
34d80 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  3; i++, pMem++){
34d90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34da0 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d  MemSetInt64(pMem
34db0 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b  , (i64)aRes[i]);
34dc0 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b  .  }    .  break
34dd0 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23  ;.};  .#endif..#
34de0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34df0 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63  IT_PRAGMA./* Opc
34e00 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65  ode: JournalMode
34e10 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
34e20 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a  .** Change the j
34e30 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64  ournal mode of d
34e40 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33  atabase P1 to P3
34e50 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65  . P3 must be one
34e60 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52   of the.** PAGER
34e70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58  _JOURNALMODE_XXX
34e80 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e   values. If chan
34e90 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  ging between the
34ea0 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63   various rollbac
34eb0 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65  k.** modes (dele
34ec0 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65  te, truncate, pe
34ed0 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d  rsist, off and m
34ee0 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20  emory), this is 
34ef0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72  a simple.** oper
34f00 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20  ation. No IO is 
34f10 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
34f20 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f  If changing into
34f30 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d   or out of WAL m
34f40 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72  ode the procedur
34f50 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  e is more compli
34f60 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  cated..**.** Wri
34f70 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  te a string cont
34f80 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  aining the final
34f90 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f   journal-mode to
34fa0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
34fb0 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c  .case OP_Journal
34fc0 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75  Mode: {    /* ou
34fd0 74 32 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  t2 */.  Btree *p
34fe0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
34ff0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
35000 20 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e   to change journ
35010 61 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20  al mode of */.  
35020 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
35030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35040 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
35050 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
35060 20 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20    int eNew;     
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35080 20 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c    /* New journal
35090 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   mode */.  int e
350a0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
350b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
350c0 65 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e old journal mo
350d0 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  de */.#ifndef SQ
350e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
350f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
35100 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
35110 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
35120 61 73 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61  ase file for pPa
35130 67 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ger */.#endif.. 
35140 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
35150 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
35160 20 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33    eNew = pOp->p3
35170 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77  ;.  assert( eNew
35180 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35190 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
351a0 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
351b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
351c0 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c  UNCATE .       |
351d0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
351e0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
351f0 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  T .       || eNe
35200 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
35210 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20  MODE_OFF.       
35220 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
35230 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
35240 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  Y.       || eNew
35250 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35260 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c  ODE_WAL.       |
35270 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
35280 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
35290 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
352a0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
352b0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
352c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
352d0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70  dOnly==0 );..  p
352e0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
352f0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61  ->p1].pBt;.  pPa
35300 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
35310 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
35320 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61  eOld = sqlite3Pa
35330 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerGetJournalMod
35340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
35350 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
35360 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29  RNALMODE_QUERY )
35370 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20   eNew = eOld;.  
35380 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65  if( !sqlite3Page
35390 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e  rOkToChangeJourn
353a0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29  alMode(pPager) )
353b0 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23   eNew = eOld;..#
353c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
353d0 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61  IT_WAL.  zFilena
353e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  me = sqlite3Page
353f0 72 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72  rFilename(pPager
35400 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  , 1);..  /* Do n
35410 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73  ot allow a trans
35420 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  ition to journal
35430 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20  _mode=WAL for a 
35440 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e  database.  ** in
35450 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
35460 67 65 20 6f 72 20 69 66 20 74 68 65 20 56 46 53  ge or if the VFS
35470 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
35480 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  t shared memory 
35490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77  .  */.  if( eNew
354a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
354b0 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73  ODE_WAL.   && (s
354c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
354d0 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20  Filename)==0    
354e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66         /* Temp f
354f0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  ile */.       ||
35500 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61   !sqlite3PagerWa
35510 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65  lSupported(pPage
35520 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72  r))   /* No shar
35530 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72  ed-memory suppor
35540 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e  t */.  ){.    eN
35550 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a  ew = eOld;.  }..
35560 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c    if( (eNew!=eOl
35570 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d  d).   && (eOld==
35580 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35590 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50  E_WAL || eNew==P
355a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
355b0 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69  _WAL).  ){.    i
355c0 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
355d0 69 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52  it || db->nVdbeR
355e0 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ead>1 ){.      r
355f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
35600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35610 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20  dbeError(p,.    
35620 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
35630 61 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65  ange %s wal mode
35640 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74   from within a t
35650 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
35660 20 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41         (eNew==PA
35670 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35680 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22  WAL ? "into" : "
35690 6f 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29  out of").      )
356a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  ;.      goto abo
356b0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
356c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20  .    }else{. .  
356d0 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41      if( eOld==PA
356e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
356f0 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  WAL ){.        /
35700 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c  * If leaving WAL
35710 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65   mode, close the
35720 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
35730 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61  ccessful, the ca
35740 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ll.        ** to
35750 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29   PagerCloseWal()
35760 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64   checkpoints and
35770 20 64 65 6c 65 74 65 73 20 74 68 65 20 77 72 69   deletes the wri
35780 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20  te-ahead-log .  
35790 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41        ** file. A
357a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
357b0 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65   may still be he
357c0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
357d0 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20  se file .       
357e0 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63 63   ** after a succ
357f0 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a  essful return. .
35800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35820 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61  agerCloseWal(pPa
35830 67 65 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20  ger, db);.      
35840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
35860 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
35870 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
35880 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20  er, eNew);.     
35890 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
358a0 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52   if( eOld==PAGER
358b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
358c0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ORY ){.        /
358d0 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74  * Cannot transit
358e0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ion directly fro
358f0 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e  m MEMORY to WAL.
35900 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20    Use mode OFF. 
35910 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20         ** as an 
35920 69 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a  intermediate */.
35930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35940 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
35950 64 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52  de(pPager, PAGER
35960 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
35970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
35980 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72      /* Open a tr
35990 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
359a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
359b0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
359c0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
359d0 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72  ** mode, this tr
359e0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73  ansaction always
359f0 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b   uses a rollback
35a00 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
35a10 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
35a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
35a30 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29  nTrans(pBt)==0 )
35a40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a70 33 42 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e  3BtreeSetVersion
35a80 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47  (pBt, (eNew==PAG
35a90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
35aa0 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20  AL ? 2 : 1));.  
35ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
35ac0 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
35ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
35ae0 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20   */..  if( rc ) 
35af0 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65  eNew = eOld;.  e
35b00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67  New = sqlite3Pag
35b10 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
35b20 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a  (pPager, eNew);.
35b30 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
35b40 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
35b50 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
35b60 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pOut->z = (char 
35b70 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  *)sqlite3Journal
35b80 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a  Modename(eNew);.
35b90 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69    pOut->n = sqli
35ba0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74  te3Strlen30(pOut
35bb0 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->z);.  pOut->en
35bc0 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
35bd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
35be0 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75  angeEncoding(pOu
35bf0 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  t, encoding);.  
35c00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
35c10 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
35c20 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65  ;.  break;.};.#e
35c30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
35c40 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23  MIT_PRAGMA */..#
35c50 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
35c60 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
35c70 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
35c80 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a  TE_OMIT_ATTACH).
35c90 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75  /* Opcode: Vacuu
35ca0 6d 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  m P1 * * * *.**.
35cb0 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e  ** Vacuum the en
35cc0 74 69 72 65 20 64 61 74 61 62 61 73 65 20 50 31  tire database P1
35cd0 2e 20 20 50 31 20 69 73 20 30 20 66 6f 72 20 22  .  P1 is 0 for "
35ce0 6d 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20  main", and 2 or 
35cf0 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61  more.** for an a
35d00 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
35d10 2e 20 20 54 68 65 20 22 74 65 6d 70 22 20 64 61  .  The "temp" da
35d20 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62  tabase may not b
35d30 65 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63  e vacuumed..*/.c
35d40 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b  ase OP_Vacuum: {
35d50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
35d60 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72  adOnly==0 );.  r
35d70 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61  c = sqlite3RunVa
35d80 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67  cuum(&p->zErrMsg
35d90 2c 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a  , db, pOp->p1);.
35da0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
35db0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
35dc0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
35dd0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
35de0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
35df0 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f  AUTOVACUUM)./* O
35e00 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75  pcode: IncrVacuu
35e10 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
35e20 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
35e30 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65  ngle step of the
35e40 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
35e50 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e  uum procedure on
35e60 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61 62  .** the P1 datab
35e70 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63 75  ase. If the vacu
35e80 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c  um has finished,
35e90 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
35ea0 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65  tion.** P2. Othe
35eb0 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f  rwise, fall thro
35ec0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
35ed0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
35ee0 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75  case OP_IncrVacu
35ef0 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  um: {        /* 
35f00 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20  jump */.  Btree 
35f10 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
35f20 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
35f30 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
35f40 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
35f50 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
35f60 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b  ask, pOp->p1) );
35f70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
35f80 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70  adOnly==0 );.  p
35f90 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
35fa0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20  ->p1].pBt;.  rc 
35fb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
35fc0 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20  crVacuum(pBt);. 
35fd0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
35fe0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
35ff0 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ,2);.  if( rc ){
36000 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36010 49 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20  ITE_DONE ) goto 
36020 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
36030 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  or;.    rc = SQL
36040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
36050 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
36060 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
36070 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45  if../* Opcode: E
36080 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a  xpire P1 * * * *
36090 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65  .**.** Cause pre
360a0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
360b0 6e 74 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20  nts to expire.  
360c0 57 68 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20  When an expired 
360d0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
360e0 65 78 65 63 75 74 65 64 20 75 73 69 6e 67 20 73  executed using s
360f0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 74  qlite3_step() it
36100 20 77 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74   will either aut
36110 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65  omatically.** re
36120 70 72 65 70 61 72 65 20 69 74 73 65 6c 66 20 28  prepare itself (
36130 69 66 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  if it was origin
36140 61 6c 6c 79 20 63 72 65 61 74 65 64 20 75 73 69  ally created usi
36150 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ng sqlite3_prepa
36160 72 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69  re_v2()).** or i
36170 74 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  t will fail with
36180 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a   SQLITE_SCHEMA..
36190 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  ** .** If P1 is 
361a0 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20  0, then all SQL 
361b0 73 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d  statements becom
361c0 65 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31  e expired. If P1
361d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a   is non-zero,.**
361e0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63   then only the c
361f0 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69  urrently executi
36200 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ng statement is 
36210 65 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65  expired..*/.case
36220 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20   OP_Expire: {.  
36230 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a  if( !pOp->p1 ){.
36240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
36250 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
36260 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65  nts(db);.  }else
36270 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
36280 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
36290 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
362a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
362b0 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65  _CACHE./* Opcode
362c0 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50  : TableLock P1 P
362d0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
362e0 6f 70 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f  opsis: iDb=P1 ro
362f0 6f 74 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a  ot=P2 write=P3.*
36300 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
36310 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ck on a particul
36320 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69  ar table. This i
36330 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e  nstruction is on
36340 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  ly used when.** 
36350 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
36360 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
36370 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69  led. .**.** P1 i
36380 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
36390 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 73  he database in s
363a0 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20  qlite3.aDb[] of 
363b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
363c0 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63  on which the loc
363d0 6b 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 20  k is acquired.  
363e0 41 20 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62  A readlock is ob
363f0 74 61 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20  tained if P3==0 
36400 6f 72 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  or.** a write lo
36410 63 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a  ck if P3==1..**.
36420 2a 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74  ** P2 contains t
36430 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  he root-page of 
36440 74 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63  the table to loc
36450 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74  k..**.** P4 cont
36460 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
36470 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  o the name of th
36480 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f  e table being lo
36490 63 6b 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e  cked. This is on
364a0 6c 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65  ly.** used to ge
364b0 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
364c0 6d 65 73 73 61 67 65 20 69 66 20 74 68 65 20 6c  message if the l
364d0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
364e0 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  tained..*/.case 
364f0 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a  OP_TableLock: {.
36500 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b    u8 isWriteLock
36510 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a   = (u8)pOp->p3;.
36520 20 20 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63    if( isWriteLoc
36530 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  k || 0==(db->fla
36540 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
36550 63 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 69  commit) ){.    i
36560 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  nt p1 = pOp->p1;
36570 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31   .    assert( p1
36580 3e 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44  >=0 && p1<db->nD
36590 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
365a0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
365b0 74 72 65 65 4d 61 73 6b 2c 20 70 31 29 20 29 3b  treeMask, p1) );
365c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 57  .    assert( isW
365d0 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69  riteLock==0 || i
365e0 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b  sWriteLock==1 );
365f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36600 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28  3BtreeLockTable(
36610 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c  db->aDb[p1].pBt,
36620 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74   pOp->p2, isWrit
36630 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
36640 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
36650 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
36660 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
36670 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36680 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
36690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
366a0 62 65 45 72 72 6f 72 28 70 2c 20 22 64 61 74 61  beError(p, "data
366b0 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
366c0 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  cked: %s", z);. 
366d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
366e0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
366f0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
36700 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
36710 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
36720 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
36730 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36740 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36750 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 42  LE./* Opcode: VB
36760 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  egin * * * P4 *.
36770 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20  **.** P4 may be 
36780 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
36790 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
367a0 75 63 74 75 72 65 2e 20 49 66 20 73 6f 2c 20 63  ucture. If so, c
367b0 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65 67  all the .** xBeg
367c0 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  in method for th
367d0 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  at table..**.** 
367e0 41 6c 73 6f 2c 20 77 68 65 74 68 65 72 20 6f 72  Also, whether or
367f0 20 6e 6f 74 20 50 34 20 69 73 20 73 65 74 2c 20   not P4 is set, 
36800 63 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  check that this 
36810 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63 61 6c  is not being cal
36820 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74 68  led from.** with
36830 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  in a callback to
36840 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
36850 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e   xSync() method.
36860 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 20 65   If it is, the e
36870 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77 69 6c  rror.** code wil
36880 6c 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  l be set to SQLI
36890 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61  TE_LOCKED..*/.ca
368a0 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a  se OP_VBegin: {.
368b0 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 3b    VTable *pVTab;
368c0 0a 20 20 70 56 54 61 62 20 3d 20 70 4f 70 2d 3e  .  pVTab = pOp->
368d0 70 34 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d  p4.pVtab;.  rc =
368e0 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69   sqlite3VtabBegi
368f0 6e 28 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20  n(db, pVTab);.  
36900 69 66 28 20 70 56 54 61 62 20 29 20 73 71 6c 69  if( pVTab ) sqli
36910 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
36920 6d 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56  msg(p, pVTab->pV
36930 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tab);.  if( rc )
36940 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
36950 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
36960 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
36970 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36980 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
36990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
369a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
369b0 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20  Opcode: VCreate 
369c0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
369d0 2a 20 50 32 20 69 73 20 61 20 72 65 67 69 73 74  * P2 is a regist
369e0 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
369f0 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74  e name of a virt
36a00 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ual table in dat
36a10 61 62 61 73 65 20 0a 2a 2a 20 50 31 2e 20 43 61  abase .** P1. Ca
36a20 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65 20 6d  ll the xCreate m
36a30 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74  ethod for that t
36a40 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
36a50 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20 20 4d 65  _VCreate: {.  Me
36a60 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  m sMem;         
36a70 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20   /* For storing 
36a80 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67  the record being
36a90 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f   decoded */.  co
36aa0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20  nst char *zTab; 
36ab0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
36ac0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
36ad0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d  ..  memset(&sMem
36ae0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d  , 0, sizeof(sMem
36af0 29 29 3b 0a 20 20 73 4d 65 6d 2e 64 62 20 3d 20  ));.  sMem.db = 
36b00 64 62 3b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65  db;.  /* Because
36b10 20 50 32 20 69 73 20 61 6c 77 61 79 73 20 61 20   P2 is always a 
36b20 73 74 61 74 69 63 20 73 74 72 69 6e 67 2c 20 69  static string, i
36b30 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
36b40 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  for the.  ** sql
36b50 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
36b60 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 61  ) to fail */.  a
36b70 73 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70  ssert( (aMem[pOp
36b80 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ->p2].flags & ME
36b90 4d 5f 53 74 72 29 21 3d 30 20 29 3b 0a 20 20 61  M_Str)!=0 );.  a
36ba0 73 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70  ssert( (aMem[pOp
36bb0 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ->p2].flags & ME
36bc0 4d 5f 53 74 61 74 69 63 29 21 3d 30 20 29 3b 0a  M_Static)!=0 );.
36bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
36be0 62 65 4d 65 6d 43 6f 70 79 28 26 73 4d 65 6d 2c  beMemCopy(&sMem,
36bf0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29   &aMem[pOp->p2])
36c00 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
36c10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a  SQLITE_OK );.  z
36c20 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
36c30 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
36c40 5f 74 65 78 74 28 26 73 4d 65 6d 29 3b 0a 20 20  _text(&sMem);.  
36c50 61 73 73 65 72 74 28 20 7a 54 61 62 20 7c 7c 20  assert( zTab || 
36c60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
36c70 20 29 3b 0a 20 20 69 66 28 20 7a 54 61 62 20 29   );.  if( zTab )
36c80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
36c90 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65  e3VtabCallCreate
36ca0 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 7a 54  (db, pOp->p1, zT
36cb0 61 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29  ab, &p->zErrMsg)
36cc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
36cd0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73  dbeMemRelease(&s
36ce0 4d 65 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Mem);.  if( rc )
36cf0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
36d00 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
36d10 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
36d20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36d30 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
36d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36d50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
36d60 4f 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79  Opcode: VDestroy
36d70 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
36d80 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d  ** P4 is the nam
36d90 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  e of a virtual t
36da0 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65  able in database
36db0 20 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78   P1.  Call the x
36dc0 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a  Destroy method.*
36dd0 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e  * of that table.
36de0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73  .*/.case OP_VDes
36df0 74 72 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56  troy: {.  db->nV
36e00 44 65 73 74 72 6f 79 2b 2b 3b 0a 20 20 72 63 20  Destroy++;.  rc 
36e10 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  = sqlite3VtabCal
36e20 6c 44 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70  lDestroy(db, pOp
36e30 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
36e40 3b 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f  ;.  db->nVDestro
36e50 79 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20  y--;.  if( rc ) 
36e60 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
36e70 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
36e80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
36e90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36ea0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
36eb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36ec0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
36ed0 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20  pcode: VOpen P1 
36ee0 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
36ef0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
36f00 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
36f10 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c  e object, an sql
36f20 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
36f30 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20  ure..** P1 is a 
36f40 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
36f50 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e  This opcode open
36f60 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68  s a cursor to th
36f70 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
36f80 6c 65 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68  le and stores th
36f90 61 74 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e  at cursor in P1.
36fa0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65  .*/.case OP_VOpe
36fb0 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  n: {.  VdbeCurso
36fc0 72 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74  r *pCur;.  sqlit
36fd0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
36fe0 70 56 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33  pVCur;.  sqlite3
36ff0 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
37000 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
37010 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a  dule *pModule;..
37020 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
37030 52 65 61 64 65 72 20 29 3b 0a 20 20 70 43 75 72  Reader );.  pCur
37040 20 3d 20 30 3b 0a 20 20 70 56 43 75 72 20 3d 20   = 0;.  pVCur = 
37050 30 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  0;.  pVtab = pOp
37060 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
37070 62 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d  b;.  if( pVtab==
37080 30 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62  0 || NEVER(pVtab
37090 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b  ->pModule==0) ){
370a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
370b0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74  _LOCKED;.    got
370c0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
370d0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64  rror;.  }.  pMod
370e0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
370f0 64 75 6c 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f  dule;.  rc = pMo
37100 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61  dule->xOpen(pVta
37110 62 2c 20 26 70 56 43 75 72 29 3b 0a 20 20 73 71  b, &pVCur);.  sq
37120 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
37130 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrmsg(p, pVtab);
37140 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
37150 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
37160 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ror;..  /* Initi
37170 61 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74  alize sqlite3_vt
37180 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63  ab_cursor base c
37190 6c 61 73 73 20 2a 2f 0a 20 20 70 56 43 75 72 2d  lass */.  pVCur-
371a0 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a  >pVtab = pVtab;.
371b0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
371c0 20 76 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a   vdbe cursor obj
371d0 65 63 74 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20  ect */.  pCur = 
371e0 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
371f0 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31  , pOp->p1, 0, -1
37200 2c 20 43 55 52 54 59 50 45 5f 56 54 41 42 29 3b  , CURTYPE_VTAB);
37210 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20  .  if( pCur ){. 
37220 20 20 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75     pCur->uc.pVCu
37230 72 20 3d 20 70 56 43 75 72 3b 0a 20 20 20 20 70  r = pVCur;.    p
37240 56 74 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Vtab->nRef++;.  
37250 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
37260 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
37270 6c 65 64 20 29 3b 0a 20 20 20 20 70 4d 6f 64 75  led );.    pModu
37280 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
37290 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  );.    goto no_m
372a0 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  em;.  }.  break;
372b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
372c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
372d0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
372e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
372f0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
37300 63 6f 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31  code: VFilter P1
37310 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
37320 79 6e 6f 70 73 69 73 3a 20 69 70 6c 61 6e 3d 72  ynopsis: iplan=r
37330 5b 50 33 5d 20 7a 70 6c 61 6e 3d 27 50 34 27 0a  [P3] zplan='P4'.
37340 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75  **.** P1 is a cu
37350 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e  rsor opened usin
37360 67 20 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20  g VOpen.  P2 is 
37370 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75  an address to ju
37380 6d 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20  mp to if.** the 
37390 66 69 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20  filtered result 
373a0 73 65 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  set is empty..**
373b0 0a 2a 2a 20 50 34 20 69 73 20 65 69 74 68 65 72  .** P4 is either
373c0 20 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e   NULL or a strin
373d0 67 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  g that was gener
373e0 61 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ated by the xBes
373f0 74 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64  tIndex.** method
37400 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20   of the module. 
37410 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 61 74   The interpretat
37420 69 6f 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74  ion of the P4 st
37430 72 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20  ring is left.** 
37440 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d  to the module im
37450 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  plementation..**
37460 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
37470 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c  invokes the xFil
37480 74 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68  ter method on th
37490 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
374a0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
374b0 50 31 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72  P1.  The integer
374c0 20 71 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61   query plan para
374d0 6d 65 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72  meter to xFilter
374e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
374f0 67 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65  gister.** P3. Re
37500 67 69 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72  gister P3+1 stor
37510 65 73 20 74 68 65 20 61 72 67 63 20 70 61 72 61  es the argc para
37520 6d 65 74 65 72 20 74 6f 20 62 65 20 70 61 73 73  meter to be pass
37530 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69  ed to the.** xFi
37540 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67  lter method. Reg
37550 69 73 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b  isters P3+2..P3+
37560 31 2b 61 72 67 63 20 61 72 65 20 74 68 65 20 61  1+argc are the a
37570 72 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  rgc.** additiona
37580 6c 20 70 61 72 61 6d 65 74 65 72 73 20 77 68 69  l parameters whi
37590 63 68 20 61 72 65 20 70 61 73 73 65 64 20 74 6f  ch are passed to
375a0 0a 2a 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61  .** xFilter as a
375b0 72 67 76 2e 20 52 65 67 69 73 74 65 72 20 50 33  rgv. Register P3
375c0 2b 32 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b  +2 becomes argv[
375d0 30 5d 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  0] when passed t
375e0 6f 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a  o xFilter..**.**
375f0 20 41 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   A jump is made 
37600 74 6f 20 50 32 20 69 66 20 74 68 65 20 72 65 73  to P2 if the res
37610 75 6c 74 20 73 65 74 20 61 66 74 65 72 20 66 69  ult set after fi
37620 6c 74 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65  ltering would be
37630 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20   empty..*/.case 
37640 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20  OP_VFilter: {   
37650 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  /* jump */.  int
37660 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75   nArg;.  int iQu
37670 65 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  ery;.  const sql
37680 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
37690 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75  dule;.  Mem *pQu
376a0 65 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  ery;.  Mem *pArg
376b0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  c;.  sqlite3_vta
376c0 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b  b_cursor *pVCur;
376d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
376e0 2a 70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75  *pVtab;.  VdbeCu
376f0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
37700 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a  t res;.  int i;.
37710 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a    Mem **apArg;..
37720 20 20 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d    pQuery = &aMem
37730 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72  [pOp->p3];.  pAr
37740 67 63 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b  gc = &pQuery[1];
37750 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  .  pCur = p->apC
37760 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
37770 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
37780 64 28 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52  d(pQuery) );.  R
37790 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
377a0 70 2d 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a  p->p3, pQuery);.
377b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
377c0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
377d0 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 56 43 75  E_VTAB );.  pVCu
377e0 72 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43  r = pCur->uc.pVC
377f0 75 72 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56  ur;.  pVtab = pV
37800 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  Cur->pVtab;.  pM
37810 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
37820 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72  Module;..  /* Gr
37830 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d  ab the index num
37840 62 65 72 20 61 6e 64 20 61 72 67 63 20 70 61 72  ber and argc par
37850 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
37860 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c  ert( (pQuery->fl
37870 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  ags&MEM_Int)!=0 
37880 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d  && pArgc->flags=
37890 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41  =MEM_Int );.  nA
378a0 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d  rg = (int)pArgc-
378b0 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d  >u.i;.  iQuery =
378c0 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e   (int)pQuery->u.
378d0 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  i;..  /* Invoke 
378e0 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
378f0 6f 64 20 2a 2f 0a 20 20 72 65 73 20 3d 20 30 3b  od */.  res = 0;
37900 0a 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70  .  apArg = p->ap
37910 41 72 67 3b 0a 20 20 66 6f 72 28 69 20 3d 20 30  Arg;.  for(i = 0
37920 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
37930 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26      apArg[i] = &
37940 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a  pArgc[i+1];.  }.
37950 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
37960 78 46 69 6c 74 65 72 28 70 56 43 75 72 2c 20 69  xFilter(pVCur, i
37970 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a  Query, pOp->p4.z
37980 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a  , nArg, apArg);.
37990 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
379a0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
379b0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
379c0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
379d0 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d  o_error;.  res =
379e0 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
379f0 56 43 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 6e  VCur);.  pCur->n
37a00 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 56 64  ullRow = 0;.  Vd
37a10 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
37a20 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72  s!=0,2);.  if( r
37a30 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  es ) goto jump_t
37a40 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
37a50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37a60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
37a70 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
37a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
37a90 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
37aa0 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50  de: VColumn P1 P
37ab0 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
37ac0 70 73 69 73 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c  psis: r[P3]=vcol
37ad0 75 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74  umn(P2).**.** St
37ae0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
37af0 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
37b00 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20  n of.** the row 
37b10 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74  of the virtual-t
37b20 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a  able that the .*
37b30 2a 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 70  * P1 cursor is p
37b40 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20  ointing to into 
37b50 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a  register P3..*/.
37b60 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a  case OP_VColumn:
37b70 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
37b80 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
37b90 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
37ba0 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d   *pModule;.  Mem
37bb0 20 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74   *pDest;.  sqlit
37bc0 65 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74  e3_context sCont
37bd0 65 78 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73  ext;..  VdbeCurs
37be0 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70  or *pCur = p->ap
37bf0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
37c00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43  assert( pCur->eC
37c10 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
37c20 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74  VTAB );.  assert
37c30 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
37c40 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
37c50 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
37c60 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61   );.  pDest = &a
37c70 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
37c80 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
37c90 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66  (p, pDest);.  if
37ca0 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
37cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
37cc0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
37cd0 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
37ce0 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43    }.  pVtab = pC
37cf0 75 72 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56  ur->uc.pVCur->pV
37d00 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d  tab;.  pModule =
37d10 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
37d20 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75  .  assert( pModu
37d30 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20  le->xColumn );. 
37d40 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78   memset(&sContex
37d50 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f  t, 0, sizeof(sCo
37d60 6e 74 65 78 74 29 29 3b 0a 20 20 73 43 6f 6e 74  ntext));.  sCont
37d70 65 78 74 2e 70 4f 75 74 20 3d 20 70 44 65 73 74  ext.pOut = pDest
37d80 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
37d90 61 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75  ag(pDest, MEM_Nu
37da0 6c 6c 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  ll);.  rc = pMod
37db0 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75  ule->xColumn(pCu
37dc0 72 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26 73 43  r->uc.pVCur, &sC
37dd0 6f 6e 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29  ontext, pOp->p2)
37de0 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 49  ;.  sqlite3VtabI
37df0 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70  mportErrmsg(p, p
37e00 56 74 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f  Vtab);.  if( sCo
37e10 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 20 29 7b  ntext.isError ){
37e20 0a 20 20 20 20 72 63 20 3d 20 73 43 6f 6e 74 65  .    rc = sConte
37e30 78 74 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a  xt.isError;.  }.
37e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
37e50 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 44 65 73  ngeEncoding(pDes
37e60 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  t, encoding);.  
37e70 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
37e80 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a  Op->p3, pDest);.
37e90 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
37ea0 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20  BSIZE(pDest);.. 
37eb0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
37ec0 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29  MemTooBig(pDest)
37ed0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
37ee0 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _big;.  }.  if( 
37ef0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
37f00 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
37f10 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
37f20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
37f30 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
37f40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37f50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37f60 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78  ./* Opcode: VNex
37f70 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
37f80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74  .** Advance virt
37f90 75 61 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20  ual table P1 to 
37fa0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
37fb0 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 20 61  its result set a
37fc0 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e  nd.** jump to in
37fd0 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f  struction P2.  O
37fe0 72 2c 20 69 66 20 74 68 65 20 76 69 72 74 75 61  r, if the virtua
37ff0 6c 20 74 61 62 6c 65 20 68 61 73 20 72 65 61 63  l table has reac
38000 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  hed.** the end o
38010 66 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74  f its result set
38020 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
38030 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
38040 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
38050 63 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b  case OP_VNext: {
38060 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
38070 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
38080 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
38090 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
380a0 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  dule;.  int res;
380b0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
380c0 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b  Cur;..  res = 0;
380d0 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  .  pCur = p->apC
380e0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
380f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75  ssert( pCur->eCu
38100 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56  rType==CURTYPE_V
38110 54 41 42 20 29 3b 0a 20 20 69 66 28 20 70 43 75  TAB );.  if( pCu
38120 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  r->nullRow ){.  
38130 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70    break;.  }.  p
38140 56 74 61 62 20 3d 20 70 43 75 72 2d 3e 75 63 2e  Vtab = pCur->uc.
38150 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20  pVCur->pVtab;.  
38160 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
38170 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
38180 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  rt( pModule->xNe
38190 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  xt );..  /* Invo
381a0 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d  ke the xNext() m
381b0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
381c0 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ule. There is no
381d0 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a   way for the.  *
381e0 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70  * underlying imp
381f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72  lementation to r
38200 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
38210 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72  f one occurs dur
38220 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29  ing.  ** xNext()
38230 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e  . Instead, if an
38240 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
38250 72 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  rue is returned 
38260 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
38270 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61   .  ** data is a
38280 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68  vailable) and th
38290 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
382a0 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75  urned when xColu
382b0 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20  mn or.  ** some 
382c0 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69