/ Hex Artifact Content
Login

Artifact 6a454c0f6c43275e2fcc0b2ea85374e034dd21b7d5f8f9fe8994ebf6cefe9b61:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 20 20 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d  }.  /* TEXT->NUM
26d0: 45 52 49 43 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e  ERIC is many->on
26e0: 65 2e 20 20 48 65 6e 63 65 2c 20 69 74 20 69 73  e.  Hence, it is
26f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 69 6e   important to in
2700: 76 61 6c 69 64 61 74 65 20 74 68 65 0a 20 20 2a  validate the.  *
2710: 2a 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  * string represe
2720: 6e 74 61 74 69 6f 6e 20 61 66 74 65 72 20 63 6f  ntation after co
2730: 6d 70 75 74 69 6e 67 20 61 20 6e 75 6d 65 72 69  mputing a numeri
2740: 63 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 62 65  c equivalent, be
2750: 63 61 75 73 65 20 74 68 65 0a 20 20 2a 2a 20 73  cause the.  ** s
2760: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2770: 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62  tion might not b
2780: 65 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  e the canonical 
2790: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
27a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 65  or the.  ** nume
27b0: 72 69 63 20 76 61 6c 75 65 2e 20 20 54 69 63 6b  ric value.  Tick
27c0: 65 74 20 5b 33 34 33 36 33 34 39 34 32 64 64 35  et [343634942dd5
27d0: 34 61 62 35 37 62 37 30 32 34 5d 20 32 30 31 38  4ab57b7024] 2018
27e0: 2d 30 31 2d 33 31 2e 20 2a 2f 0a 20 20 70 52 65  -01-31. */.  pRe
27f0: 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  c->flags &= ~MEM
2800: 5f 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  _Str;.}../*.** P
2810: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2820: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2830: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
2840: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
2850: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
2860: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
2870: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
2880: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
2890: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
28a0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
28b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
28c0: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
28d0: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
28e0: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
28f0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2900: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2910: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2920: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2930: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
2940: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
2950: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
2960: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
2970: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
2980: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
2990: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
29a0: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
29b0: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
29c0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
29d0: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
29e0: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
29f0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2a00: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2a10: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a  LITE_AFF_BLOB:.*
2a20: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2a30: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
2a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2a50: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
2a60: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
2a70: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
2a80: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
2a90: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2aa0: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2ab0: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2ac0: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2ad0: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2ae0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2af0: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2b00: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2b10: 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
2b20: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
2b30: 61 73 73 65 72 74 28 20 61 66 66 69 6e 69 74 79  assert( affinity
2b40: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
2b50: 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79  EGER || affinity
2b60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
2b70: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  L.             |
2b80: 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  | affinity==SQLI
2b90: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
2ba0: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
2bb0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
2bc0: 29 3d 3d 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  )==0 ){ /*OPTIMI
2bd0: 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a  ZATION-IF-FALSE*
2be0: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65  /.      if( (pRe
2bf0: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  c->flags & MEM_R
2c00: 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
2c10: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
2c20: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 61  gs & MEM_Str ) a
2c30: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
2c40: 69 74 79 28 70 52 65 63 2c 31 29 3b 0a 20 20 20  ity(pRec,1);.   
2c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
2c70: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65  egerAffinity(pRe
2c80: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2c90: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66  }.  }else if( af
2ca0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2cb0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
2cc0: 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74  * Only attempt t
2cd0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
2ce0: 20 54 45 58 54 20 69 66 20 74 68 65 72 65 20 69   TEXT if there i
2cf0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  s an integer or 
2d00: 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72  real.    ** repr
2d10: 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62  esentation (blob
2d20: 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74   and NULL do not
2d30: 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20   get converted) 
2d40: 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20  but no string.  
2d50: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
2d60: 69 6f 6e 2e 20 20 49 74 20 77 6f 75 6c 64 20 62  ion.  It would b
2d70: 65 20 68 61 72 6d 6c 65 73 73 20 74 6f 20 72 65  e harmless to re
2d80: 70 65 61 74 20 74 68 65 20 63 6f 6e 76 65 72 73  peat the convers
2d90: 69 6f 6e 20 69 66 20 0a 20 20 20 20 2a 2a 20 74  ion if .    ** t
2da0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
2db0: 61 20 73 74 72 69 6e 67 20 72 65 70 2c 20 62 75  a string rep, bu
2dc0: 74 20 69 74 20 69 73 20 70 6f 69 6e 74 6c 65 73  t it is pointles
2dd0: 73 20 74 6f 20 77 61 73 74 65 20 74 68 6f 73 65  s to waste those
2de0: 0a 20 20 20 20 2a 2a 20 43 50 55 20 63 79 63 6c  .    ** CPU cycl
2df0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 30  es. */.    if( 0
2e00: 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ==(pRec->flags&M
2e10: 45 4d 5f 53 74 72 29 20 29 7b 20 2f 2a 4f 50 54  EM_Str) ){ /*OPT
2e20: 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
2e30: 53 45 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  SE*/.      if( (
2e40: 70 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  pRec->flags&(MEM
2e50: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20  _Real|MEM_Int)) 
2e60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e70: 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
2e80: 66 79 28 70 52 65 63 2c 20 65 6e 63 2c 20 31 29  fy(pRec, enc, 1)
2e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ea0: 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20      pRec->flags 
2eb0: 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  &= ~(MEM_Real|ME
2ec0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Int);.  }.}../
2ed0: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76  *.** Try to conv
2ee0: 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66 20  ert the type of 
2ef0: 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  a function argum
2f00: 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20  ent or a result 
2f10: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61  column.** into a
2f20: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
2f30: 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69  ntation.  Use ei
2f40: 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20  ther INTEGER or 
2f50: 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a  REAL whichever.*
2f60: 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  * is appropriate
2f70: 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74  .  But only do t
2f80: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66  he conversion if
2f90: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2fa0: 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20  without.** loss 
2fb0: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  of information a
2fc0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
2fd0: 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74 68  vised type of th
2fe0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  e argument..*/.i
2ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
3000: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71  _numeric_type(sq
3010: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
3020: 6c 29 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 20  l){.  int eType 
3030: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3040: 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 69 66  type(pVal);.  if
3050: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
3060: 54 45 58 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20  TEXT ){.    Mem 
3070: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56  *pMem = (Mem*)pV
3080: 61 6c 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d  al;.    applyNum
3090: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
30a0: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 54 79 70 65  m, 0);.    eType
30b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30c0: 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d  _type(pVal);.  }
30d0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
30e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74  .}../*.** Export
30f0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70  ed version of ap
3100: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54  plyAffinity(). T
3110: 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e  his one works on
3120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c   sqlite3_value*,
3130: 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74   .** not the int
3140: 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e  ernal Mem* type.
3150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3160: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
3170: 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ty(.  sqlite3_va
3180: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38  lue *pVal, .  u8
3190: 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38   affinity, .  u8
31a0: 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41   enc.){.  applyA
31b0: 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70  ffinity((Mem *)p
31c0: 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  Val, affinity, e
31d0: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d  nc);.}../*.** pM
31e0: 65 6d 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  em currently onl
31f0: 79 20 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67  y holds a string
3200: 20 74 79 70 65 20 28 6f 72 20 6d 61 79 62 65 20   type (or maybe 
3210: 61 20 42 4c 4f 42 20 74 68 61 74 20 77 65 20 63  a BLOB that we c
3220: 61 6e 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 20  an.** interpret 
3230: 61 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 77  as a string if w
3240: 65 20 77 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d  e want to).  Com
3250: 70 75 74 65 20 69 74 73 20 63 6f 72 72 65 73 70  pute its corresp
3260: 6f 6e 64 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69  onding.** numeri
3270: 63 20 74 79 70 65 2c 20 69 66 20 68 61 73 20 6f  c type, if has o
3280: 6e 65 2e 20 20 53 65 74 20 74 68 65 20 70 4d 65  ne.  Set the pMe
3290: 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d  m->u.r and pMem-
32a0: 3e 75 2e 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61  >u.i fields.** a
32b0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
32c0: 74 61 74 69 63 20 75 31 36 20 53 51 4c 49 54 45  tatic u16 SQLITE
32d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74  _NOINLINE comput
32e0: 65 4e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d  eNumericType(Mem
32f0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72   *pMem){.  asser
3300: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
3310: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3320: 65 61 6c 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  eal))==0 );.  as
3330: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
3340: 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45  gs & (MEM_Str|ME
3350: 4d 5f 42 6c 6f 62 29 29 21 3d 30 20 29 3b 0a 20  M_Blob))!=0 );. 
3360: 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46   if( sqlite3AtoF
3370: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d  (pMem->z, &pMem-
3380: 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70  >u.r, pMem->n, p
3390: 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a  Mem->enc)==0 ){.
33a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
33b0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
33c0: 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26  toi64(pMem->z, &
33d0: 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d  pMem->u.i, pMem-
33e0: 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d  >n, pMem->enc)==
33f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3400: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72  MEM_Int;.  }.  r
3410: 65 74 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a  eturn MEM_Real;.
3420: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3430: 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
3440: 20 66 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65   for pMem, eithe
3450: 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d  r MEM_Int or MEM
3460: 5f 52 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72  _Real or both or
3470: 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a  .** none.  .**.*
3480: 2a 20 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75  * Unlike applyNu
3490: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c  mericAffinity(),
34a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
34b0: 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d  es not modify pM
34c0: 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75  em->flags..** Bu
34d0: 74 20 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d  t it does set pM
34e0: 65 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d  em->u.r and pMem
34f0: 2d 3e 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74  ->u.i appropriat
3500: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ely..*/.static u
3510: 31 36 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d  16 numericType(M
3520: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28  em *pMem){.  if(
3530: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
3540: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
3550: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3560: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3570: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
3580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
3590: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
35a0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a  tr|MEM_Blob) ){.
35b0: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75      return compu
35c0: 74 65 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d  teNumericType(pM
35d0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  em);.  }.  retur
35e0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
35f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3600: 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73  * Write a nice s
3610: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74  tion of the cont
3630: 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65  ents of cell pMe
3640: 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72  m.** into buffer
3650: 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42   zBuf, length nB
3660: 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uf..*/.void sqli
3670: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
3680: 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Print(Mem *pMem,
3690: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
36a0: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75  char *zCsr = zBu
36b0: 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65  f;.  int f = pMe
36c0: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61  m->flags;..  sta
36d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
36e0: 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d  const encnames[]
36f0: 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22   = {"(X)", "(8)"
3700: 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36  , "(16LE)", "(16
3710: 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26  BE)"};..  if( f&
3720: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
3730: 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
3740: 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  c;.    if( f & M
3750: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
3760: 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  c = 'z';.      a
3770: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3780: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3790: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
37a0: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
37b0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
37c0: 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  c = 't';.      a
37d0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
37e0: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
37f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3800: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3810: 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  em ){.      c = 
3820: 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'e';.      asser
3830: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3840: 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30  tic|MEM_Dyn))==0
3850: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
3860: 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20       c = 's';.  
3870: 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b 2b    }.    *(zCsr++
3880: 29 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74  ) = c;.    sqlit
3890: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
38a0: 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d   zCsr, "%d[", pM
38b0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72  em->n);.    zCsr
38c0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
38d0: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66  n30(zCsr);.    f
38e0: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
38f0: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3910: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3920: 72 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74  r, "%02X", ((int
3930: 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78  )pMem->z[i] & 0x
3940: 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  FF));.      zCsr
3950: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3960: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3980: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
39a0: 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d  r z = pMem->z[i]
39b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32  ;.      if( z<32
39c0: 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73   || z>126 ) *zCs
39d0: 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  r++ = '.';.     
39e0: 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20   else *zCsr++ = 
39f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a  z;.    }.    *(z
3a00: 43 73 72 2b 2b 29 20 3d 20 27 5d 27 3b 0a 20 20  Csr++) = ']';.  
3a10: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65    if( f & MEM_Ze
3a20: 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ro ){.      sqli
3a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
3a40: 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d  , zCsr,"+%dz",pM
3a50: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20  em->u.nZero);.  
3a60: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3a70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  );.    }.    *zC
3a90: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
3aa0: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
3ab0: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  tr ){.    int j,
3ac0: 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20   k;.    zBuf[0] 
3ad0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66  = ' ';.    if( f
3ae0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3af0: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
3b00: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
3b10: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3b20: 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  c|MEM_Ephem))==0
3b30: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
3b40: 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63  ( f & MEM_Static
3b50: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3b60: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  ] = 't';.      a
3b70: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3b80: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
3b90: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3ba0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3bb0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  em ){.      zBuf
3bc0: 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20  [1] = 'e';.     
3bd0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
3be0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79  EM_Static|MEM_Dy
3bf0: 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  n))==0 );.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
3c10: 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a  1] = 's';.    }.
3c20: 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73      k = 2;.    s
3c30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3c40: 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22  100, &zBuf[k], "
3c50: 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  %d", pMem->n);. 
3c60: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3c70: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3c80: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3c90: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28   = '[';.    for(
3ca0: 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70  j=0; j<15 && j<p
3cb0: 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Mem->n; j++){.  
3cc0: 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d      u8 c = pMem-
3cd0: 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >z[j];.      if(
3ce0: 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78   c>=0x20 && c<0x
3cf0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  7f ){.        zB
3d00: 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  uf[k++] = c;.   
3d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d20: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e    zBuf[k++] = '.
3d30: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
3d40: 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d  .    zBuf[k++] =
3d50: 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   ']';.    sqlite
3d60: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26  3_snprintf(100,&
3d70: 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65  zBuf[k], encname
3d80: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
3d90: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3da0: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3db0: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3dc0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
3dd0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
3de0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
3df0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
3e00: 20 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20   a register for 
3e10: 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73  tracing purposes
3e20: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  :.*/.static void
3e30: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d   memTracePrint(M
3e40: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
3e50: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64  >flags & MEM_Und
3e60: 65 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72  efined ){.    pr
3e70: 69 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64  intf(" undefined
3e80: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
3e90: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  p->flags & MEM_N
3ea0: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ull ){.    print
3eb0: 66 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  f(p->flags & MEM
3ec0: 5f 5a 65 72 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e  _Zero ? " NULL-n
3ed0: 6f 63 68 6e 67 22 20 3a 20 22 20 4e 55 4c 4c 22  ochng" : " NULL"
3ee0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
3ef0: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
3f00: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
3f10: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3f20: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3f30: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3f40: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3f50: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3f60: 6e 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  nt ){.    printf
3f70: 28 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75  (" i:%lld", p->u
3f80: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
3f90: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
3fa0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
3fb0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3fc0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
3fd0: 72 69 6e 74 66 28 22 20 72 3a 25 67 22 2c 20 70  rintf(" r:%g", p
3fe0: 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ->u.r);.#endif. 
3ff0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
4000: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
4010: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4020: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
4030: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
4040: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
4050: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
4060: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
4070: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 25  ;.    printf(" %
4080: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  s", zBuf);.  }. 
4090: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
40a0: 4d 45 4d 5f 53 75 62 74 79 70 65 20 29 20 70 72  MEM_Subtype ) pr
40b0: 69 6e 74 66 28 22 20 73 75 62 74 79 70 65 3d 30  intf(" subtype=0
40c0: 78 25 30 32 78 22 2c 20 70 2d 3e 65 53 75 62 74  x%02x", p->eSubt
40d0: 79 70 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ype);.}.static v
40e0: 6f 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63  oid registerTrac
40f0: 65 28 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  e(int iReg, Mem 
4100: 2a 70 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 52  *p){.  printf("R
4110: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
4120: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
4130: 6e 74 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 28  nt(p);.  printf(
4140: 22 5c 6e 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  "\n");.  sqlite3
4150: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
4160: 72 69 61 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e  riants(p);.}.#en
4170: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4180: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4190: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
41a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
41b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
41c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
41d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
41e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
41f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4200: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4210: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4220: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4230: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4240: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4250: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4260: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4270: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4290: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
42a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
42b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
42c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
42d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
42e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
42f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4300: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4310: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4320: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4330: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4350: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4360: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4370: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4380: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4390: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
43a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
43b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
43c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
43d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
43e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
43f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4400: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4410: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4420: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4430: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4440: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4450: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4460: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4470: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4480: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4490: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
44a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
44b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
44c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
44d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
44e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
44f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4500: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4510: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4520: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4530: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4540: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4550: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4570: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4580: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4590: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
45a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
45b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
45c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
45d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
45e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
45f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4600: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4610: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4620: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4630: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4640: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4650: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4660: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4670: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4680: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4690: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
46a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
46b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
46c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
46d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
46e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
46f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4700: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4710: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4720: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4730: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4740: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4750: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4760: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4770: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4780: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
47a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
47b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
47c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
47d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
47e0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
47f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4800: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4810: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4820: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4830: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4840: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4860: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4870: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4880: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
48a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
48b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
48c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
48d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
48e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
48f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4910: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4920: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4930: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4950: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4960: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4970: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4980: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4990: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
49a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
49b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
49c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
49d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
49e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4a00: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4a10: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4a20: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4a30: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4a40: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4a50: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a70: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4a80: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4a90: 72 6f 67 72 65 73 73 4c 69 6d 69 74 3b 20 20 20  rogressLimit;   
4aa0: 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72  /* Invoke xProgr
4ab0: 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53 74  ess() when nVmSt
4ac0: 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73 20  ep reaches this 
4ad0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20  */.#endif.  Mem 
4ae0: 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *aMem = p->aMem;
4af0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
4b00: 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d  f p->aMem */.  M
4b10: 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20  em *pIn1 = 0;   
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
4b30: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
4b40: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20  /.  Mem *pIn2 = 
4b50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4b60: 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65 72  * 2nd input oper
4b70: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
4b80: 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n3 = 0;         
4b90: 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75 74      /* 3rd input
4ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4bb0: 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20 20  m *pOut = 0;    
4bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
4bd0: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69  ut operand */.#i
4be0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4bf0: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c10: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
4c20: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
4c30: 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  code */.#endif. 
4c40: 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54 41   /*** INSERT STA
4c50: 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a  CK UNION HERE **
4c60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
4c70: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4c80: 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71  IC_RUN );  /* sq
4c90: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65 72  lite3_step() ver
4ca0: 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ifies this */.  
4cb0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
4cc0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  (p);.  if( p->rc
4cd0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
4ce0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
4cf0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
4d00: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
4d10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
4d20: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
4d30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4d40: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
4d50: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74  led.  */.    got
4d60: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
4d70: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4d80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
4d90: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
4da0: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
4db0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
4dc0: 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d  || p->readOnly!=
4dd0: 30 20 29 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65  0 );.  p->iCurre
4de0: 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73  ntTime = 0;.  as
4df0: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
4e00: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73  ==0 );.  p->pRes
4e10: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64 62  ultSet = 0;.  db
4e20: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
4e30: 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 64  usy = 0;.  if( d
4e40: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
4e50: 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  ted ) goto abort
4e60: 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70  _due_to_interrup
4e70: 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
4e80: 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23  IOTraceSql(p);.#
4e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ea0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4eb0: 42 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78  BACK.  if( db->x
4ec0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
4ed0: 75 33 32 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e  u32 iPrior = p->
4ee0: 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f  aCounter[SQLITE_
4ef0: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
4f00: 45 50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  EP];.    assert(
4f10: 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65   0 < db->nProgre
4f20: 73 73 4f 70 73 20 29 3b 0a 20 20 20 20 6e 50 72  ssOps );.    nPr
4f30: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 64 62  ogressLimit = db
4f40: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d  ->nProgressOps -
4f50: 20 28 69 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e   (iPrior % db->n
4f60: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
4f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 6f 67  }else{.    nProg
4f80: 72 65 73 73 4c 69 6d 69 74 20 3d 20 30 78 66 66  ressLimit = 0xff
4f90: 66 66 66 66 66 66 3b 0a 20 20 7d 0a 23 65 6e 64  ffffff;.  }.#end
4fa0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4fb0: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4fc0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4fd0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4fe0: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
4ff0: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
5000: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
5010: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
5020: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
5030: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
5040: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
5050: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
5060: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
5070: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
5080: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5090: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
50a0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
50b0: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
50c0: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
50d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
50e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
50f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5100: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
5110: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
5120: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
5130: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5140: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
5150: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5160: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5170: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
5180: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
5190: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
51a0: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
51b0: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
51c0: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
51d0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
51e0: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
51f0: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5200: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5220: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5230: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5240: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
5250: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
5260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
5270: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
5280: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
5290: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
52a0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
52b0: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
52c0: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
52d0: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
52e0: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
52f0: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5300: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5310: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5320: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5340: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
5350: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
5360: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
5370: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
5380: 74 65 33 4e 50 72 6f 66 69 6c 65 43 6e 74 20 3f  te3NProfileCnt ?
5390: 20 73 71 6c 69 74 65 33 4e 50 72 6f 66 69 6c 65   sqlite3NProfile
53a0: 43 6e 74 20 3a 20 73 71 6c 69 74 65 33 48 77 74  Cnt : sqlite3Hwt
53b0: 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ime();.#endif.  
53c0: 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a 23 69 66    nVmStep++;.#if
53d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
53e0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
53f0: 53 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 6e 45  S.    if( p->anE
5400: 78 65 63 20 29 20 70 2d 3e 61 6e 45 78 65 63 5b  xec ) p->anExec[
5410: 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29 5d 2b  (int)(pOp-aOp)]+
5420: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  +;.#endif..    /
5430: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61  * Only allow tra
5440: 63 69 6e 67 20 69 66 20 53 51 4c 49 54 45 5f 44  cing if SQLITE_D
5450: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
5460: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
5470: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
5480: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
5490: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
54a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
54b0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
54c0: 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  out, (int)(pOp -
54d0: 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a 20 20 20   aOp), pOp);.   
54e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
54f0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
5500: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
5510: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
5520: 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68 69 73  interrupt.  This
5530: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a 20 20   only happens.  
5540: 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76 65 20    ** if we have 
5550: 61 20 73 70 65 63 69 61 6c 20 74 65 73 74 20 62  a special test b
5560: 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  uild..    */.#if
5570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
5580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5590: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e  interrupt_count>
55a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
55b0: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
55c0: 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  nt--;.      if( 
55d0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
55e0: 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20  t_count==0 ){.  
55f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
5600: 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 20  terrupt(db);.   
5610: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
5620: 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79  f..    /* Sanity
5630: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68   checking on oth
5640: 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23  er operands */.#
5650: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5660: 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  UG.    {.      u
5670: 38 20 6f 70 50 72 6f 70 65 72 74 79 20 3d 20 73  8 opProperty = s
5680: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
5690: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
56a0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70  ];.      if( (op
56b0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
56c0: 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN1)!=0 ){.    
56d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
56e0: 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p1>0 );.       
56f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
5700: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
5710: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
5720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
5730: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
5740: 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20  Op->p1]) );.    
5750: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5760: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
5770: 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b  nvariants(&aMem[
5780: 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20  pOp->p1]) );.   
5790: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
57a0: 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26 61 4d  ACE(pOp->p1, &aM
57b0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  em[pOp->p1]);.  
57c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
57d0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
57e0: 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20  FLG_IN2)!=0 ){. 
57f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5800: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
5810: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5820: 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p2<=(p->nMem+1 
5830: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5840: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5850: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
5860: 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20  m[pOp->p2]) );. 
5870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5880: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
5890: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
58a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a  em[pOp->p2]) );.
58b0: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
58c0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
58d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
58e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
58f0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5900: 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29   OPFLG_IN3)!=0 )
5910: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5920: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20  ( pOp->p3>0 );. 
5930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5940: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
5950: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
5960: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5970: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5980: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29  aMem[pOp->p3]) )
5990: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
59a0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
59b0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
59c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20  &aMem[pOp->p3]) 
59d0: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
59e0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
59f0: 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  3, &aMem[pOp->p3
5a00: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5a10: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5a20: 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21  y & OPFLG_OUT2)!
5a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5a40: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
5a50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5a60: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  t( pOp->p2<=(p->
5a70: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
5a80: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
5a90: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
5aa0: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
5ab0: 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
5ac0: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
5ad0: 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29  ty & OPFLG_OUT3)
5ae0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5af0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
5b00: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5b10: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
5b20: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
5b30: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
5b40: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
5b50: 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
5b60: 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p3]);.      }.  
5b70: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
5b80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
5b90: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
5ba0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
5bb0: 20 20 70 4f 72 69 67 4f 70 20 3d 20 70 4f 70 3b    pOrigOp = pOp;
5bc0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 73  .#endif.  .    s
5bd0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
5be0: 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  de ){../********
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c30: 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f  *****.** What fo
5c40: 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73 73 69  llows is a massi
5c50: 76 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d  ve switch statem
5c60: 65 6e 74 20 77 68 65 72 65 20 65 61 63 68 20 63  ent where each c
5c70: 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ase implements a
5c80: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 73  .** separate ins
5c90: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
5ca0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
5cb0: 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74    If we follow t
5cc0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65  he usual.** inde
5cd0: 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69  ntation conventi
5ce0: 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65 20 73  ons, each case s
5cf0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
5d00: 64 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  d by 6 spaces.  
5d10: 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  But.** that is a
5d20: 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64 20 73   lot of wasted s
5d30: 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  pace on the left
5d40: 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74 68 65   margin.  So the
5d50: 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20   code within.** 
5d60: 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65  the switch state
5d70: 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61 6b 20  ment will break 
5d80: 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  with convention 
5d90: 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c 65 66  and be flush-lef
5da0: 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69  t. Another.** bi
5db0: 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c  g comment (simil
5dc0: 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65 29 20  ar to this one) 
5dd0: 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f  will mark the po
5de0: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
5df0: 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e  where.** we tran
5e00: 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e  sition back to n
5e10: 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
5e20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
5e30: 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63 68 20  matting of each 
5e40: 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  case is importan
5e50: 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69 6c 65  t.  The makefile
5e60: 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67   for SQLite.** g
5e70: 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43 20 66  enerates two C f
5e80: 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e 68 22  iles "opcodes.h"
5e90: 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e 63 22   and "opcodes.c"
5ea0: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
5eb0: 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e  s.** file lookin
5ec0: 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68 61 74  g for lines that
5ed0: 20 62 65 67 69 6e 20 77 69 74 68 20 22 63 61 73   begin with "cas
5ee0: 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f 70 63  e OP_".  The opc
5ef0: 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20  odes.h files.** 
5f00: 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64 20 77  will be filled w
5f10: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
5f20: 74 20 67 69 76 65 20 75 6e 69 71 75 65 20 69 6e  t give unique in
5f30: 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20  teger values to 
5f40: 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  each.** opcode a
5f50: 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73 2e 63  nd the opcodes.c
5f60: 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65 64 20   file is filled 
5f70: 77 69 74 68 20 61 6e 20 61 72 72 61 79 20 6f 66  with an array of
5f80: 20 73 74 72 69 6e 67 73 20 77 68 65 72 65 0a 2a   strings where.*
5f90: 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20 69 73  * each string is
5fa0: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
5fb0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  me for the corre
5fc0: 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e  sponding opcode.
5fd0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61 73 65    If the.** case
5fe0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
5ff0: 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6d 6d  llowed by a comm
6000: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ent of the form 
6010: 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20  "/# same as ... 
6020: 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d  #/".** that comm
6030: 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ent is used to d
6040: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 72  etermine the par
6050: 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
6060: 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a   the opcode..**.
6070: 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f 72 64  ** Other keyword
6080: 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  s in the comment
6090: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61   that follows ea
60a0: 63 68 20 63 61 73 65 20 61 72 65 20 75 73 65 64  ch case are used
60b0: 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74   to.** construct
60c0: 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49   the OPFLG_INITI
60d0: 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74 68 61  ALIZER value tha
60e0: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70  t initializes op
60f0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a  codeProperty[]..
6100: 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c  ** Keywords incl
6110: 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69  ude: in1, in2, i
6120: 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20  n3, out2, out3. 
6130: 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70   See.** the mkop
6140: 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
6150: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6160: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
6170: 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** Documentation
6180: 20 61 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f   about VDBE opco
6190: 64 65 73 20 69 73 20 67 65 6e 65 72 61 74 65 64  des is generated
61a0: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
61b0: 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69  s file.** for li
61c0: 6e 65 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74  nes of that cont
61d0: 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20  ain "Opcode:".  
61e0: 54 68 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c  That line and al
61f0: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
6200: 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72  comment lines ar
6210: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 67 65  e used in the ge
6220: 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  neration of the 
6230: 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75  opcode.html docu
6240: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  mentation.** fil
6250: 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59  e..**.** SUMMARY
6260: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d  :.**.**     Form
6270: 61 74 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74  atting is import
6280: 61 6e 74 20 74 6f 20 73 63 72 69 70 74 73 20 74  ant to scripts t
6290: 68 61 74 20 73 63 61 6e 20 74 68 69 73 20 66 69  hat scan this fi
62a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f  le..**     Do no
62b0: 74 20 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74  t deviate from t
62c0: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74  he formatting st
62d0: 79 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  yle currently in
62e0: 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a   use..**.*******
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6330: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  ******/../* Opco
6340: 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a  de:  Goto * P2 *
6350: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e   * *.**.** An un
6360: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
6370: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a   to address P2..
6380: 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74  ** The next inst
6390: 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64  ruction executed
63a0: 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65   will be .** the
63b0: 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32   one at index P2
63c0: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
63d0: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72  ing of.** the pr
63e0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ogram..**.** The
63f0: 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
6400: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 75 73   not actually us
6410: 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
6420: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 74 0a  e.  However, it.
6430: 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  ** is sometimes 
6440: 73 65 74 20 74 6f 20 31 20 69 6e 73 74 65 61 64  set to 1 instead
6450: 20 6f 66 20 30 20 61 73 20 61 20 68 69 6e 74 20   of 0 as a hint 
6460: 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  to the command-l
6470: 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20 74 68 61  ine shell.** tha
6480: 74 20 74 68 69 73 20 47 6f 74 6f 20 69 73 20 74  t this Goto is t
6490: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c  he bottom of a l
64a0: 6f 6f 70 20 61 6e 64 20 74 68 61 74 20 74 68 65  oop and that the
64b0: 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50 32 20 64   lines from P2 d
64c0: 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75  own.** to the cu
64d0: 72 72 65 6e 74 20 6c 69 6e 65 20 73 68 6f 75 6c  rrent line shoul
64e0: 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 66 6f  d be indented fo
64f0: 72 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  r EXPLAIN output
6500: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74  ..*/.case OP_Got
6510: 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  o: {            
6520: 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a 75 6d 70   /* jump */.jump
6530: 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b  _to_p2_and_check
6540: 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a  _for_interrupt:.
6550: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70    pOp = &aOp[pOp
6560: 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20 20 2f 2a  ->p2 - 1];..  /*
6570: 20 4f 70 63 6f 64 65 73 20 74 68 61 74 20 61 72   Opcodes that ar
6580: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 62 6f  e used as the bo
6590: 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28  ttom of a loop (
65a0: 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
65b0: 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c  ,.  ** OP_VNext,
65c0: 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78   or OP_SorterNex
65d0: 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68 65 72 65  t) all jump here
65e0: 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c   upon.  ** compl
65f0: 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b 20 74 6f  etion.  Check to
6600: 20 73 65 65 20 69 66 20 73 71 6c 69 74 65 33 5f   see if sqlite3_
6610: 69 6e 74 65 72 72 75 70 74 28 29 20 68 61 73 20  interrupt() has 
6620: 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  been called.  **
6630: 20 6f 72 20 69 66 20 74 68 65 20 70 72 6f 67 72   or if the progr
6640: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 6e 65 65  ess callback nee
6650: 64 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ds to be invoked
6660: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  . .  **.  ** Thi
6670: 73 20 63 6f 64 65 20 75 73 65 73 20 75 6e 73 74  s code uses unst
6680: 72 75 63 74 75 72 65 64 20 22 67 6f 74 6f 22 20  ructured "goto" 
6690: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 64  statements and d
66a0: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65  oes not look cle
66b0: 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 61  an..  ** But tha
66c0: 74 20 69 73 20 6e 6f 74 20 64 75 65 20 74 6f 20  t is not due to 
66d0: 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67 20 68 61  sloppy coding ha
66e0: 62 69 74 73 2e 20 54 68 65 20 63 6f 64 65 20 69  bits. The code i
66f0: 73 20 77 72 69 74 74 65 6e 20 74 68 69 73 0a 20  s written this. 
6700: 20 2a 2a 20 77 61 79 20 66 6f 72 20 70 65 72 66   ** way for perf
6710: 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61 76 6f 69  ormance, to avoi
6720: 64 20 68 61 76 69 6e 67 20 74 6f 20 72 75 6e 20  d having to run 
6730: 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 61 6e  the interrupt an
6740: 64 20 70 72 6f 67 72 65 73 73 0a 20 20 2a 2a 20  d progress.  ** 
6750: 63 68 65 63 6b 73 20 6f 6e 20 65 76 65 72 79 20  checks on every 
6760: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 68 65  opcode.  This he
6770: 6c 70 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70  lps sqlite3_step
6780: 28 29 20 74 6f 20 72 75 6e 20 61 62 6f 75 74 20  () to run about 
6790: 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73 74 65 72  1.5%.  ** faster
67a0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22 76   according to "v
67b0: 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63  algrind --tool=c
67c0: 61 63 68 65 67 72 69 6e 64 22 20 2a 2f 0a 63 68  achegrind" */.ch
67d0: 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
67e0: 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  t:.  if( db->u1.
67f0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
6800: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
6810: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 23 69 66  o_interrupt;.#if
6820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6830: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
6840: 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  CK.  /* Call the
6850: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
6860: 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e 66  ck if it is conf
6870: 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20 72  igured and the r
6880: 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a 20  equired number. 
6890: 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73 20   ** of VDBE ops 
68a0: 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75 74  have been execut
68b0: 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63 65  ed (either since
68c0: 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f 6e   this invocation
68d0: 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   of.  ** sqlite3
68e0: 56 64 62 65 45 78 65 63 28 29 20 6f 72 20 73 69  VdbeExec() or si
68f0: 6e 63 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68  nce last time th
6900: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6910: 61 63 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e  ack was called).
6920: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f  .  ** If the pro
6930: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
6940: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
6950: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
6960: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
6970: 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f 64   ** a return cod
6980: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a  e SQLITE_ABORT..
6990: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 6d 53 74    */.  if( nVmSt
69a0: 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d  ep>=nProgressLim
69b0: 69 74 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72  it && db->xProgr
69c0: 65 73 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ess!=0 ){.    as
69d0: 73 65 72 74 28 20 64 62 2d 3e 6e 50 72 6f 67 72  sert( db->nProgr
69e0: 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a 20 20 20  essOps!=0 );.   
69f0: 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20   nProgressLimit 
6a00: 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64 62 2d 3e  = nVmStep + db->
6a10: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d 20 28  nProgressOps - (
6a20: 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e 50 72 6f  nVmStep%db->nPro
6a30: 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 20 20 69  gressOps);.    i
6a40: 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73  f( db->xProgress
6a50: 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72  (db->pProgressAr
6a60: 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
6a70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6a80: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  T;.      goto ab
6a90: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
6aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6ab0: 69 66 0a 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d  if.  .  break;.}
6ac0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f  ../* Opcode:  Go
6ad0: 73 75 62 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  sub P1 P2 * * *.
6ae0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
6af0: 63 75 72 72 65 6e 74 20 61 64 64 72 65 73 73 20  current address 
6b00: 6f 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 31  onto register P1
6b10: 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d  .** and then jum
6b20: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
6b30: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75  .*/.case OP_Gosu
6b40: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
6b50: 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  /* jump */.  ass
6b60: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
6b70: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
6b80: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
6b90: 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  or) );.  pIn1 = 
6ba0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6bb0: 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65    assert( VdbeMe
6bc0: 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d 3d  mDynamic(pIn1)==
6bd0: 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  0 );.  memAboutT
6be0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
6bf0: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
6c00: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e  = MEM_Int;.  pIn
6c10: 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70  1->u.i = (int)(p
6c20: 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45 47 49 53  Op-aOp);.  REGIS
6c30: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
6c40: 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a 20  1, pIn1);..  /* 
6c50: 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65 72 61 74  Most jump operat
6c60: 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74 6f 20 74  ions do a goto t
6c70: 6f 20 74 68 69 73 20 73 70 6f 74 20 69 6e 20 6f  o this spot in o
6c80: 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 0a 20  rder to update. 
6c90: 20 2a 2a 20 74 68 65 20 70 4f 70 20 70 6f 69 6e   ** the pOp poin
6ca0: 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f  ter. */.jump_to_
6cb0: 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  p2:.  pOp = &aOp
6cc0: 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20  [pOp->p2 - 1];. 
6cd0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6ce0: 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31  code:  Return P1
6cf0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a   * * * *.**.** J
6d00: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
6d10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
6d20: 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  r the address in
6d30: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 41   register P1.  A
6d40: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 75 6d 70  fter.** the jump
6d50: 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62 65  , register P1 be
6d60: 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 2e  comes undefined.
6d70: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75  .*/.case OP_Retu
6d80: 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  rn: {           
6d90: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
6da0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6db0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
6dc0: 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e  1->flags==MEM_In
6dd0: 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f  t );.  pOp = &aO
6de0: 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20  p[pIn1->u.i];.  
6df0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
6e00: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62  M_Undefined;.  b
6e10: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
6e20: 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  de: InitCoroutin
6e30: 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
6e40: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72 65 67 69  *.** Set up regi
6e50: 73 74 65 72 20 50 31 20 73 6f 20 74 68 61 74 20  ster P1 so that 
6e60: 69 74 20 77 69 6c 6c 20 59 69 65 6c 64 20 74 6f  it will Yield to
6e70: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 0a 2a   the coroutine.*
6e80: 2a 20 6c 6f 63 61 74 65 64 20 61 74 20 61 64 64  * located at add
6e90: 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49  ress P3..**.** I
6ea0: 66 20 50 32 21 3d 30 20 74 68 65 6e 20 74 68 65  f P2!=0 then the
6eb0: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
6ec0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d 65 64 69  mentation immedi
6ed0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a 2a  ately follows.**
6ee0: 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 53   this opcode.  S
6ef0: 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
6f00: 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
6f10: 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 61  entation to.** a
6f20: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a 2a  ddress P2..**.**
6f30: 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e 64 43 6f   See also: EndCo
6f40: 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20  routine.*/.case 
6f50: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
6f60: 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20  : {     /* jump 
6f70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
6f80: 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f 70 2d 3e  ->p1>0 &&  pOp->
6f90: 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
6fa0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
6fb0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
6fc0: 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  2>=0 && pOp->p2<
6fd0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61 73 73 65  p->nOp );.  asse
6fe0: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26  rt( pOp->p3>=0 &
6ff0: 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70  & pOp->p3<p->nOp
7000: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
7010: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
7020: 73 73 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44  ssert( !VdbeMemD
7030: 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 3b 0a  ynamic(pOut) );.
7040: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f    pOut->u.i = pO
7050: 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20 70 4f 75  p->p3 - 1;.  pOu
7060: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  t->flags = MEM_I
7070: 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  nt;.  if( pOp->p
7080: 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  2 ) goto jump_to
7090: 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
70a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 45 6e 64  ./* Opcode:  End
70b0: 43 6f 72 6f 75 74 69 6e 65 20 50 31 20 2a 20 2a  Coroutine P1 * *
70c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69   * *.**.** The i
70d0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74 68  nstruction at th
70e0: 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67  e address in reg
70f0: 69 73 74 65 72 20 50 31 20 69 73 20 61 20 59 69  ister P1 is a Yi
7100: 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  eld..** Jump to 
7110: 74 68 65 20 50 32 20 70 61 72 61 6d 65 74 65 72  the P2 parameter
7120: 20 6f 66 20 74 68 61 74 20 59 69 65 6c 64 2e 0a   of that Yield..
7130: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 75 6d  ** After the jum
7140: 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62  p, register P1 b
7150: 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64  ecomes undefined
7160: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
7170: 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a  : InitCoroutine.
7180: 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e 64 43 6f  */.case OP_EndCo
7190: 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 20  routine: {      
71a0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
71b0: 20 56 64 62 65 4f 70 20 2a 70 43 61 6c 6c 65 72   VdbeOp *pCaller
71c0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
71d0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
71e0: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
71f0: 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  ==MEM_Int );.  a
7200: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 75 2e 69  ssert( pIn1->u.i
7210: 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e 75 2e 69  >=0 && pIn1->u.i
7220: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 43 61  <p->nOp );.  pCa
7230: 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70 49 6e 31  ller = &aOp[pIn1
7240: 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73 65 72 74  ->u.i];.  assert
7250: 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64  ( pCaller->opcod
7260: 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29 3b 0a 20  e==OP_Yield );. 
7270: 20 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72   assert( pCaller
7280: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43 61 6c 6c  ->p2>=0 && pCall
7290: 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  er->p2<p->nOp );
72a0: 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 43  .  pOp = &aOp[pC
72b0: 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a  aller->p2 - 1];.
72c0: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
72d0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
72e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
72f0: 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31 20  code:  Yield P1 
7300: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
7310: 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d 20  wap the program 
7320: 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68 65  counter with the
7330: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
7340: 65 72 20 50 31 2e 20 20 54 68 69 73 0a 2a 2a 20  er P1.  This.** 
7350: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
7360: 66 20 79 69 65 6c 64 69 6e 67 20 74 6f 20 61 20  f yielding to a 
7370: 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  coroutine..**.**
7380: 20 49 66 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   If the coroutin
7390: 65 20 74 68 61 74 20 69 73 20 6c 61 75 6e 63 68  e that is launch
73a0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72  ed by this instr
73b0: 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68  uction ends with
73c0: 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20 52 65 74  .** Yield or Ret
73d0: 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  urn then continu
73e0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  e to the next in
73f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20  struction.  But 
7400: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72 6f 75 74  if.** the corout
7410: 69 6e 65 20 6c 61 75 6e 63 68 65 64 20 62 79 20  ine launched by 
7420: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
7430: 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20 45 6e   ends with.** En
7440: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  dCoroutine, then
7450: 20 6a 75 6d 70 20 74 6f 20 50 32 20 72 61 74 68   jump to P2 rath
7460: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 6e 75 69  er than continui
7470: 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  ng with the.** n
7480: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
7490: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
74a0: 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a   InitCoroutine.*
74b0: 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a  /.case OP_Yield:
74c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
74d0: 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20   in1, jump */.  
74e0: 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70 49  int pcDest;.  pI
74f0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
7500: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56  p1];.  assert( V
7510: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49  dbeMemDynamic(pI
7520: 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  n1)==0 );.  pIn1
7530: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7540: 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69  t;.  pcDest = (i
7550: 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn1->u.i;.  
7560: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
7570: 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
7580: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
7590: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20  Op->p1, pIn1);. 
75a0: 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 44 65   pOp = &aOp[pcDe
75b0: 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st];.  break;.}.
75c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
75d0: 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20 50  tIfNull  P1 P2 P
75e0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
75f0: 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 3d 6e 75  sis: if r[P3]=nu
7600: 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68  ll halt.**.** Ch
7610: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eck the value in
7620: 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49   register P3.  I
7630: 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  f it is NULL the
7640: 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20  n Halt using.** 
7650: 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32  parameter P1, P2
7660: 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20 74  , and P4 as if t
7670: 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74 20  his were a Halt 
7680: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  instruction.  If
7690: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e   the.** value in
76a0: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
76b0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
76c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
76d0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 50   no-op..** The P
76e0: 35 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75  5 parameter shou
76f0: 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63 61 73 65  ld be 1..*/.case
7700: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20   OP_HaltIfNull: 
7710: 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f  {      /* in3 */
7720: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
7730: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
7740: 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
7750: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72  EM_Null)==0 ) br
7760: 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
7770: 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48  hrough into OP_H
7780: 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63  alt */.}../* Opc
7790: 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32  ode:  Halt P1 P2
77a0: 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45   * P4 P5.**.** E
77b0: 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  xit immediately.
77c0: 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f    All open curso
77d0: 72 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73  rs, etc are clos
77e0: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
77f0: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  lly..**.** P1 is
7800: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
7810: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
7820: 69 74 65 33 5f 65 78 65 63 28 29 2c 20 73 71 6c  ite3_exec(), sql
7830: 69 74 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a  ite3_reset(),.**
7840: 20 6f 72 20 73 71 6c 69 74 65 33 5f 66 69 6e 61   or sqlite3_fina
7850: 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20 61 20 6e  lize().  For a n
7860: 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69 73  ormal halt, this
7870: 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54   should be SQLIT
7880: 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72  E_OK (0)..** For
7890: 20 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e 20   errors, it can 
78a0: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 76 61  be some other va
78b0: 6c 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74  lue.  If P1!=0 t
78c0: 68 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65  hen P2 will dete
78d0: 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
78e0: 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62   or not to rollb
78f0: 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  ack the current 
7900: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f  transaction.  Do
7910: 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   not rollback.**
7920: 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e   if P2==OE_Fail.
7930: 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   Do the rollback
7940: 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62   if P2==OE_Rollb
7950: 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f  ack.  If P2==OE_
7960: 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62  Abort,.** then b
7970: 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e  ack out all chan
7980: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 6f 63  ges that have oc
7990: 63 75 72 72 65 64 20 64 75 72 69 6e 67 20 74 68  curred during th
79a0: 69 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  is execution of 
79b0: 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74  the.** VDBE, but
79c0: 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b   do not rollback
79d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
79e0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  . .**.** If P4 i
79f0: 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20  s not null then 
7a00: 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d  it is an error m
7a10: 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a  essage string..*
7a20: 2a 0a 2a 2a 20 50 35 20 69 73 20 61 20 76 61 6c  *.** P5 is a val
7a30: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  ue between 0 and
7a40: 20 34 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 74   4, inclusive, t
7a50: 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65  hat modifies the
7a60: 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a   P4 string..**.*
7a70: 2a 20 20 20 20 30 3a 20 20 28 6e 6f 20 63 68 61  *    0:  (no cha
7a80: 6e 67 65 29 0a 2a 2a 20 20 20 20 31 3a 20 20 4e  nge).**    1:  N
7a90: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74 72 61 69 6e  OT NULL contrain
7aa0: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20  t failed: P4.** 
7ab0: 20 20 20 32 3a 20 20 55 4e 49 51 55 45 20 63 6f     2:  UNIQUE co
7ac0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
7ad0: 20 50 34 0a 2a 2a 20 20 20 20 33 3a 20 20 43 48   P4.**    3:  CH
7ae0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ECK constraint f
7af0: 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20  ailed: P4.**    
7b00: 34 3a 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 20  4:  FOREIGN KEY 
7b10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7b20: 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20 49 66 20 50  d: P4.**.** If P
7b30: 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 61 6e  5 is not zero an
7b40: 64 20 50 34 20 69 73 20 4e 55 4c 4c 2c 20 74 68  d P4 is NULL, th
7b50: 65 6e 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  en everything af
7b60: 74 65 72 20 74 68 65 20 22 3a 22 20 69 73 0a 2a  ter the ":" is.*
7b70: 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  * omitted..**.**
7b80: 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d 70   There is an imp
7b90: 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30 20 30  lied "Halt 0 0 0
7ba0: 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  " instruction in
7bb0: 73 65 72 74 65 64 20 61 74 20 74 68 65 20 76 65  serted at the ve
7bc0: 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76 65  ry end of.** eve
7bd0: 72 79 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f 20  ry program.  So 
7be0: 61 20 6a 75 6d 70 20 70 61 73 74 20 74 68 65 20  a jump past the 
7bf0: 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  last instruction
7c00: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 0a   of the program.
7c10: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
7c20: 73 20 65 78 65 63 75 74 69 6e 67 20 48 61 6c 74  s executing Halt
7c30: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c  ..*/.case OP_Hal
7c40: 74 3a 20 7b 0a 20 20 56 64 62 65 46 72 61 6d 65  t: {.  VdbeFrame
7c50: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20   *pFrame;.  int 
7c60: 70 63 78 3b 0a 0a 20 20 70 63 78 20 3d 20 28 69  pcx;..  pcx = (i
7c70: 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
7c80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
7c90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
7ca0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
7cb0: 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f  Halt the sub-pro
7cc0: 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e  gram. Return con
7cd0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65  trol to the pare
7ce0: 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20  nt frame. */.   
7cf0: 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72   pFrame = p->pFr
7d00: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  ame;.    p->pFra
7d10: 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61  me = pFrame->pPa
7d20: 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72  rent;.    p->nFr
7d30: 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  ame--;.    sqlit
7d40: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
7d50: 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
7d60: 3b 0a 20 20 20 20 70 63 78 20 3d 20 73 71 6c 69  ;.    pcx = sqli
7d70: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
7d80: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
7d90: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45   if( pOp->p2==OE
7da0: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
7db0: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
7dc0: 70 63 78 20 69 73 20 74 68 65 20 4f 50 5f 50 72  pcx is the OP_Pr
7dd0: 6f 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b  ogram that invok
7de0: 65 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ed the sub-progr
7df0: 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  am .      ** cur
7e00: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c  rently being hal
7e10: 74 65 64 2e 20 49 66 20 74 68 65 20 70 32 20 69  ted. If the p2 i
7e20: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
7e30: 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20  is OP_Halt.     
7e40: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
7e50: 69 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e  is set to OE_Ign
7e60: 6f 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ore, then the su
7e70: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72  b-program is thr
7e80: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  owing.      ** a
7e90: 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69  n IGNORE excepti
7ea0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
7eb0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64   jump to the add
7ec0: 72 65 73 73 20 73 70 65 63 69 66 69 65 64 0a 20  ress specified. 
7ed0: 20 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70       ** as the p
7ee0: 32 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  2 of the calling
7ef0: 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f   OP_Program.  */
7f00: 0a 20 20 20 20 20 20 70 63 78 20 3d 20 70 2d 3e  .      pcx = p->
7f10: 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31 3b 0a 20  aOp[pcx].p2-1;. 
7f20: 20 20 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70     }.    aOp = p
7f30: 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20  ->aOp;.    aMem 
7f40: 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70  = p->aMem;.    p
7f50: 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78 5d 3b 0a  Op = &aOp[pcx];.
7f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
7f70: 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31   p->rc = pOp->p1
7f80: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
7f90: 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32  on = (u8)pOp->p2
7fa0: 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 78 3b  ;.  p->pc = pcx;
7fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7fc0: 70 35 3c 3d 34 20 29 3b 0a 20 20 69 66 28 20 70  p5<=4 );.  if( p
7fd0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ->rc ){.    if( 
7fe0: 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20  pOp->p5 ){.     
7ff0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8000: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
8010: 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c  e[] = { "NOT NUL
8020: 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 43  L", "UNIQUE", "C
8030: 48 45 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 20  HECK",.         
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 59      "FOREIGN KEY
8070: 22 20 7d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  " };.      testc
8080: 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 31 20  ase( pOp->p5==1 
8090: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
80a0: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b  e( pOp->p5==2 );
80b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
80c0: 20 70 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20   pOp->p5==3 );. 
80d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
80e0: 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20 20 20  Op->p5==4 );.   
80f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
8100: 72 6f 72 28 70 2c 20 22 25 73 20 63 6f 6e 73 74  ror(p, "%s const
8110: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 20 61  raint failed", a
8120: 7a 54 79 70 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d  zType[pOp->p5-1]
8130: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
8140: 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20  ->p4.z ){.      
8150: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
8160: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
8170: 2c 20 22 25 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a  , "%z: %s", p->z
8180: 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e 70 34 2e  ErrMsg, pOp->p4.
8190: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
81a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
81b0: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
81c0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
81d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
81e0: 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31  ite3_log(pOp->p1
81f0: 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64 20 69  , "abort at %d i
8200: 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63 78  n [%s]: %s", pcx
8210: 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45  , p->zSql, p->zE
8220: 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 63  rrMsg);.  }.  rc
8230: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 48 61   = sqlite3VdbeHa
8240: 6c 74 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  lt(p);.  assert(
8250: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
8260: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
8270: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
8280: 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72  ERROR );.  if( r
8290: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
82a0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
82b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
82c0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
82d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
82e0: 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
82f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
8300: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
8320: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
8330: 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66  ns>0 || db->nDef
8340: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29  erredImmCons>0 )
8350: 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63  ;.    rc = p->rc
8360: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
8370: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
8380: 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72   }.  goto vdbe_r
8390: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
83a0: 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20  ode: Integer P1 
83b0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
83c0: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a  psis: r[P2]=P1.*
83d0: 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20  *.** The 32-bit 
83e0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 31  integer value P1
83f0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
8400: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
8410: 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72  .case OP_Integer
8420: 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  : {         /* o
8430: 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20  ut2 */.  pOut = 
8440: 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
8450: 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
8460: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  u.i = pOp->p1;. 
8470: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
8480: 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32  code: Int64 * P2
8490: 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
84a0: 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a  sis: r[P2]=P4.**
84b0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
84c0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
84d0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a  integer value..*
84e0: 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c  * Write that val
84f0: 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
8500: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
8510: 49 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20  Int64: {        
8520: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
8530: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
8540: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
8550: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
8560: 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f  .pI64!=0 );.  pO
8570: 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e  ut->u.i = *pOp->
8580: 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b  p4.pI64;.  break
8590: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
85a0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
85b0: 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64  G_POINT./* Opcod
85c0: 65 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50  e: Real * P2 * P
85d0: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
85e0: 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20   r[P2]=P4.**.** 
85f0: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
8600: 74 6f 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  to a 64-bit floa
8610: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
8620: 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20  ..** Write that 
8630: 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73  value into regis
8640: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
8650: 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20  OP_Real: {      
8660: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
8670: 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20   TK_FLOAT, out2 
8680: 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  */.  pOut = out2
8690: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
86a0: 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  p);.  pOut->flag
86b0: 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  s = MEM_Real;.  
86c0: 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
86d0: 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70  IsNaN(*pOp->p4.p
86e0: 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d  Real) );.  pOut-
86f0: 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e  >u.r = *pOp->p4.
8700: 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a  pReal;.  break;.
8710: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
8720: 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50  ode: String8 * P
8730: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
8740: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27  psis: r[P2]='P4'
8750: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
8760: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
8770: 61 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  ated UTF-8 strin
8780: 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  g. This opcode i
8790: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a  s transformed .*
87a0: 2a 20 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20  * into a String 
87b0: 6f 70 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74  opcode before it
87c0: 20 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72   is executed for
87d0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e   the first time.
87e0: 20 20 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73    During.** this
87f0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c   transformation,
8800: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73   the length of s
8810: 74 72 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70  tring P4 is comp
8820: 75 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  uted and stored.
8830: 2a 2a 20 61 73 20 74 68 65 20 50 31 20 70 61 72  ** as the P1 par
8840: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20  ameter..*/.case 
8850: 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20  OP_String8: {   
8860: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
8870: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32   TK_STRING, out2
8880: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
8890: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20  p->p4.z!=0 );.  
88a0: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
88b0: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
88c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
88d0: 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d  P_String;.  pOp-
88e0: 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72  >p1 = sqlite3Str
88f0: 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29  len30(pOp->p4.z)
8900: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
8910: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
8920: 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c  f( encoding!=SQL
8930: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
8940: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
8950: 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20  MemSetStr(pOut, 
8960: 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53  pOp->p4.z, -1, S
8970: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
8980: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
8990: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
89a0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
89b0: 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 20 20  ITE_TOOBIG );.  
89c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
89d0: 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e  =sqlite3VdbeChan
89e0: 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
89f0: 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74   encoding) ) got
8a00: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73  o no_mem;.    as
8a10: 73 65 72 74 28 20 70 4f 75 74 2d 3e 73 7a 4d 61  sert( pOut->szMa
8a20: 6c 6c 6f 63 3e 30 20 26 26 20 70 4f 75 74 2d 3e  lloc>0 && pOut->
8a30: 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a  zMalloc==pOut->z
8a40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8a50: 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
8a60: 4f 75 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Out)==0 );.    p
8a70: 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Out->szMalloc = 
8a80: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  0;.    pOut->fla
8a90: 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63  gs |= MEM_Static
8aa0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
8ab0: 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49  4type==P4_DYNAMI
8ac0: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
8ad0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
8ae0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20  ->p4.z);.    }. 
8af0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
8b00: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20   P4_DYNAMIC;.   
8b10: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75   pOp->p4.z = pOu
8b20: 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  t->z;.    pOp->p
8b30: 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d  1 = pOut->n;.  }
8b40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d  .  testcase( rc=
8b50: 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29  =SQLITE_TOOBIG )
8b60: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
8b70: 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69  Op->p1>db->aLimi
8b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
8b90: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
8ba0: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
8bb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
8bc0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20  LITE_OK );.  /* 
8bd0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  Fall through to 
8be0: 74 68 65 20 6e 65 78 74 20 63 61 73 65 2c 20 4f  the next case, O
8bf0: 50 5f 53 74 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20  P_String */.}.  
8c00: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69  ./* Opcode: Stri
8c10: 6e 67 20 50 31 20 50 32 20 50 33 20 50 34 20 50  ng P1 P2 P3 P4 P
8c20: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
8c30: 5b 50 32 5d 3d 27 50 34 27 20 28 6c 65 6e 3d 50  [P2]='P4' (len=P
8c40: 31 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72  1).**.** The str
8c50: 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f 66 20  ing value P4 of 
8c60: 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74 65 73  length P1 (bytes
8c70: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ) is stored in r
8c80: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
8c90: 2a 20 49 66 20 50 33 20 69 73 20 6e 6f 74 20 7a  * If P3 is not z
8ca0: 65 72 6f 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ero and the cont
8cb0: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
8cc0: 50 33 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50  P3 is equal to P
8cd0: 35 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  5, then.** the d
8ce0: 61 74 61 74 79 70 65 20 6f 66 20 74 68 65 20 72  atatype of the r
8cf0: 65 67 69 73 74 65 72 20 50 32 20 69 73 20 63 6f  egister P2 is co
8d00: 6e 76 65 72 74 65 64 20 74 6f 20 42 4c 4f 42 2e  nverted to BLOB.
8d10: 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 69 73    The content is
8d20: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 65 71  .** the same seq
8d30: 75 65 6e 63 65 20 6f 66 20 62 79 74 65 73 2c 20  uence of bytes, 
8d40: 69 74 20 69 73 20 6d 65 72 65 6c 79 20 69 6e 74  it is merely int
8d50: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 42 4c  erpreted as a BL
8d60: 4f 42 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  OB instead.** of
8d70: 20 61 20 73 74 72 69 6e 67 2c 20 61 73 20 69 66   a string, as if
8d80: 20 69 74 20 68 61 64 20 62 65 65 6e 20 43 41 53   it had been CAS
8d90: 54 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  T.  In other wor
8da0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 69 66 28 20 50 33  ds:.**.** if( P3
8db0: 21 3d 30 20 61 6e 64 20 72 65 67 5b 50 33 5d 3d  !=0 and reg[P3]=
8dc0: 3d 50 35 20 29 20 72 65 67 5b 50 32 5d 20 3a 3d  =P5 ) reg[P2] :=
8dd0: 20 43 41 53 54 28 72 65 67 5b 50 32 5d 20 61 73   CAST(reg[P2] as
8de0: 20 42 4c 4f 42 29 0a 2a 2f 0a 63 61 73 65 20 4f   BLOB).*/.case O
8df0: 50 5f 53 74 72 69 6e 67 3a 20 7b 20 20 20 20 20  P_String: {     
8e00: 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
8e10: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
8e20: 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  4.z!=0 );.  pOut
8e30: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
8e40: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
8e50: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  t->flags = MEM_S
8e60: 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  tr|MEM_Static|ME
8e70: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
8e80: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
8e90: 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e   pOut->n = pOp->
8ea0: 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  p1;.  pOut->enc 
8eb0: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
8ec0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
8ed0: 45 28 70 4f 75 74 29 3b 0a 23 69 66 6e 64 65 66  E(pOut);.#ifndef
8ee0: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
8ef0: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
8f00: 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20    if( pOp->p3>0 
8f10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8f20: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
8f30: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
8f40: 20 29 3b 0a 20 20 20 20 70 49 6e 33 20 3d 20 26   );.    pIn3 = &
8f50: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
8f60: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d     assert( pIn3-
8f70: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
8f80: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 33   );.    if( pIn3
8f90: 2d 3e 75 2e 69 3d 3d 70 4f 70 2d 3e 70 35 20 29  ->u.i==pOp->p5 )
8fa0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
8fb0: 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74  EM_Blob|MEM_Stat
8fc0: 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d  ic|MEM_Term;.  }
8fd0: 0a 23 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b  .#endif.  break;
8fe0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
8ff0: 75 6c 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ull P1 P2 P3 * *
9000: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
9010: 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a  P2..P3]=NULL.**.
9020: 2a 2a 20 57 72 69 74 65 20 61 20 4e 55 4c 4c 20  ** Write a NULL 
9030: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 50  into registers P
9040: 32 2e 20 20 49 66 20 50 33 20 67 72 65 61 74 65  2.  If P3 greate
9050: 72 20 74 68 61 6e 20 50 32 2c 20 74 68 65 6e 20  r than P2, then 
9060: 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 4e 55  also write.** NU
9070: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
9080: 20 50 33 20 61 6e 64 20 65 76 65 72 79 20 72 65   P3 and every re
9090: 67 69 73 74 65 72 20 69 6e 20 62 65 74 77 65 65  gister in betwee
90a0: 6e 20 50 32 20 61 6e 64 20 50 33 2e 20 20 49 66  n P2 and P3.  If
90b0: 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74   P3.** is less t
90c0: 68 61 6e 20 50 32 20 28 74 79 70 69 63 61 6c 6c  han P2 (typicall
90d0: 79 20 50 33 20 69 73 20 7a 65 72 6f 29 20 74 68  y P3 is zero) th
90e0: 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73 74 65 72  en only register
90f0: 20 50 32 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f   P2 is.** set to
9100: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
9110: 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 73 20  the P1 value is 
9120: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
9130: 6c 73 6f 20 73 65 74 20 74 68 65 20 4d 45 4d 5f  lso set the MEM_
9140: 43 6c 65 61 72 65 64 20 66 6c 61 67 20 73 6f 20  Cleared flag so 
9150: 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  that.** NULL val
9160: 75 65 73 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d  ues will not com
9170: 70 61 72 65 20 65 71 75 61 6c 20 65 76 65 6e 20  pare equal even 
9180: 69 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  if SQLITE_NULLEQ
9190: 20 69 73 20 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50   is set on.** OP
91a0: 5f 4e 65 20 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f  _Ne or OP_Eq..*/
91b0: 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b  .case OP_Null: {
91c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
91d0: 74 32 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  t2 */.  int cnt;
91e0: 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 3b  .  u16 nullFlag;
91f0: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
9200: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
9210: 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70  ;.  cnt = pOp->p
9220: 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  3-pOp->p2;.  ass
9230: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  ert( pOp->p3<=(p
9240: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
9250: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74  ursor) );.  pOut
9260: 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c  ->flags = nullFl
9270: 61 67 20 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28  ag = pOp->p1 ? (
9280: 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65  MEM_Null|MEM_Cle
9290: 61 72 65 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c  ared) : MEM_Null
92a0: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b  ;.  pOut->n = 0;
92b0: 0a 20 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20  .  while( cnt>0 
92c0: 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20  ){.    pOut++;. 
92d0: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
92e0: 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20  nge(p, pOut);.  
92f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
9300: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
9310: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
9320: 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 70   nullFlag;.    p
9330: 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Out->n = 0;.    
9340: 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65  cnt--;.  }.  bre
9350: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
9360: 3a 20 53 6f 66 74 4e 75 6c 6c 20 50 31 20 2a 20  : SoftNull P1 * 
9370: 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
9380: 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a  s: r[P1]=NULL.**
9390: 0a 2a 2a 20 53 65 74 20 72 65 67 69 73 74 65 72  .** Set register
93a0: 20 50 31 20 74 6f 20 68 61 76 65 20 74 68 65 20   P1 to have the 
93b0: 76 61 6c 75 65 20 4e 55 4c 4c 20 61 73 20 73 65  value NULL as se
93c0: 65 6e 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  en by the OP_Mak
93d0: 65 52 65 63 6f 72 64 0a 2a 2a 20 69 6e 73 74 72  eRecord.** instr
93e0: 75 63 74 69 6f 6e 2c 20 62 75 74 20 64 6f 20 6e  uction, but do n
93f0: 6f 74 20 66 72 65 65 20 61 6e 79 20 73 74 72 69  ot free any stri
9400: 6e 67 20 6f 72 20 62 6c 6f 62 20 6d 65 6d 6f 72  ng or blob memor
9410: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9420: 68 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  h.** the registe
9430: 72 2c 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  r, so that if th
9440: 65 20 76 61 6c 75 65 20 77 61 73 20 61 20 73 74  e value was a st
9450: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 68 61  ring or blob tha
9460: 74 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  t was.** previou
9470: 73 6c 79 20 63 6f 70 69 65 64 20 75 73 69 6e 67  sly copied using
9480: 20 4f 50 5f 53 43 6f 70 79 2c 20 74 68 65 20 63   OP_SCopy, the c
9490: 6f 70 69 65 73 20 77 69 6c 6c 20 63 6f 6e 74 69  opies will conti
94a0: 6e 75 65 20 74 6f 20 62 65 20 76 61 6c 69 64 2e  nue to be valid.
94b0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 66 74  .*/.case OP_Soft
94c0: 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73 73 65 72 74  Null: {.  assert
94d0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70  ( pOp->p1>0 && p
94e0: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
94f0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
9500: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
9510: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
9520: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 4f  Out->flags = (pO
9530: 75 74 2d 3e 66 6c 61 67 73 26 7e 28 4d 45 4d 5f  ut->flags&~(MEM_
9540: 55 6e 64 65 66 69 6e 65 64 7c 4d 45 4d 5f 41 66  Undefined|MEM_Af
9550: 66 4d 61 73 6b 29 29 7c 4d 45 4d 5f 4e 75 6c 6c  fMask))|MEM_Null
9560: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
9570: 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31   Opcode: Blob P1
9580: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
9590: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34  nopsis: r[P2]=P4
95a0: 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20   (len=P1).**.** 
95b0: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  P4 points to a b
95c0: 6c 6f 62 20 6f 66 20 64 61 74 61 20 50 31 20 62  lob of data P1 b
95d0: 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72  ytes long.  Stor
95e0: 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69  e this.** blob i
95f0: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
9600: 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20  /.case OP_Blob: 
9610: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
9620: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
9630: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d  sert( pOp->p1 <=
9640: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
9650: 54 48 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  TH );.  pOut = o
9660: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
9670: 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOp);.  sqlite3
9680: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
9690: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70  ut, pOp->p4.z, p
96a0: 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20  Op->p1, 0, 0);. 
96b0: 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63   pOut->enc = enc
96c0: 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f  oding;.  UPDATE_
96d0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
96e0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
96f0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61  /* Opcode: Varia
9700: 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ble P1 P2 * P4 *
9710: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
9720: 50 32 5d 3d 70 61 72 61 6d 65 74 65 72 28 50 31  P2]=parameter(P1
9730: 2c 50 34 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  ,P4).**.** Trans
9740: 66 65 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f  fer the values o
9750: 66 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  f bound paramete
9760: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
9770: 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74  er P2.**.** If t
9780: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
9790: 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20  named, then its 
97a0: 6e 61 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20  name appears in 
97b0: 50 34 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  P4..** The P4 va
97c0: 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20 73  lue is used by s
97d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
97e0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f  meter_name()..*/
97f0: 0a 63 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c  .case OP_Variabl
9800: 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
9810: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 4d 65 6d  /* out2 */.  Mem
9820: 20 2a 70 56 61 72 3b 20 20 20 20 20 20 20 2f 2a   *pVar;       /*
9830: 20 56 61 6c 75 65 20 62 65 69 6e 67 20 74 72 61   Value being tra
9840: 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61  nsferred */..  a
9850: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
9860: 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e   && pOp->p1<=p->
9870: 6e 56 61 72 20 29 3b 0a 20 20 61 73 73 65 72 74  nVar );.  assert
9880: 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c  ( pOp->p4.z==0 |
9890: 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 73 71 6c  | pOp->p4.z==sql
98a0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
98b0: 6d 65 28 70 2d 3e 70 56 4c 69 73 74 2c 70 4f 70  me(p->pVList,pOp
98c0: 2d 3e 70 31 29 20 29 3b 0a 20 20 70 56 61 72 20  ->p1) );.  pVar 
98d0: 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e  = &p->aVar[pOp->
98e0: 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73  p1 - 1];.  if( s
98f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
9900: 42 69 67 28 70 56 61 72 29 20 29 7b 0a 20 20 20  Big(pVar) ){.   
9910: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
9920: 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65   }.  pOut = &aMe
9930: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
9940: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
9950: 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56  lowCopy(pOut, pV
9960: 61 72 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b  ar, MEM_Static);
9970: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
9980: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20  OBSIZE(pOut);.  
9990: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
99a0: 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20  ode: Move P1 P2 
99b0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
99c0: 69 73 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50  is: r[P2@P3]=r[P
99d0: 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  1@P3].**.** Move
99e0: 20 74 68 65 20 50 33 20 76 61 6c 75 65 73 20 69   the P3 values i
99f0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50  n register P1..P
9a00: 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f  1+P3-1 over into
9a10: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 50 32  .** registers P2
9a20: 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69  ..P2+P3-1.  Regi
9a30: 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d  sters P1..P1+P3-
9a40: 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f  1 are.** left ho
9a50: 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49  lding a NULL.  I
9a60: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  t is an error fo
9a70: 72 20 72 65 67 69 73 74 65 72 20 72 61 6e 67 65  r register range
9a80: 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31  s.** P1..P1+P3-1
9a90: 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31   and P2..P2+P3-1
9aa0: 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74   to overlap.  It
9ab0: 20 69 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   is an error.** 
9ac0: 66 6f 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73  for P3 to be les
9ad0: 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73  s than 1..*/.cas
9ae0: 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69  e OP_Move: {.  i
9af0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9b00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
9b10: 69 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63  isters left to c
9b20: 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b  opy */.  int p1;
9b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
9b40: 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72  ister to copy fr
9b50: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20  om */.  int p2; 
9b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9b70: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20  ster to copy to 
9b80: 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70  */..  n = pOp->p
9b90: 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70  3;.  p1 = pOp->p
9ba0: 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70  1;.  p2 = pOp->p
9bb0: 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  2;.  assert( n>0
9bc0: 20 26 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30   && p1>0 && p2>0
9bd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31   );.  assert( p1
9be0: 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d  +n<=p2 || p2+n<=
9bf0: 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  p1 );..  pIn1 = 
9c00: 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75  &aMem[p1];.  pOu
9c10: 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20  t = &aMem[p2];. 
9c20: 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
9c30: 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d   pOut<=&aMem[(p-
9c40: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
9c50: 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73  rsor)] );.    as
9c60: 73 65 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65  sert( pIn1<=&aMe
9c70: 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  m[(p->nMem+1 - p
9c80: 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20  ->nCursor)] );. 
9c90: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
9ca0: 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20  Valid(pIn1) );. 
9cb0: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
9cc0: 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20  nge(p, pOut);.  
9cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
9ce0: 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29  Move(pOut, pIn1)
9cf0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9d00: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f  DEBUG.    if( pO
9d10: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d  ut->pScopyFrom>=
9d20: 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75  &aMem[p1] && pOu
9d30: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f  t->pScopyFrom<pO
9d40: 75 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74  ut ){.      pOut
9d50: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20  ->pScopyFrom += 
9d60: 70 4f 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20  pOp->p2 - p1;.  
9d70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44    }.#endif.    D
9d80: 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f  eephemeralize(pO
9d90: 75 74 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  ut);.    REGISTE
9da0: 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f  R_TRACE(p2++, pO
9db0: 75 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b  ut);.    pIn1++;
9dc0: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d  .    pOut++;.  }
9dd0: 77 68 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20  while( --n );.  
9de0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
9df0: 6f 64 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20  ode: Copy P1 P2 
9e00: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
9e10: 69 73 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72  is: r[P2@P3+1]=r
9e20: 5b 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20  [P1@P3+1].**.** 
9e30: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72  Make a copy of r
9e40: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
9e50: 50 33 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P3 into register
9e60: 73 20 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a  s P2..P2+P3..**.
9e70: 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
9e80: 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70  ion makes a deep
9e90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c   copy of the val
9ea0: 75 65 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65  ue.  A duplicate
9eb0: 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61  .** is made of a
9ec0: 6e 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  ny string or blo
9ed0: 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  b constant.  See
9ee0: 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a   also OP_SCopy..
9ef0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a  */.case OP_Copy:
9f00: 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e   {.  int n;..  n
9f10: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49   = pOp->p3;.  pI
9f20: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
9f30: 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p1];.  pOut = &a
9f40: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
9f50: 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49  assert( pOut!=pI
9f60: 6e 31 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  n1 );.  while( 1
9f70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
9f80: 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
9f90: 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45  y(pOut, pIn1, ME
9fa0: 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65  M_Ephem);.    De
9fb0: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75  ephemeralize(pOu
9fc0: 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
9fd0: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74  E_DEBUG.    pOut
9fe0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30  ->pScopyFrom = 0
9ff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47  ;.#endif.    REG
a000: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
a010: 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70  >p2+pOp->p3-n, p
a020: 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e  Out);.    if( (n
a030: 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  --)==0 ) break;.
a040: 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20      pOut++;.    
a050: 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72  pIn1++;.  }.  br
a060: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a070: 65 3a 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a  e: SCopy P1 P2 *
a080: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
a090: 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a  : r[P2]=r[P1].**
a0a0: 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c  .** Make a shall
a0b0: 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73  ow copy of regis
a0c0: 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69  ter P1 into regi
a0d0: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
a0e0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
a0f0: 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20  makes a shallow 
a100: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
a110: 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  e.  If the value
a120: 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
a130: 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68  or blob, then th
a140: 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61  e copy is only a
a150: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
a160: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20  ** original and 
a170: 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69  hence if the ori
a180: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f  ginal changes so
a190: 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a   will the copy..
a1a0: 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65  ** Worse, if the
a1b0: 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61   original is dea
a1c0: 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f  llocated, the co
a1d0: 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c  py becomes inval
a1e0: 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20  id..** Thus the 
a1f0: 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61  program must gua
a200: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
a210: 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f  original will no
a220: 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69  t change.** duri
a230: 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
a240: 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73  of the copy.  Us
a250: 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b  e OP_Copy to mak
a260: 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20  e a complete.** 
a270: 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  copy..*/.case OP
a280: 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20  _SCopy: {       
a290: 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
a2a0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
a2b0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
a2c0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
a2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74  ;.  assert( pOut
a2e0: 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69  !=pIn1 );.  sqli
a2f0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
a300: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31  wCopy(pOut, pIn1
a310: 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69  , MEM_Ephem);.#i
a320: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a330: 47 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53  G.  if( pOut->pS
a340: 63 6f 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f  copyFrom==0 ) pO
a350: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d  ut->pScopyFrom =
a360: 20 70 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20   pIn1;.#endif.  
a370: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a380: 6f 64 65 3a 20 49 6e 74 43 6f 70 79 20 50 31 20  ode: IntCopy P1 
a390: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
a3a0: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31  psis: r[P2]=r[P1
a3b0: 5d 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ].**.** Transfer
a3c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
a3d0: 75 65 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73  ue held in regis
a3e0: 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69  ter P1 into regi
a3f0: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
a400: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
a410: 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  zed version of S
a420: 43 6f 70 79 20 74 68 61 74 20 77 6f 72 6b 73 20  Copy that works 
a430: 6f 6e 6c 79 20 66 6f 72 20 69 6e 74 65 67 65 72  only for integer
a440: 0a 2a 2a 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63  .** values..*/.c
a450: 61 73 65 20 4f 50 5f 49 6e 74 43 6f 70 79 3a 20  ase OP_IntCopy: 
a460: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
a470: 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d  out2 */.  pIn1 =
a480: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
a490: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
a4a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
a4b0: 74 29 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20  t)!=0 );.  pOut 
a4c0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
a4d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
a4e0: 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c  emSetInt64(pOut,
a4f0: 20 70 49 6e 31 2d 3e 75 2e 69 29 3b 0a 20 20 62   pIn1->u.i);.  b
a500: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
a510: 64 65 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31  de: ResultRow P1
a520: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
a530: 6f 70 73 69 73 3a 20 6f 75 74 70 75 74 3d 72 5b  opsis: output=r[
a540: 50 31 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P1@P2].**.** The
a550: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 74 68   registers P1 th
a560: 72 6f 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f  rough P1+P2-1 co
a570: 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ntain a single r
a580: 6f 77 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73  ow of.** results
a590: 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61  . This opcode ca
a5a0: 75 73 65 73 20 74 68 65 20 73 71 6c 69 74 65 33  uses the sqlite3
a5b0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20  _step() call to 
a5c0: 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74  terminate.** wit
a5d0: 68 20 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20  h an SQLITE_ROW 
a5e0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
a5f0: 69 74 20 73 65 74 73 20 75 70 20 74 68 65 20 73  it sets up the s
a600: 71 6c 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73  qlite3_stmt.** s
a610: 74 72 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76  tructure to prov
a620: 69 64 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ide access to th
a630: 65 20 72 28 50 31 29 2e 2e 72 28 50 31 2b 50 32  e r(P1)..r(P1+P2
a640: 2d 31 29 20 76 61 6c 75 65 73 20 61 73 0a 2a 2a  -1) values as.**
a650: 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 2e   the result row.
a660: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75  .*/.case OP_Resu
a670: 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ltRow: {.  Mem *
a680: 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pMem;.  int i;. 
a690: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73   assert( p->nRes
a6a0: 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20  Column==pOp->p2 
a6b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
a6c0: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p1>0 );.  asse
a6d0: 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d  rt( pOp->p1+pOp-
a6e0: 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p2<=(p->nMem+1 
a6f0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
a700: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
a710: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
a720: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 52  _CALLBACK.  /* R
a730: 75 6e 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  un the progress 
a740: 63 6f 75 6e 74 65 72 20 6a 75 73 74 20 62 65 66  counter just bef
a750: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
a760: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50   */.  if( db->xP
a770: 72 6f 67 72 65 73 73 21 3d 30 0a 20 20 20 26 26  rogress!=0.   &&
a780: 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72   nVmStep>=nProgr
a790: 65 73 73 4c 69 6d 69 74 20 0a 20 20 20 26 26 20  essLimit .   && 
a7a0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62  db->xProgress(db
a7b0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29 21  ->pProgressArg)!
a7c0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  =0.  ){.    rc =
a7d0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a7e0: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  T;.    goto abor
a7f0: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
a800: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
a810: 20 49 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   If this stateme
a820: 6e 74 20 68 61 73 20 76 69 6f 6c 61 74 65 64 20  nt has violated 
a830: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
a840: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a850: 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72  s, do.  ** not r
a860: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
a870: 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 65   of rows modifie
a880: 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45  d. And do not RE
a890: 4c 45 41 53 45 20 74 68 65 20 73 74 61 74 65 6d  LEASE the statem
a8a0: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
a8b0: 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 74  tion. It needs t
a8c0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
a8d0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
a8e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
a8f0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
a900: 70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 61 73  p, 0)) ){.    as
a910: 73 65 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 26  sert( db->flags&
a920: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
a930: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a940: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
a950: 61 6c 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61  al );.    goto a
a960: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
a970: 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
a980: 74 68 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  the SQLITE_Count
a990: 52 6f 77 73 20 66 6c 61 67 20 69 73 20 73 65 74  Rows flag is set
a9a0: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
a9b0: 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20  s mask, then .  
a9c0: 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74  ** DML statement
a9d0: 73 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70  s invoke this op
a9e0: 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74  code to return t
a9f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
aa00: 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  s .  ** modified
aa10: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68   to the user. Th
aa20: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
aa30: 61 79 20 74 68 61 74 20 61 20 56 4d 20 74 68 61  ay that a VM tha
aa40: 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73  t.  ** opens a s
aa50: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
aa60: 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20  tion may invoke 
aa70: 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a  this opcode..  *
aa80: 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74  *.  ** In case t
aa90: 68 69 73 20 69 73 20 73 75 63 68 20 61 20 73 74  his is such a st
aaa0: 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61  atement, close a
aab0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ny statement tra
aac0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  nsaction.  ** op
aad0: 65 6e 65 64 20 62 79 20 74 68 69 73 20 56 4d 20  ened by this VM 
aae0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
aaf0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
ab00: 75 73 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f  user. This is to
ab10: 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
ab20: 74 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  t statement-tran
ab30: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77  sactions are alw
ab40: 61 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20  ays nested, not 
ab50: 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a  overlapping..  *
ab60: 2a 20 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74  * If the open st
ab70: 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
ab80: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65  ion is not close
ab90: 64 20 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65  d here, then the
aba0: 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73   user.  ** may s
abb0: 74 65 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74  tep another VM t
abc0: 68 61 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77  hat opens its ow
abd0: 6e 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  n statement tran
abe0: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20  saction. This.  
abf0: 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f  ** may lead to o
ac00: 76 65 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65  verlapping state
ac10: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
ac20: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
ac30: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ac40: 61 63 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20  action is never 
ac50: 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e  a top-level tran
ac60: 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a  saction.  Hence.
ac70: 20 20 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45    ** the RELEASE
ac80: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20   call below can 
ac90: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f  never fail..  */
aca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
acb0: 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64  tatement==0 || d
acc0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
acd0: 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72  CountRows );.  r
ace0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
acf0: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
ad00: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
ad10: 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  SE);.  assert( r
ad20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
ad30: 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65  .  /* Invalidate
ad40: 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 63   all ephemeral c
ad50: 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68 65 73  ursor row caches
ad60: 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   */.  p->cacheCt
ad70: 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 72  r = (p->cacheCtr
ad80: 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d   + 2)|1;..  /* M
ad90: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 73  ake sure the res
ada0: 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ults of the curr
adb0: 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30 30 30  ent row are \000
adc0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a   terminated.  **
add0: 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61 73 73   and have an ass
ade0: 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54 68 65  igned type.  The
adf0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 65 2d   results are de-
ae00: 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 73  ephemeralized as
ae10: 0a 20 20 2a 2a 20 61 20 73 69 64 65 20 65 66 66  .  ** a side eff
ae20: 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d  ect..  */.  pMem
ae30: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
ae40: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
ae50: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
ae60: 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20  pOp->p2; i++){. 
ae70: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
ae80: 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20  Valid(&pMem[i]) 
ae90: 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72  );.    Deephemer
aea0: 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b  alize(&pMem[i]);
aeb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d  .    assert( (pM
aec0: 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[i].flags & ME
aed0: 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20  M_Ephem)==0.    
aee0: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d          || (pMem
aef0: 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d  [i].flags & (MEM
af00: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  _Str|MEM_Blob))=
af10: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
af20: 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69  3VdbeMemNulTermi
af30: 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a  nate(&pMem[i]);.
af40: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
af50: 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70  CE(pOp->p1+i, &p
af60: 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  Mem[i]);.  }.  i
af70: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
af80: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
af90: 6d 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54  m;..  if( db->mT
afa0: 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52  race & SQLITE_TR
afb0: 41 43 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64  ACE_ROW ){.    d
afc0: 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45  b->xTrace(SQLITE
afd0: 5f 54 52 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e  _TRACE_ROW, db->
afe0: 70 54 72 61 63 65 41 72 67 2c 20 70 2c 20 30 29  pTraceArg, p, 0)
aff0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
b000: 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  rn SQLITE_ROW.  
b010: 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e  */.  p->pc = (in
b020: 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20  t)(pOp - aOp) + 
b030: 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  1;.  rc = SQLITE
b040: 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62  _ROW;.  goto vdb
b050: 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  e_return;.}../* 
b060: 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50  Opcode: Concat P
b070: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b080: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b090: 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P2]+r[P1].**.**
b0a0: 20 41 64 64 20 74 68 65 20 74 65 78 74 20 69 6e   Add the text in
b0b0: 20 72 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74   register P1 ont
b0c0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b0d0: 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69   text in.** regi
b0e0: 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72  ster P2 and stor
b0f0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b100: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
b110: 49 66 20 65 69 74 68 65 72 20 74 68 65 20 50 31  If either the P1
b120: 20 6f 72 20 50 32 20 74 65 78 74 20 61 72 65 20   or P2 text are 
b130: 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20  NULL then store 
b140: 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a  NULL in P3..**.*
b150: 2a 20 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50  *   P3 = P2 || P
b160: 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  1.**.** It is il
b170: 6c 65 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64  legal for P1 and
b180: 20 50 33 20 74 6f 20 62 65 20 74 68 65 20 73 61   P3 to be the sa
b190: 6d 65 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d  me register. Som
b1a0: 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33  etimes,.** if P3
b1b0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67   is the same reg
b1c0: 69 73 74 65 72 20 61 73 20 50 32 2c 20 74 68 65  ister as P2, the
b1d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b1e0: 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76  is able.** to av
b1f0: 6f 69 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a  oid a memcpy()..
b200: 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61  */.case OP_Conca
b210: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  t: {           /
b220: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e  * same as TK_CON
b230: 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  CAT, in1, in2, o
b240: 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79  ut3 */.  i64 nBy
b250: 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  te;..  pIn1 = &a
b260: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
b270: 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
b280: 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p2];.  pOut = 
b290: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
b2a0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d    assert( pIn1!=
b2b0: 70 4f 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70  pOut );.  if( (p
b2c0: 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e  In1->flags | pIn
b2d0: 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f  2->flags) & MEM_
b2e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  Null ){.    sqli
b2f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
b300: 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65  l(pOut);.    bre
b310: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78  ak;.  }.  if( Ex
b320: 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c  pandBlob(pIn1) |
b330: 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  | ExpandBlob(pIn
b340: 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  2) ) goto no_mem
b350: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
b360: 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n1, encoding);. 
b370: 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c   Stringify(pIn2,
b380: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42   encoding);.  nB
b390: 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20  yte = pIn1->n + 
b3a0: 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e  pIn2->n;.  if( n
b3b0: 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Byte>db->aLimit[
b3c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
b3d0: 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
b3e0: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
b3f0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
b400: 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e  emGrow(pOut, (in
b410: 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d  t)nByte+2, pOut=
b420: 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f  =pIn2) ){.    go
b430: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
b440: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
b450: 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a  pOut, MEM_Str);.
b460: 20 20 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32    if( pOut!=pIn2
b470: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
b480: 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c  Out->z, pIn2->z,
b490: 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20   pIn2->n);.  }. 
b4a0: 20 6d 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a   memcpy(&pOut->z
b4b0: 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d  [pIn2->n], pIn1-
b4c0: 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20  >z, pIn1->n);.  
b4d0: 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30  pOut->z[nByte]=0
b4e0: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
b4f0: 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74  e+1] = 0;.  pOut
b500: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54  ->flags |= MEM_T
b510: 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  erm;.  pOut->n =
b520: 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
b530: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
b540: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
b550: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
b560: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
b570: 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20   Opcode: Add P1 
b580: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b590: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b5a0: 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41  1]+r[P2].**.** A
b5b0: 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  dd the value in 
b5c0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 74  register P1 to t
b5d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b5e0: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b5f0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b600: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b610: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b620: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b630: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b640: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75  */./* Opcode: Mu
b650: 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33 20  ltiply P1 P2 P3 
b660: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
b670: 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50   r[P3]=r[P1]*r[P
b680: 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74  2].**.**.** Mult
b690: 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20 69  iply the value i
b6a0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79  n register P1 by
b6b0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b6c0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
b6d0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b6e0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b6f0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
b700: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
b710: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b720: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b730: 53 75 62 74 72 61 63 74 20 50 31 20 50 32 20 50  Subtract P1 P2 P
b740: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
b750: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72  s: r[P3]=r[P2]-r
b760: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72  [P1].**.** Subtr
b770: 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
b780: 20 72 65 67 69 73 74 65 72 20 50 31 20 66 72 6f   register P1 fro
b790: 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  m the value in r
b7a0: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
b7b0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
b7c0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b7d0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b7e0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b7f0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b800: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b810: 20 44 69 76 69 64 65 20 50 31 20 50 32 20 50 33   Divide P1 P2 P3
b820: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
b830: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b  : r[P3]=r[P2]/r[
b840: 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65  P1].**.** Divide
b850: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b860: 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65  gister P1 by the
b870: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b880: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
b890: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b8a0: 20 72 65 67 69 73 74 65 72 20 50 33 20 28 50 33   register P3 (P3
b8b0: 3d 50 32 2f 50 31 29 2e 20 49 66 20 74 68 65 20  =P2/P1). If the 
b8c0: 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67  value in .** reg
b8d0: 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f  ister P1 is zero
b8e0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
b8f0: 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69  t is NULL. If ei
b900: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 0a 2a  ther input is .*
b910: 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  * NULL, the resu
b920: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
b930: 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e  * Opcode: Remain
b940: 64 65 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a  der P1 P2 P3 * *
b950: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
b960: 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50 31 5d 0a  P3]=r[P2]%r[P1].
b970: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
b980: 65 20 72 65 6d 61 69 6e 64 65 72 20 61 66 74 65  e remainder afte
b990: 72 20 69 6e 74 65 67 65 72 20 72 65 67 69 73 74  r integer regist
b9a0: 65 72 20 50 32 20 69 73 20 64 69 76 69 64 65 64  er P2 is divided
b9b0: 20 62 79 20 0a 2a 2a 20 72 65 67 69 73 74 65 72   by .** register
b9c0: 20 50 31 20 61 6e 64 20 73 74 6f 72 65 20 74 68   P1 and store th
b9d0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b9e0: 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20 49 66 20  ster P3. .** If 
b9f0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
ba00: 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f  ister P1 is zero
ba10: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
ba20: 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  ULL..** If eithe
ba30: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
ba40: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
ba50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
ba60: 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 20  P_Add:          
ba70: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ba80: 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31   as TK_PLUS, in1
ba90: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
baa0: 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a  ase OP_Subtract:
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bac0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55   same as TK_MINU
bad0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
bae0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c  3 */.case OP_Mul
baf0: 74 69 70 6c 79 3a 20 20 20 20 20 20 20 20 20 20  tiply:          
bb00: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
bb10: 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32  K_STAR, in1, in2
bb20: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
bb30: 50 5f 44 69 76 69 64 65 3a 20 20 20 20 20 20 20  P_Divide:       
bb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
bb50: 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e   as TK_SLASH, in
bb60: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
bb70: 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65  case OP_Remainde
bb80: 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  r: {           /
bb90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d  * same as TK_REM
bba0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
bbb0: 20 2a 2f 0a 20 20 63 68 61 72 20 62 49 6e 74 69   */.  char bInti
bbc0: 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72 74 65 64  nt;   /* Started
bbd0: 20 6f 75 74 20 61 73 20 74 77 6f 20 69 6e 74 65   out as two inte
bbe0: 67 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a  ger operands */.
bbf0: 20 20 75 31 36 20 66 6c 61 67 73 3b 20 20 20 20    u16 flags;    
bc00: 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45    /* Combined ME
bc10: 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62  M_* flags from b
bc20: 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20  oth inputs */.  
bc30: 75 31 36 20 74 79 70 65 31 3b 20 20 20 20 20 20  u16 type1;      
bc40: 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70 65 20  /* Numeric type 
bc50: 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  of left operand 
bc60: 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 32 3b 20  */.  u16 type2; 
bc70: 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20       /* Numeric 
bc80: 74 79 70 65 20 6f 66 20 72 69 67 68 74 20 6f 70  type of right op
bc90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69  erand */.  i64 i
bca0: 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  A;         /* In
bcb0: 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c  teger value of l
bcc0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
bcd0: 20 69 36 34 20 69 42 3b 20 20 20 20 20 20 20 20   i64 iB;        
bce0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
bcf0: 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61  e of right opera
bd00: 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  nd */.  double r
bd10: 41 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20  A;      /* Real 
bd20: 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70  value of left op
bd30: 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c  erand */.  doubl
bd40: 65 20 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65  e rB;      /* Re
bd50: 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68  al value of righ
bd60: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20  t operand */..  
bd70: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
bd80: 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65 31 20 3d  ->p1];.  type1 =
bd90: 20 6e 75 6d 65 72 69 63 54 79 70 65 28 70 49 6e   numericType(pIn
bda0: 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
bdb0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74  em[pOp->p2];.  t
bdc0: 79 70 65 32 20 3d 20 6e 75 6d 65 72 69 63 54 79  ype2 = numericTy
bdd0: 70 65 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74  pe(pIn2);.  pOut
bde0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
bdf0: 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e  ];.  flags = pIn
be00: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
be10: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 74  >flags;.  if( (t
be20: 79 70 65 31 20 26 20 74 79 70 65 32 20 26 20 4d  ype1 & type2 & M
be30: 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
be40: 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69    iA = pIn1->u.i
be50: 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d  ;.    iB = pIn2-
be60: 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e 74 69 6e  >u.i;.    bIntin
be70: 74 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 63  t = 1;.    switc
be80: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
be90: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
bea0: 41 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73  Add:       if( s
beb0: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
bec0: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
bed0: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
bee0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62       case OP_Sub
bef0: 74 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69  tract:  if( sqli
bf00: 74 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c  te3SubInt64(&iB,
bf10: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
bf20: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
bf30: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70    case OP_Multip
bf40: 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ly:  if( sqlite3
bf50: 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29  MulInt64(&iB,iA)
bf60: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
bf70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf80: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
bf90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
bfa0: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
bfb0: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
bfc0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
bfd0: 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53   iA==-1 && iB==S
bfe0: 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20  MALLEST_INT64 ) 
bff0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20  goto fp_math;.  
c000: 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a        iB /= iA;.
c010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
c030: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
c040: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
c050: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
c060: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
c070: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
c080: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
c090: 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20   iB %= iA;.     
c0a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c0b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  }.    }.    pOut
c0c0: 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20  ->u.i = iB;.    
c0d0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c0e0: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
c0f0: 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
c100: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
c110: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 72 69   ){.    goto ari
c120: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
c130: 73 5f 6e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  s_null;.  }else{
c140: 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 30  .    bIntint = 0
c150: 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20 20 20 72  ;.fp_math:.    r
c160: 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  A = sqlite3VdbeR
c170: 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a  ealValue(pIn1);.
c180: 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65 33      rB = sqlite3
c190: 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49  VdbeRealValue(pI
c1a0: 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  n2);.    switch(
c1b0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
c1c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64        case OP_Ad
c1d0: 64 3a 20 20 20 20 20 20 20 20 20 72 42 20 2b 3d  d:         rB +=
c1e0: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
c1f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
c200: 53 75 62 74 72 61 63 74 3a 20 20 20 20 72 42 20  Subtract:    rB 
c210: 2d 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  -= rA;       bre
c220: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c230: 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 72  P_Multiply:    r
c240: 42 20 2a 3d 20 72 41 3b 20 20 20 20 20 20 20 62  B *= rA;       b
c250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c260: 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20   OP_Divide: {.  
c270: 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65        /* (double
c280: 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
c290: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
c2a0: 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
c2b0: 20 20 20 20 20 20 20 69 66 28 20 72 41 3d 3d 28         if( rA==(
c2c0: 64 6f 75 62 6c 65 29 30 20 29 20 67 6f 74 6f 20  double)0 ) goto 
c2d0: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
c2e0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
c2f0: 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a 20 20 20     rB /= rA;.   
c300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c310: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
c320: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 41 20  t: {.        iA 
c330: 3d 20 28 69 36 34 29 72 41 3b 0a 20 20 20 20 20  = (i64)rA;.     
c340: 20 20 20 69 42 20 3d 20 28 69 36 34 29 72 42 3b     iB = (i64)rB;
c350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
c360: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
c370: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
c380: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
c390: 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31   iA==-1 ) iA = 1
c3a0: 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d 20 28  ;.        rB = (
c3b0: 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69 41 29  double)(iB % iA)
c3c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
c3e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c3f0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
c400: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
c410: 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   rB;.    MemSetT
c420: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
c430: 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20  M_Int);.#else.  
c440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
c450: 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20 20 20  aN(rB) ){.      
c460: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
c470: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
c480: 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e      }.    pOut->
c490: 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65  u.r = rB;.    Me
c4a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
c4b0: 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  t, MEM_Real);.  
c4c0: 20 20 69 66 28 20 28 28 74 79 70 65 31 7c 74 79    if( ((type1|ty
c4d0: 70 65 32 29 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d  pe2)&MEM_Real)==
c4e0: 30 20 26 26 20 21 62 49 6e 74 69 6e 74 20 29 7b  0 && !bIntint ){
c4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c500: 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74  beIntegerAffinit
c510: 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23  y(pOut);.    }.#
c520: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61  endif.  }.  brea
c530: 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72  k;..arithmetic_r
c540: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20  esult_is_null:. 
c550: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
c560: 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20  etNull(pOut);.  
c570: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c580: 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 50 31 20  ode: CollSeq P1 
c590: 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20  * * P4.**.** P4 
c5a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c5b0: 61 20 43 6f 6c 6c 53 65 71 20 6f 62 6a 65 63 74  a CollSeq object
c5c0: 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 63 61  . If the next ca
c5d0: 6c 6c 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e  ll to a user fun
c5e0: 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72  ction.** or aggr
c5f0: 65 67 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69  egate calls sqli
c600: 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65  te3GetFuncCollSe
c610: 71 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74  q(), this collat
c620: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ion sequence wil
c630: 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64  l.** be returned
c640: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
c650: 79 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  y the built-in m
c660: 69 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20  in(), max() and 
c670: 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63  nullif().** func
c680: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tions..**.** If 
c690: 50 31 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P1 is not zero, 
c6a0: 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 67  then it is a reg
c6b0: 69 73 74 65 72 20 74 68 61 74 20 61 20 73 75 62  ister that a sub
c6c0: 73 65 71 75 65 6e 74 20 6d 69 6e 28 29 20 6f 72  sequent min() or
c6d0: 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67 72 65 67  .** max() aggreg
c6e0: 61 74 65 20 77 69 6c 6c 20 73 65 74 20 74 6f 20  ate will set to 
c6f0: 31 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  1 if the current
c700: 20 72 6f 77 20 69 73 20 6e 6f 74 20 74 68 65 20   row is not the 
c710: 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20 6d 61  minimum or.** ma
c720: 78 69 6d 75 6d 2e 20 20 54 68 65 20 50 31 20 72  ximum.  The P1 r
c730: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
c740: 61 6c 69 7a 65 64 20 74 6f 20 30 20 62 79 20 74  alized to 0 by t
c750: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
c760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
c770: 66 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  face used by the
c780: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c790: 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65 6e 74  of the aforement
c7a0: 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a  ioned functions.
c7b0: 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ** to retrieve t
c7c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
c7d0: 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68 69  uence set by thi
c7e0: 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20  s opcode is not 
c7f0: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75 62  available.** pub
c800: 6c 69 63 6c 79 2e 20 20 4f 6e 6c 79 20 62 75 69  licly.  Only bui
c810: 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20  lt-in functions 
c820: 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74  have access to t
c830: 68 69 73 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a  his feature..*/.
c840: 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a  case OP_CollSeq:
c850: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
c860: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c  ->p4type==P4_COL
c870: 4c 53 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f  LSEQ );.  if( pO
c880: 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c  p->p1 ){.    sql
c890: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
c8a0: 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t64(&aMem[pOp->p
c8b0: 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72  1], 0);.  }.  br
c8c0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c8d0: 65 3a 20 42 69 74 41 6e 64 20 50 31 20 50 32 20  e: BitAnd P1 P2 
c8e0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
c8f0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 26  is: r[P3]=r[P1]&
c900: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65  r[P2].**.** Take
c910: 20 74 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e   the bit-wise AN
c920: 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  D of the values 
c930: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
c940: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
c950: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
c960: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
c970: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
c980: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
c990: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
c9a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f  ./* Opcode: BitO
c9b0: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
c9c0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
c9d0: 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d 0a 2a 2a  ]=r[P1]|r[P2].**
c9e0: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74  .** Take the bit
c9f0: 2d 77 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20  -wise OR of the 
ca00: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
ca10: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
ca20: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65  .** store the re
ca30: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
ca40: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
ca50: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
ca60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
ca70: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
ca80: 65 3a 20 53 68 69 66 74 4c 65 66 74 20 50 31 20  e: ShiftLeft P1 
ca90: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
caa0: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
cab0: 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]<<r[P1].**.** 
cac0: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
cad0: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
cae0: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65  ter P2 to the le
caf0: 66 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ft by the.** num
cb00: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
cb10: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
cb20: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
cb30: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
cb40: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
cb50: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
cb60: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
cb70: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
cb80: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
cb90: 70 63 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68  pcode: ShiftRigh
cba0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
cbb0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
cbc0: 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50 31 5d 0a 2a  ]=r[P2]>>r[P1].*
cbd0: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
cbe0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
cbf0: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
cc00: 68 65 20 72 69 67 68 74 20 62 79 20 74 68 65 0a  he right by the.
cc10: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
cc20: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
cc30: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
cc40: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
cc50: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
cc60: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
cc70: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
cc80: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
cc90: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
cca0: 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64  /.case OP_BitAnd
ccb0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ccc0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ccd0: 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32  BITAND, in1, in2
cce0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
ccf0: 50 5f 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20  P_BitOr:        
cd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
cd10: 65 20 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69  e as TK_BITOR, i
cd20: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
cd30: 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65  .case OP_ShiftLe
cd40: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ft:             
cd50: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
cd60: 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c  SHIFT, in1, in2,
cd70: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
cd80: 5f 53 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20  _ShiftRight: {  
cd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
cda0: 20 61 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69   as TK_RSHIFT, i
cdb0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
cdc0: 0a 20 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34  .  i64 iA;.  u64
cdd0: 20 75 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20   uA;.  i64 iB;. 
cde0: 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20   u8 op;..  pIn1 
cdf0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
ce00: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
ce10: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
ce20: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
ce30: 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  3];.  if( (pIn1-
ce40: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66  >flags | pIn2->f
ce50: 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c  lags) & MEM_Null
ce60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
ce70: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
ce80: 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ut);.    break;.
ce90: 20 20 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74    }.  iA = sqlit
cea0: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
ceb0: 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c  In2);.  iB = sql
cec0: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
ced0: 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70  (pIn1);.  op = p
cee0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66  Op->opcode;.  if
cef0: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  ( op==OP_BitAnd 
cf00: 29 7b 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b  ){.    iA &= iB;
cf10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
cf20: 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20  =OP_BitOr ){.   
cf30: 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA |= iB;.  }el
cf40: 73 65 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a  se if( iB!=0 ){.
cf50: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
cf60: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c  OP_ShiftRight ||
cf70: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66   op==OP_ShiftLef
cf80: 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t );..    /* If 
cf90: 73 68 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65  shifting by a ne
cfa0: 67 61 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73  gative amount, s
cfb0: 68 69 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65  hift in the othe
cfc0: 72 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  r direction */. 
cfd0: 20 20 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20     if( iB<0 ){. 
cfe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
cff0: 53 68 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53  ShiftRight==OP_S
d000: 68 69 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20  hiftLeft+1 );.  
d010: 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68      op = 2*OP_Sh
d020: 69 66 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70  iftLeft + 1 - op
d030: 3b 0a 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e  ;.      iB = iB>
d040: 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34  (-64) ? -iB : 64
d050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
d060: 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20   iB>=64 ){.     
d070: 20 69 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20   iA = (iA>=0 || 
d080: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
d090: 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20  ) ? 0 : -1;.    
d0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
d0b0: 63 70 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69  cpy(&uA, &iA, si
d0c0: 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20  zeof(uA));.     
d0d0: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66   if( op==OP_Shif
d0e0: 74 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  tLeft ){.       
d0f0: 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20   uA <<= iB;.    
d100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d110: 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20   uA >>= iB;.    
d120: 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65      /* Sign-exte
d130: 6e 64 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68  nd on a right sh
d140: 69 66 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76  ift of a negativ
d150: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
d160: 20 20 20 20 69 66 28 20 69 41 3c 30 20 29 20 75      if( iA<0 ) u
d170: 41 20 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66  A |= ((((u64)0xf
d180: 66 66 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78  fffffff)<<32)|0x
d190: 66 66 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34  ffffffff) << (64
d1a0: 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -iB);.      }.  
d1b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20      memcpy(&iA, 
d1c0: 26 75 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29  &uA, sizeof(iA))
d1d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  ;.    }.  }.  pO
d1e0: 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20  ut->u.i = iA;.  
d1f0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
d200: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
d210: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
d220: 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31  code: AddImm  P1
d230: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
d240: 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 72 5b 50  opsis: r[P1]=r[P
d250: 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a 20 41 64 64  1]+P2.** .** Add
d260: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32   the constant P2
d270: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
d280: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
d290: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
d2a0: 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72  lways an integer
d2b0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65  ..**.** To force
d2c0: 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f   any register to
d2d0: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   be an integer, 
d2e0: 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63  just add 0..*/.c
d2f0: 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b  ase OP_AddImm: {
d300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
d310: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
d320: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
d330: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
d340: 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71  e(p, pIn1);.  sq
d350: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
d360: 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
d370: 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70  pIn1->u.i += pOp
d380: 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p2;.  break;.}
d390: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73  ../* Opcode: Mus
d3a0: 74 42 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a  tBeInt P1 P2 * *
d3b0: 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20   *.** .** Force 
d3c0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
d3d0: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61  ister P1 to be a
d3e0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  n integer.  If t
d3f0: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50  he value.** in P
d400: 31 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  1 is not an inte
d410: 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62  ger and cannot b
d420: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
d430: 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77   an integer.** w
d440: 69 74 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73  ithout data loss
d450: 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
d460: 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f  diately to P2, o
d470: 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61  r if P2==0.** ra
d480: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
d490: 53 4d 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e  SMATCH exception
d4a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73  ..*/.case OP_Mus
d4b0: 74 42 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20  tBeInt: {       
d4c0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
d4d0: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
d4e0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
d4f0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
d500: 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29   & MEM_Int)==0 )
d510: 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e  {.    applyAffin
d520: 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45  ity(pIn1, SQLITE
d530: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e  _AFF_NUMERIC, en
d540: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 56 64 62  coding);.    Vdb
d550: 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 28 70 49  eBranchTaken((pI
d560: 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  n1->flags&MEM_In
d570: 74 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69  t)==0, 2);.    i
d580: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
d590: 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b  & MEM_Int)==0 ){
d5a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
d5b0: 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p2==0 ){.       
d5c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
d5d0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 67  MATCH;.        g
d5e0: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
d5f0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  _error;.      }e
d600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  lse{.        got
d610: 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
d620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d630: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
d640: 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pIn1, MEM_Int);
d650: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
d660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d670: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
d680: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41  /* Opcode: RealA
d690: 66 66 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a  ffinity P1 * * *
d6a0: 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69   *.**.** If regi
d6b0: 73 74 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e  ster P1 holds an
d6c0: 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74   integer convert
d6d0: 20 69 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61   it to a real va
d6e0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
d6f0: 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 77  opcode is used w
d700: 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
d710: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
d720: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a  a column that.**
d730: 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
d740: 74 79 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e  ty.  Such column
d750: 20 76 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c   values may stil
d760: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
d770: 2a 20 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20  * integers, for 
d780: 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 63 79  space efficiency
d790: 2c 20 62 75 74 20 61 66 74 65 72 20 65 78 74 72  , but after extr
d7a0: 61 63 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74  action we want t
d7b0: 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f  hem.** to have o
d7c0: 6e 6c 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65  nly a real value
d7d0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
d7e0: 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20  lAffinity: {    
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d800: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
d810: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
d820: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
d830: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
d840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
d850: 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b  emRealify(pIn1);
d860: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
d870: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
d880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
d890: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 61 73 74  ./* Opcode: Cast
d8a0: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
d8b0: 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69  Synopsis: affini
d8c0: 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a 2a 2a 20  ty(r[P1]).**.** 
d8d0: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
d8e0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
d8f0: 6f 20 62 65 20 74 68 65 20 74 79 70 65 20 64 65  o be the type de
d900: 66 69 6e 65 64 20 62 79 20 50 32 2e 0a 2a 2a 20  fined by P2..** 
d910: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e  .** <ul>.** <li>
d920: 20 50 32 3d 3d 27 41 27 20 26 72 61 72 72 3b 20   P2=='A' &rarr; 
d930: 42 4c 4f 42 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d  BLOB.** <li> P2=
d940: 3d 27 42 27 20 26 72 61 72 72 3b 20 54 45 58 54  ='B' &rarr; TEXT
d950: 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 43 27  .** <li> P2=='C'
d960: 20 26 72 61 72 72 3b 20 4e 55 4d 45 52 49 43 0a   &rarr; NUMERIC.
d970: 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 44 27 20  ** <li> P2=='D' 
d980: 26 72 61 72 72 3b 20 49 4e 54 45 47 45 52 0a 2a  &rarr; INTEGER.*
d990: 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 45 27 20 26  * <li> P2=='E' &
d9a0: 72 61 72 72 3b 20 52 45 41 4c 0a 2a 2a 20 3c 2f  rarr; REAL.** </
d9b0: 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  ul>.**.** A NULL
d9c0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68   value is not ch
d9d0: 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f  anged by this ro
d9e0: 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69  utine.  It remai
d9f0: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  ns NULL..*/.case
da00: 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20 20 20 20   OP_Cast: {     
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da20: 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in1 */.  assert(
da30: 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54 45   pOp->p2>=SQLITE
da40: 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f 70  _AFF_BLOB && pOp
da50: 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46 46  ->p2<=SQLITE_AFF
da60: 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65 73 74 63  _REAL );.  testc
da70: 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ase( pOp->p2==SQ
da80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
da90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70  .  testcase( pOp
daa0: 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  ->p2==SQLITE_AFF
dab0: 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74 63  _BLOB );.  testc
dac0: 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ase( pOp->p2==SQ
dad0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
dae0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
daf0: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
db00: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
db10: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
db20: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  p2==SQLITE_AFF_R
db30: 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  EAL );.  pIn1 = 
db40: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
db50: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
db60: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 72  ge(p, pIn1);.  r
db70: 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  c = ExpandBlob(p
db80: 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  In1);.  sqlite3V
db90: 64 62 65 4d 65 6d 43 61 73 74 28 70 49 6e 31 2c  dbeMemCast(pIn1,
dba0: 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64 69   pOp->p2, encodi
dbb0: 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ng);.  UPDATE_MA
dbc0: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
dbd0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
dbe0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
dbf0: 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
dc00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dc10: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a  E_OMIT_CAST */..
dc20: 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31  /* Opcode: Eq P1
dc30: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
dc40: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
dc50: 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  3]==r[P1].**.** 
dc60: 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
dc70: 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  es in register P
dc80: 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65  1 and P3.  If re
dc90: 67 28 50 33 29 3d 3d 72 65 67 28 50 31 29 20 74  g(P3)==reg(P1) t
dca0: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61  hen.** jump to a
dcb0: 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69  ddress P2.  Or i
dcc0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f  f the SQLITE_STO
dcd0: 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65 74  REP2 flag is set
dce0: 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20   in P5, then.** 
dcf0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
dd00: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
dd10: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
dd20: 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
dd30: 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e  AFF_MASK portion
dd40: 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61   of P5 must be a
dd50: 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61  n affinity chara
dd60: 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45  cter -.** SQLITE
dd70: 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54  _AFF_TEXT, SQLIT
dd80: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61  E_AFF_INTEGER, a
dd90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20  nd so forth. An 
dda0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
ddb0: 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f  .** to coerce bo
ddc0: 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64  th inputs accord
ddd0: 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69  ing to this affi
dde0: 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a  nity before the.
ddf0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
de00: 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51   made. If the SQ
de10: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73  LITE_AFF_MASK is
de20: 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65   0x00, then nume
de30: 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ric.** affinity 
de40: 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68  is used. Note th
de50: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
de60: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
de70: 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69  stored.** back i
de80: 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65  nto the input re
de90: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
dea0: 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f  3.  So this opco
deb0: 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20  de can cause.** 
dec0: 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67  persistent chang
ded0: 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20  es to registers 
dee0: 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a  P1 and P3..**.**
def0: 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72   Once any conver
df00: 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e  sions have taken
df10: 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74   place, and neit
df20: 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  her value is NUL
df30: 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  L, .** the value
df40: 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20  s are compared. 
df50: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
df60: 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65  re blobs then me
df70: 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65  mcmp() is.** use
df80: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
df90: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
dfa0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
dfb0: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a  f both values.**
dfc0: 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20   are text, then 
dfd0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
dfe0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
dff0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a  on specified in.
e000: 2a 2a 20 50 34 20 69 73 20 75 73 65 64 20 74 6f  ** P4 is used to
e010: 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   do the comparis
e020: 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f  on.  If P4 is no
e030: 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65 6e  t specified then
e040: 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20  .** memcmp() is 
e050: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
e060: 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66  text string.  If
e070: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
e080: 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65  .** numeric, the
e090: 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70  n a numeric comp
e0a0: 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20  arison is used. 
e0b0: 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  If the two value
e0c0: 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66  s.** are of diff
e0d0: 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65  erent types, the
e0e0: 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f  n numbers are co
e0f0: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
e100: 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e  an.** strings an
e110: 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f  d strings are co
e120: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
e130: 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20  an blobs..**.** 
e140: 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
e150: 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 74 68   is set in P5 th
e160: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
e170: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   comparison is a
e180: 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20  lways either.** 
e190: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e  true or false an
e1a0: 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e  d is never NULL.
e1b0: 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e    If both operan
e1c0: 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e  ds are NULL then
e1d0: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
e1e0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
e1f0: 74 72 75 65 2e 20 20 49 66 20 65 69 74 68 65 72  true.  If either
e200: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
e210: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e220: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66   is false..** If
e230: 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64   neither operand
e240: 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73   is NULL the res
e250: 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ult is the same 
e260: 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
e270: 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  f.** the SQLITE_
e280: 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65  NULLEQ flag were
e290: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35   omitted from P5
e2a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
e2b0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61  SQLITE_STOREP2 a
e2c0: 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  nd SQLITE_KEEPNU
e2d0: 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65 74  LL flags are set
e2e0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e   then the.** con
e2f0: 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73  tent of r[P2] is
e300: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66   only changed if
e310: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
e320: 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61 6c  s NULL or 0 (fal
e330: 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  se)..** In other
e340: 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20   words, a prior 
e350: 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c  r[P2] value will
e360: 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74   not be overwrit
e370: 74 65 6e 20 62 79 20 31 20 28 74 72 75 65 29 2e  ten by 1 (true).
e380: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
e390: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
e3a0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
e3b0: 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a 2a   r[P3]!=r[P1].**
e3c0: 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
e3d0: 75 73 74 20 6c 69 6b 65 20 74 68 65 20 45 71 20  ust like the Eq 
e3e0: 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68  opcode except th
e3f0: 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  at the jump is t
e400: 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f  aken if.** the o
e410: 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73  perands in regis
e420: 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 20 61  ters P1 and P3 a
e430: 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53  re not equal.  S
e440: 65 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65  ee the Eq opcode
e450: 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   for.** addition
e460: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
e470: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51  **.** If both SQ
e480: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64  LITE_STOREP2 and
e490: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
e4a0: 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20 74   flags are set t
e4b0: 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  hen the.** conte
e4c0: 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f  nt of r[P2] is o
e4d0: 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
e4e0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
e4f0: 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72 75 65 29  NULL or 1 (true)
e500: 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
e510: 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50  rds, a prior r[P
e520: 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  2] value will no
e530: 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
e540: 20 62 79 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a   by 0 (false)..*
e550: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20  /./* Opcode: Lt 
e560: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
e570: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
e580: 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P3]<r[P1].**.**
e590: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
e5a0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
e5b0: 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72  P1 and P3.  If r
e5c0: 65 67 28 50 33 29 3c 72 65 67 28 50 31 29 20 74  eg(P3)<reg(P1) t
e5d0: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61  hen.** jump to a
e5e0: 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69  ddress P2.  Or i
e5f0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f  f the SQLITE_STO
e600: 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65 74  REP2 flag is set
e610: 20 69 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a 20   in P5 store.** 
e620: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
e630: 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f 72 20 31  mparison (0 or 1
e640: 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 72   or NULL) into r
e650: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
e660: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
e670: 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f  JUMPIFNULL bit o
e680: 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64 20  f P5 is set and 
e690: 65 69 74 68 65 72 20 72 65 67 28 50 31 29 20 6f  either reg(P1) o
e6a0: 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20  r.** reg(P3) is 
e6b0: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 74 61  NULL then the ta
e6c0: 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20 49 66  ke the jump.  If
e6d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50   the SQLITE_JUMP
e6e0: 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69  IFNULL .** bit i
e6f0: 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66 61 6c  s clear then fal
e700: 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65 69 74  l through if eit
e710: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
e720: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ULL..**.** The S
e730: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70  QLITE_AFF_MASK p
e740: 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73  ortion of P5 mus
e750: 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79  t be an affinity
e760: 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20   character -.** 
e770: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
e780: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
e790: 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  GER, and so fort
e7a0: 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  h. An attempt is
e7b0: 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65   made .** to coe
e7c0: 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20  rce both inputs 
e7d0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  according to thi
e7e0: 73 20 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72  s affinity befor
e7f0: 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69  e the.** compari
e800: 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20  son is made. If 
e810: 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  the SQLITE_AFF_M
e820: 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65  ASK is 0x00, the
e830: 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66  n numeric.** aff
e840: 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e  inity is used. N
e850: 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 66 66  ote that the aff
e860: 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e  inity conversion
e870: 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
e880: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e  back into the in
e890: 70 75 74 20 72 65 67 69 73 74 65 72 73 20 50 31  put registers P1
e8a0: 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69   and P3.  So thi
e8b0: 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75  s opcode can cau
e8c0: 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74  se.** persistent
e8d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69   changes to regi
e8e0: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
e8f0: 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20  .**.** Once any 
e900: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65  conversions have
e910: 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e   taken place, an
e920: 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20  d neither value 
e930: 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65  is NULL, .** the
e940: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70   values are comp
e950: 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61  ared. If both va
e960: 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74  lues are blobs t
e970: 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a  hen memcmp() is.
e980: 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  ** used to deter
e990: 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73  mine the results
e9a0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
e9b0: 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c  on.  If both val
e9c0: 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c  ues.** are text,
e9d0: 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70   then the approp
e9e0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
e9f0: 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
ea00: 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20  ed in.** P4 is  
ea10: 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63  used to do the c
ea20: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50  omparison.  If P
ea30: 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69  4 is not specifi
ea40: 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d  ed then.** memcm
ea50: 70 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 63  p() is used to c
ea60: 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74 72 69  ompare text stri
ea70: 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c  ng.  If both val
ea80: 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72  ues are.** numer
ea90: 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72  ic, then a numer
eaa0: 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ic comparison is
eab0: 20 75 73 65 64 2e 20 49 66 20 74 68 65 20 74 77   used. If the tw
eac0: 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  o values.** are 
ead0: 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  of different typ
eae0: 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73  es, then numbers
eaf0: 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
eb00: 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72  less than.** str
eb10: 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73  ings and strings
eb20: 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
eb30: 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
eb40: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .*/./* Opcode: L
eb50: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
eb60: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
eb70: 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a   r[P3]<=r[P1].**
eb80: 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
eb90: 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20  ust like the Lt 
eba0: 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68  opcode except th
ebb0: 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  at the jump is t
ebc0: 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63  aken if.** the c
ebd0: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
ebe0: 65 72 20 50 33 20 69 73 20 6c 65 73 73 20 74 68  er P3 is less th
ebf0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
ec00: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
ec10: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
ec20: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
ec30: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
ec40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
ec50: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31  /* Opcode: Gt P1
ec60: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
ec70: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
ec80: 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  3]>r[P1].**.** T
ec90: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
eca0: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
ecb0: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
ecc0: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
ecd0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  if.** the conten
ece0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
ecf0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
ed00: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
ed10: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
ed20: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
ed30: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
ed40: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
ed50: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20  /./* Opcode: Ge 
ed60: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
ed70: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
ed80: 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]>=r[P1].**.*
ed90: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
eda0: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
edb0: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
edc0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
edd0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
ede0: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
edf0: 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
ee00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
ee10: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
ee20: 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  * register P1.  
ee30: 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  See the Lt opcod
ee40: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
ee50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
ee60: 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20  .case OP_Eq:    
ee70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
ee80: 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d  me as TK_EQ, jum
ee90: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
eea0: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20  ase OP_Ne:      
eeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
eec0: 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c   as TK_NE, jump,
eed0: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
eee0: 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20  e OP_Lt:        
eef0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ef00: 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69  s TK_LT, jump, i
ef10: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
ef20: 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20  OP_Le:          
ef30: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
ef40: 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LE, jump, in1
ef50: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
ef60: 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Gt:            
ef70: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
ef80: 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _GT, jump, in1, 
ef90: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
efa0: 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
efb0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
efc0: 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  E, jump, in1, in
efd0: 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c 20  3 */.  int res, 
efe0: 72 65 73 32 3b 20 20 20 20 20 20 2f 2a 20 52 65  res2;      /* Re
eff0: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  sult of the comp
f000: 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61  arison of pIn1 a
f010: 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20  gainst pIn3 */. 
f020: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
f030: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
f040: 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70   to use for comp
f050: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  arison */.  u16 
f060: 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20 20  flags1;         
f070: 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69  /* Copy of initi
f080: 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31  al value of pIn1
f090: 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36  ->flags */.  u16
f0a0: 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20   flags3;        
f0b0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74   /* Copy of init
f0c0: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e  ial value of pIn
f0d0: 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70  3->flags */..  p
f0e0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
f0f0: 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
f100: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
f110: 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e   flags1 = pIn1->
f120: 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20  flags;.  flags3 
f130: 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20  = pIn3->flags;. 
f140: 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66   if( (flags1 | f
f150: 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20  lags3)&MEM_Null 
f160: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72  ){.    /* One or
f170: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
f180: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69  re NULL */.    i
f190: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
f1a0: 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20  ITE_NULLEQ ){.  
f1b0: 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45      /* If SQLITE
f1c0: 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28  _NULLEQ is set (
f1d0: 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20  which will only 
f1e0: 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70  happen if the op
f1f0: 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20  erator is.      
f200: 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e  ** OP_Eq or OP_N
f210: 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  e) then take the
f220: 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70   jump or not dep
f230: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
f240: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f  r.      ** or no
f250: 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  t both operands 
f260: 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20  are null..      
f270: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
f280: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
f290: 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  _Eq || pOp->opco
f2a0: 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  de==OP_Ne );.   
f2b0: 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
f2c0: 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65 64  s1 & MEM_Cleared
f2d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )==0 );.      as
f2e0: 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
f2f0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
f300: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  LL)==0 );.      
f310: 69 66 28 20 28 66 6c 61 67 73 31 26 66 6c 61 67  if( (flags1&flag
f320: 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a  s3&MEM_Null)!=0.
f330: 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
f340: 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d  3&MEM_Cleared)==
f350: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
f360: 20 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20     res = 0;  /* 
f370: 4f 70 65 72 61 6e 64 73 20 61 72 65 20 65 71 75  Operands are equ
f380: 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  al */.      }els
f390: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
f3a0: 20 31 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73   1;  /* Operands
f3b0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a   are not equal *
f3c0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
f3d0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51  lse{.      /* SQ
f3e0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63  LITE_NULLEQ is c
f3f0: 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73  lear and at leas
f400: 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73  t one operand is
f410: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20   NULL,.      ** 
f420: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f430: 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a  is always NULL..
f440: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d        ** The jum
f450: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
f460: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
f470: 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a  ULL bit is set..
f480: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f490: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
f4a0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
f4b0: 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61         pOut = &a
f4c0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
f4d0: 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d        iCompare =
f4e0: 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e   1;    /* Operan
f4f0: 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  ds are not equal
f500: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 41   */.        memA
f510: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
f520: 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 4d  pOut);.        M
f530: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
f540: 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
f550: 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
f560: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
f570: 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
f580: 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 42  e{.        VdbeB
f590: 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b  ranchTaken(2,3);
f5a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
f5b0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
f5c0: 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  MPIFNULL ){.    
f5d0: 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f        goto jump_
f5e0: 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 7d  to_p2;.        }
f5f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  reak;.    }.  }e
f610: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  lse{.    /* Neit
f620: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
f630: 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61  ULL.  Do a compa
f640: 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66  rison. */.    af
f650: 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35  finity = pOp->p5
f660: 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41   & SQLITE_AFF_MA
f670: 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69  SK;.    if( affi
f680: 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
f690: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
f6a0: 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
f6b0: 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74 72 20  flags3)&MEM_Str 
f6c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
f6d0: 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e  flags1 & (MEM_In
f6e0: 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53  t|MEM_Real|MEM_S
f6f0: 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b  tr))==MEM_Str ){
f700: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c 79  .          apply
f710: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
f720: 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20 20  pIn1,0);.       
f730: 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
f740: 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73  gs3!=pIn3->flags
f750: 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65 20   ); /* Possible 
f760: 69 66 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a 2f  if pIn1==pIn3 */
f770: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
f780: 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b  3 = pIn3->flags;
f790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f7a0: 20 20 20 69 66 28 20 28 66 6c 61 67 73 33 20 26     if( (flags3 &
f7b0: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
f7c0: 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45  al|MEM_Str))==ME
f7d0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
f7e0: 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
f7f0: 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 30 29 3b  ffinity(pIn3,0);
f800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f810: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64   }.      /* Hand
f820: 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  le the common ca
f830: 73 65 20 6f 66 20 69 6e 74 65 67 65 72 20 63 6f  se of integer co
f840: 6d 70 61 72 69 73 6f 6e 20 68 65 72 65 2c 20 61  mparison here, a
f850: 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  s an.      ** op
f860: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 61  timization, to a
f870: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
f880: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
f890: 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  () */.      if( 
f8a0: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70  (pIn1->flags & p
f8b0: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
f8c0: 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
f8d0: 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
f8e0: 69 20 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b  i > pIn1->u.i ){
f8f0: 20 72 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f 20   res = +1; goto 
f900: 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20  compare_op; }.  
f910: 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e        if( pIn3->
f920: 75 2e 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69 20  u.i < pIn1->u.i 
f930: 29 7b 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f 74  ){ res = -1; got
f940: 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a  o compare_op; }.
f950: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b          res = 0;
f960: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  .        goto co
f970: 6d 70 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20 20  mpare_op;.      
f980: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
f990: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
f9a0: 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20  _AFF_TEXT ){.   
f9b0: 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 26     if( (flags1 &
f9c0: 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20   MEM_Str)==0 && 
f9d0: 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49  (flags1 & (MEM_I
f9e0: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30  nt|MEM_Real))!=0
f9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
fa00: 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67  case( pIn1->flag
fa10: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
fa20: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
fa30: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
fa40: 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  EM_Real );.     
fa50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
fa60: 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c  mStringify(pIn1,
fa70: 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20   encoding, 1);. 
fa80: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
fa90: 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79 6e   (flags1&MEM_Dyn
faa0: 29 20 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ) != (pIn1->flag
fab0: 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  s&MEM_Dyn) );.  
fac0: 20 20 20 20 20 20 66 6c 61 67 73 31 20 3d 20 28        flags1 = (
fad0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e 4d  pIn1->flags & ~M
fae0: 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28  EM_TypeMask) | (
faf0: 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 54 79 70  flags1 & MEM_Typ
fb00: 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  eMask);.        
fb10: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 49  assert( pIn1!=pI
fb20: 6e 33 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n3 );.      }.  
fb30: 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33 20      if( (flags3 
fb40: 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26  & MEM_Str)==0 &&
fb50: 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f   (flags3 & (MEM_
fb60: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d  Int|MEM_Real))!=
fb70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
fb80: 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61  tcase( pIn3->fla
fb90: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
fba0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
fbb0: 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
fbc0: 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
fbe0: 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33  emStringify(pIn3
fbf0: 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a  , encoding, 1);.
fc00: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
fc10: 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79  ( (flags3&MEM_Dy
fc20: 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61  n) != (pIn3->fla
fc30: 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20  gs&MEM_Dyn) );. 
fc40: 20 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20         flags3 = 
fc50: 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e  (pIn3->flags & ~
fc60: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
fc70: 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79  (flags3 & MEM_Ty
fc80: 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d  peMask);.      }
fc90: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
fca0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
fcb0: 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f  P4_COLLSEQ || pO
fcc0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29  p->p4.pColl==0 )
fcd0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
fce0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49  te3MemCompare(pI
fcf0: 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70  n3, pIn1, pOp->p
fd00: 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63 6f  4.pColl);.  }.co
fd10: 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 2f 2a 20 41  mpare_op:.  /* A
fd20: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 72 65  t this point, re
fd30: 73 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  s is negative, z
fd40: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
fd50: 20 69 66 20 72 65 67 5b 50 31 5d 20 69 73 0a 20   if reg[P1] is. 
fd60: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   ** less than, e
fd70: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
fd80: 74 65 72 20 74 68 61 6e 20 72 65 67 5b 50 33 5d  ter than reg[P3]
fd90: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
fda0: 20 43 6f 6d 70 75 74 65 0a 20 20 2a 2a 20 74 68   Compute.  ** th
fdb0: 65 20 61 6e 73 77 65 72 20 74 6f 20 74 68 69 73  e answer to this
fdc0: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 72 65 73   operator in res
fdd0: 32 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  2, depending on 
fde0: 77 68 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69  what the compari
fdf0: 73 6f 6e 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  son.  ** operato
fe00: 72 20 61 63 74 75 61 6c 6c 79 20 69 73 2e 20 20  r actually is.  
fe10: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
fe20: 66 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  f code depends o
fe30: 6e 20 74 68 65 20 66 61 63 74 0a 20 20 2a 2a 20  n the fact.  ** 
fe40: 74 68 61 74 20 74 68 65 20 36 20 63 6f 6d 70 61  that the 6 compa
fe50: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20  rison operators 
fe60: 61 72 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20  are consecutive 
fe70: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 69 73  integers in this
fe80: 0a 20 20 2a 2a 20 6f 72 64 65 72 3a 20 20 4e 45  .  ** order:  NE
fe90: 2c 20 45 51 2c 20 47 54 2c 20 4c 45 2c 20 4c 54  , EQ, GT, LE, LT
fea0: 2c 20 47 45 20 2a 2f 0a 20 20 61 73 73 65 72 74  , GE */.  assert
feb0: 28 20 4f 50 5f 45 71 3d 3d 4f 50 5f 4e 65 2b 31  ( OP_Eq==OP_Ne+1
fec0: 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47   ); assert( OP_G
fed0: 74 3d 3d 4f 50 5f 4e 65 2b 32 20 29 3b 20 61 73  t==OP_Ne+2 ); as
fee0: 73 65 72 74 28 20 4f 50 5f 4c 65 3d 3d 4f 50 5f  sert( OP_Le==OP_
fef0: 4e 65 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74  Ne+3 );.  assert
ff00: 28 20 4f 50 5f 4c 74 3d 3d 4f 50 5f 4e 65 2b 34  ( OP_Lt==OP_Ne+4
ff10: 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47   ); assert( OP_G
ff20: 65 3d 3d 4f 50 5f 4e 65 2b 35 20 29 3b 0a 20 20  e==OP_Ne+5 );.  
ff30: 69 66 28 20 72 65 73 3c 30 20 29 7b 20 20 20 20  if( res<0 ){    
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 2f 2a 20 6e 65 2c 20 65 71 2c 20 67      /* ne, eq, g
ff60: 74 2c 20 6c 65 2c 20 6c 74 2c 20 67 65 20 2a 2f  t, le, lt, ge */
ff70: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
ff80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
ff90: 61 4c 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30  aLTb[] = { 1,  0
ffa0: 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  0,  1,  1,  0
ffb0: 20 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61   };.    res2 = a
ffc0: 4c 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  LTb[pOp->opcode 
ffd0: 2d 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73  - OP_Ne];.  }els
ffe0: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a  e if( res==0 ){.
fff0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10000 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
10010 45 51 62 5b 5d 20 3d 20 7b 20 30 2c 20 20 31 2c  EQb[] = { 0,  1,
10020 20 20 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 20    0,  1,  0,  1 
10030 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 45  };.    res2 = aE
10040 51 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d  Qb[pOp->opcode -
10050 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65   OP_Ne];.  }else
10060 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
10070 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
10080 20 61 47 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20   aGTb[] = { 1,  
10090 30 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  0,  1,  0,  0,  
100a0 31 20 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20  1 };.    res2 = 
100b0 61 47 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  aGTb[pOp->opcode
100c0 20 2d 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 0a 0a   - OP_Ne];.  }..
100d0 20 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68    /* Undo any ch
100e0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70  anges made by ap
100f0 70 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f  plyAffinity() to
10100 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
10110 74 65 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ters. */.  asser
10120 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  t( (pIn1->flags 
10130 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66  & MEM_Dyn) == (f
10140 6c 61 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29  lags1 & MEM_Dyn)
10150 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
10160 73 20 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73  s = flags1;.  as
10170 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61  sert( (pIn3->fla
10180 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d  gs & MEM_Dyn) ==
10190 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44   (flags3 & MEM_D
101a0 79 6e 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66  yn) );.  pIn3->f
101b0 6c 61 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a  lags = flags3;..
101c0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
101d0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
101e0 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d  {.    pOut = &aM
101f0 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  em[pOp->p2];.   
10200 20 69 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b   iCompare = res;
10210 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70  .    if( (pOp->p
10220 35 20 26 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e  5 & SQLITE_KEEPN
10230 55 4c 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)!=0 ){.     
10240 20 2f 2a 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c   /* The KEEPNULL
10250 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 4f   flag prevents O
10260 50 5f 45 71 20 66 72 6f 6d 20 6f 76 65 72 77 72  P_Eq from overwr
10270 69 74 69 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74  iting a NULL wit
10280 68 20 31 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  h 1.      ** and
10290 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20   prevents OP_Ne 
102a0 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67  from overwriting
102b0 20 4e 55 4c 4c 20 77 69 74 68 20 30 2e 20 20 54   NULL with 0.  T
102c0 68 69 73 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  his flag.      *
102d0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  * is only used i
102e0 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
102f0 20 65 69 74 68 65 72 3a 0a 20 20 20 20 20 20 2a   either:.      *
10300 2a 20 20 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45  *   (1) op==OP_E
10310 71 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c  q && (r[P2]==NUL
10320 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20  L || r[P2]==0). 
10330 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20 6f 70       **   (2) op
10340 3d 3d 4f 50 5f 4e 65 20 26 26 20 28 72 5b 50 32  ==OP_Ne && (r[P2
10350 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d  ]==NULL || r[P2]
10360 3d 3d 31 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  ==1).      ** Th
10370 65 72 65 66 6f 72 65 20 69 74 20 69 73 20 6e 6f  erefore it is no
10380 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  t necessary to c
10390 68 65 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  heck the content
103a0 20 6f 66 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20   of r[P2] for.  
103b0 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a      ** NULL. */.
103c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
103d0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65  p->opcode==OP_Ne
103e0 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
103f0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
10400 61 73 73 65 72 74 28 20 72 65 73 32 3d 3d 30 20  assert( res2==0 
10410 7c 7c 20 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20  || res2==1 );.  
10420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
10430 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==0 && pOp->op
10440 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  code==OP_Eq );. 
10450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
10460 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f  es2==1 && pOp->o
10470 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a  pcode==OP_Eq );.
10480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10490 72 65 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  res2==0 && pOp->
104a0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b  opcode==OP_Ne );
104b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
104c0 20 72 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d   res2==1 && pOp-
104d0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29  >opcode==OP_Ne )
104e0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 70  ;.      if( (pOp
104f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29  ->opcode==OP_Eq)
10500 3d 3d 72 65 73 32 20 29 20 62 72 65 61 6b 3b 0a  ==res2 ) break;.
10510 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f      }.    memAbo
10520 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
10530 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54  ut);.    MemSetT
10540 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
10550 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74  M_Int);.    pOut
10560 2d 3e 75 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20  ->u.i = res2;.  
10570 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
10580 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
10590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
105a0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
105b0 73 21 3d 30 2c 20 28 70 4f 70 2d 3e 70 35 20 26  s!=0, (pOp->p5 &
105c0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3f   SQLITE_NULLEQ)?
105d0 32 3a 33 29 3b 0a 20 20 20 20 69 66 28 20 72 65  2:3);.    if( re
105e0 73 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  s2 ){.      goto
105f0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
10600 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
10610 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 6c  }../* Opcode: El
10620 73 65 4e 6f 74 45 71 20 2a 20 50 32 20 2a 20 2a  seNotEq * P2 * *
10630 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
10640 63 6f 64 65 20 6d 75 73 74 20 69 6d 6d 65 64 69  code must immedi
10650 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e 20  ately follow an 
10660 4f 50 5f 4c 74 20 6f 72 20 4f 50 5f 47 74 20 63  OP_Lt or OP_Gt c
10670 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
10680 6f 72 2e 0a 2a 2a 20 49 66 20 72 65 73 75 6c 74  or..** If result
10690 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d   of an OP_Eq com
106a0 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 73  parison on the s
106b0 61 6d 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73  ame two operands
106c0 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
106d0 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20  e NULL or false 
106e0 28 30 29 2c 20 74 68 65 6e 20 74 68 65 6e 20 6a  (0), then then j
106f0 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49  ump to P2. .** I
10700 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
10710 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69  an OP_Eq compari
10720 73 6f 6e 20 6f 6e 20 74 68 65 20 74 77 6f 20 70  son on the two p
10730 72 65 76 69 6f 75 73 20 6f 70 65 72 61 6e 64 73  revious operands
10740 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
10750 65 65 6e 20 74 72 75 65 20 28 31 29 2c 20 74 68  een true (1), th
10760 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
10770 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6c 73 65  .*/.case OP_Else
10780 4e 6f 74 45 71 3a 20 7b 20 20 20 20 20 20 20 2f  NotEq: {       /
10790 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 53 43  * same as TK_ESC
107a0 41 50 45 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 61  APE, jump */.  a
107b0 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
107c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
107d0 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c  -1].opcode==OP_L
107e0 74 20 7c 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  t || pOp[-1].opc
107f0 6f 64 65 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  ode==OP_Gt );.  
10800 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
10810 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
10820 45 50 32 20 29 3b 0a 20 20 56 64 62 65 42 72 61  EP2 );.  VdbeBra
10830 6e 63 68 54 61 6b 65 6e 28 69 43 6f 6d 70 61 72  nchTaken(iCompar
10840 65 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  e!=0, 2);.  if( 
10850 69 43 6f 6d 70 61 72 65 21 3d 30 20 29 20 67 6f  iCompare!=0 ) go
10860 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
10870 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
10880 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61 74 69  pcode: Permutati
10890 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  on * * * P4 *.**
108a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65 72 6d  .** Set the perm
108b0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  utation used by 
108c0 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f  the OP_Compare o
108d0 70 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 6e  perator in the n
108e0 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  ext.** instructi
108f0 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61  on.  The permuta
10900 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69  tion is stored i
10910 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
10920 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d  ..**.** The perm
10930 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  utation is only 
10940 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
10950 6e 65 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20  next OP_Compare 
10960 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20  that has.** the 
10970 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
10980 69 74 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79  it set in P5. Ty
10990 70 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50  pically the OP_P
109a0 65 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c  ermutation shoul
109b0 64 20 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65  d .** occur imme
109c0 64 69 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f  diately prior to
109d0 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e   the OP_Compare.
109e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
109f0 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
10a00 50 34 20 69 6e 74 65 67 65 72 20 61 72 72 61 79  P4 integer array
10a10 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
10a20 66 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 61  f the array.** a
10a30 6e 64 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f  nd does not beco
10a40 6d 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  me part of the p
10a50 65 72 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  ermutation..*/.c
10a60 61 73 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  ase OP_Permutati
10a70 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  on: {.  assert( 
10a80 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
10a90 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73  INTARRAY );.  as
10aa0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69  sert( pOp->p4.ai
10ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
10ac0 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[1].opcode==OP_
10ad0 43 6f 6d 70 61 72 65 20 29 3b 0a 20 20 61 73 73  Compare );.  ass
10ae0 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 35 20 26  ert( pOp[1].p5 &
10af0 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20   OPFLAG_PERMUTE 
10b00 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
10b10 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72  * Opcode: Compar
10b20 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
10b30 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
10b40 50 31 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40  P1@P3] <-> r[P2@
10b50 50 33 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72  P3].**.** Compar
10b60 65 20 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66  e two vectors of
10b70 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 72 65   registers in re
10b80 67 28 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33  g(P1)..reg(P1+P3
10b90 2d 31 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a  -1) (call this.*
10ba0 2a 20 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e  * vector "A") an
10bb0 64 20 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65  d in reg(P2)..re
10bc0 67 28 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29  g(P2+P3-1) ("B")
10bd0 2e 20 20 53 61 76 65 20 74 68 65 20 72 65 73 75  .  Save the resu
10be0 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d  lt of.** the com
10bf0 70 61 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20  parison for use 
10c00 62 79 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a  by the next OP_J
10c10 75 6d 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a  ump instruct..**
10c20 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74 68  .** If P5 has th
10c30 65 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  e OPFLAG_PERMUTE
10c40 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74   bit set, then t
10c50 68 65 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70  he order of comp
10c60 61 72 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  arison is.** det
10c70 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6d  ermined by the m
10c80 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f 50 65  ost recent OP_Pe
10c90 72 6d 75 74 61 74 69 6f 6e 20 6f 70 65 72 61 74  rmutation operat
10ca0 6f 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f  or.  If the.** O
10cb0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69  PFLAG_PERMUTE bi
10cc0 74 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  t is clear, then
10cd0 20 72 65 67 69 73 74 65 72 20 61 72 65 20 63 6f   register are co
10ce0 6d 70 61 72 65 64 20 69 6e 20 73 65 71 75 65 6e  mpared in sequen
10cf0 74 69 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a  tial.** order..*
10d00 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79  *.** P4 is a Key
10d10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
10d20 68 61 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c  hat defines coll
10d30 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
10d40 61 6e 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65  and sort.** orde
10d50 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  rs for the compa
10d60 72 69 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d  rison.  The perm
10d70 75 74 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20  utation applies 
10d80 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
10d90 6f 6e 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e  only.  The KeyIn
10da0 66 6f 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  fo elements are 
10db0 75 73 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c  used sequentiall
10dc0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d  y..**.** The com
10dd0 70 61 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72  parison is a sor
10de0 74 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f  t comparison, so
10df0 20 4e 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65   NULLs compare e
10e00 71 75 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61  qual,.** NULLs a
10e10 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d  re less than num
10e20 62 65 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  bers, numbers ar
10e30 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69  e less than stri
10e40 6e 67 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69  ngs,.** and stri
10e50 6e 67 73 20 61 72 65 20 6c 65 73 73 20 74 68 61  ngs are less tha
10e60 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65  n blobs..*/.case
10e70 20 4f 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20   OP_Compare: {. 
10e80 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
10e90 0a 20 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74  .  int p1;.  int
10ea0 20 70 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79   p2;.  const Key
10eb0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
10ec0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c    int idx;.  Col
10ed0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
10ee0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
10ef0 75 65 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20  uence to use on 
10f00 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69  this term */.  i
10f10 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
10f20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45    /* True for DE
10f30 53 43 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72  SCENDING sort or
10f40 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  der */.  int *aP
10f50 65 72 6d 75 74 65 3b 20 20 20 20 20 2f 2a 20 54  ermute;     /* T
10f60 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 2a  he permutation *
10f70 2f 0a 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 70  /..  if( (pOp->p
10f80 35 20 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  5 & OPFLAG_PERMU
10f90 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 50  TE)==0 ){.    aP
10fa0 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20 7d 65  ermute = 0;.  }e
10fb0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10fc0 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20   pOp>aOp );.    
10fd0 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
10fe0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d 75  opcode==OP_Permu
10ff0 74 61 74 69 6f 6e 20 29 3b 0a 20 20 20 20 61 73  tation );.    as
11000 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34  sert( pOp[-1].p4
11010 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41  type==P4_INTARRA
11020 59 20 29 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  Y );.    aPermut
11030 65 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61  e = pOp[-1].p4.a
11040 69 20 2b 20 31 3b 0a 20 20 20 20 61 73 73 65 72  i + 1;.    asser
11050 74 28 20 61 50 65 72 6d 75 74 65 21 3d 30 20 29  t( aPermute!=0 )
11060 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d  ;.  }.  n = pOp-
11070 3e 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  >p3;.  pKeyInfo 
11080 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
11090 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  fo;.  assert( n>
110a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
110b0 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20  KeyInfo!=0 );.  
110c0 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = pOp->p1;.  
110d0 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69  p2 = pOp->p2;.#i
110e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
110f0 47 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  G.  if( aPermute
11100 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d   ){.    int k, m
11110 78 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b  x = 0;.    for(k
11120 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66  =0; k<n; k++) if
11130 28 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78  ( aPermute[k]>mx
11140 20 29 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65   ) mx = aPermute
11150 5b 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [k];.    assert(
11160 20 70 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d   p1>0 && p1+mx<=
11170 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
11180 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
11190 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26    assert( p2>0 &
111a0 26 20 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65  & p2+mx<=(p->nMe
111b0 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
111c0 29 2b 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  )+1 );.  }else{.
111d0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 30      assert( p1>0
111e0 20 26 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d   && p1+n<=(p->nM
111f0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
11200 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r)+1 );.    asse
11210 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e  rt( p2>0 && p2+n
11220 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
11230 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a  ->nCursor)+1 );.
11240 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11250 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20  LITE_DEBUG */.  
11260 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
11270 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d 20 61 50  +){.    idx = aP
11280 65 72 6d 75 74 65 20 3f 20 61 50 65 72 6d 75 74  ermute ? aPermut
11290 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61 73  e[i] : i;.    as
112a0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
112b0 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 20  (&aMem[p1+idx]) 
112c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
112d0 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b  emIsValid(&aMem[
112e0 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20  p2+idx]) );.    
112f0 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
11300 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31 2b  1+idx, &aMem[p1+
11310 69 64 78 5d 29 3b 0a 20 20 20 20 52 45 47 49 53  idx]);.    REGIS
11320 54 45 52 5f 54 52 41 43 45 28 70 32 2b 69 64 78  TER_TRACE(p2+idx
11330 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29  , &aMem[p2+idx])
11340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  ;.    assert( i<
11350 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
11360 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  eld );.    pColl
11370 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
11380 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20  ll[i];.    bRev 
11390 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
113a0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69  tOrder[i];.    i
113b0 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
113c0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65  3MemCompare(&aMe
113d0 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d  m[p1+idx], &aMem
113e0 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29  [p2+idx], pColl)
113f0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61  ;.    if( iCompa
11400 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  re ){.      if( 
11410 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20  bRev ) iCompare 
11420 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20  = -iCompare;.   
11430 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11440 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
11450 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20  /* Opcode: Jump 
11460 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
11470 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69  ** Jump to the i
11480 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64  nstruction at ad
11490 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72  dress P1, P2, or
114a0 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   P3 depending on
114b0 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74   whether.** in t
114c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
114d0 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75  P_Compare instru
114e0 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63  ction the P1 vec
114f0 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68 61  tor was less tha
11500 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  n.** equal to, o
11510 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
11520 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65  he P2 vector, re
11530 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63  spectively..*/.c
11540 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20  ase OP_Jump: {  
11550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
11560 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d  mp */.  if( iCom
11570 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 56 64  pare<0 ){.    Vd
11580 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c  beBranchTaken(0,
11590 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  3); pOp = &aOp[p
115a0 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 7d  Op->p1 - 1];.  }
115b0 65 6c 73 65 20 69 66 28 20 69 43 6f 6d 70 61 72  else if( iCompar
115c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  e==0 ){.    Vdbe
115d0 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 33 29  BranchTaken(1,3)
115e0 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70  ; pOp = &aOp[pOp
115f0 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c  ->p2 - 1];.  }el
11600 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  se{.    VdbeBran
11610 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b 20 70 4f  chTaken(2,3); pO
11620 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 33  p = &aOp[pOp->p3
11630 20 2d 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72 65   - 1];.  }.  bre
11640 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
11650 3a 20 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a  : And P1 P2 P3 *
11660 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
11670 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26 20  r[P3]=(r[P1] && 
11680 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b  r[P2]).**.** Tak
11690 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e  e the logical AN
116a0 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  D of the values 
116b0 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20  in registers P1 
116c0 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72  and P2 and.** wr
116d0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ite the result i
116e0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e  nto register P3.
116f0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11700 20 50 31 20 6f 72 20 50 32 20 69 73 20 30 20 28   P1 or P2 is 0 (
11710 66 61 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20  false) then the 
11720 72 65 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e  result is 0 even
11730 20 69 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72   if.** the other
11740 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20   input is NULL. 
11750 20 41 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65   A NULL and true
11760 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69   or two NULLs gi
11770 76 65 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74  ve.** a NULL out
11780 70 75 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  put..*/./* Opcod
11790 65 3a 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a  e: Or P1 P2 P3 *
117a0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
117b0 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c 20  r[P3]=(r[P1] || 
117c0 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b  r[P2]).**.** Tak
117d0 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52  e the logical OR
117e0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
117f0 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
11800 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72  d P2 and.** stor
11810 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e 20  e the answer in 
11820 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a  register P3..**.
11830 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31 20  ** If either P1 
11840 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72 6f  or P2 is nonzero
11850 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68 65   (true) then the
11860 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74 72   result is 1 (tr
11870 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74  ue).** even if t
11880 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69  he other input i
11890 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20  s NULL.  A NULL 
118a0 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77 6f  and false or two
118b0 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20 61   NULLs.** give a
118c0 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f   NULL output..*/
118d0 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20 20  .case OP_And:   
118e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
118f0 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69 6e  me as TK_AND, in
11900 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
11910 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20 20  case OP_Or: {   
11920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
11930 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31 2c  e as TK_OR, in1,
11940 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in2, out3 */.  
11950 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c 65  int v1;    /* Le
11960 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d 3d  ft operand:  0==
11970 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20  FALSE, 1==TRUE, 
11980 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55  2==UNKNOWN or NU
11990 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b 20  LL */.  int v2; 
119a0 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
119b0 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20 31  and: 0==FALSE, 1
119c0 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f  ==TRUE, 2==UNKNO
119d0 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  WN or NULL */.. 
119e0 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   v1 = sqlite3Vdb
119f0 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26 61  eBooleanValue(&a
11a00 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 32 29  Mem[pOp->p1], 2)
11a10 3b 0a 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33  ;.  v2 = sqlite3
11a20 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65  VdbeBooleanValue
11a30 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2c  (&aMem[pOp->p2],
11a40 20 32 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e   2);.  if( pOp->
11a50 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29  opcode==OP_And )
11a60 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
11a70 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11a80 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b   and_logic[] = {
11a90 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
11aa0 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20  2, 0, 2, 2 };.  
11ab0 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63    v1 = and_logic
11ac0 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c  [v1*3+v2];.  }el
11ad0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
11ae0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11af0 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20  ar or_logic[] = 
11b00 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c  { 0, 1, 2, 1, 1,
11b10 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20   1, 2, 1, 2 };. 
11b20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63     v1 = or_logic
11b30 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20  [v1*3+v2];.  }. 
11b40 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
11b50 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31  p->p3];.  if( v1
11b60 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65  ==2 ){.    MemSe
11b70 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
11b80 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  MEM_Null);.  }el
11b90 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  se{.    pOut->u.
11ba0 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53  i = v1;.    MemS
11bb0 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
11bc0 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20   MEM_Int);.  }. 
11bd0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
11be0 63 6f 64 65 3a 20 49 73 54 72 75 65 20 50 31 20  code: IsTrue P1 
11bf0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
11c00 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 20 3d 20  nopsis: r[P2] = 
11c10 63 6f 61 6c 65 73 63 65 28 72 5b 50 31 5d 3d 3d  coalesce(r[P1]==
11c20 54 52 55 45 2c 50 33 29 20 5e 20 50 34 0a 2a 2a  TRUE,P3) ^ P4.**
11c30 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
11c40 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 49  implements the I
11c50 53 20 54 52 55 45 2c 20 49 53 20 46 41 4c 53 45  S TRUE, IS FALSE
11c60 2c 20 49 53 20 4e 4f 54 20 54 52 55 45 2c 20 61  , IS NOT TRUE, a
11c70 6e 64 0a 2a 2a 20 49 53 20 4e 4f 54 20 46 41 4c  nd.** IS NOT FAL
11c80 53 45 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  SE operators..**
11c90 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
11ca0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
11cb0 74 65 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c  ter P1 as a bool
11cc0 65 61 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72  ean value.  Stor
11cd0 65 20 74 68 61 74 0a 2a 2a 20 62 6f 6f 6c 65 61  e that.** boolea
11ce0 6e 20 28 61 20 30 20 6f 72 20 31 29 20 69 6e 20  n (a 0 or 1) in 
11cf0 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 4f 72  register P2.  Or
11d00 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
11d10 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
11d20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  .** NULL, then t
11d30 68 65 20 50 33 20 69 73 20 73 74 6f 72 65 64 20  he P3 is stored 
11d40 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  in register P2. 
11d50 20 49 6e 76 65 72 74 20 74 68 65 20 61 6e 73 77   Invert the answ
11d60 65 72 20 69 66 20 50 34 0a 2a 2a 20 69 73 20 31  er if P4.** is 1
11d70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 67 69  ..**.** The logi
11d80 63 20 69 73 20 73 75 6d 6d 61 72 69 7a 65 64 20  c is summarized 
11d90 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
11da0 20 3c 75 6c 3e 20 0a 2a 2a 20 3c 6c 69 3e 20 49   <ul> .** <li> I
11db0 66 20 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d 3d  f P3==0 and P4==
11dc0 30 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a  0  then  r[P2] :
11dd0 3d 20 72 5b 50 31 5d 20 49 53 20 54 52 55 45 0a  = r[P1] IS TRUE.
11de0 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 31  ** <li> If P3==1
11df0 20 61 6e 64 20 50 34 3d 3d 31 20 20 74 68 65 6e   and P4==1  then
11e00 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d    r[P2] := r[P1]
11e10 20 49 53 20 46 41 4c 53 45 0a 2a 2a 20 3c 6c 69   IS FALSE.** <li
11e20 3e 20 49 66 20 50 33 3d 3d 30 20 61 6e 64 20 50  > If P3==0 and P
11e30 34 3d 3d 31 20 20 74 68 65 6e 20 20 72 5b 50 32  4==1  then  r[P2
11e40 5d 20 3a 3d 20 72 5b 50 31 5d 20 49 53 20 4e 4f  ] := r[P1] IS NO
11e50 54 20 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e 20 49  T TRUE.** <li> I
11e60 66 20 50 33 3d 3d 31 20 61 6e 64 20 50 34 3d 3d  f P3==1 and P4==
11e70 30 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a  0  then  r[P2] :
11e80 3d 20 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20 46  = r[P1] IS NOT F
11e90 41 4c 53 45 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2f  ALSE.** </ul>.*/
11ea0 0a 63 61 73 65 20 4f 50 5f 49 73 54 72 75 65 3a  .case OP_IsTrue:
11eb0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
11ec0 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f   /* in1, out2 */
11ed0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
11ee0 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
11ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
11f00 70 2d 3e 70 34 2e 69 3d 3d 30 20 7c 7c 20 70 4f  p->p4.i==0 || pO
11f10 70 2d 3e 70 34 2e 69 3d 3d 31 20 29 3b 0a 20 20  p->p4.i==1 );.  
11f20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d  assert( pOp->p3=
11f30 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 31  =0 || pOp->p3==1
11f40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
11f50 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
11f60 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2c 0a 20 20 20  em[pOp->p2],.   
11f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f     sqlite3VdbeBo
11f80 6f 6c 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d  oleanValue(&aMem
11f90 5b 70 4f 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d 3e  [pOp->p1], pOp->
11fa0 70 33 29 20 5e 20 70 4f 70 2d 3e 70 34 2e 69 29  p3) ^ pOp->p4.i)
11fb0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
11fc0 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20   Opcode: Not P1 
11fd0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
11fe0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b  psis: r[P2]= !r[
11ff0 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  P1].**.** Interp
12000 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ret the value in
12010 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
12020 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
12030 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62    Store the.** b
12040 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e  oolean complemen
12050 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  t in register P2
12060 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
12070 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
12080 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  s .** NULL, then
12090 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65   a NULL is store
120a0 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  d in P2..*/.case
120b0 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20   OP_Not: {      
120c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
120d0 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31  e as TK_NOT, in1
120e0 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
120f0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
12100 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
12110 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66  m[pOp->p2];.  if
12120 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
12130 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b   MEM_Null)==0 ){
12140 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12150 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74  MemSetInt64(pOut
12160 2c 20 21 73 71 6c 69 74 65 33 56 64 62 65 42 6f  , !sqlite3VdbeBo
12170 6f 6c 65 61 6e 56 61 6c 75 65 28 70 49 6e 31 2c  oleanValue(pIn1,
12180 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0));.  }else{.  
12190 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
121a0 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
121b0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
121c0 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74  * Opcode: BitNot
121d0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
121e0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d  Synopsis: r[P1]=
121f0 20 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e   ~r[P1].**.** In
12200 74 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74  terpret the cont
12210 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
12220 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  P1 as an integer
12230 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20  .  Store the.** 
12240 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  ones-complement 
12250 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  of the P1 value 
12260 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
12270 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a  .  If P1 holds.*
12280 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74  * a NULL then st
12290 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32  ore a NULL in P2
122a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  ..*/.case OP_Bit
122b0 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Not: {          
122c0 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
122d0 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75  _BITNOT, in1, ou
122e0 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
122f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
12300 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
12310 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
12320 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
12330 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49  pOut);.  if( (pI
12340 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
12350 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Null)==0 ){.    
12360 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
12370 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d  M_Int;.    pOut-
12380 3e 75 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33 56  >u.i = ~sqlite3V
12390 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
123a0 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
123b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e  }../* Opcode: On
123c0 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ce P1 P2 * * *.*
123d0 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67  *.** Fall throug
123e0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
123f0 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
12400 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 6f 70  rst time this op
12410 63 6f 64 65 20 69 73 0a 2a 2a 20 65 6e 63 6f 75  code is.** encou
12420 6e 74 65 72 65 64 20 6f 6e 20 65 61 63 68 20 69  ntered on each i
12430 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65  nvocation of the
12440 20 62 79 74 65 2d 63 6f 64 65 20 70 72 6f 67 72   byte-code progr
12450 61 6d 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 0a  am.  Jump to P2.
12460 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
12470 20 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75   and all subsequ
12480 65 6e 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 64  ent encounters d
12490 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69  uring the same i
124a0 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
124b0 20 54 6f 70 2d 6c 65 76 65 6c 20 70 72 6f 67 72   Top-level progr
124c0 61 6d 73 20 64 65 74 65 72 6d 69 6e 65 20 66 69  ams determine fi
124d0 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 62  rst invocation b
124e0 79 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  y comparing the 
124f0 50 31 0a 2a 2a 20 6f 70 65 72 61 6e 64 20 61 67  P1.** operand ag
12500 61 69 6e 73 74 20 74 68 65 20 50 31 20 6f 70 65  ainst the P1 ope
12510 72 61 6e 64 20 6f 6e 20 74 68 65 20 4f 50 5f 49  rand on the OP_I
12520 6e 69 74 20 6f 70 63 6f 64 65 20 61 74 20 74 68  nit opcode at th
12530 65 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 6f  e beginning.** o
12540 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
12550 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 73  If the P1 values
12560 20 64 69 66 66 65 72 2c 20 74 68 65 6e 20 66 61   differ, then fa
12570 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6d  ll through and m
12580 61 6b 65 0a 2a 2a 20 74 68 65 20 50 31 20 6f 66  ake.** the P1 of
12590 20 74 68 69 73 20 6f 70 63 6f 64 65 20 65 71 75   this opcode equ
125a0 61 6c 20 74 6f 20 74 68 65 20 50 31 20 6f 66 20  al to the P1 of 
125b0 4f 50 5f 49 6e 69 74 2e 20 20 49 66 20 50 31 20  OP_Init.  If P1 
125c0 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 74 68  values are.** th
125d0 65 20 73 61 6d 65 20 74 68 65 6e 20 74 61 6b 65  e same then take
125e0 20 74 68 65 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a   the jump..**.**
125f0 20 46 6f 72 20 73 75 62 70 72 6f 67 72 61 6d 73   For subprograms
12600 2c 20 74 68 65 72 65 20 69 73 20 61 20 62 69 74  , there is a bit
12610 6d 61 73 6b 20 69 6e 20 74 68 65 20 56 64 62 65  mask in the Vdbe
12620 46 72 61 6d 65 20 74 68 61 74 20 64 65 74 65 72  Frame that deter
12630 6d 69 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72  mines.** whether
12640 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70   or not the jump
12650 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e   should be taken
12660 2e 20 20 54 68 65 20 62 69 74 6d 61 73 6b 20 69  .  The bitmask i
12670 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
12680 65 63 61 75 73 65 20 74 68 65 20 73 65 6c 66 2d  ecause the self-
12690 61 6c 74 65 72 69 6e 67 20 63 6f 64 65 20 74 72  altering code tr
126a0 69 63 6b 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  ick does not wor
126b0 6b 20 66 6f 72 20 72 65 63 75 72 73 69 76 65 0a  k for recursive.
126c0 2a 2a 20 74 72 69 67 67 65 72 73 2e 0a 2a 2f 0a  ** triggers..*/.
126d0 63 61 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20  case OP_Once: { 
126e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
126f0 75 6d 70 20 2a 2f 0a 20 20 75 33 32 20 69 41 64  ump */.  u32 iAd
12700 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
12710 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12720 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
12730 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
12740 2d 3e 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d  ->aOp[0].opcode=
12750 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 69 66  =OP_Init );.  if
12760 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
12770 20 20 20 69 41 64 64 72 20 3d 20 28 69 6e 74 29     iAddr = (int)
12780 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 3b 0a  (pOp - p->aOp);.
12790 20 20 20 20 69 66 28 20 28 70 2d 3e 70 46 72 61      if( (p->pFra
127a0 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f  me->aOnce[iAddr/
127b0 38 5d 20 26 20 28 31 3c 3c 28 69 41 64 64 72 20  8] & (1<<(iAddr 
127c0 26 20 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  & 7)))!=0 ){.   
127d0 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
127e0 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  en(1, 2);.      
127f0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
12800 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 46  .    }.    p->pF
12810 72 61 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64 64  rame->aOnce[iAdd
12820 72 2f 38 5d 20 7c 3d 20 31 3c 3c 28 69 41 64 64  r/8] |= 1<<(iAdd
12830 72 20 26 20 37 29 3b 0a 20 20 7d 65 6c 73 65 7b  r & 7);.  }else{
12840 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b  .    if( p->aOp[
12850 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29  0].p1==pOp->p1 )
12860 7b 0a 20 20 20 20 20 20 56 64 62 65 42 72 61 6e  {.      VdbeBran
12870 63 68 54 61 6b 65 6e 28 31 2c 20 32 29 3b 0a 20  chTaken(1, 2);. 
12880 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74       goto jump_t
12890 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  o_p2;.    }.  }.
128a0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
128b0 6e 28 30 2c 20 32 29 3b 0a 20 20 70 4f 70 2d 3e  n(0, 2);.  pOp->
128c0 70 31 20 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70  p1 = p->aOp[0].p
128d0 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
128e0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20  * Opcode: If P1 
128f0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
12900 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
12910 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
12920 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e 20  ter P1 is true. 
12930 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73   The value.** is
12940 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65   considered true
12950 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69   if it is numeri
12960 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  c and non-zero. 
12970 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   If the value.**
12980 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74   in P1 is NULL t
12990 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  hen take the jum
129a0 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  p if and only if
129b0 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e   P3 is non-zero.
129c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20  .*/.case OP_If: 
129d0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
129e0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
129f0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
12a00 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65  sqlite3VdbeBoole
12a10 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f  anValue(&aMem[pO
12a20 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33 29  p->p1], pOp->p3)
12a30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
12a40 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20  ken(c!=0, 2);.  
12a50 69 66 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d  if( c ) goto jum
12a60 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
12a70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12a80 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a  IfNot P1 P2 P3 *
12a90 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
12aa0 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
12ab0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
12ac0 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76  is False.  The v
12ad0 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  alue.** is consi
12ae0 64 65 72 65 64 20 66 61 6c 73 65 20 69 66 20 69  dered false if i
12af0 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20  t has a numeric 
12b00 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20  value of zero.  
12b10 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
12b20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
12b30 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
12b40 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
12b50 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  P3 is non-zero..
12b60 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74  */.case OP_IfNot
12b70 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
12b80 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
12b90 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 21 73   int c;.  c = !s
12ba0 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61  qlite3VdbeBoolea
12bb0 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70  nValue(&aMem[pOp
12bc0 2d 3e 70 31 5d 2c 20 21 70 4f 70 2d 3e 70 33 29  ->p1], !pOp->p3)
12bd0 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
12be0 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20  ken(c!=0, 2);.  
12bf0 69 66 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d  if( c ) goto jum
12c00 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
12c10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12c20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a  IsNull P1 P2 * *
12c30 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
12c40 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20 67  if r[P1]==NULL g
12c50 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d  oto P2.**.** Jum
12c60 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
12c70 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
12c80 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a   P1 is NULL..*/.
12c90 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20  case OP_IsNull: 
12ca0 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
12cb0 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c  same as TK_ISNUL
12cc0 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  L, jump, in1 */.
12cd0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
12ce0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42  Op->p1];.  VdbeB
12cf0 72 61 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e  ranchTaken( (pIn
12d00 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12d10 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a 20 20 69  ull)!=0, 2);.  i
12d20 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
12d30 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
12d40 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  {.    goto jump_
12d50 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
12d60 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12d70 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20  : NotNull P1 P2 
12d80 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
12d90 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 4e 55 4c  s: if r[P1]!=NUL
12da0 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  L goto P2.**.** 
12db0 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
12dc0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
12dd0 74 65 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55  ter P1 is not NU
12de0 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50  LL.  .*/.case OP
12df0 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20  _NotNull: {     
12e00 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
12e10 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75  s TK_NOTNULL, ju
12e20 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
12e30 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
12e40 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  1];.  VdbeBranch
12e50 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c  Taken( (pIn1->fl
12e60 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
12e70 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 70  =0, 2);.  if( (p
12e80 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
12e90 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
12ea0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
12eb0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
12ec0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e  ../* Opcode: IfN
12ed0 75 6c 6c 52 6f 77 20 50 31 20 50 32 20 50 33 20  ullRow P1 P2 P3 
12ee0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
12ef0 20 69 66 20 50 31 2e 6e 75 6c 6c 52 6f 77 20 74   if P1.nullRow t
12f00 68 65 6e 20 72 5b 50 33 5d 3d 4e 55 4c 4c 2c 20  hen r[P3]=NULL, 
12f10 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 43 68  goto P2.**.** Ch
12f20 65 63 6b 20 74 68 65 20 63 75 72 73 6f 72 20 50  eck the cursor P
12f30 31 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  1 to see if it i
12f40 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
12f50 74 69 6e 67 20 61 74 20 61 20 4e 55 4c 4c 20 72  ting at a NULL r
12f60 6f 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c  ow..** If it is,
12f70 20 74 68 65 6e 20 73 65 74 20 72 65 67 69 73 74   then set regist
12f80 65 72 20 50 33 20 74 6f 20 4e 55 4c 4c 20 61 6e  er P3 to NULL an
12f90 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  d jump immediate
12fa0 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20  ly to P2..** If 
12fb0 50 31 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 4e  P1 is not on a N
12fc0 55 4c 4c 20 72 6f 77 2c 20 74 68 65 6e 20 66 61  ULL row, then fa
12fd0 6c 6c 20 74 68 72 6f 75 67 68 20 77 69 74 68 6f  ll through witho
12fe0 75 74 20 6d 61 6b 69 6e 67 20 61 6e 79 0a 2a 2a  ut making any.**
12ff0 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 63 61 73   changes..*/.cas
13000 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 3a 20  e OP_IfNullRow: 
13010 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  {         /* jum
13020 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  p */.  assert( p
13030 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
13040 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
13050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13060 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d  apCsr[pOp->p1]!=
13070 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  0 );.  if( p->ap
13080 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 6e 75  Csr[pOp->p1]->nu
13090 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c  llRow ){.    sql
130a0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
130b0 6c 6c 28 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70  ll(aMem + pOp->p
130c0 33 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d  3);.    goto jum
130d0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
130e0 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  reak;.}..#ifdef 
130f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
13100 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a  FSET_SQL_FUNC./*
13110 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74 20   Opcode: Offset 
13120 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
13130 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 20  Synopsis: r[P3] 
13140 3d 20 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 28  = sqlite_offset(
13150 50 31 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  P1).**.** Store 
13160 69 6e 20 72 65 67 69 73 74 65 72 20 72 5b 50 33  in register r[P3
13170 5d 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  ] the byte offse
13180 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
13190 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 69 73  ase file that is
131a0 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66   the.** start of
131b0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
131c0 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77   the record at w
131d0 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72  hich that cursor
131e0 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
131f0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  .** pointing..**
13200 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 63 6f  .** P2 is the co
13210 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20  lumn number for 
13220 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
13230 74 68 65 20 73 71 6c 69 74 65 5f 6f 66 66 73 65  the sqlite_offse
13240 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  t() function..**
13250 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   This opcode doe
13260 73 20 6e 6f 74 20 75 73 65 20 50 32 20 69 74 73  s not use P2 its
13270 65 6c 66 2c 20 62 75 74 20 74 68 65 20 50 32 20  elf, but the P2 
13280 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62 79  value is used by
13290 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e   the.** code gen
132a0 65 72 61 74 6f 72 2e 20 20 54 68 65 20 50 31 2c  erator.  The P1,
132b0 20 50 32 2c 20 61 6e 64 20 50 33 20 6f 70 65 72   P2, and P3 oper
132c0 61 6e 64 73 20 74 6f 20 74 68 69 73 20 6f 70 63  ands to this opc
132d0 6f 64 65 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  ode are the.** s
132e0 61 6d 65 20 61 73 20 66 6f 72 20 4f 50 5f 43 6f  ame as for OP_Co
132f0 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lumn..**.** This
13300 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
13310 61 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c  available if SQL
13320 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
13330 77 69 74 68 20 74 68 65 0a 2a 2a 20 2d 44 53 51  with the.** -DSQ
13340 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
13350 45 54 5f 53 51 4c 5f 46 55 4e 43 20 6f 70 74 69  ET_SQL_FUNC opti
13360 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  on..*/.case OP_O
13370 66 66 73 65 74 3a 20 7b 20 20 20 20 20 20 20 20  ffset: {        
13380 20 20 2f 2a 20 6f 75 74 33 20 2a 2f 0a 20 20 56    /* out3 */.  V
13390 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
133a0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
133b0 72 73 6f 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  rsor */.  assert
133c0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
133d0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
133e0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
133f0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
13400 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
13410 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66  m[pOp->p3];.  if
13420 28 20 4e 45 56 45 52 28 70 43 3d 3d 30 29 20 7c  ( NEVER(pC==0) |
13430 7c 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  | pC->eCurType!=
13440 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b  CURTYPE_BTREE ){
13450 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13460 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
13470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
13480 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
13490 49 6e 74 36 34 28 70 4f 75 74 2c 20 73 71 6c 69  Int64(pOut, sqli
134a0 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 70  te3BtreeOffset(p
134b0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 29 3b  C->uc.pCursor));
134c0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
134d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
134e0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
134f0 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4f  QL_FUNC */../* O
13500 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
13510 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
13520 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
13530 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  PX.**.** Interpr
13540 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61 74  et the data that
13550 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
13560 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63 74  s to as a struct
13570 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a  ure built using.
13580 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ** the MakeRecor
13590 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
135a0 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63  (See the MakeRec
135b0 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  ord opcode for a
135c0 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66  dditional.** inf
135d0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
135e0 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  he format of the
135f0 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63 74   data.)  Extract
13600 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
13610 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72  n.** from this r
13620 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65  ecord.  If there
13630 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20 28   are less that (
13640 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73  P2+1) .** values
13650 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20   in the record, 
13660 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a  extract a NULL..
13670 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
13680 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74 6f  extracted is sto
13690 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
136a0 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
136b0 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
136c0 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20 66   fewer than P2 f
136d0 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72  ields, then extr
136e0 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c  act a NULL.  Or,
136f0 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61 72  .** if the P4 ar
13700 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d  gument is a P4_M
13710 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  EM use the value
13720 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75 6d   of the P4 argum
13730 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65  ent as.** the re
13740 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
13750 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  he OPFLAG_CLEARC
13760 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74 20  ACHE bit is set 
13770 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73 20  on P5 and P1 is 
13780 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  a pseudo-table c
13790 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  ursor,.** then t
137a0 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  he cache of the 
137b0 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74 20  cursor is reset 
137c0 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74  prior to extract
137d0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  ing the column..
137e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f  ** The first OP_
137f0 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61  Column against a
13800 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66   pseudo-table af
13810 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ter the value of
13820 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
13830 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68 61  register has cha
13840 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65  nged should have
13850 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a   this bit set..*
13860 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
13870 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64  AG_LENGTHARG and
13880 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
13890 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20 6f  G bits are set o
138a0 6e 20 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68 65  n P5 then.** the
138b0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
138c0 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65  nteed to only be
138d0 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72 67   used as the arg
138e0 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74  ument of a lengt
138f0 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66  h().** or typeof
13900 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73  () function, res
13910 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
13920 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65  loading of large
13930 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a   blobs can be.**
13940 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e   skipped for len
13950 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f  gth() and all co
13960 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61  ntent loading ca
13970 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72  n be skipped for
13980 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61   typeof()..*/.ca
13990 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a  se OP_Column: {.
139a0 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20    int p2;       
139b0 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e       /* column n
139c0 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69 65 76  umber to retriev
139d0 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  e */.  VdbeCurso
139e0 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65  r *pC;    /* The
139f0 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a   VDBE cursor */.
13a00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
13a10 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65  r;   /* The BTre
13a20 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33  e cursor */.  u3
13a30 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20  2 *aOffset;     
13a40 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69   /* aOffset[i] i
13a50 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72  s offset to star
13a60 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d  t of data for i-
13a70 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  th column */.  i
13a80 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
13a90 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20    /* The length 
13aa0 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  of the serialize
13ab0 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  d data for the c
13ac0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
13ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13ae0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
13af0 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20  .  Mem *pDest;  
13b00 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
13b10 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74 72  o write the extr
13b20 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20  acted value */. 
13b30 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20   Mem sMem;      
13b40 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69      /* For stori
13b50 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  ng the record be
13b60 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
13b70 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61   const u8 *zData
13b80 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74  ;   /* Part of t
13b90 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
13ba0 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  decoded */.  con
13bb0 73 74 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20  st u8 *zHdr;    
13bc0 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64  /* Next unparsed
13bd0 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
13be0 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  der */.  const u
13bf0 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50  8 *zEndHdr; /* P
13c00 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
13c10 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 68  byte after the h
13c20 65 61 64 65 72 20 2a 2f 0a 20 20 75 36 34 20 6f  eader */.  u64 o
13c30 66 66 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a  ffset64;      /*
13c40 20 36 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a   64-bit offset *
13c50 2f 0a 20 20 75 33 32 20 74 3b 20 20 20 20 20 20  /.  u32 t;      
13c60 20 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65         /* A type
13c70 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72   code from the r
13c80 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a  ecord header */.
13c90 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20    Mem *pReg;    
13ca0 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61       /* PseudoTa
13cb0 62 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  ble input regist
13cc0 65 72 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d  er */..  pC = p-
13cd0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
13ce0 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
13cf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
13d00 72 73 6f 72 20 63 61 63 68 65 20 69 73 20 73 74  rsor cache is st
13d10 61 6c 65 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  ale (meaning it 
13d20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
13d30 20 70 6f 69 6e 74 20 61 74 0a 20 20 2a 2a 20 74   point at.  ** t
13d40 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 29 20  he correct row) 
13d50 74 68 65 6e 20 62 72 69 6e 67 20 69 74 20 75 70  then bring it up
13d60 2d 74 6f 2d 64 61 74 65 20 62 79 20 64 6f 69 6e  -to-date by doin
13d70 67 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  g the necessary 
13d80 0a 20 20 2a 2a 20 42 2d 54 72 65 65 20 73 65 65  .  ** B-Tree see
13d90 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  k. */.  rc = sql
13da0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
13db0 76 65 74 6f 28 26 70 43 2c 20 26 70 32 29 3b 0a  veto(&pC, &p2);.
13dc0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
13dd0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
13de0 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  or;..  assert( p
13df0 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
13e00 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
13e10 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
13e20 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d  .  pDest = &aMem
13e30 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
13e40 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
13e50 20 70 44 65 73 74 29 3b 0a 20 20 61 73 73 65 72   pDest);.  asser
13e60 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
13e70 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
13e80 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
13e90 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
13ea0 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c  rt( p2<pC->nFiel
13eb0 64 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d  d );.  aOffset =
13ec0 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20   pC->aOffset;.  
13ed0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
13ee0 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56 54  Type!=CURTYPE_VT
13ef0 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
13f00 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
13f10 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20  RTYPE_PSEUDO || 
13f20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20  pC->nullRow );. 
13f30 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
13f40 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53  rType!=CURTYPE_S
13f50 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69 66 28 20  ORTER );..  if( 
13f60 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 21  pC->cacheStatus!
13f70 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 20  =p->cacheCtr ){ 
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f90 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
13fa0 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28  -FALSE*/.    if(
13fb0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
13fc0 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65 43        if( pC->eC
13fd0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
13fe0 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20 20  PSEUDO ){.      
13ff0 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 73 70 65    /* For the spe
14000 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 73 20  cial case of as 
14010 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2c 20 74  pseudo-cursor, t
14020 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 66 69  he seekResult fi
14030 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
14040 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 72 65  dentifies the re
14050 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
14060 73 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  s the record */.
14070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14080 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 3e 30  pC->seekResult>0
14090 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 67   );.        pReg
140a0 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 73 65 65   = &aMem[pC->see
140b0 6b 52 65 73 75 6c 74 5d 3b 0a 20 20 20 20 20 20  kResult];.      
140c0 20 20 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e    assert( pReg->
140d0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
140e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
140f0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
14100 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Reg) );.        
14110 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
14120 3d 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 52  = pC->szRow = pR
14130 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70  eg->n;.        p
14140 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70  C->aRow = (u8*)p
14150 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Reg->z;.      }e
14160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14170 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
14180 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  ll(pDest);.     
14190 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
141a0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
141b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
141c0 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
141d0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 61 73  Cursor;.      as
141e0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
141f0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
14200 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
14210 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20  t( pCrsr );.    
14220 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14230 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
14240 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20  lid(pCrsr) );.  
14250 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53      pC->payloadS
14260 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ize = sqlite3Btr
14270 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
14280 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  rsr);.      pC->
14290 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 42 74  aRow = sqlite3Bt
142a0 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28  reePayloadFetch(
142b0 70 43 72 73 72 2c 20 26 70 43 2d 3e 73 7a 52 6f  pCrsr, &pC->szRo
142c0 77 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  w);.      assert
142d0 28 20 70 43 2d 3e 73 7a 52 6f 77 3c 3d 70 43 2d  ( pC->szRow<=pC-
142e0 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29 3b 0a  >payloadSize );.
142f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14300 2d 3e 73 7a 52 6f 77 3c 3d 36 35 35 33 36 20 29  ->szRow<=65536 )
14310 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61  ;  /* Maximum pa
14320 67 65 20 73 69 7a 65 20 69 73 20 36 34 4b 69 42  ge size is 64KiB
14330 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
14340 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20  ->payloadSize > 
14350 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b  (u32)db->aLimit[
14360 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
14370 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  GTH] ){.        
14380 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
14390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
143a0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
143b0 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20  = p->cacheCtr;. 
143c0 20 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65     pC->iHdrOffse
143d0 74 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  t = getVarint32(
143e0 70 43 2d 3e 61 52 6f 77 2c 20 61 4f 66 66 73 65  pC->aRow, aOffse
143f0 74 5b 30 5d 29 3b 0a 20 20 20 20 70 43 2d 3e 6e  t[0]);.    pC->n
14400 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b 0a 0a  HdrParsed = 0;..
14410 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 73 7a 52  .    if( pC->szR
14420 6f 77 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b  ow<aOffset[0] ){
14430 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41        /*OPTIMIZA
14440 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a  TION-IF-FALSE*/.
14450 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52 6f        /* pC->aRo
14460 77 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  w does not have 
14470 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
14480 72 65 20 72 6f 77 2c 20 62 75 74 20 69 74 20 64  re row, but it d
14490 6f 65 73 20 61 74 20 6c 65 61 73 74 0a 20 20 20  oes at least.   
144a0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63 6f     ** need to co
144b0 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f  ver the header o
144c0 66 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 49  f the record.  I
144d0 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20  f pC->aRow does 
144e0 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  not contain.    
144f0 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    ** the complet
14500 65 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20 73  e header, then s
14510 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20 66  et it to zero, f
14520 6f 72 63 69 6e 67 20 74 68 65 20 68 65 61 64 65  orcing the heade
14530 72 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a  r to be.      **
14540 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
14550 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ocated. */.     
14560 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20   pC->aRow = 0;. 
14570 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d       pC->szRow =
14580 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61   0;..      /* Ma
14590 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72 75 70  ke sure a corrup
145a0 74 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  t database has n
145b0 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f  ot given us an o
145c0 76 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a  versize header..
145d0 20 20 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73        ** Do this
145e0 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e   now to avoid an
145f0 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79   oversize memory
14600 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   allocation..   
14610 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
14620 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20  ype entries can 
14630 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
14640 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20 20   5 bytes each.  
14650 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74 65  But 4 and 5 byte
14660 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 73 20  .      ** types 
14670 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61  use so much data
14680 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65 72   space that ther
14690 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30  e can only be 40
146a0 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20  96 and 32 of.   
146b0 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70     ** them, resp
146c0 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68  ectively.  So th
146d0 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72  e maximum header
146e0 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20   length results 
146f0 66 72 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a 20  from a.      ** 
14700 33 2d 62 79 74 65 20 74 79 70 65 20 66 6f 72 20  3-byte type for 
14710 65 61 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69  each of the maxi
14720 6d 75 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c  mum of 32768 col
14730 75 6d 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a  umns plus three.
14740 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20 62        ** extra b
14750 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65 61  ytes for the hea
14760 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65 6c  der length itsel
14770 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33 20  f.  32768*3 + 3 
14780 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 20 20 2a  = 98307..      *
14790 2f 0a 20 20 20 20 20 20 69 66 28 20 61 4f 66 66  /.      if( aOff
147a0 73 65 74 5b 30 5d 20 3e 20 39 38 33 30 37 20 7c  set[0] > 98307 |
147b0 7c 20 61 4f 66 66 73 65 74 5b 30 5d 20 3e 20 70  | aOffset[0] > p
147c0 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29  C->payloadSize )
147d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f  {.        goto o
147e0 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74  p_column_corrupt
147f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14800 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
14810 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
14820 61 74 69 6f 6e 2e 20 20 42 79 20 73 6b 69 70 70  ation.  By skipp
14830 69 6e 67 20 6f 76 65 72 20 74 68 65 20 66 69 72  ing over the fir
14840 73 74 20 66 65 77 20 74 65 73 74 73 0a 20 20 20  st few tests.   
14850 20 20 20 2a 2a 20 28 65 78 3a 20 70 43 2d 3e 6e     ** (ex: pC->n
14860 48 64 72 50 61 72 73 65 64 3c 3d 70 32 29 20 69  HdrParsed<=p2) i
14870 6e 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 69  n the next secti
14880 6f 6e 2c 20 77 65 20 61 63 68 69 65 76 65 20 61  on, we achieve a
14890 0a 20 20 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  .      ** measur
148a0 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
148b0 20 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a   gain..      **.
148c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72        ** This br
148d0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 65 76  anch is taken ev
148e0 65 6e 20 69 66 20 61 4f 66 66 73 65 74 5b 30 5d  en if aOffset[0]
148f0 3d 3d 30 2e 20 20 53 75 63 68 20 61 20 72 65 63  ==0.  Such a rec
14900 6f 72 64 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ord is never.   
14910 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
14920 62 79 20 53 51 4c 69 74 65 2c 20 61 6e 64 20 63  by SQLite, and c
14930 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72  ould be consider
14940 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2c 20 62  ed corruption, b
14950 75 74 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 61  ut we.      ** a
14960 63 63 65 70 74 20 69 74 20 66 6f 72 20 68 69 73  ccept it for his
14970 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
14980 20 20 57 68 65 6e 20 61 4f 66 66 73 65 74 5b 30    When aOffset[0
14990 5d 3d 3d 30 2c 20 74 68 65 20 63 6f 64 65 20 74  ]==0, the code t
149a0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 72 61  his.      ** bra
149b0 6e 63 68 20 6a 75 6d 70 73 20 74 6f 20 72 65 61  nch jumps to rea
149c0 64 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ds past the end 
149d0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 62  of the record, b
149e0 75 74 20 6e 65 76 65 72 20 6d 6f 72 65 0a 20 20  ut never more.  
149f0 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 20 66 65      ** than a fe
14a00 77 20 62 79 74 65 73 2e 20 20 45 76 65 6e 20 69  w bytes.  Even i
14a10 66 20 74 68 65 20 72 65 63 6f 72 64 20 6f 63 63  f the record occ
14a20 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  urs at the end o
14a30 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  f the page.     
14a40 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61   ** content area
14a50 2c 20 74 68 65 20 22 70 61 67 65 20 68 65 61 64  , the "page head
14a60 65 72 22 20 63 6f 6d 65 73 20 61 66 74 65 72 20  er" comes after 
14a70 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
14a80 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20 2a 2a   and so.      **
14a90 20 74 68 69 73 20 6f 76 65 72 72 65 61 64 20 69   this overread i
14aa0 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 53 69 6d  s harmless.  Sim
14ab0 69 6c 61 72 20 6f 76 65 72 72 65 61 64 73 20 63  ilar overreads c
14ac0 61 6e 20 6f 63 63 75 72 20 66 6f 72 20 61 20 63  an occur for a c
14ad0 6f 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20  orrupt.      ** 
14ae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
14af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a 44       */.      zD
14b00 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a  ata = pC->aRow;.
14b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14b20 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32  ->nHdrParsed<=p2
14b30 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   );         /* C
14b40 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70 70  onditional skipp
14b50 65 64 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ed */.      test
14b60 63 61 73 65 28 20 61 4f 66 66 73 65 74 5b 30 5d  case( aOffset[0]
14b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ==0 );.      got
14b80 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64  o op_column_read
14b90 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a 20  _header;.    }. 
14ba0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
14bb0 72 65 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  re at least the 
14bc0 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74 72 69  first p2+1 entri
14bd0 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  es of the header
14be0 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a 20   have been.  ** 
14bf0 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c 69 64  parsed and valid
14c00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
14c10 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e 64  in aOffset[] and
14c20 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20 20   pC->aType[]..  
14c30 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48 64  */.  if( pC->nHd
14c40 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20  rParsed<=p2 ){. 
14c50 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
14c60 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20 61 76  s more header av
14c70 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61 72 73  ailable for pars
14c80 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ing in the recor
14c90 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f  d, try.    ** to
14ca0 20 65 78 74 72 61 63 74 20 61 64 64 69 74 69 6f   extract additio
14cb0 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20 74 68  nal fields up th
14cc0 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31 2d 74  rough the p2+1-t
14cd0 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f 0a  h field .    */.
14ce0 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48 64 72      if( pC->iHdr
14cf0 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74 5b 30  Offset<aOffset[0
14d00 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61  ] ){.      /* Ma
14d10 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20 70 6f  ke sure zData po
14d20 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68 20 6f  ints to enough o
14d30 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
14d40 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72  cover the header
14d50 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
14d60 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  C->aRow==0 ){.  
14d70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4d        memset(&sM
14d80 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d  em, 0, sizeof(sM
14d90 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em));.        rc
14da0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
14db0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75  mFromBtree(pC->u
14dc0 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 61 4f  c.pCursor, 0, aO
14dd0 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d 29  ffset[0], &sMem)
14de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
14e00 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
14e10 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a  error;.        z
14e20 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d  Data = (u8*)sMem
14e30 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  .z;.      }else{
14e40 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d  .        zData =
14e50 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20   pC->aRow;.     
14e60 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
14e70 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70 65  ill in pC->aType
14e80 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b  [i] and aOffset[
14e90 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f 75 67  i] values throug
14ea0 68 20 74 68 65 20 70 32 2d 74 68 20 66 69 65 6c  h the p2-th fiel
14eb0 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c  d. */.    op_col
14ec0 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3a  umn_read_header:
14ed0 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e  .      i = pC->n
14ee0 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20 20 20  HdrParsed;.     
14ef0 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f 66 66   offset64 = aOff
14f00 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48  set[i];.      zH
14f10 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d  dr = zData + pC-
14f20 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  >iHdrOffset;.   
14f30 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61     zEndHdr = zDa
14f40 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b  ta + aOffset[0];
14f50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14f60 20 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 29   zHdr>=zEndHdr )
14f70 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
14f80 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a 48 64      if( (t = zHd
14f90 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20  r[0])<0x80 ){.  
14fa0 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a          zHdr++;.
14fb0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
14fc0 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  64 += sqlite3Vdb
14fd0 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
14fe0 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
14ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15000 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74     zHdr += sqlit
15010 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48  e3GetVarint32(zH
15020 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20  dr, &t);.       
15030 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73     offset64 += s
15040 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15050 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20  TypeLen(t);.    
15060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
15070 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20 74  ->aType[i++] = t
15080 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65  ;.        aOffse
15090 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f 66 66  t[i] = (u32)(off
150a0 73 65 74 36 34 20 26 20 30 78 66 66 66 66 66 66  set64 & 0xffffff
150b0 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ff);.      }whil
150c0 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 64 72  e( i<=p2 && zHdr
150d0 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20 20  <zEndHdr );..   
150e0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
150f0 20 69 73 20 63 6f 72 72 75 70 74 20 69 66 20 61   is corrupt if a
15100 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
15110 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
15120 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62      ** (1) the b
15130 79 74 65 73 20 6f 66 20 74 68 65 20 68 65 61 64  ytes of the head
15140 65 72 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  er extend past t
15150 68 65 20 64 65 63 6c 61 72 65 64 20 68 65 61 64  he declared head
15160 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  er size.      **
15170 20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65 20   (2) the entire 
15180 68 65 61 64 65 72 20 77 61 73 20 75 73 65 64 20  header was used 
15190 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61  but not all data
151a0 20 77 61 73 20 75 73 65 64 0a 20 20 20 20 20 20   was used.      
151b0 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f  ** (3) the end o
151c0 66 20 74 68 65 20 64 61 74 61 20 65 78 74 65 6e  f the data exten
151d0 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e  ds beyond the en
151e0 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  d of the record.
151f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15200 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48  if( (zHdr>=zEndH
15210 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64  dr && (zHdr>zEnd
15220 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21  Hdr || offset64!
15230 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65  =pC->payloadSize
15240 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66  )).       || (of
15250 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79  fset64 > pC->pay
15260 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20  loadSize).      
15270 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
15280 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 20 29 7b 0a  Offset[0]==0 ){.
15290 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b            i = 0;
152a0 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 20  .          zHdr 
152b0 3d 20 7a 45 6e 64 48 64 72 3b 0a 20 20 20 20 20  = zEndHdr;.     
152c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152d0 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77      if( pC->aRow
152e0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
152f0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
15300 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  m);.          go
15310 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72  to op_column_cor
15320 72 75 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rupt;.        }.
15330 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
15340 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20  C->nHdrParsed = 
15350 69 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64  i;.      pC->iHd
15360 72 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 28  rOffset = (u32)(
15370 7a 48 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20  zHdr - zData);. 
15380 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f       if( pC->aRo
15390 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  w==0 ) sqlite3Vd
153a0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
153b0 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  em);.    }else{.
153c0 20 20 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20        t = 0;.   
153d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66   }..    /* If af
153e0 74 65 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78  ter trying to ex
153f0 74 72 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65  tract new entrie
15400 73 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65  s from the heade
15410 72 2c 20 6e 48 64 72 50 61 72 73 65 64 20 69 73  r, nHdrParsed is
15420 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f  .    ** still no
15430 74 20 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74  t up to p2, that
15440 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15450 72 65 63 6f 72 64 20 68 61 73 20 66 65 77 65 72  record has fewer
15460 20 74 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20   than p2.    ** 
15470 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65  columns.  So the
15480 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20   result will be 
15490 65 69 74 68 65 72 20 74 68 65 20 64 65 66 61 75  either the defau
154a0 6c 74 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55  lt value or a NU
154b0 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
154c0 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65  f( pC->nHdrParse
154d0 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69  d<=p2 ){.      i
154e0 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
154f0 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  P4_MEM ){.      
15500 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
15510 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73  ShallowCopy(pDes
15520 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c  t, pOp->p4.pMem,
15530 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20   MEM_Static);.  
15540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
15560 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
15570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
15580 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
15590 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
155a0 7b 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54  {.    t = pC->aT
155b0 79 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20  ype[p2];.  }..  
155c0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63  /* Extract the c
155d0 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70  ontent for the p
155e0 32 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  2+1-th column.  
155f0 43 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79  Control can only
15600 0a 20 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73  .  ** reach this
15610 20 70 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65   point if aOffse
15620 74 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70  t[p2], aOffset[p
15630 32 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54  2+1], and pC->aT
15640 79 70 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a  ype[p2] are.  **
15650 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f   all valid..  */
15660 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43  .  assert( p2<pC
15670 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a  ->nHdrParsed );.
15680 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
15690 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
156a0 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
156b0 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
156c0 74 73 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69  ts(pDest) );.  i
156d0 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  f( VdbeMemDynami
156e0 63 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  c(pDest) ){.    
156f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
15700 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
15710 7d 0a 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70  }.  assert( t==p
15720 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a  C->aType[p2] );.
15730 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e    if( pC->szRow>
15740 3d 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29  =aOffset[p2+1] )
15750 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
15760 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
15770 20 77 68 65 72 65 20 74 68 65 20 64 65 73 69 72   where the desir
15780 65 64 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20  ed content fits 
15790 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  on the original.
157a0 20 20 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68      ** page - wh
157b0 65 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ere the content 
157c0 69 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65  is not on an ove
157d0 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
157e0 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52    zData = pC->aR
157f0 6f 77 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d  ow + aOffset[p2]
15800 3b 0a 20 20 20 20 69 66 28 20 74 3c 31 32 20 29  ;.    if( t<12 )
15810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
15820 64 62 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61  dbeSerialGet(zDa
15830 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  ta, t, pDest);. 
15840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15850 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
15860 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
15870 6e 67 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65  ng, we need a pe
15880 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20  rsistent value, 
15890 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d  not.      ** a M
158a0 45 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20  EM_Ephem value. 
158b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
158c0 61 20 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74  a fast short-cut
158d0 20 74 68 61 74 20 69 73 20 65 71 75 69 76 61 6c   that is equival
158e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ent.      ** to 
158f0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56  calling sqlite3V
15900 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
15910 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
15920 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a  ephemeralize()..
15930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15940 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
15950 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
15960 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  Blob, MEM_Str|ME
15970 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20  M_Term };.      
15980 70 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d  pDest->n = len =
15990 20 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20   (t-12)/2;.     
159a0 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
159b0 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66  coding;.      if
159c0 28 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f  ( pDest->szMallo
159d0 63 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20  c < len+2 ){.   
159e0 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
159f0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
15a00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15a10 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65  3VdbeMemGrow(pDe
15a20 73 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20  st, len+2, 0) ) 
15a30 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
15a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15a50 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65    pDest->z = pDe
15a60 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  st->zMalloc;.   
15a70 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
15a80 79 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74  y(pDest->z, zDat
15a90 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70  a, len);.      p
15aa0 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30  Dest->z[len] = 0
15ab0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a  ;.      pDest->z
15ac0 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  [len+1] = 0;.   
15ad0 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
15ae0 3d 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20  = aFlag[t&1];.  
15af0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15b00 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
15b10 63 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54  coding;.    /* T
15b20 68 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65  his branch happe
15b30 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e  ns only when con
15b40 74 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66  tent is on overf
15b50 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  low pages */.   
15b60 20 69 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26   if( ((pOp->p5 &
15b70 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
15b80 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
15b90 41 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ARG))!=0.       
15ba0 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26     && ((t>=12 &&
15bb0 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70   (t&1)==0) || (p
15bc0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
15bd0 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a  TYPEOFARG)!=0)).
15be0 20 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73       || (len = s
15bf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15c00 54 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20  TypeLen(t))==0. 
15c10 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43     ){.      /* C
15c20 6f 6e 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65  ontent is irrele
15c30 76 61 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a  vant for.      *
15c40 2a 20 20 20 20 31 2e 20 74 68 65 20 74 79 70 65  *    1. the type
15c50 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20  of() function,. 
15c60 20 20 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68       **    2. th
15c70 65 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63  e length(X) func
15c80 74 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62  tion if X is a b
15c90 6c 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  lob, and.      *
15ca0 2a 20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63  *    3. if the c
15cb0 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73  ontent length is
15cc0 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20   zero..      ** 
15cd0 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
15ce0 65 6c 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f  ell use bogus co
15cf0 6e 74 65 6e 74 20 72 61 74 68 65 72 20 74 68 61  ntent rather tha
15d00 6e 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  n reading.      
15d10 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ** content from 
15d20 64 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  disk. .      **.
15d30 20 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67        ** Althoug
15d40 68 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  h sqlite3VdbeSer
15d50 69 61 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61  ialGet() may rea
15d60 64 20 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65  d at most 8 byte
15d70 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  s from the.     
15d80 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
15d90 64 20 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69  d to it, debuggi
15da0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65  ng function Vdbe
15db0 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29  MemPrettyPrint()
15dc0 20 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65   may.      ** re
15dd0 61 64 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20  ad up to 16. So 
15de0 31 36 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75  16 bytes of bogu
15df0 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70  s content is sup
15e00 70 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  plied..      */.
15e10 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20        static u8 
15e20 61 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54  aZero[16];  /* T
15e30 68 69 73 20 69 73 20 74 68 65 20 62 6f 67 75 73  his is the bogus
15e40 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
15e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
15e60 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c  ialGet(aZero, t,
15e70 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c   pDest);.    }el
15e80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
15e90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
15ea0 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43  mBtree(pC->uc.pC
15eb0 75 72 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70  ursor, aOffset[p
15ec0 32 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b  2], len, pDest);
15ed0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15ee0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15ef0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
15f00 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
15f10 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
15f20 63 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d  const u8*)pDest-
15f30 3e 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  >z, t, pDest);. 
15f40 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
15f50 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b  s &= ~MEM_Ephem;
15f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63  .    }.  }..op_c
15f70 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44  olumn_out:.  UPD
15f80 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
15f90 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53  (pDest);.  REGIS
15fa0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
15fb0 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65  3, pDest);.  bre
15fc0 61 6b 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 63  ak;..op_column_c
15fd0 6f 72 72 75 70 74 3a 0a 20 20 69 66 28 20 61 4f  orrupt:.  if( aO
15fe0 70 5b 30 5d 2e 70 33 3e 30 20 29 7b 0a 20 20 20  p[0].p3>0 ){.   
15ff0 20 70 4f 70 20 3d 20 26 61 4f 70 5b 61 4f 70 5b   pOp = &aOp[aOp[
16000 30 5d 2e 70 33 2d 31 5d 3b 0a 20 20 20 20 62 72  0].p3-1];.    br
16010 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eak;.  }else{.  
16020 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
16030 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16040 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
16050 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a  o_error;.  }.}..
16060 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e  /* Opcode: Affin
16070 69 74 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ity P1 P2 * P4 *
16080 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66  .** Synopsis: af
16090 66 69 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29  finity(r[P1@P2])
160a0 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66  .**.** Apply aff
160b0 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e  inities to a ran
160c0 67 65 20 6f 66 20 50 32 20 72 65 67 69 73 74 65  ge of P2 registe
160d0 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
160e0 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73   P1..**.** P4 is
160f0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
16100 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73 20  s P2 characters 
16110 6c 6f 6e 67 2e 20 54 68 65 20 4e 2d 74 68 20 63  long. The N-th c
16120 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
16130 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
16140 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
16150 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
16160 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
16170 74 68 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65 6d 6f  the N-th.** memo
16180 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72  ry cell in the r
16190 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ange..*/.case OP
161a0 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63  _Affinity: {.  c
161b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69  onst char *zAffi
161c0 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61  nity;   /* The a
161d0 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70  ffinity to be ap
161e0 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 7a 41 66 66  plied */..  zAff
161f0 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e  inity = pOp->p4.
16200 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  z;.  assert( zAf
16210 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61  finity!=0 );.  a
16220 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
16230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41   );.  assert( zA
16240 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d  ffinity[pOp->p2]
16250 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  ==0 );.  pIn1 = 
16260 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
16270 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
16280 28 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d  ( pIn1 <= &p->aM
16290 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  em[(p->nMem+1 - 
162a0 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a  p->nCursor)] );.
162b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
162c0 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a  sValid(pIn1) );.
162d0 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
162e0 79 28 70 49 6e 31 2c 20 2a 28 7a 41 66 66 69 6e  y(pIn1, *(zAffin
162f0 69 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67  ity++), encoding
16300 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
16310 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69   }while( zAffini
16320 74 79 5b 30 5d 20 29 3b 0a 20 20 62 72 65 61 6b  ty[0] );.  break
16330 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
16340 4d 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32  MakeRecord P1 P2
16350 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
16360 70 73 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65  psis: r[P3]=mkre
16370 63 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a  c(r[P1@P2]).**.*
16380 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67  * Convert P2 reg
16390 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
163a0 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68   with P1 into th
163b0 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  e [record format
163c0 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61  ].** use as a da
163d0 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64  ta record in a d
163e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
163f0 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20   as a key.** in 
16400 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f  an index.  The O
16410 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
16420 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72  can decode the r
16430 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a  ecord later..**.
16440 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73  ** P4 may be a s
16450 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
16460 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
16470 2e 20 20 54 68 65 20 4e 2d 74 68 20 63 68 61 72  .  The N-th char
16480 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20  acter of the.** 
16490 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73  string indicates
164a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
164b0 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
164c0 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
164d0 20 4e 2d 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f   N-th.** field o
164e0 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e  f the index key.
164f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69  .**.** The mappi
16500 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65  ng from characte
16510 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73  r to affinity is
16520 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51   given by the SQ
16530 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63  LITE_AFF_.** mac
16540 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ros defined in s
16550 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a  qliteInt.h..**.*
16560 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20  * If P4 is NULL 
16570 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66  then all index f
16580 69 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61  ields have the a
16590 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f  ffinity BLOB..*/
165a0 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63  .case OP_MakeRec
165b0 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65  ord: {.  u8 *zNe
165c0 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  wRecord;        
165d0 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
165e0 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72  old the data for
165f0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
16600 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20  */.  Mem *pRec; 
16610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16620 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
16630 0a 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20  .  u64 nData;   
16640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16650 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16660 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20  data space */.  
16670 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20  int nHdr;       
16680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16690 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61   of bytes of hea
166a0 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  der space */.  i
166b0 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
166c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70        /* Data sp
166d0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
166e0 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a   this record */.
166f0 20 20 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20    i64 nZero;    
16700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16710 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73  er of zero bytes
16720 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
16730 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
16740 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20  nt nVarint;     
16750 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16760 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61  of bytes in a va
16770 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65  rint */.  u32 se
16780 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20  rial_type;      
16790 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a   /* Type field *
167a0 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b  /.  Mem *pData0;
167b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
167c0 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  rst field to be 
167d0 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
167e0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  e record */.  Me
167f0 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  m *pLast;       
16800 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65       /* Last fie
16810 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ld of the record
16820 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
16830 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16840 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
16850 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
16860 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  /.  char *zAffin
16870 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ity;       /* Th
16880 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
16890 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  g for the record
168a0 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66   */.  int file_f
168b0 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20  ormat;       /* 
168c0 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75  File format to u
168d0 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20  se for encoding 
168e0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
168f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16900 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65  pace used in zNe
16910 77 52 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72  wRecord[] header
16920 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16940 53 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e  Space used in zN
16950 65 77 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65  ewRecord[] conte
16960 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  nt */.  u32 len;
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16980 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69  * Length of a fi
16990 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73  eld */..  /* Ass
169a0 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  uming the record
169b0 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
169c0 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66  ds, the record f
169d0 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a  ormat looks.  **
169e0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
169f0 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
16a40 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c   ** | hdr-size |
16a50 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31   type 0 | type 1
16a60 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d   | ... | type N-
16a70 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20  1 | data0 | ... 
16a80 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20  | data N-1 | .  
16a90 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
16ae0 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73  .  ** Data(0) is
16af0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
16b00 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31  ster P1.  Data(1
16b10 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67  ) comes from reg
16b20 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20  ister P1+1.  ** 
16b30 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20  and so forth..  
16b40 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70  **.  ** Each typ
16b50 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72  e field is a var
16b60 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  int representing
16b70 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16b80 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   of the .  ** co
16b90 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
16ba0 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71   element (see sq
16bb0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16bc0 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a  ype()). The.  **
16bd0 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20   hdr-size field 
16be0 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74  is also a varint
16bf0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66   which is the of
16c00 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
16c10 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
16c20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61  the record to da
16c30 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74  ta0..  */.  nDat
16c40 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
16c50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16c60 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
16c70 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20  */.  nHdr = 0;  
16c80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16c90 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65  r of bytes of he
16ca0 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20  ader space */.  
16cb0 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
16cc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16cd0 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
16ce0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
16cf0 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ord */.  nField 
16d00 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66  = pOp->p1;.  zAf
16d10 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
16d20 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  .z;.  assert( nF
16d30 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ield>0 && pOp->p
16d40 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
16d50 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  Field<=(p->nMem+
16d60 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
16d70 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20  1 );.  pData0 = 
16d80 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20  &aMem[nField];. 
16d90 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
16da0 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44  2;.  pLast = &pD
16db0 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  ata0[nField-1];.
16dc0 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20    file_format = 
16dd0 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
16de0 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65  ormat;..  /* Ide
16df0 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74  ntify the output
16e00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61   register */.  a
16e10 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
16e20 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p1 || pOp->p
16e30 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  3>=pOp->p1+pOp->
16e40 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26  p2 );.  pOut = &
16e50 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
16e60 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
16e70 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f  e(p, pOut);..  /
16e80 2a 20 41 70 70 6c 79 20 74 68 65 20 72 65 71 75  * Apply the requ
16e90 65 73 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  ested affinity t
16ea0 6f 20 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a  o all inputs.  *
16eb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  /.  assert( pDat
16ec0 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69  a0<=pLast );.  i
16ed0 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a  f( zAffinity ){.
16ee0 20 20 20 20 70 52 65 63 20 3d 20 70 44 61 74 61      pRec = pData
16ef0 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
16f00 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
16f10 52 65 63 2b 2b 2c 20 2a 28 7a 41 66 66 69 6e 69  Rec++, *(zAffini
16f20 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29  ty++), encoding)
16f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16f40 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 30 20  zAffinity[0]==0 
16f50 7c 7c 20 70 52 65 63 3c 3d 70 4c 61 73 74 20 29  || pRec<=pLast )
16f60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 41  ;.    }while( zA
16f70 66 66 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20  ffinity[0] );.  
16f80 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
16f90 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49  _ENABLE_NULL_TRI
16fa0 4d 0a 20 20 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e  M.  /* NULLs can
16fb0 20 62 65 20 73 61 66 65 6c 79 20 74 72 69 6d 6d   be safely trimm
16fc0 65 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ed from the end 
16fd0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
16fe0 73 20 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a 20 61  s long as.  ** a
16ff0 73 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  s the schema for
17000 6d 61 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  mat is 2 or more
17010 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
17020 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73   omitted columns
17030 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e  .  ** have a non
17040 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61  -NULL default va
17050 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 68 65 20  lue.  Also, the 
17060 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 6c  record must be l
17070 65 66 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 74  eft with.  ** at
17080 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64   least one field
17090 2e 20 20 49 66 20 50 35 3e 30 20 74 68 65 6e 20  .  If P5>0 then 
170a0 69 74 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6d  it will be one m
170b0 6f 72 65 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ore than the.  *
170c0 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  * index of the r
170d0 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
170e0 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   with a non-NULL
170f0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
17100 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  /.  if( pOp->p5 
17110 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ){.    while( (p
17120 4c 61 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Last->flags & ME
17130 4d 5f 4e 75 6c 6c 29 21 3d 30 20 26 26 20 6e 46  M_Null)!=0 && nF
17140 69 65 6c 64 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a  ield>pOp->p5 ){.
17150 20 20 20 20 20 20 70 4c 61 73 74 2d 2d 3b 0a 20        pLast--;. 
17160 20 20 20 20 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20       nField--;. 
17170 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
17180 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
17190 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  gh the elements 
171a0 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  that will make u
171b0 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  p the record to 
171c0 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20  figure.  ** out 
171d0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
171e0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
171f0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20  he new record.. 
17200 20 2a 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61   */.  pRec = pLa
17210 73 74 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73  st;.  do{.    as
17220 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
17230 28 70 52 65 63 29 20 29 3b 0a 20 20 20 20 73 65  (pRec) );.    se
17240 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
17250 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17260 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72  e(pRec, file_for
17270 6d 61 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  mat, &len);.    
17280 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20  if( pRec->flags 
17290 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
172a0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
172b0 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
172c0 20 20 2f 2a 20 56 61 6c 75 65 73 20 77 69 74 68    /* Values with
172d0 20 4d 45 4d 5f 4e 75 6c 6c 20 61 6e 64 20 4d 45   MEM_Null and ME
172e0 4d 5f 5a 65 72 6f 20 61 72 65 20 63 72 65 61 74  M_Zero are creat
172f0 65 64 20 62 79 20 78 43 6f 6c 75 6d 6e 20 76 69  ed by xColumn vi
17300 72 74 75 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  rtual.        **
17310 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 74   table methods t
17320 68 61 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65  hat never invoke
17330 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
17340 78 78 78 78 78 28 29 20 77 68 69 6c 65 0a 20 20  xxxxx() while.  
17350 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 69        ** computi
17360 6e 67 20 61 6e 20 75 6e 63 68 61 6e 67 69 6e 67  ng an unchanging
17370 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
17380 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
17390 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ment..        **
173a0 20 47 69 76 65 20 73 75 63 68 20 76 61 6c 75 65   Give such value
173b0 73 20 61 20 73 70 65 63 69 61 6c 20 69 6e 74 65  s a special inte
173c0 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 73 65  rnal-use-only se
173d0 72 69 61 6c 2d 74 79 70 65 20 6f 66 20 31 30 0a  rial-type of 10.
173e0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
173f0 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 70  at they can be p
17400 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
17410 20 78 55 70 64 61 74 65 20 61 6e 64 20 68 61 76   xUpdate and hav
17420 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  e.        ** a t
17430 72 75 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rue sqlite3_valu
17440 65 5f 6e 6f 63 68 61 6e 67 65 28 29 2e 20 2a 2f  e_nochange(). */
17450 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17460 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47   pOp->p5==OPFLAG
17470 5f 4e 4f 43 48 4e 47 5f 4d 41 47 49 43 20 7c 7c  _NOCHNG_MAGIC ||
17480 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
17490 20 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79         serial_ty
174a0 70 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 7d  pe = 10;.      }
174b0 65 6c 73 65 20 69 66 28 20 6e 44 61 74 61 20 29  else if( nData )
174c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
174d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61  lite3VdbeMemExpa
174e0 6e 64 42 6c 6f 62 28 70 52 65 63 29 20 29 20 67  ndBlob(pRec) ) g
174f0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
17500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17510 20 6e 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e   nZero += pRec->
17520 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
17530 20 6c 65 6e 20 2d 3d 20 70 52 65 63 2d 3e 75 2e   len -= pRec->u.
17540 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  nZero;.      }. 
17550 20 20 20 7d 0a 20 20 20 20 6e 44 61 74 61 20 2b     }.    nData +
17560 3d 20 6c 65 6e 3b 0a 20 20 20 20 74 65 73 74 63  = len;.    testc
17570 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
17580 3d 3d 31 32 37 20 29 3b 0a 20 20 20 20 74 65 73  ==127 );.    tes
17590 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
175a0 70 65 3d 3d 31 32 38 20 29 3b 0a 20 20 20 20 6e  pe==128 );.    n
175b0 48 64 72 20 2b 3d 20 73 65 72 69 61 6c 5f 74 79  Hdr += serial_ty
175c0 70 65 3c 3d 31 32 37 20 3f 20 31 20 3a 20 73 71  pe<=127 ? 1 : sq
175d0 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
175e0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
175f0 20 70 52 65 63 2d 3e 75 54 65 6d 70 20 3d 20 73   pRec->uTemp = s
17600 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 20 20  erial_type;.    
17610 69 66 28 20 70 52 65 63 3d 3d 70 44 61 74 61 30  if( pRec==pData0
17620 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52   ) break;.    pR
17630 65 63 2d 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31  ec--;.  }while(1
17640 29 3b 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  );..  /* EVIDENC
17650 45 2d 4f 46 3a 20 52 2d 32 32 35 36 34 2d 31 31  E-OF: R-22564-11
17660 36 34 37 20 54 68 65 20 68 65 61 64 65 72 20 62  647 The header b
17670 65 67 69 6e 73 20 77 69 74 68 20 61 20 73 69 6e  egins with a sin
17680 67 6c 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20  gle varint.  ** 
17690 77 68 69 63 68 20 64 65 74 65 72 6d 69 6e 65 73  which determines
176a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
176b0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
176c0 65 20 68 65 61 64 65 72 2e 20 54 68 65 20 76 61  e header. The va
176d0 72 69 6e 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  rint.  ** value 
176e0 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
176f0 68 65 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  he header in byt
17700 65 73 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  es including the
17710 20 73 69 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a   size varint.  *
17720 2a 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74  * itself. */.  t
17730 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31  estcase( nHdr==1
17740 32 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  26 );.  testcase
17750 28 20 6e 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20  ( nHdr==127 );. 
17760 20 69 66 28 20 6e 48 64 72 3c 3d 31 32 36 20 29   if( nHdr<=126 )
17770 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d  {.    /* The com
17780 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
17790 6e 48 64 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c  nHdr += 1;.  }el
177a0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 61 72 65 20  se{.    /* Rare 
177b0 63 61 73 65 20 6f 66 20 61 20 72 65 61 6c 6c 79  case of a really
177c0 20 6c 61 72 67 65 20 68 65 61 64 65 72 20 2a 2f   large header */
177d0 0a 20 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73  .    nVarint = s
177e0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
177f0 6e 48 64 72 29 3b 0a 20 20 20 20 6e 48 64 72 20  nHdr);.    nHdr 
17800 2b 3d 20 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20  += nVarint;.    
17810 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69  if( nVarint<sqli
17820 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
17830 72 29 20 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d  r) ) nHdr++;.  }
17840 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b  .  nByte = nHdr+
17850 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 6e 42 79  nData;.  if( nBy
17860 74 65 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69  te+nZero>db->aLi
17870 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
17880 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
17890 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
178a0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
178b0 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  e the output reg
178c0 69 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66  ister has a buff
178d0 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
178e0 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74  to store .  ** t
178f0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54  he new record. T
17900 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
17910 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20  er (pOp->p3) is 
17920 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
17930 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68   ** be one of th
17940 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
17950 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  s (because the f
17960 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
17970 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
17980 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
17990 7a 65 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62  ze() could clobb
179a0 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  er the value bef
179b0 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29 2e  ore it is used).
179c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
179d0 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
179e0 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28  ndResize(pOut, (
179f0 69 6e 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20  int)nByte) ){.  
17a00 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
17a10 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20   }.  zNewRecord 
17a20 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b  = (u8 *)pOut->z;
17a30 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
17a40 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d   record */.  i =
17a50 20 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65   putVarint32(zNe
17a60 77 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a  wRecord, nHdr);.
17a70 20 20 6a 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73    j = nHdr;.  as
17a80 73 65 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c  sert( pData0<=pL
17a90 61 73 74 20 29 3b 0a 20 20 70 52 65 63 20 3d 20  ast );.  pRec = 
17aa0 70 44 61 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20  pData0;.  do{.  
17ab0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
17ac0 70 52 65 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20  pRec->uTemp;.   
17ad0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17ae0 20 52 2d 30 36 35 32 39 2d 34 37 33 36 32 20 46   R-06529-47362 F
17af0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 73 69 7a  ollowing the siz
17b00 65 20 76 61 72 69 6e 74 20 61 72 65 20 6f 6e 65  e varint are one
17b10 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20   or more.    ** 
17b20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e  additional varin
17b30 74 73 2c 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75  ts, one per colu
17b40 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20  mn. */.    i += 
17b50 70 75 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65  putVarint32(&zNe
17b60 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69  wRecord[i], seri
17b70 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20  al_type);       
17b80 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74       /* serial t
17b90 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56  ype */.    /* EV
17ba0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35  IDENCE-OF: R-645
17bb0 33 36 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c  36-51728 The val
17bc0 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ues for each col
17bd0 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72  umn in the recor
17be0 64 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61  d.    ** immedia
17bf0 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
17c00 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a  header. */.    j
17c10 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
17c20 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65  erialPut(&zNewRe
17c30 63 6f 72 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73  cord[j], pRec, s
17c40 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20  erial_type); /* 
17c50 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68  content */.  }wh
17c60 69 6c 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70  ile( (++pRec)<=p
17c70 4c 61 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Last );.  assert
17c80 28 20 69 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61  ( i==nHdr );.  a
17c90 73 73 65 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20  ssert( j==nByte 
17ca0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  );..  assert( pO
17cb0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
17cc0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
17cd0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
17ce0 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74    pOut->n = (int
17cf0 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e  )nByte;.  pOut->
17d00 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
17d10 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b  ;.  if( nZero ){
17d20 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65  .    pOut->u.nZe
17d30 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  ro = nZero;.    
17d40 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
17d50 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 52  EM_Zero;.  }.  R
17d60 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
17d70 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p3, pOut);.  
17d80 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
17d90 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
17da0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
17db0 3a 20 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20  : Count P1 P2 * 
17dc0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
17dd0 20 72 5b 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a   r[P2]=count().*
17de0 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e  *.** Store the n
17df0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
17e00 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c   (an integer val
17e10 75 65 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ue) in the table
17e20 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70   or index .** op
17e30 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20 50  ened by cursor P
17e40 31 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  1 in register P2
17e50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
17e60 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
17e70 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74  NT.case OP_Count
17e80 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  : {         /* o
17e90 75 74 32 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e  ut2 */.  i64 nEn
17ea0 74 72 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  try;.  BtCursor 
17eb0 2a 70 43 72 73 72 3b 0a 0a 20 20 61 73 73 65 72  *pCrsr;..  asser
17ec0 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  t( p->apCsr[pOp-
17ed0 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d  >p1]->eCurType==
17ee0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17ef0 0a 20 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70  .  pCrsr = p->ap
17f00 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63  Csr[pOp->p1]->uc
17f10 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  .pCursor;.  asse
17f20 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 6e  rt( pCrsr );.  n
17f30 45 6e 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e  Entry = 0;  /* N
17f40 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79  ot needed.  Only
17f50 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65   used to silence
17f60 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
17f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17f80 65 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26  eeCount(pCrsr, &
17f90 6e 45 6e 74 72 79 29 3b 0a 20 20 69 66 28 20 72  nEntry);.  if( r
17fa0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
17fb0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70  ue_to_error;.  p
17fc0 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
17fd0 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
17fe0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74  pOut->u.i = nEnt
17ff0 72 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  ry;.  break;.}.#
18000 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65  endif../* Opcode
18010 3a 20 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a  : Savepoint P1 *
18020 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70   * P4 *.**.** Op
18030 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
18040 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65  ollback the save
18050 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70  point named by p
18060 61 72 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70  arameter P4, dep
18070 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ending.** on the
18080 20 76 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f   value of P1. To
18090 20 6f 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65   open a new save
180a0 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f  point, P1==0. To
180b0 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
180c0 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  ) an.** existing
180d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d   savepoint, P1==
180e0 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63  1, or to rollbac
180f0 6b 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61  k an existing sa
18100 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a  vepoint P1==2..*
18110 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f  /.case OP_Savepo
18120 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b  int: {.  int p1;
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
18150 65 20 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20  e of P1 operand 
18160 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
18170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18180 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18190 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69  savepoint */.  i
181a0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65  nt nName;.  Save
181b0 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53  point *pNew;.  S
181c0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
181d0 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e  oint;.  Savepoin
181e0 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69  t *pTmp;.  int i
181f0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74  Savepoint;.  int
18200 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70   ii;..  p1 = pOp
18210 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  ->p1;.  zName = 
18220 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a  pOp->p4.z;..  /*
18230 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
18240 20 70 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   p1 parameter is
18250 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61   valid. Also tha
18260 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  t if there is no
18270 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   open.  ** trans
18280 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  action, then the
18290 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79  re cannot be any
182a0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20   savepoints. .  
182b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
182c0 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >pSavepoint==0 |
182d0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
182e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
182f0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
18300 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EGIN||p1==SAVEPO
18310 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d  INT_RELEASE||p1=
18320 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
18330 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
18340 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
18350 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  || db->isTransac
18360 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  tionSavepoint==0
18370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68   );.  assert( ch
18380 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
18390 74 28 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72  t(db) );.  asser
183a0 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
183b0 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41  );..  if( p1==SA
183c0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b  VEPOINT_BEGIN ){
183d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
183e0 62 65 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20  beWrite>0 ){.   
183f0 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65     /* A new save
18400 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  point cannot be 
18410 63 72 65 61 74 65 64 20 69 66 20 74 68 65 72 65  created if there
18420 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69 74   are active writ
18430 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  e .      ** stat
18440 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65  ements (i.e. ope
18450 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63  n read/write inc
18460 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61  remental blob ha
18470 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f  ndles)..      */
18480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18490 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e  beError(p, "cann
184a0 6f 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ot open savepoin
184b0 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  t - SQL statemen
184c0 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29  ts in progress")
184d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
184e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
184f0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  lse{.      nName
18500 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18510 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e  30(zName);..#ifn
18520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18530 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
18540 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
18550 69 73 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68  is Ok even if th
18560 69 73 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  is savepoint is 
18570 61 63 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73  actually a trans
18580 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
18590 73 61 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74  savepoint (and t
185a0 68 65 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20  herefore should 
185b0 6e 6f 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65  not prompt xSave
185c0 70 6f 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63  point()) callbac
185d0 6b 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ks..      ** If 
185e0 74 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61  this is a transa
185f0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
18600 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74  being opened, it
18610 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20   is guaranteed. 
18620 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
18630 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61   db->aVTrans[] a
18640 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20  rray is empty.  
18650 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
18660 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
18670 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e  =0 || db->nVTran
18680 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  s==0 );.      rc
18690 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
186a0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
186b0 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20  POINT_BEGIN,.   
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
186e0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
186f0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
18700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18710 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
18720 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
18730 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
18740 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 61   Create a new sa
18750 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
18760 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  e. */.      pNew
18770 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
18780 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
18790 6f 66 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e  of(Savepoint)+nN
187a0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  ame+1);.      if
187b0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
187c0 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
187d0 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d  (char *)&pNew[1]
187e0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
187f0 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  (pNew->zName, zN
18800 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
18810 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
18820 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  f there is no op
18830 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
18840 74 68 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61  then mark this a
18850 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20  s a special.    
18860 20 20 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74      ** "transact
18870 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20  ion savepoint". 
18880 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  */.        if( d
18890 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
188a0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
188b0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  utoCommit = 0;. 
188c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54           db->isT
188d0 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
188e0 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  int = 1;.       
188f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18900 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
18910 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ++;.        }.. 
18920 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74         /* Link t
18930 68 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74  he new savepoint
18940 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18950 73 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74  se handle's list
18960 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
18970 77 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  w->pNext = db->p
18980 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20  Savepoint;.     
18990 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
189a0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
189b0 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65    pNew->nDeferre
189c0 64 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  dCons = db->nDef
189d0 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20  erredCons;.     
189e0 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72     pNew->nDeferr
189f0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e  edImmCons = db->
18a00 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
18a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61    }else{.    iSa
18a30 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20  vepoint = 0;..  
18a40 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    /* Find the na
18a50 6d 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  med savepoint. I
18a60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
18a70 63 68 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ch savepoint, th
18a80 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  en an.    ** an 
18a90 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
18aa0 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20  d to the user.  
18ab0 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20  */.    for(.    
18ac0 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64    pSavepoint = d
18ad0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a  b->pSavepoint; .
18ae0 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
18af0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
18b00 6d 70 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a  mp(pSavepoint->z
18b10 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
18b20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d      pSavepoint =
18b30 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
18b40 78 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  xt.    ){.      
18b50 69 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20  iSavepoint++;.  
18b60 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61    }.    if( !pSa
18b70 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20  vepoint ){.     
18b80 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
18b90 72 28 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61  r(p, "no such sa
18ba0 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e  vepoint: %s", zN
18bb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
18bc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d     }else if( db-
18be0 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 26 26  >nVdbeWrite>0 &&
18bf0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
18c00 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
18c10 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
18c20 73 69 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65  sible to release
18c30 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65   (commit) a save
18c40 70 6f 69 6e 74 20 69 66 20 74 68 65 72 65 20 61  point if there a
18c50 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74  re .      ** act
18c60 69 76 65 20 77 72 69 74 65 20 73 74 61 74 65 6d  ive write statem
18c70 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ents..      */. 
18c80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18c90 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74  Error(p, "cannot
18ca0 20 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69   release savepoi
18cb0 6e 74 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20  nt - ".         
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73   "SQL statements
18ce0 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
18cf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18d00 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
18d10 65 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74  e{..      /* Det
18d20 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
18d30 72 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20  r not this is a 
18d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
18d50 70 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20  point. If so,.  
18d60 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20      ** and this 
18d70 69 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d  is a RELEASE com
18d80 6d 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  mand, then the c
18d90 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
18da0 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  on .      ** is 
18db0 63 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20  committed. .    
18dc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69    */.      int i
18dd0 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  sTransaction = p
18de0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
18df0 3d 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61  ==0 && db->isTra
18e00 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
18e10 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  t;.      if( isT
18e20 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31  ransaction && p1
18e30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
18e40 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ASE ){.        i
18e50 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
18e60 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
18e70 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
18e80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
18e90 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
18ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
18eb0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
18ec0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  1;.        if( s
18ed0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
18ee0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  )==SQLITE_BUSY )
18ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
18f00 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  c = (int)(pOp - 
18f10 61 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  aOp);.          
18f20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
18f30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   0;.          p-
18f40 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54  >rc = rc = SQLIT
18f50 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
18f60 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
18f70 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
18f80 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e        db->isTran
18f90 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
18fa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
18fb0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
18fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
18fd0 6e 74 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67  nt isSchemaChang
18fe0 65 3b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65  e;.        iSave
18ff0 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76  point = db->nSav
19000 65 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f  epoint - iSavepo
19010 69 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  int - 1;.       
19020 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49   if( p1==SAVEPOI
19030 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
19040 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d           isSchem
19050 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d  aChange = (db->m
19060 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
19070 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d  _SchemaChange)!=
19080 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
19090 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44  (ii=0; ii<db->nD
190a0 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  b; ii++){.      
190b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190c0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
190d0 72 73 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69  rsors(db->aDb[ii
190e0 5d 2e 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20  ].pBt,.         
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19110 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
19120 41 43 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ACK,.           
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 20 20 20 69 73 53 63              isSc
19150 68 65 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a  hemaChange==0);.
19160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19180 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19190 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
191a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
191b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73  se{.          is
191c0 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 30  SchemaChange = 0
191d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
191e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
191f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b  <db->nDb; ii++){
19200 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
19210 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
19220 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69  point(db->aDb[ii
19230 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65  ].pBt, p1, iSave
19240 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
19250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19270 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19280 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
19290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
192a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
192b0 53 63 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a  SchemaChange ){.
192c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
192d0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
192e0 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
192f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19300 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
19310 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
19320 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
19330 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
19340 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
19350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19360 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65  }.  .      /* Re
19370 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
19380 68 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45  her this is a RE
19390 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
193a0 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a  K, destroy all .
193b0 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69        ** savepoi
193c0 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64  nts nested insid
193d0 65 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  e of the savepoi
193e0 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
193f0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77  d on. */.      w
19400 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
19410 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74  oint!=pSavepoint
19420 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70   ){.        pTmp
19430 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
19440 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  t;.        db->p
19450 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
19460 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
19470 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19480 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20  b, pTmp);.      
19490 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
194a0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  --;.      }..   
194b0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61     /* If it is a
194c0 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64   RELEASE, then d
194d0 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
194e0 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
194f0 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ted on .      **
19500 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61   too. If it is a
19510 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68   ROLLBACK TO, th
19520 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65  en set the numbe
19530 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20  r of deferred . 
19540 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
19550 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72  nt violations pr
19560 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
19570 61 62 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c  abase to the val
19580 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  ue stored.      
19590 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76 65  ** when the save
195a0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
195b0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
195c0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
195d0 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
195e0 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65 70    assert( pSavep
195f0 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70  oint==db->pSavep
19600 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  oint );.        
19610 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
19620 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
19630 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
19640 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
19650 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
19660 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61     if( !isTransa
19670 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19680 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e     db->nSavepoin
19690 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
196a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
196b0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
196c0 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  dCons = pSavepoi
196d0 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  nt->nDeferredCon
196e0 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  s;.        db->n
196f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
19700 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44  = pSavepoint->nD
19710 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
19720 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
19730 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f  f( !isTransactio
19740 6e 20 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49  n || p1==SAVEPOI
19750 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
19760 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19770 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
19780 28 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  (db, p1, iSavepo
19790 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
197a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
197b0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
197c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
197d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
197e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
197f0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
19800 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ..  break;.}../*
19810 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d   Opcode: AutoCom
19820 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  mit P1 P2 P3 * *
19830 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
19840 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d  atabase auto-com
19850 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28  mit flag to P1 (
19860 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69  1 or 0). If P2 i
19870 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20  s true, roll.** 
19880 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74  back any current
19890 6c 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20  ly active btree 
198a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66  transactions. If
198b0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61   there are any a
198c0 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70  ctive.** VMs (ap
198d0 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e  art from this on
198e0 65 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42  e), then a ROLLB
198f0 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f  ACK fails.  A CO
19900 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a  MMIT fails if.**
19910 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
19920 65 20 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72  e writing VMs or
19930 20 61 63 74 69 76 65 20 56 4d 73 20 74 68 61 74   active VMs that
19940 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
19950 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  e..**.** This in
19960 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73  struction causes
19970 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e   the VM to halt.
19980 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f  .*/.case OP_Auto
19990 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20  Commit: {.  int 
199a0 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
199b0 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61  t;.  int iRollba
199c0 63 6b 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75  ck;..  desiredAu
199d0 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e  toCommit = pOp->
199e0 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20  p1;.  iRollback 
199f0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
19a00 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
19a10 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73  Commit==1 || des
19a20 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
19a30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
19a40 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
19a50 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b  ==1 || iRollback
19a60 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19a70 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19a80 69 74 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33  it==0 || pOp->p3
19a90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19aa0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
19ab0 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61  >0 );  /* At lea
19ac0 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20 69  st this one VM i
19ad0 73 20 61 63 74 69 76 65 20 2a 2f 0a 20 20 61 73  s active */.  as
19ae0 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
19af0 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 64 65 73  er );..  if( des
19b00 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d  iredAutoCommit!=
19b10 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
19b20 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62  {.    if( iRollb
19b30 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ack ){.      ass
19b40 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
19b50 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20  Commit==1 );.   
19b60 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
19b70 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
19b80 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
19b90 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  ;.      db->auto
19ba0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
19bb0 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65  }else if( desire
19bc0 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  dAutoCommit && d
19bd0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20  b->nVdbeWrite>0 
19be0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
19bf0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
19c00 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d  implements a COM
19c10 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d  MIT and other VM
19c20 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20  s are writing.  
19c30 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
19c40 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e   error indicatin
19c50 67 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  g that the other
19c60 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65   VMs must comple
19c70 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 20  te first. .     
19c80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
19c90 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63  3VdbeError(p, "c
19ca0 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61  annot commit tra
19cb0 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20  nsaction - ".   
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
19ce0 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
19cf0 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
19d00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19d10 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
19d20 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
19d30 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
19d40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
19d50 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49  kFk(p, 1))!=SQLI
19d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
19d70 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
19d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19d90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
19da0 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75   = (u8)desiredAu
19db0 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a  toCommit;.    }.
19dc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
19dd0 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
19de0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
19df0 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70   p->pc = (int)(p
19e00 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20  Op - aOp);.     
19e10 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
19e20 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72 65 64  = (u8)(1-desired
19e30 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  AutoCommit);.   
19e40 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20     p->rc = rc = 
19e50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
19e60 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
19e70 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
19e80 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
19e90 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ement==0 );.    
19ea0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
19eb0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
19ec0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19ee0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
19ef0 20 20 20 20 20 20 64 62 2d 3e 72 65 61 64 6f 6e        db->readon
19f00 6c 79 54 72 61 6e 73 20 3d 20 28 70 4f 70 2d 3e  lyTrans = (pOp->
19f10 70 33 3d 3d 54 4b 5f 52 45 41 44 4f 4e 4c 59 29  p3==TK_READONLY)
19f20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
19f40 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
19f50 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
19f70 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
19f80 70 2c 0a 20 20 20 20 20 20 20 20 28 21 64 65 73  p,.        (!des
19f90 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f  iredAutoCommit)?
19fa0 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
19fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
19fc0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
19fd0 22 3a 28 0a 20 20 20 20 20 20 20 20 28 69 52 6f  ":(.        (iRo
19fe0 6c 6c 62 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20  llback)?"cannot 
19ff0 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72  rollback - no tr
1a000 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
1a010 69 76 65 22 3a 0a 20 20 20 20 20 20 20 20 20 20  ive":.          
1a020 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
1a030 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61   commit - no tra
1a040 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1a050 76 65 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ve"));.         
1a060 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a070 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f  _ERROR;.    goto
1a080 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1a090 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ror;.  }.  break
1a0a0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1a0b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50  Transaction P1 P
1a0c0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
1a0d0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1a0e0 74 69 6f 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  tion on database
1a0f0 20 50 31 20 69 66 20 61 20 74 72 61 6e 73 61 63   P1 if a transac
1a100 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65  tion is not alre
1a110 61 64 79 0a 2a 2a 20 61 63 74 69 76 65 2e 0a 2a  ady.** active..*
1a120 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a  * If P2 is non-z
1a130 65 72 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74  ero, then a writ
1a140 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1a150 20 73 74 61 72 74 65 64 2c 20 6f 72 20 69 66 20   started, or if 
1a160 61 20 0a 2a 2a 20 72 65 61 64 2d 74 72 61 6e 73  a .** read-trans
1a170 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a180 79 20 61 63 74 69 76 65 2c 20 69 74 20 69 73 20  y active, it is 
1a190 75 70 67 72 61 64 65 64 20 74 6f 20 61 20 77 72  upgraded to a wr
1a1a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
1a1b0 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72  .** If P2 is zer
1a1c0 6f 2c 20 74 68 65 6e 20 61 20 72 65 61 64 2d 74  o, then a read-t
1a1d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1a1e0 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  arted..**.** P1 
1a1f0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1a200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a210 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74  e on which the t
1a220 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
1a230 20 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78   started.  Index
1a240 20 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64   0 is the main d
1a250 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1a260 20 69 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a   index 1 is the.
1a270 2a 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  ** file used for
1a280 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1a290 73 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32  s.  Indices of 2
1a2a0 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65   or more are use
1a2b0 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65  d for.** attache
1a2c0 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  d databases..**.
1a2d0 2a 2a 20 49 66 20 61 20 77 72 69 74 65 2d 74 72  ** If a write-tr
1a2e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a2f0 72 74 65 64 20 61 6e 64 20 74 68 65 20 56 64 62  rted and the Vdb
1a300 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  e.usesStmtJourna
1a310 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75  l flag is.** tru
1a320 65 20 28 74 68 69 73 20 66 6c 61 67 20 69 73 20  e (this flag is 
1a330 73 65 74 20 69 66 20 74 68 65 20 56 64 62 65 20  set if the Vdbe 
1a340 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20  may modify more 
1a350 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64  than one row and
1a360 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
1a370 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
1a380 29 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ), a statement t
1a390 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61  ransaction may a
1a3a0 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a  lso be opened..*
1a3b0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1a3c0 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  lly, a statement
1a3d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1a3e0 6f 70 65 6e 65 64 20 69 66 66 20 74 68 65 20 64  opened iff the d
1a3f0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1a400 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1a410 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f  ly not in autoco
1a420 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66  mmit mode, or if
1a430 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1a440 0a 2a 2a 20 61 63 74 69 76 65 20 73 74 61 74 65  .** active state
1a450 6d 65 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65  ments. A stateme
1a460 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
1a470 6c 6c 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65  llows the change
1a480 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a  s made by this.*
1a490 2a 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c  * VDBE to be rol
1a4a0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61  led back after a
1a4b0 6e 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20  n error without 
1a4c0 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62  having to roll b
1a4d0 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  ack the.** entir
1a4e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  e transaction. I
1a4f0 66 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e  f no error is en
1a500 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73  countered, the s
1a510 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1a520 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74  tion.** will aut
1a530 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
1a540 74 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  t when the VDBE 
1a550 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  halts..**.** If 
1a560 50 35 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20  P5!=0 then this 
1a570 6f 70 63 6f 64 65 20 61 6c 73 6f 20 63 68 65 63  opcode also chec
1a580 6b 73 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ks the schema co
1a590 6f 6b 69 65 20 61 67 61 69 6e 73 74 20 50 33 0a  okie against P3.
1a5a0 2a 2a 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ** and the schem
1a5b0 61 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75  a generation cou
1a5c0 6e 74 65 72 20 61 67 61 69 6e 73 74 20 50 34 2e  nter against P4.
1a5d0 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 63  .** The cookie c
1a5e0 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75 65  hanges its value
1a5f0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
1a600 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 68  tabase schema ch
1a610 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f  anges..** This o
1a620 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64  peration is used
1a630 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
1a640 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  that the cookie 
1a650 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61  has changed.** a
1a660 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72 72  nd that the curr
1a670 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65 64  ent process need
1a680 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
1a690 73 63 68 65 6d 61 2e 20 20 49 66 20 74 68 65 20  schema.  If the 
1a6a0 73 63 68 65 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65  schema.** cookie
1a6b0 20 69 6e 20 50 33 20 64 69 66 66 65 72 73 20 66   in P3 differs f
1a6c0 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 20 63  rom the schema c
1a6d0 6f 6f 6b 69 65 20 69 6e 20 74 68 65 20 64 61 74  ookie in the dat
1a6e0 61 62 61 73 65 20 68 65 61 64 65 72 20 6f 72 0a  abase header or.
1a6f0 2a 2a 20 69 66 20 74 68 65 20 73 63 68 65 6d 61  ** if the schema
1a700 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
1a710 74 65 72 20 69 6e 20 50 34 20 64 69 66 66 65 72  ter in P4 differ
1a720 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
1a730 6e 74 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e  nt.** generation
1a740 20 63 6f 75 6e 74 65 72 2c 20 74 68 65 6e 20 61   counter, then a
1a750 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  n SQLITE_SCHEMA 
1a760 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 20  error is raised 
1a770 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  and execution.**
1a780 20 68 61 6c 74 73 2e 20 20 54 68 65 20 73 71 6c   halts.  The sql
1a790 69 74 65 33 5f 73 74 65 70 28 29 20 77 72 61 70  ite3_step() wrap
1a7a0 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  per function mig
1a7b0 68 74 20 74 68 65 6e 20 72 65 70 72 65 70 61 72  ht then reprepar
1a7c0 65 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  e the.** stateme
1a7d0 6e 74 20 61 6e 64 20 72 65 72 75 6e 20 69 74 20  nt and rerun it 
1a7e0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
1a7f0 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  ng..*/.case OP_T
1a800 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20  ransaction: {.  
1a810 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
1a820 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
1a830 47 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Gen;..  assert( 
1a840 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
1a850 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
1a860 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d  dOnly==0 || pOp-
1a870 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p2==0 );.  asse
1a880 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1a890 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
1a8a0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
1a8b0 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1a8c0 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29  eeMask, pOp->p1)
1a8d0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
1a8e0 32 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  2 && (db->flags 
1a8f0 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e  & SQLITE_QueryOn
1a900 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ly)!=0 ){.    rc
1a910 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a920 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  LY;.    goto abo
1a930 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1a940 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d  .  }.  pBt = db-
1a950 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
1a960 74 3b 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b  t;..  if( pBt ){
1a970 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a980 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1a990 28 70 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a  (pBt, pOp->p2);.
1a9a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1a9b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  ==SQLITE_BUSY_SN
1a9c0 41 50 53 48 4f 54 20 29 3b 0a 20 20 20 20 74 65  APSHOT );.    te
1a9d0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
1a9e0 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
1a9f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1aa00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aa10 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
1aa20 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
1aa30 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  .        p->pc =
1aa40 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
1aa50 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  );.        p->rc
1aa60 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 67   = rc;.        g
1aa70 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
1aa80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1aa90 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1aaa0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20  _error;.    }.. 
1aab0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26     if( pOp->p2 &
1aac0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
1aad0 72 6e 61 6c 20 0a 20 20 20 20 20 26 26 20 28 64  rnal .     && (d
1aae0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
1aaf0 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   || db->nVdbeRea
1ab00 64 3e 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  d>1) .    ){.   
1ab10 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1ab20 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
1ab30 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
1ab40 66 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  f( p->iStatement
1ab50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1ab60 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
1ab70 65 6d 65 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e  ement>=0 && db->
1ab80 6e 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b  nSavepoint>=0 );
1ab90 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74  .        db->nSt
1aba0 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20  atement++; .    
1abb0 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
1abc0 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  t = db->nSavepoi
1abd0 6e 74 20 2b 20 64 62 2d 3e 6e 53 74 61 74 65 6d  nt + db->nStatem
1abe0 65 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ent;.      }..  
1abf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ac00 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
1ac10 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  , SAVEPOINT_BEGI
1ac20 4e 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  N, p->iStatement
1ac30 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
1ac40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ac50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ac60 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1ac70 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53 74 61 74  mt(pBt, p->iStat
1ac80 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ement);.      }.
1ac90 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  .      /* Store 
1aca0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1acb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1acc0 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
1acd0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ed constraint.  
1ace0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20      ** counter. 
1acf0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1ad00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
1ad10 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1ad20 62 61 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74  back,.      ** t
1ad30 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  he value of this
1ad40 20 63 6f 75 6e 74 65 72 20 6e 65 65 64 73 20 74   counter needs t
1ad50 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  o be restored to
1ad60 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  o.  */.      p->
1ad70 6e 53 74 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64  nStmtDefCons = d
1ad80 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
1ad90 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  ;.      p->nStmt
1ada0 44 65 66 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d  DefImmCons = db-
1adb0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
1adc0 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
1add0 20 47 61 74 68 65 72 20 74 68 65 20 73 63 68 65   Gather the sche
1ade0 6d 61 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  ma version numbe
1adf0 72 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 3a 0a  r for checking:.
1ae00 20 20 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54      ** IMPLEMENT
1ae10 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 33 31 38  ATION-OF: R-0318
1ae20 39 2d 35 31 31 33 35 20 41 73 20 65 61 63 68 20  9-51135 As each 
1ae30 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 72 75  SQL statement ru
1ae40 6e 73 2c 20 74 68 65 20 73 63 68 65 6d 61 0a 20  ns, the schema. 
1ae50 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 69 73     ** version is
1ae60 20 63 68 65 63 6b 65 64 20 74 6f 20 65 6e 73 75   checked to ensu
1ae70 72 65 20 74 68 61 74 20 74 68 65 20 73 63 68 65  re that the sche
1ae80 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
1ae90 65 64 20 73 69 6e 63 65 20 74 68 65 0a 20 20 20  ed since the.   
1aea0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1aeb0 74 20 77 61 73 20 70 72 65 70 61 72 65 64 2e 0a  t was prepared..
1aec0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1aed0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
1aee0 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
1aef0 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
1af00 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 47  )&iMeta);.    iG
1af10 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  en = db->aDb[pOp
1af20 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  ->p1].pSchema->i
1af30 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65  Generation;.  }e
1af40 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20  lse{.    iGen = 
1af50 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  iMeta = 0;.  }. 
1af60 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
1af70 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  ==0 || pOp->p4ty
1af80 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
1af90 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 26    if( pOp->p5 &&
1afa0 20 28 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 33   (iMeta!=pOp->p3
1afb0 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70   || iGen!=pOp->p
1afc0 34 2e 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  4.i) ){.    sqli
1afd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
1afe0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
1aff0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
1b000 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1b010 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
1b020 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b 0a   has changed");.
1b030 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63      /* If the sc
1b040 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d  hema-cookie from
1b050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b060 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  le matches the c
1b070 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 74  ookie .    ** st
1b080 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69 6e  ored with the in
1b090 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
1b0a0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  tation of the sc
1b0b0 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  hema, do.    ** 
1b0c0 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 73  not reload the s
1b0d0 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 64  chema from the d
1b0e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1b0f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76    **.    ** If v
1b100 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 72  irtual-tables ar
1b110 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 69  e in use, this i
1b120 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70  s not just an op
1b130 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
1b140 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c  ** Often, v-tabl
1b150 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 64  es store their d
1b160 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 4c  ata in other SQL
1b170 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 63  ite tables, whic
1b180 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 65  h.    ** are que
1b190 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ried from within
1b1a0 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 68   xNext() and oth
1b1b0 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f  er v-table metho
1b1c0 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ds using.    ** 
1b1d0 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65 73  prepared queries
1b1e0 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65 72  . If such a quer
1b1f0 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65  y is out-of-date
1b200 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  , we do not want
1b210 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   to.    ** disca
1b220 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rd the database 
1b230 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 75  schema, as the u
1b240 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  ser code impleme
1b250 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  nting the.    **
1b260 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 68   v-table would h
1b270 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 20  ave to be ready 
1b280 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f  for the sqlite3_
1b290 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 69  vtab structure i
1b2a0 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20  tself.    ** to 
1b2b0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  be invalidated w
1b2c0 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 5f  henever sqlite3_
1b2d0 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 64  step() is called
1b2e0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20   from within .  
1b2f0 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d    ** a v-table m
1b300 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ethod..    */.  
1b310 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f    if( db->aDb[pO
1b320 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
1b330 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69  schema_cookie!=i
1b340 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71  Meta ){.      sq
1b350 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
1b360 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29  ema(db, pOp->p1)
1b370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 65  ;.    }.    p->e
1b380 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  xpired = 1;.    
1b390 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
1b3a0 4d 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  MA;.  }.  if( rc
1b3b0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1b3c0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
1b3d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1b3e0 65 3a 20 52 65 61 64 43 6f 6f 6b 69 65 20 50 31  e: ReadCookie P1
1b3f0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
1b400 20 52 65 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d   Read cookie num
1b410 62 65 72 20 50 33 20 66 72 6f 6d 20 64 61 74 61  ber P3 from data
1b420 62 61 73 65 20 50 31 20 61 6e 64 20 77 72 69 74  base P1 and writ
1b430 65 20 69 74 20 69 6e 74 6f 20 72 65 67 69 73 74  e it into regist
1b440 65 72 20 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20  er P2..** P3==1 
1b450 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  is the schema ve
1b460 72 73 69 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73  rsion.  P3==2 is
1b470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
1b480 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69  rmat..** P3==3 i
1b490 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  s the recommende
1b4a0 64 20 70 61 67 65 72 20 63 61 63 68 65 20 73 69  d pager cache si
1b4b0 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ze, and so forth
1b4c0 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74  .  P1==0 is.** t
1b4d0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1b4e0 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20   file and P1==1 
1b4f0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1b500 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f  file used to sto
1b510 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
1b520 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
1b530 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 72 65  ere must be a re
1b540 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1b550 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1b560 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1b570 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b580 20 6f 72 20 74 68 65 72 65 20 6d 75 73 74 20 62   or there must b
1b590 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
1b5a0 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63  ) before.** exec
1b5b0 75 74 69 6e 67 20 74 68 69 73 20 69 6e 73 74 72  uting this instr
1b5c0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
1b5d0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b  OP_ReadCookie: {
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5f0 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
1b600 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62  iMeta;.  int iDb
1b610 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b  ;.  int iCookie;
1b620 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
1b630 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 69 44  IsReader );.  iD
1b640 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  b = pOp->p1;.  i
1b650 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33  Cookie = pOp->p3
1b660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b670 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p3<SQLITE_N_BTR
1b680 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
1b690 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1b6a0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1b6b0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1b6c0 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
1b6d0 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1b6e0 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1b6f0 2c 20 69 44 62 29 20 29 3b 0a 0a 20 20 73 71 6c  , iDb) );..  sql
1b700 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
1b710 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
1b720 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32  t, iCookie, (u32
1b730 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f   *)&iMeta);.  pO
1b740 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
1b750 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
1b760 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61  Out->u.i = iMeta
1b770 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1b780 20 4f 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b   Opcode: SetCook
1b790 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ie P1 P2 P3 * *.
1b7a0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
1b7b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 33  integer value P3
1b7c0 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d   into cookie num
1b7d0 62 65 72 20 50 32 20 6f 66 20 64 61 74 61 62 61  ber P2 of databa
1b7e0 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20  se P1..** P2==1 
1b7f0 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  is the schema ve
1b800 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 32 20 69 73  rsion.  P2==2 is
1b810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
1b820 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69  rmat..** P2==3 i
1b830 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  s the recommende
1b840 64 20 70 61 67 65 72 20 63 61 63 68 65 20 0a 2a  d pager cache .*
1b850 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66  * size, and so f
1b860 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 20  orth.  P1==0 is 
1b870 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b880 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31  e file and P1==1
1b890 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   is the .** data
1b8a0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74  base file used t
1b8b0 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72  o store temporar
1b8c0 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  y tables..**.** 
1b8d0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
1b8e0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1b8f0 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20 74  fore executing t
1b900 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  his opcode..*/.c
1b910 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  ase OP_SetCookie
1b920 3a 20 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  : {.  Db *pDb;. 
1b930 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
1b940 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  <SQLITE_N_BTREE_
1b950 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74  META );.  assert
1b960 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1b970 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
1b980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
1b990 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
1b9a0 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29  Mask, pOp->p1) )
1b9b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
1b9c0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
1b9d0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
1b9e0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1b9f0 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29  t( pDb->pBt!=0 )
1ba00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ba10 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1ba20 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
1ba30 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65 65 20 6e  0) );.  /* See n
1ba40 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65 78 20  ote about index 
1ba50 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52  shifting on OP_R
1ba60 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72  eadCookie */.  r
1ba70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ba80 55 70 64 61 74 65 4d 65 74 61 28 70 44 62 2d 3e  UpdateMeta(pDb->
1ba90 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  pBt, pOp->p2, pO
1baa0 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20 70 4f  p->p3);.  if( pO
1bab0 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43 48  p->p2==BTREE_SCH
1bac0 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20  EMA_VERSION ){. 
1bad0 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 73     /* When the s
1bae0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61  chema cookie cha
1baf0 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68 65  nges, record the
1bb00 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65   new cookie inte
1bb10 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44  rnally */.    pD
1bb20 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b->pSchema->sche
1bb30 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d  ma_cookie = pOp-
1bb40 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  >p3;.    db->mDb
1bb50 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
1bb60 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
1bb70 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
1bb80 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  2==BTREE_FILE_FO
1bb90 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52  RMAT ){.    /* R
1bba0 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e  ecord changes in
1bbb0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
1bbc0 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
1bbd0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1bbe0 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d  t = pOp->p3;.  }
1bbf0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
1bc00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61  1 ){.    /* Inva
1bc10 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61  lidate all prepa
1bc20 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77  red statements w
1bc30 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50  henever the TEMP
1bc40 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1bc50 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67   schema is chang
1bc60 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34  ed.  Ticket #164
1bc70 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  4 */.    sqlite3
1bc80 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
1bc90 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
1bca0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
1bcb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
1bcc0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1bcd0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
1bce0 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  k;.}..#ifdef SQL
1bcf0 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
1bd00 4f 4e 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 72  ON./* Opcode: Fr
1bd10 65 65 6c 69 73 74 46 6d 74 20 50 31 20 50 32 20  eelistFmt P1 P2 
1bd20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 61 72  P3 * *.**.** Par
1bd30 61 6d 65 74 65 72 20 50 33 20 6d 75 73 74 20 62  ameter P3 must b
1bd40 65 20 30 2c 20 31 20 6f 72 20 32 2e 20 49 66 20  e 0, 1 or 2. If 
1bd50 69 74 20 69 73 20 6e 6f 74 20 30 2c 20 61 74 74  it is not 0, att
1bd60 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 0a  empt to set the.
1bd70 2a 2a 20 66 72 65 65 6c 69 73 74 20 66 6f 72 6d  ** freelist form
1bd80 61 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  at of database P
1bd90 31 20 74 6f 20 66 6f 72 6d 61 74 20 31 20 6f 72  1 to format 1 or
1bda0 20 66 6f 72 6d 61 74 20 32 2e 20 42 65 66 6f 72   format 2. Befor
1bdb0 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20  e.** returning, 
1bdc0 73 74 6f 72 65 20 74 68 65 20 66 69 6e 61 6c 20  store the final 
1bdd0 66 72 65 65 6c 69 73 74 20 66 6f 72 6d 61 74 20  freelist format 
1bde0 28 65 69 74 68 65 72 20 31 20 6f 72 20 32 29 20  (either 1 or 2) 
1bdf0 6f 66 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  of .** database 
1be00 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
1be10 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
1be20 46 72 65 65 6c 69 73 74 46 6d 74 3a 20 7b 20 20  FreelistFmt: {  
1be30 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 44 62 20  /* out2 */.  Db 
1be40 2a 70 44 62 3b 0a 20 20 69 6e 74 20 69 56 61 6c  *pDb;.  int iVal
1be50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
1be60 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1be70 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
1be80 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
1be90 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
1bea0 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61   pOp->p1) );.  a
1beb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1bec0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1bed0 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b  , pOp->p1, 0) );
1bee0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
1bef0 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
1bf00 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
1bf10 30 20 29 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f  0 );..  pOut = o
1bf20 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
1bf30 20 70 4f 70 29 3b 0a 20 20 72 63 20 3d 20 73 71   pOp);.  rc = sq
1bf40 6c 69 74 65 33 42 74 72 65 65 46 72 65 65 6c 69  lite3BtreeFreeli
1bf50 73 74 46 6f 72 6d 61 74 28 70 44 62 2d 3e 70 42  stFormat(pDb->pB
1bf60 74 2c 20 70 4f 70 2d 3e 70 33 2c 20 26 69 56 61  t, pOp->p3, &iVa
1bf70 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  l);.  if( rc ) g
1bf80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1bf90 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e  _error;.  pOut->
1bfa0 75 2e 69 20 3d 20 69 56 61 6c 3b 0a 0a 20 20 62  u.i = iVal;..  b
1bfb0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
1bfc0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52  /* Opcode: OpenR
1bfd0 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ead P1 P2 P3 P4 
1bfe0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1bff0 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1c000 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
1c010 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72  -only cursor for
1c020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
1c030 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
1c040 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20  age is.** P2 in 
1c050 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
1c060 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1c070 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ile is determine
1c080 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d  d by P3. .** P3=
1c090 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  =0 means the mai
1c0a0 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d  n database, P3==
1c0b0 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  1 means the data
1c0c0 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a  base used for .*
1c0d0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1c0e0 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61  es, and P3>1 mea
1c0f0 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72 72  ns used the corr
1c100 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68  esponding attach
1c110 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  ed.** database. 
1c120 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63 75   Give the new cu
1c130 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69  rsor an identifi
1c140 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50  er of P1.  The P
1c150 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64  1.** values need
1c160 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f   not be contiguo
1c170 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61  us but all P1 va
1c180 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  lues should be s
1c190 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a  mall integers..*
1c1a0 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
1c1b0 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65   for P1 to be ne
1c1c0 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  gative..**.** If
1c1d0 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20   P5!=0 then use 
1c1e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
1c1f0 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74 68  egister P2 as th
1c200 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74  e root page, not
1c210 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c220 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a   P2 itself..**.*
1c230 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20  * There will be 
1c240 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
1c250 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  he database when
1c260 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ever there is an
1c270 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e  .** open cursor.
1c280 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1c290 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70  e was unlocked p
1c2a0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73  rior to this ins
1c2b0 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e  truction.** then
1c2c0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
1c2d0 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72 74  acquired as part
1c2e0 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   of this instruc
1c2f0 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a  tion.  A read.**
1c300 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68   lock allows oth
1c310 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20  er processes to 
1c320 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1c330 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a  e but prohibits.
1c340 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  ** any other pro
1c350 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79  cess from modify
1c360 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1c370 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1c380 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20   is.** released 
1c390 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  when all cursors
1c3a0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66   are closed.  If
1c3b0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1c3c0 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  n attempts.** to
1c3d0 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b   get a read lock
1c3e0 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20   but fails, the 
1c3f0 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65  script terminate
1c400 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  s with an.** SQL
1c410 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63  ITE_BUSY error c
1c420 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ode..**.** The P
1c430 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65  4 value may be e
1c440 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1c450 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61   (P4_INT32) or a
1c460 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61   pointer to.** a
1c470 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1c480 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e  re (P4_KEYINFO).
1c490 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e   If it is a poin
1c4a0 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
1c4b0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20   .** structure, 
1c4c0 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63 74  then said struct
1c4d0 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20  ure defines the 
1c4e0 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c  content and coll
1c4f0 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e  ating .** sequen
1c500 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ce of the index 
1c510 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74  being opened. Ot
1c520 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20 69  herwise, if P4 i
1c530 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a  s an integer .**
1c540 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65   value, it is se
1c550 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1c560 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1c570 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  e table..**.** S
1c580 65 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69  ee also: OpenWri
1c590 74 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f  te, ReopenIdx.*/
1c5a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70  ./* Opcode: Reop
1c5b0 65 6e 49 64 78 20 50 31 20 50 32 20 50 33 20 50  enIdx P1 P2 P3 P
1c5c0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
1c5d0 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33  : root=P2 iDb=P3
1c5e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65  .**.** The Reope
1c5f0 6e 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b  nIdx opcode work
1c600 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 52  s exactly like R
1c610 65 61 64 4f 70 65 6e 20 65 78 63 65 70 74 20 74  eadOpen except t
1c620 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20  hat it first.** 
1c630 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1c640 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50   the cursor on P
1c650 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  1 is already ope
1c660 6e 20 77 69 74 68 20 61 20 72 6f 6f 74 20 70 61  n with a root pa
1c670 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  ge.** number of 
1c680 50 32 20 61 6e 64 20 69 66 20 69 74 20 69 73 20  P2 and if it is 
1c690 74 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f  this opcode beco
1c6a0 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e  mes a no-op.  In
1c6b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
1c6c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1c6d0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
1c6e0 64 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74  do not reopen it
1c6f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70  ..**.** The Reop
1c700 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79  enIdx opcode may
1c710 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
1c720 74 68 20 50 35 3d 3d 30 20 61 6e 64 20 77 69 74  th P5==0 and wit
1c730 68 20 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61 20  h P4 being.** a 
1c740 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63  P4_KEYINFO objec
1c750 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  t.  Furthermore,
1c760 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75   the P3 value mu
1c770 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
1c780 73 0a 2a 2a 20 65 76 65 72 79 20 6f 74 68 65 72  s.** every other
1c790 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70   ReopenIdx or Op
1c7a0 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20 73  enRead for the s
1c7b0 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
1c7c0 72 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  r..**.** See the
1c7d0 20 4f 70 65 6e 52 65 61 64 20 6f 70 63 6f 64 65   OpenRead opcode
1c7e0 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
1c7f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1c800 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
1c810 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
1c820 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
1c830 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
1c840 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a  oot=P2 iDb=P3.**
1c850 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f  .** Open a read/
1c860 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d  write cursor nam
1c870 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62  ed P1 on the tab
1c880 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
1c890 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
1c8a0 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21  s P2.  Or if P5!
1c8b0 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  =0 use the conte
1c8c0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1c8d0 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  2 to find the.**
1c8e0 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a   root page..**.*
1c8f0 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1c900 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1c910 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1c920 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1c930 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1c940 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1c950 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1c960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c970 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
1c980 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
1c990 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1c9a0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
1c9b0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
1c9c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1c9d0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
1c9e0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1c9f0 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1ca00 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
1ca10 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1ca20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1ca30 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s in the table, 
1ca40 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72  or to the.** lar
1ca50 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e  gest index of an
1ca60 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
1ca70 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61 63  table that is ac
1ca80 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a  tually used..**.
1ca90 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
1caa0 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ion works just l
1cab0 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63  ike OpenRead exc
1cac0 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e  ept that it open
1cad0 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  s the cursor.** 
1cae0 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f  in read/write mo
1caf0 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e  de.  For a given
1cb00 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61   table, there ca
1cb10 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  n be one or more
1cb20 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1cb30 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c  rsors or a singl
1cb40 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  e read/write cur
1cb50 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  sor but not both
1cb60 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1cb70 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61   OpenRead..*/.ca
1cb80 73 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a  se OP_ReopenIdx:
1cb90 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b   {.  int nField;
1cba0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1cbb0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a  Info;.  int p2;.
1cbc0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
1cbd0 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65   wrFlag;.  Btree
1cbe0 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73   *pX;.  VdbeCurs
1cbf0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a  or *pCur;.  Db *
1cc00 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
1cc10 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
1cc20 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45  p->p5==OPFLAG_SE
1cc30 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74  EKEQ );.  assert
1cc40 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1cc50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70  4_KEYINFO );.  p
1cc60 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
1cc70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
1cc80 43 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e  Cur && pCur->pgn
1cc90 6f 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d  oRoot==(u32)pOp-
1cca0 3e 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >p2 ){.    asser
1ccb0 74 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f  t( pCur->iDb==pO
1ccc0 70 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a  p->p3 );      /*
1ccd0 20 47 75 61 72 61 6e 74 65 65 64 20 62 79 20 74   Guaranteed by t
1cce0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1ccf0 72 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70  r */.    goto op
1cd00 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69  en_cursor_set_hi
1cd10 6e 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  nts;.  }.  /* If
1cd20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1cd30 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
1cd40 6e 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  n or is open on 
1cd50 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
1cd60 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c   index, then fal
1cd70 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
1cd80 50 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f  P_OpenRead to fo
1cd90 72 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a  rce a reopen */.
1cda0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64  case OP_OpenRead
1cdb0 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72  :.case OP_OpenWr
1cdc0 69 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20  ite:..  assert( 
1cdd0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1cde0 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70  OpenWrite || pOp
1cdf0 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  ->p5==0 || pOp->
1ce00 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45  p5==OPFLAG_SEEKE
1ce10 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Q );.  assert( p
1ce20 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
1ce30 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
1ce40 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61  code==OP_OpenRea
1ce50 64 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  d || pOp->opcode
1ce60 3d 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20  ==OP_ReopenIdx. 
1ce70 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
1ce80 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20  eadOnly==0 );.. 
1ce90 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20   if( p->expired 
1cea0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1ceb0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
1cec0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  K;.    goto abor
1ced0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1cee0 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20    }..  nField = 
1cef0 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  0;.  pKeyInfo = 
1cf00 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70  0;.  p2 = pOp->p
1cf10 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e  2;.  iDb = pOp->
1cf20 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  p3;.  assert( iD
1cf30 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1cf40 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
1cf50 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
1cf60 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29  treeMask, iDb) )
1cf70 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
1cf80 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20  Db[iDb];.  pX = 
1cf90 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  pDb->pBt;.  asse
1cfa0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69  rt( pX!=0 );.  i
1cfb0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
1cfc0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a  OP_OpenWrite ){.
1cfd0 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c      assert( OPFL
1cfe0 41 47 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42 54  AG_FORDELETE==BT
1cff0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 29 3b  REE_FORDELETE );
1d000 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 42 54  .    wrFlag = BT
1d010 52 45 45 5f 57 52 43 53 52 20 7c 20 28 70 4f 70  REE_WRCSR | (pOp
1d020 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 46 4f  ->p5 & OPFLAG_FO
1d030 52 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 61 73  RDELETE);.    as
1d040 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1d050 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1d060 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
1d070 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
1d080 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20  ->file_format < 
1d090 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
1d0a0 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70  ormat ){.      p
1d0b0 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
1d0c0 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68  rmat = pDb->pSch
1d0d0 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
1d0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1d0f0 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b  .    wrFlag = 0;
1d100 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1d110 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32 49 53  p5 & OPFLAG_P2IS
1d120 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72  REG ){.    asser
1d130 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61  t( p2>0 );.    a
1d140 73 73 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e 6e  ssert( p2<=(p->n
1d150 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
1d160 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 32 20  or) );.    pIn2 
1d170 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20  = &aMem[p2];.   
1d180 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
1d190 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20  lid(pIn2) );.   
1d1a0 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
1d1b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1d1c0 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
1d1d0 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
1d1e0 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70  ify(pIn2);.    p
1d1f0 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75  2 = (int)pIn2->u
1d200 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  .i;.    /* The p
1d210 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63  2 value always c
1d220 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f  omes from a prio
1d230 72 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  r OP_CreateBtree
1d240 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20   opcode and.    
1d250 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77  ** that opcode w
1d260 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74  ill always set t
1d270 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32  he p2 value to 2
1d280 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65   or more or else
1d290 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66   fail..    ** If
1d2a0 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66 61   there were a fa
1d2b0 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70 61  ilure, the prepa
1d2c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f  red statement wo
1d2d0 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a  uld have halted.
1d2e0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65      ** before re
1d2f0 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74  aching this inst
1d300 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ruction. */.    
1d310 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20 29 3b  assert( p2>=2 );
1d320 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1d330 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e  p4type==P4_KEYIN
1d340 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e  FO ){.    pKeyIn
1d350 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
1d360 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72  yInfo;.    asser
1d370 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  t( pKeyInfo->enc
1d380 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20  ==ENC(db) );.   
1d390 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1d3a0 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20  o->db==db );.   
1d3b0 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
1d3c0 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3b 0a 20  fo->nAllField;. 
1d3d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1d3e0 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1d3f0 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d   ){.    nField =
1d400 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d 0a   pOp->p4.i;.  }.
1d410 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1d420 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1d430 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a 20  ( nField>=0 );. 
1d440 20 74 65 73 74 63 61 73 65 28 20 6e 46 69 65 6c   testcase( nFiel
1d450 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62 6c  d==0 );  /* Tabl
1d460 65 20 77 69 74 68 20 49 4e 54 45 47 45 52 20 50  e with INTEGER P
1d470 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 6e  RIMARY KEY and n
1d480 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20  othing else */. 
1d490 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65   pCur = allocate
1d4a0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1d4b0 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20  1, nField, iDb, 
1d4c0 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a  CURTYPE_BTREE);.
1d4d0 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
1d4e0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1d4f0 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  Cur->nullRow = 1
1d500 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65  ;.  pCur->isOrde
1d510 72 65 64 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d  red = 1;.  pCur-
1d520 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b 0a  >pgnoRoot = p2;.
1d530 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d540 42 55 47 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  BUG.  pCur->wrFl
1d550 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23 65 6e  ag = wrFlag;.#en
1d560 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  dif.  rc = sqlit
1d570 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 58  e3BtreeCursor(pX
1d580 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70 4b  , p2, wrFlag, pK
1d590 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 75 63  eyInfo, pCur->uc
1d5a0 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75  .pCursor);.  pCu
1d5b0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
1d5c0 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74  eyInfo;.  /* Set
1d5d0 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e   the VdbeCursor.
1d5e0 69 73 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65  isTable variable
1d5f0 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  . Previous versi
1d600 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69  ons of.  ** SQLi
1d610 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  te used to check
1d620 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   if the root-pag
1d630 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e  e flags were san
1d640 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a  e at this point.
1d650 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20    ** and report 
1d660 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1d670 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65  ion if they were
1d680 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63   not, but this c
1d690 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69  heck has.  ** si
1d6a0 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  nce moved into t
1d6b0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20  he btree layer. 
1d6c0 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73   */  .  pCur->is
1d6d0 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74  Table = pOp->p4t
1d6e0 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b  ype!=P4_KEYINFO;
1d6f0 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65  ..open_cursor_se
1d700 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73 65 72  t_hints:.  asser
1d710 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  t( OPFLAG_BULKCS
1d720 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  R==BTREE_BULKLOA
1d730 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  D );.  assert( O
1d740 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54  PFLAG_SEEKEQ==BT
1d750 52 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20  REE_SEEK_EQ );. 
1d760 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
1d770 70 35 20 26 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  p5 & OPFLAG_BULK
1d780 43 53 52 20 29 3b 0a 23 69 66 64 65 66 20 53 51  CSR );.#ifdef SQ
1d790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
1d7a0 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65 73 74 63  OR_HINTS.  testc
1d7b0 61 73 65 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f  ase( pOp->p2 & O
1d7c0 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a  PFLAG_SEEKEQ );.
1d7d0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1d7e0 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46  BtreeCursorHintF
1d7f0 6c 61 67 73 28 70 43 75 72 2d 3e 75 63 2e 70 43  lags(pCur->uc.pC
1d800 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ursor,.         
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
1d830 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52   (OPFLAG_BULKCSR
1d840 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 29  |OPFLAG_SEEKEQ))
1d850 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
1d860 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1d870 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
1d880 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  }../* Opcode: Op
1d890 65 6e 44 75 70 20 50 31 20 50 32 20 2a 20 2a 20  enDup P1 P2 * * 
1d8a0 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
1d8b0 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 68 61  ew cursor P1 tha
1d8c0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1d8d0 73 61 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 74  same ephemeral t
1d8e0 61 62 6c 65 20 61 73 0a 2a 2a 20 63 75 72 73 6f  able as.** curso
1d8f0 72 20 50 32 2e 20 20 54 68 65 20 50 32 20 63 75  r P2.  The P2 cu
1d900 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1d910 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20  een opened by a 
1d920 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1d930 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70 63 6f 64 65  emeral.** opcode
1d940 2e 20 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72 61  .  Only ephemera
1d950 6c 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65  l cursors may be
1d960 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
1d970 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 65 70 68  ** Duplicate eph
1d980 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20 61  emeral cursors a
1d990 72 65 20 75 73 65 64 20 66 6f 72 20 73 65 6c 66  re used for self
1d9a0 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61 74 65 72 69  -joins of materi
1d9b0 61 6c 69 7a 65 64 20 76 69 65 77 73 2e 0a 2a 2f  alized views..*/
1d9c0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 44 75 70  .case OP_OpenDup
1d9d0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1d9e0 20 2a 70 4f 72 69 67 3b 20 20 20 20 2f 2a 20 54   *pOrig;    /* T
1d9f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 75 72 73  he original curs
1da00 6f 72 20 74 6f 20 62 65 20 64 75 70 6c 69 63 61  or to be duplica
1da10 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ted */.  VdbeCur
1da20 73 6f 72 20 2a 70 43 78 3b 20 20 20 20 20 20 2f  sor *pCx;      /
1da30 2a 20 54 68 65 20 6e 65 77 20 63 75 72 73 6f 72  * The new cursor
1da40 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d 20 70   */..  pOrig = p
1da50 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 32 5d  ->apCsr[pOp->p2]
1da60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
1da70 67 2d 3e 70 42 74 78 21 3d 30 20 29 3b 20 20 2f  g->pBtx!=0 );  /
1da80 2a 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72 61 6c  * Only ephemeral
1da90 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62 65 20   cursors can be 
1daa0 64 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 0a 20  duplicated */.. 
1dab0 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1dac0 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1dad0 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64 2c  , pOrig->nField,
1dae0 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54 52   -1, CURTYPE_BTR
1daf0 45 45 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d  EE);.  if( pCx==
1db00 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1db10 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20  .  pCx->nullRow 
1db20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 45 70  = 1;.  pCx->isEp
1db30 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20 20 70  hemeral = 1;.  p
1db40 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  Cx->pKeyInfo = p
1db50 4f 72 69 67 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Orig->pKeyInfo;.
1db60 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d    pCx->isTable =
1db70 20 70 4f 72 69 67 2d 3e 69 73 54 61 62 6c 65 3b   pOrig->isTable;
1db80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1db90 74 72 65 65 43 75 72 73 6f 72 28 70 4f 72 69 67  treeCursor(pOrig
1dba0 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52  ->pBtx, MASTER_R
1dbb0 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
1dbc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 78 2d              pCx-
1dbe0 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78 2d 3e  >pKeyInfo, pCx->
1dbf0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 2f  uc.pCursor);.  /
1dc00 2a 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72  * The sqlite3Btr
1dc10 65 65 43 75 72 73 6f 72 28 29 20 72 6f 75 74 69  eeCursor() routi
1dc20 6e 65 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c  ne can only fail
1dc30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
1dc40 75 72 73 6f 72 0a 20 20 2a 2a 20 6f 70 65 6e 65  ursor.  ** opene
1dc50 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
1dc60 2e 20 20 53 69 6e 63 65 20 74 68 65 72 65 20 69  .  Since there i
1dc70 73 20 61 6c 72 65 61 64 79 20 61 6e 20 6f 70 65  s already an ope
1dc80 6e 20 63 75 72 73 6f 72 20 77 68 65 6e 20 74 68  n cursor when th
1dc90 69 73 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69  is.  ** opcode i
1dca0 73 20 72 75 6e 2c 20 74 68 65 20 73 71 6c 69 74  s run, the sqlit
1dcb0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20  e3BtreeCursor() 
1dcc0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
1dcd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1dce0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 62 72 65 61  ITE_OK );.  brea
1dcf0 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
1dd00 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  : OpenEphemeral 
1dd10 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a  P1 P2 * P4 P5.**
1dd20 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75   Synopsis: nColu
1dd30 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  mn=P2.**.** Open
1dd40 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31   a new cursor P1
1dd50 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
1dd60 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75  table..** The cu
1dd70 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20 6f  rsor is always o
1dd80 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
1dd90 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65   even if .** the
1dda0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
1ddb0 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  s read-only.  Th
1ddc0 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
1ddd0 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  able is deleted 
1dde0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1ddf0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1de00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50   closed..**.** P
1de10 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
1de20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1de30 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
1de40 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
1de50 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72   points to a BTr
1de60 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d  ee table if P4==
1de70 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65  0 and to a BTree
1de80 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20   index.** if P4 
1de90 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34  is not 0.  If P4
1dea0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
1deb0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
1dec0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
1ded0 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  * that defines t
1dee0 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79  he format of key
1def0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1df00 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72  **.** The P5 par
1df10 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 61 20  ameter can be a 
1df20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45  mask of the BTRE
1df30 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
1df40 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e  d.** in btree.h.
1df50 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f    These flags co
1df60 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66  ntrol aspects of
1df70 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
1df80 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20  f.** the btree. 
1df90 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f   The BTREE_OMIT_
1dfa0 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45  JOURNAL and BTRE
1dfb0 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61  E_SINGLE flags a
1dfc0 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f  re.** added auto
1dfd0 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a  matically..*/./*
1dfe0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74   Opcode: OpenAut
1dff0 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50  oindex P1 P2 * P
1e000 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1e010 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a   nColumn=P2.**.*
1e020 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
1e030 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  rks the same as 
1e040 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1e050 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a 20 64  .  It has a.** d
1e060 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f  ifferent name to
1e070 20 64 69 73 74 69 6e 67 75 69 73 68 20 69 74 73   distinguish its
1e080 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20 63 72   use.  Tables cr
1e090 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62  eated using.** b
1e0a0 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69  y this opcode wi
1e0b0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
1e0c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1e0d0 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a  ated transient.*
1e0e0 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69  * indices in joi
1e0f0 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ns..*/.case OP_O
1e100 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63  penAutoindex: .c
1e110 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ase OP_OpenEphem
1e120 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75  eral: {.  VdbeCu
1e130 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b 65 79  rsor *pCx;.  Key
1e140 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1e150 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1e160 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a  int vfsFlags = .
1e170 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1e180 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
1e190 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1e1a0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53  CREATE |.      S
1e1b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1e1c0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  SIVE |.      SQL
1e1d0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1e1e0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53  NCLOSE |.      S
1e1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1e200 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73 65 72  IENT_DB;.  asser
1e210 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b  t( pOp->p1>=0 );
1e220 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1e230 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p2>=0 );.  pCx =
1e240 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1e250 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1e260 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59 50 45  >p2, -1, CURTYPE
1e270 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70  _BTREE);.  if( p
1e280 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1e290 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1e2a0 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1e2b0 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b  isEphemeral = 1;
1e2c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1e2d0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1e2e0 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78 2d 3e  s, 0, db, &pCx->
1e2f0 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pBtx, .         
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42                 B
1e310 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
1e320 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  L | BTREE_SINGLE
1e330 20 7c 20 70 4f 70 2d 3e 70 35 2c 20 76 66 73 46   | pOp->p5, vfsF
1e340 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
1e350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e370 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43  reeBeginTrans(pC
1e380 78 2d 3e 70 42 74 78 2c 20 31 29 3b 0a 20 20 7d  x->pBtx, 1);.  }
1e390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
1e3b0 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  f a transient in
1e3c0 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2c  dex is required,
1e3d0 20 63 72 65 61 74 65 20 69 74 20 62 79 20 63 61   create it by ca
1e3e0 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 73 71 6c  lling.    ** sql
1e3f0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1e400 61 62 6c 65 28 29 20 77 69 74 68 20 74 68 65 20  able() with the 
1e410 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 66 6c  BTREE_BLOBKEY fl
1e420 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ag before.    **
1e430 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49 66 20   opening it. If 
1e440 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
1e450 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 6a  e is required, j
1e460 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 20 20  ust use the.    
1e470 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1e480 20 63 72 65 61 74 65 64 20 74 61 62 6c 65 20 77   created table w
1e490 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31 20  ith root-page 1 
1e4a0 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45 59 20  (an BLOB_INTKEY 
1e4b0 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20  table)..    */. 
1e4c0 20 20 20 69 66 28 20 28 70 43 78 2d 3e 70 4b 65     if( (pCx->pKe
1e4d0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1e4e0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
1e4f0 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  nfo)!=0 ){.     
1e500 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
1e510 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1e520 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1e530 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
1e540 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1e550 65 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74 78  eTable(pCx->pBtx
1e560 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45 5f 42  , &pgno, BTREE_B
1e570 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e 70 35  LOBKEY | pOp->p5
1e580 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ); .      if( rc
1e590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e5a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e5b0 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  gno==MASTER_ROOT
1e5c0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
1e5d0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1e5e0 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 20 20  db==db );.      
1e5f0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1e600 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
1e610 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1e620 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1e630 73 6f 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 70  sor(pCx->pBtx, p
1e640 67 6e 6f 2c 20 42 54 52 45 45 5f 57 52 43 53 52  gno, BTREE_WRCSR
1e650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78 2d    pKeyInfo, pCx-
1e680 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
1e690 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78 2d      }.      pCx-
1e6a0 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  >isTable = 0;.  
1e6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e6c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e6d0 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 78  Cursor(pCx->pBtx
1e6e0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 42  , MASTER_ROOT, B
1e6f0 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20 20  TREE_WRCSR,.    
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 78            0, pCx
1e720 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1e730 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c       pCx->isTabl
1e740 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
1e750 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1e760 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1e770 72 6f 72 3b 0a 20 20 70 43 78 2d 3e 69 73 4f 72  ror;.  pCx->isOr
1e780 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e 70 35  dered = (pOp->p5
1e790 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  !=BTREE_UNORDERE
1e7a0 44 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  D);.  break;.}..
1e7b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
1e7c0 72 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20 50  rOpen P1 P2 P3 P
1e7d0 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  4 *.**.** This o
1e7e0 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c 69 6b 65  pcode works like
1e7f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1e800 6c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  l except that it
1e810 20 6f 70 65 6e 73 0a 2a 2a 20 61 20 74 72 61 6e   opens.** a tran
1e820 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74  sient index that
1e830 20 69 73 20 73 70 65 63 69 66 69 63 61 6c 6c 79   is specifically
1e840 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 6f 72   designed to sor
1e850 74 20 6c 61 72 67 65 0a 2a 2a 20 74 61 62 6c 65  t large.** table
1e860 73 20 75 73 69 6e 67 20 61 6e 20 65 78 74 65 72  s using an exter
1e870 6e 61 6c 20 6d 65 72 67 65 2d 73 6f 72 74 20 61  nal merge-sort a
1e880 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20  lgorithm..**.** 
1e890 49 66 20 61 72 67 75 6d 65 6e 74 20 50 33 20 69  If argument P3 i
1e8a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1e8b0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68   it indicates th
1e8c0 61 74 20 74 68 65 20 73 6f 72 74 65 72 20 6d 61  at the sorter ma
1e8d0 79 0a 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74  y.** assume that
1e8e0 20 61 20 73 74 61 62 6c 65 20 73 6f 72 74 20 63   a stable sort c
1e8f0 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 66  onsidering the f
1e900 69 72 73 74 20 50 33 20 66 69 65 6c 64 73 20 6f  irst P3 fields o
1e910 66 20 65 61 63 68 0a 2a 2a 20 6b 65 79 20 69 73  f each.** key is
1e920 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
1e930 72 6f 64 75 63 65 20 74 68 65 20 72 65 71 75 69  roduce the requi
1e940 72 65 64 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  red results..*/.
1e950 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70  case OP_SorterOp
1e960 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  en: {.  VdbeCurs
1e970 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65  or *pCx;..  asse
1e980 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1e990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1e9a0 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p2>=0 );.  pCx 
1e9b0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1e9c0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1e9d0 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p2, -1, CURTYP
1e9e0 45 5f 53 4f 52 54 45 52 29 3b 0a 20 20 69 66 28  E_SORTER);.  if(
1e9f0 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1ea00 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 70 4b  o_mem;.  pCx->pK
1ea10 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
1ea20 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73  .pKeyInfo;.  ass
1ea30 65 72 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 6e  ert( pCx->pKeyIn
1ea40 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1ea50 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b 65  assert( pCx->pKe
1ea60 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28  yInfo->enc==ENC(
1ea70 64 62 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  db) );.  rc = sq
1ea80 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 49  lite3VdbeSorterI
1ea90 6e 69 74 28 64 62 2c 20 70 4f 70 2d 3e 70 33 2c  nit(db, pOp->p3,
1eaa0 20 70 43 78 29 3b 0a 20 20 69 66 28 20 72 63 20   pCx);.  if( rc 
1eab0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1eac0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1ead0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1eae0 3a 20 53 65 71 75 65 6e 63 65 54 65 73 74 20 50  : SequenceTest P
1eaf0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
1eb00 6e 6f 70 73 69 73 3a 20 69 66 28 20 63 75 72 73  nopsis: if( curs
1eb10 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 20 29 20 70  or[P1].ctr++ ) p
1eb20 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20  c = P2.**.** P1 
1eb30 69 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73  is a sorter curs
1eb40 6f 72 2e 20 49 66 20 74 68 65 20 73 65 71 75 65  or. If the seque
1eb50 6e 63 65 20 63 6f 75 6e 74 65 72 20 69 73 20 63  nce counter is c
1eb60 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2c 20 6a  urrently zero, j
1eb70 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 52 65  ump.** to P2. Re
1eb80 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1eb90 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
1eba0 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 69 6e  ump is taken, in
1ebb0 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 74  crement the.** t
1ebc0 68 65 20 73 65 71 75 65 6e 63 65 20 76 61 6c 75  he sequence valu
1ebd0 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  e..*/.case OP_Se
1ebe0 71 75 65 6e 63 65 54 65 73 74 3a 20 7b 0a 20 20  quenceTest: {.  
1ebf0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1ec00 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1ec10 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1ec20 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1ec30 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1ec40 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1ec50 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
1ec60 3b 0a 20 20 69 66 28 20 28 70 43 2d 3e 73 65 71  ;.  if( (pC->seq
1ec70 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20 29 7b 0a 20  Count++)==0 ){. 
1ec80 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
1ec90 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
1eca0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
1ecb0 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20  penPseudo P1 P2 
1ecc0 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
1ecd0 69 73 3a 20 50 33 20 63 6f 6c 75 6d 6e 73 20 69  is: P3 columns i
1ece0 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 4f 70  n r[P2].**.** Op
1ecf0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1ed00 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
1ed10 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68 61 74   fake table that
1ed20 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
1ed30 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74  le.** row of dat
1ed40 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  a.  The content 
1ed50 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20  of that one row 
1ed60 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  is the content o
1ed70 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  f memory.** regi
1ed80 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f 74 68  ster P2.  In oth
1ed90 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f 72  er words, cursor
1eda0 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20 61   P1 becomes an a
1edb0 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a  lias for the .**
1edc0 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e   MEM_Blob conten
1edd0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72  t contained in r
1ede0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
1edf0 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  * A pseudo-table
1ee00 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1ee10 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
1ee20 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65  to hold a single
1ee30 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74 20 66  .** row output f
1ee40 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 73  rom the sorter s
1ee50 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 63  o that the row c
1ee60 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73 65 64  an be decomposed
1ee70 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64   into.** individ
1ee80 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e  ual columns usin
1ee90 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  g the OP_Column 
1eea0 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f  opcode.  The OP_
1eeb0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a  Column opcode.**
1eec0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 75 72   is the only cur
1eed0 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61 74 20  sor opcode that 
1eee0 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70 73 65  works with a pse
1eef0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
1ef00 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P3 is the numbe
1ef10 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
1ef20 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  he records that 
1ef30 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 62  will be stored b
1ef40 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64 6f 2d  y.** the pseudo-
1ef50 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
1ef60 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a  P_OpenPseudo: {.
1ef70 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1ef80 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  x;..  assert( pO
1ef90 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73  p->p1>=0 );.  as
1efa0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30  sert( pOp->p3>=0
1efb0 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f   );.  pCx = allo
1efc0 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1efd0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p1, pOp->p3, 
1efe0 2d 31 2c 20 43 55 52 54 59 50 45 5f 50 53 45 55  -1, CURTYPE_PSEU
1eff0 44 4f 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d  DO);.  if( pCx==
1f000 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1f010 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20  .  pCx->nullRow 
1f020 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 73 65 65 6b  = 1;.  pCx->seek
1f030 52 65 73 75 6c 74 20 3d 20 70 4f 70 2d 3e 70 32  Result = pOp->p2
1f040 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65  ;.  pCx->isTable
1f050 20 3d 20 31 3b 0a 20 20 2f 2a 20 47 69 76 65 20   = 1;.  /* Give 
1f060 74 68 69 73 20 70 73 65 75 64 6f 2d 63 75 72 73  this pseudo-curs
1f070 6f 72 20 61 20 66 61 6b 65 20 42 74 43 75 72 73  or a fake BtCurs
1f080 6f 72 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  or pointer so th
1f090 61 74 20 70 43 78 0a 20 20 2a 2a 20 63 61 6e 20  at pCx.  ** can 
1f0a0 62 65 20 73 61 66 65 6c 79 20 70 61 73 73 65 64  be safely passed
1f0b0 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 43   to sqlite3VdbeC
1f0c0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 20 20  ursorMoveto().  
1f0d0 54 68 69 73 20 61 76 6f 69 64 73 20 61 20 74 65  This avoids a te
1f0e0 73 74 0a 20 20 2a 2a 20 66 6f 72 20 70 43 78 2d  st.  ** for pCx-
1f0f0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
1f100 50 45 5f 42 54 52 45 45 20 69 6e 73 69 64 65 20  PE_BTREE inside 
1f110 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  of sqlite3VdbeCu
1f120 72 73 6f 72 4d 6f 76 65 74 6f 28 29 0a 20 20 2a  rsorMoveto().  *
1f130 2a 20 77 68 69 63 68 20 69 73 20 61 20 70 65 72  * which is a per
1f140 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
1f150 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 43 78 2d 3e  ation */.  pCx->
1f160 75 63 2e 70 43 75 72 73 6f 72 20 3d 20 73 71 6c  uc.pCursor = sql
1f170 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c  ite3BtreeFakeVal
1f180 69 64 43 75 72 73 6f 72 28 29 3b 0a 20 20 61 73  idCursor();.  as
1f190 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30  sert( pOp->p5==0
1f1a0 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   );.  break;.}..
1f1b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65  /* Opcode: Close
1f1c0 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
1f1d0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1f1e0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1f1f0 65 64 20 61 73 20 50 31 2e 20 20 49 66 20 50 31  ed as P1.  If P1
1f200 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65   is not.** curre
1f210 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  ntly open, this 
1f220 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
1f230 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20   no-op..*/.case 
1f240 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73  OP_Close: {.  as
1f250 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1f260 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1f270 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69  Cursor );.  sqli
1f280 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
1f290 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f  r(p, p->apCsr[pO
1f2a0 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70  p->p1]);.  p->ap
1f2b0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30  Csr[pOp->p1] = 0
1f2c0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  ;.  break;.}..#i
1f2d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f2e0 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
1f2f0 41 53 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  ASK./* Opcode: C
1f300 6f 6c 75 6d 6e 73 55 73 65 64 20 50 31 20 2a 20  olumnsUsed P1 * 
1f310 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  * P4 *.**.** Thi
1f320 73 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20  s opcode (which 
1f330 6f 6e 6c 79 20 65 78 69 73 74 73 20 69 66 20 53  only exists if S
1f340 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
1f350 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54  ed with.** SQLIT
1f360 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
1f370 55 53 45 44 5f 4d 41 53 4b 29 20 69 64 65 6e 74  USED_MASK) ident
1f380 69 66 69 65 73 20 77 68 69 63 68 20 63 6f 6c 75  ifies which colu
1f390 6d 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  mns of the.** ta
1f3a0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 6f 72  ble or index for
1f3b0 20 63 75 72 73 6f 72 20 50 31 20 61 72 65 20 75   cursor P1 are u
1f3c0 73 65 64 2e 20 20 50 34 20 69 73 20 61 20 36 34  sed.  P4 is a 64
1f3d0 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
1f3e0 28 50 34 5f 49 4e 54 36 34 29 20 69 6e 20 77 68  (P4_INT64) in wh
1f3f0 69 63 68 20 74 68 65 20 66 69 72 73 74 20 36 33  ich the first 63
1f400 20 62 69 74 73 20 61 72 65 20 6f 6e 65 20 66 6f   bits are one fo
1f410 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
1f420 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
1f430 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  s of the table o
1f440 72 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  r index that are
1f450 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 2a   actually used.*
1f460 2a 20 62 79 20 74 68 65 20 63 75 72 73 6f 72 2e  * by the cursor.
1f470 20 20 54 68 65 20 68 69 67 68 2d 6f 72 64 65 72    The high-order
1f480 20 62 69 74 20 69 73 20 73 65 74 20 69 66 20 61   bit is set if a
1f490 6e 79 20 63 6f 6c 75 6d 6e 20 61 66 74 65 72 0a  ny column after.
1f4a0 2a 2a 20 74 68 65 20 36 34 74 68 20 69 73 20 75  ** the 64th is u
1f4b0 73 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  sed..*/.case OP_
1f4c0 43 6f 6c 75 6d 6e 73 55 73 65 64 3a 20 7b 0a 20  ColumnsUsed: {. 
1f4d0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1f4e0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1f4f0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1f500 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
1f510 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
1f520 20 29 3b 0a 20 20 70 43 2d 3e 6d 61 73 6b 55 73   );.  pC->maskUs
1f530 65 64 20 3d 20 2a 28 75 36 34 2a 29 70 4f 70 2d  ed = *(u64*)pOp-
1f540 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61  >p4.pI64;.  brea
1f550 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
1f560 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 45 20 50  Opcode: SeekGE P
1f570 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
1f580 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1f590 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1f5a0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1f5b0 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1f5c0 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1f5d0 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1f5e0 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1f5f0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1f600 50 33 20 61 73 20 74 68 65 20 6b 65 79 2e 20 20  P3 as the key.  
1f610 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
1f620 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51  ers .** to an SQ
1f630 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33  L index, then P3
1f640 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
1f650 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20   an array of P4 
1f660 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68  registers .** th
1f670 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61  at are used as a
1f680 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
1f690 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70   key. .**.** Rep
1f6a0 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50  osition cursor P
1f6b0 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f  1 so that  it po
1f6c0 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c  ints to the smal
1f6d0 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20  lest entry that 
1f6e0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1f6f0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1f700 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49  the key value. I
1f710 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72  f there are no r
1f720 65 63 6f 72 64 73 20 0a 2a 2a 20 67 72 65 61 74  ecords .** great
1f730 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1f740 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20   to the key and 
1f750 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1f760 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1f770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
1f780 72 73 6f 72 20 50 31 20 77 61 73 20 6f 70 65 6e  rsor P1 was open
1f790 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 46  ed using the OPF
1f7a0 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c 61 67 2c  LAG_SEEKEQ flag,
1f7b0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70   then this.** op
1f7c0 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  code will always
1f7d0 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65 63 6f 72   land on a recor
1f7e0 64 20 74 68 61 74 20 65 71 75 61 6c 6c 79 20 65  d that equally e
1f7f0 71 75 61 6c 73 20 74 68 65 20 6b 65 79 2c 20 6f  quals the key, o
1f800 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d 70 20 69  r.** else jump i
1f810 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
1f820 2e 20 20 57 68 65 6e 20 74 68 65 20 63 75 72 73  .  When the curs
1f830 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f 53 45 45  or is OPFLAG_SEE
1f840 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20 6f 70 63  KEQ, this.** opc
1f850 6f 64 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ode must be foll
1f860 6f 77 65 64 20 62 79 20 61 6e 20 49 64 78 4c 45  owed by an IdxLE
1f870 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68 65   opcode with the
1f880 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 73 2e   same arguments.
1f890 0a 2a 2a 20 54 68 65 20 49 64 78 4c 45 20 6f 70  .** The IdxLE op
1f8a0 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 6b 69  code will be ski
1f8b0 70 70 65 64 20 69 66 20 74 68 69 73 20 6f 70 63  pped if this opc
1f8c0 6f 64 65 20 73 75 63 63 65 65 64 73 2c 20 62 75  ode succeeds, bu
1f8d0 74 20 74 68 65 0a 2a 2a 20 49 64 78 4c 45 20 6f  t the.** IdxLE o
1f8e0 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73  pcode will be us
1f8f0 65 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  ed on subsequent
1f900 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 73   loop iterations
1f910 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
1f920 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
1f930 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
1f940 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77   to move in forw
1f950 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  ard order,.** fr
1f960 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1f970 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e   toward the end.
1f980 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f990 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
1f9a0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
1f9b0 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50   use Next, not P
1f9c0 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  rev..**.** See a
1f9d0 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
1f9e0 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65  ound, SeekLt, Se
1f9f0 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGt, SeekLe.*/.
1fa00 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
1fa10 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  T P1 P2 P3 P4 *.
1fa20 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
1fa30 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
1fa40 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
1fa50 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61  ers to an SQL ta
1fa60 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74  ble (B-Tree that
1fa70 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65   uses integer ke
1fa80 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65  ys), .** use the
1fa90 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1faa0 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20  er P3 as a key. 
1fab0 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
1fac0 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51  ers .** to an SQ
1fad0 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33  L index, then P3
1fae0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
1faf0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20   an array of P4 
1fb00 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68  registers .** th
1fb10 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61  at are used as a
1fb20 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
1fb30 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70   key. .**.** Rep
1fb40 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50  osition cursor P
1fb50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f  1 so that  it po
1fb60 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c  ints to the smal
1fb70 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20  lest entry that 
1fb80 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1fb90 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
1fba0 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  e. If there are 
1fbb0 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65 61 74  no records great
1fbc0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20  er than .** the 
1fbd0 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
1fbe0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
1fbf0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  p to P2..**.** T
1fc00 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
1fc10 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
1fc20 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
1fc30 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  in forward order
1fc40 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65  ,.** from the be
1fc50 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74  ginning toward t
1fc60 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65  he end.  In othe
1fc70 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
1fc80 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
1fc90 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74  ured to use Next
1fca0 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a  , not Prev..**.*
1fcb0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1fcc0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
1fcd0 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65  kLt, SeekGe, See
1fce0 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kLe.*/./* Opcode
1fcf0 3a 20 53 65 65 6b 4c 54 20 50 31 20 50 32 20 50  : SeekLT P1 P2 P
1fd00 33 20 50 34 20 2a 20 0a 2a 2a 20 53 79 6e 6f 70  3 P4 * .** Synop
1fd10 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
1fd20 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ].**.** If curso
1fd30 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61  r P1 refers to a
1fd40 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54  n SQL table (B-T
1fd50 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e  ree that uses in
1fd60 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a  teger keys), .**
1fd70 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
1fd80 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73  n register P3 as
1fd90 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f   a key. If curso
1fda0 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
1fdb0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
1fdc0 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
1fdd0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
1fde0 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
1fdf0 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
1fe00 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
1fe10 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
1fe20 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
1fe30 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
1fe40 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
1fe50 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72  the largest entr
1fe60 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65  y that .** is le
1fe70 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  ss than the key 
1fe80 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
1fe90 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c  are no records l
1fea0 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65  ess than .** the
1feb0 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1fec0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1fed0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1fee0 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
1fef0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
1ff00 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
1ff10 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1ff20 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65  r,.** from the e
1ff30 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65  nd toward the be
1ff40 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68  ginning.  In oth
1ff50 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
1ff60 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
1ff70 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65  gured to use Pre
1ff80 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a  v, not Next..**.
1ff90 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1ffa0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65  nd, NotFound, Se
1ffb0 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekGt, SeekGe, Se
1ffc0 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekLe.*/./* Opcod
1ffd0 65 3a 20 53 65 65 6b 4c 45 20 50 31 20 50 32 20  e: SeekLE P1 P2 
1ffe0 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
1fff0 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
20000 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ].**.** If curso
20010 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61  r P1 refers to a
20020 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54  n SQL table (B-T
20030 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e  ree that uses in
20040 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a  teger keys), .**
20050 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
20060 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73  n register P3 as
20070 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f   a key. If curso
20080 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
20090 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
200a0 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
200b0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
200c0 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
200d0 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
200e0 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
200f0 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
20100 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
20110 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
20120 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
20130 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
20140 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73   that .** is les
20150 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
20160 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  to the key value
20170 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  . If there are n
20180 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65  o records .** le
20190 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
201a0 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20   to the key and 
201b0 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
201c0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
201d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
201e0 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
201f0 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20  rsor configured 
20200 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72  to move in rever
20210 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f  se order,.** fro
20220 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64  m the end toward
20230 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
20240 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
20250 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
20260 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  * configured to 
20270 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65  use Prev, not Ne
20280 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  xt..**.** If the
20290 20 63 75 72 73 6f 72 20 50 31 20 77 61 73 20 6f   cursor P1 was o
202a0 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
202b0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c  OPFLAG_SEEKEQ fl
202c0 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ag, then this.**
202d0 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77   opcode will alw
202e0 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65  ays land on a re
202f0 63 6f 72 64 20 74 68 61 74 20 65 71 75 61 6c 6c  cord that equall
20300 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b 65 79  y equals the key
20310 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d  , or.** else jum
20320 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
20330 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65 20 63   P2.  When the c
20340 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f  ursor is OPFLAG_
20350 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20  SEEKEQ, this.** 
20360 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65 20 66  opcode must be f
20370 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 49 64  ollowed by an Id
20380 78 47 45 20 6f 70 63 6f 64 65 20 77 69 74 68 20  xGE opcode with 
20390 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e  the same argumen
203a0 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78 47 45  ts..** The IdxGE
203b0 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20   opcode will be 
203c0 73 6b 69 70 70 65 64 20 69 66 20 74 68 69 73 20  skipped if this 
203d0 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64 73 2c  opcode succeeds,
203e0 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64 78 47   but the.** IdxG
203f0 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  E opcode will be
20400 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65 71 75   used on subsequ
20410 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ent loop iterati
20420 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
20430 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
20440 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65  ound, SeekGt, Se
20450 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a 2f 0a  ekGe, SeekLt.*/.
20460 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 54 3a 20  case OP_SeekLT: 
20470 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
20480 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
20490 53 65 65 6b 4c 45 3a 20 20 20 20 20 20 20 20 20  SeekLE:         
204a0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
204b0 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 45 3a 20  case OP_SeekGE: 
204c0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
204d0 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
204e0 53 65 65 6b 47 54 3a 20 7b 20 20 20 20 20 20 20  SeekGT: {       
204f0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
20500 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
20510 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
20520 6f 6e 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  on result */.  i
20530 6e 74 20 6f 63 3b 20 20 20 20 20 20 20 20 20 20  nt oc;          
20540 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
20550 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
20560 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
20570 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 55  r to seek */.  U
20580 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
20590 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
205a0 73 65 65 6b 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  seek for */.  in
205b0 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
205c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
205d0 6c 75 6d 6e 73 20 6f 72 20 66 69 65 6c 64 73 20  lumns or fields 
205e0 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
205f0 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  i64 iKey;       
20600 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
20610 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74  we are to seek t
20620 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 71 4f 6e 6c  o */.  int eqOnl
20630 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c  y;        /* Onl
20640 79 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20  y interested in 
20650 3d 3d 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  == results */.. 
20660 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
20670 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
20680 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
20690 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
206a0 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
206b0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
206c0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
206d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
206e0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
206f0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
20700 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 20 3d  ert( OP_SeekLE =
20710 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31 20 29 3b  = OP_SeekLT+1 );
20720 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
20730 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGE == OP_SeekL
20740 54 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T+2 );.  assert(
20750 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d 20 4f 50   OP_SeekGT == OP
20760 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a 20 20 61  _SeekLT+3 );.  a
20770 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64  ssert( pC->isOrd
20780 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ered );.  assert
20790 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
207a0 21 3d 30 20 29 3b 0a 20 20 6f 63 20 3d 20 70 4f  !=0 );.  oc = pO
207b0 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 65 71 4f  p->opcode;.  eqO
207c0 6e 6c 79 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 6e  nly = 0;.  pC->n
207d0 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23 69 66 64  ullRow = 0;.#ifd
207e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
207f0 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70    pC->seekOp = p
20800 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64  Op->opcode;.#end
20810 69 66 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73  if..  if( pC->is
20820 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
20830 54 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  The BTREE_SEEK_E
20840 51 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 73  Q flag is only s
20850 65 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72 73  et on index curs
20860 6f 72 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ors */.    asser
20870 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
20880 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d  ursorHasHint(pC-
20890 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52  >uc.pCursor, BTR
208a0 45 45 5f 53 45 45 4b 5f 45 51 29 3d 3d 30 0a 20  EE_SEEK_EQ)==0. 
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
208c0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
208d0 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
208e0 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68  value in P3 migh
208f0 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65  t be of any type
20900 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c  : integer, real,
20910 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a 20   string,.    ** 
20920 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20  blob, or NULL.  
20930 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20  But it needs to 
20940 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  be an integer be
20950 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20  fore we can do. 
20960 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20     ** the seek, 
20970 73 6f 20 63 6f 6e 76 65 72 74 20 69 74 2e 20 2a  so convert it. *
20980 2f 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d  /.    pIn3 = &aM
20990 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
209a0 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
209b0 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
209c0 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Real|MEM_Str))=
209d0 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  =MEM_Str ){.    
209e0 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
209f0 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 30 29 3b  finity(pIn3, 0);
20a00 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b 65 79 20  .    }.    iKey 
20a10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
20a20 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20 20  Value(pIn3);..  
20a30 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76    /* If the P3 v
20a40 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  alue could not b
20a50 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
20a60 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74 68   an integer with
20a70 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73 20  out.    ** loss 
20a80 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  of information, 
20a90 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72 6f  then special pro
20aa0 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69  cessing is requi
20ab0 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66  red... */.    if
20ac0 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
20ad0 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
20ae0 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
20af0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
20b00 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
20b10 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61   /* If the P3 va
20b20 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  lue cannot be co
20b30 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79  nverted into any
20b40 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65   kind of a numbe
20b50 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  r,.        ** th
20b60 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20 6e  en the seek is n
20b70 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20  ot possible, so 
20b80 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20  jump to P2 */.  
20b90 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
20ba0 54 61 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74 6f  Taken(1,2); goto
20bb0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
20bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20bd0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
20be0 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 69   the approximati
20bf0 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61 72 67 65  on iKey is large
20c00 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75 61  r than the actua
20c10 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20  l real search.  
20c20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62      ** term, sub
20c30 73 74 69 74 75 74 65 20 3e 3d 20 66 6f 72 20 3e  stitute >= for >
20c40 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20 65   and < for <=. e
20c50 2e 67 2e 20 69 66 20 74 68 65 20 73 65 61 72 63  .g. if the searc
20c60 68 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20  h term.      ** 
20c70 69 73 20 34 2e 39 20 61 6e 64 20 74 68 65 20 69  is 4.9 and the i
20c80 6e 74 65 67 65 72 20 61 70 70 72 6f 78 69 6d 61  nteger approxima
20c90 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a 2a  tion 5:.      **
20ca0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
20cb0 20 28 78 20 3e 20 20 34 2e 39 29 20 20 20 20 2d   (x >  4.9)    -
20cc0 3e 20 20 20 20 20 28 78 20 3e 3d 20 35 29 0a 20  >     (x >= 5). 
20cd0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28       **        (
20ce0 78 20 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e 20  x <= 4.9)    -> 
20cf0 20 20 20 20 28 78 20 3c 20 20 35 29 0a 20 20 20      (x <  5).   
20d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20d10 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62 6c  pIn3->u.r<(doubl
20d20 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  e)iKey ){.      
20d30 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
20d40 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 2d  kGE==(OP_SeekGT-
20d50 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
20d60 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54 3d  sert( OP_SeekLT=
20d70 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20 29  =(OP_SeekLE-1) )
20d80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20d90 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20 30  ( (OP_SeekLE & 0
20da0 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
20db0 47 54 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a  GT & 0x0001) );.
20dc0 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20          if( (oc 
20dd0 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
20de0 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29 20  eekGT & 0x0001) 
20df0 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  ) oc--;.      }.
20e00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
20e10 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69   approximation i
20e20 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Key is smaller t
20e30 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  han the actual r
20e40 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20  eal search.     
20e50 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69   ** term, substi
20e60 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61 6e  tute <= for < an
20e70 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f 0a  d > for >=.  */.
20e80 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
20e90 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c 65  In3->u.r>(double
20ea0 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  )iKey ){.       
20eb0 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b   assert( OP_Seek
20ec0 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b 31  LE==(OP_SeekLT+1
20ed0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
20ee0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d 3d  ert( OP_SeekGT==
20ef0 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29 20 29 3b  (OP_SeekGE+1) );
20f00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20f10 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78   (OP_SeekLT & 0x
20f20 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47  0001)==(OP_SeekG
20f30 45 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a 20  E & 0x0001) );. 
20f40 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20 26         if( (oc &
20f50 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65   0x0001)==(OP_Se
20f60 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 20 29  ekLT & 0x0001) )
20f70 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   oc++;.      }. 
20f80 20 20 20 7d 20 0a 20 20 20 20 72 63 20 3d 20 73     } .    rc = s
20f90 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
20fa0 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
20fb0 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  .pCursor, 0, (u6
20fc0 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
20fd0 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f  ;.    pC->moveto
20fe0 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20  Target = iKey;  
20ff0 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65  /* Used by OP_De
21000 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  lete */.    if( 
21010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21020 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
21030 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
21040 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
21050 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 72 73     /* For a curs
21060 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 52 45  or with the BTRE
21070 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 2c 20  E_SEEK_EQ hint, 
21080 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 65 6b  only the OP_Seek
21090 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4f 50  GE and.    ** OP
210a0 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20  _SeekLE opcodes 
210b0 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e 64  are allowed, and
210c0 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20 69   these must be i
210d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
210e0 77 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 61 6e  wed.    ** by an
210f0 20 4f 50 5f 49 64 78 47 54 20 6f 72 20 4f 50 5f   OP_IdxGT or OP_
21100 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72 65  IdxLT opcode, re
21110 73 70 65 63 74 69 76 65 6c 79 2c 20 77 69 74 68  spectively, with
21120 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20   the same key.. 
21130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
21140 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21150 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e 70  HasHint(pC->uc.p
21160 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53 45  Cursor, BTREE_SE
21170 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  EK_EQ) ){.      
21180 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  eqOnly = 1;.    
21190 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
211a0 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 47 45  pcode==OP_SeekGE
211b0 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
211c0 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
211d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
211e0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
211f0 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70  xLT || pOp[1].op
21200 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
21210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21220 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b 30  pOp[1].p1==pOp[0
21230 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20 20 61 73  ].p1 );.      as
21240 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32 3d  sert( pOp[1].p2=
21250 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20 20  =pOp[0].p2 );.  
21260 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
21270 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33  1].p3==pOp[0].p3
21280 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21290 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70  ( pOp[1].p4.i==p
212a0 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b 0a 20 20  Op[0].p4.i );.  
212b0 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20    }..    nField 
212c0 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  = pOp->p4.i;.   
212d0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
212e0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
212f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 46  ;.    assert( nF
21300 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 72 2e  ield>0 );.    r.
21310 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
21320 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
21330 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69  Field = (u16)nFi
21340 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  eld;..    /* The
21350 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f   next line of co
21360 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66  de computes as f
21370 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73  ollows, only fas
21380 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20 20 69 66  ter:.    **   if
21390 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ( oc==OP_SeekGT 
213a0 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
213b0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72   ){.    **     r
213c0 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31  .default_rc = -1
213d0 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65  ;.    **   }else
213e0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 64  {.    **     r.d
213f0 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b 31 3b 0a  efault_rc = +1;.
21400 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 2a      **   }.    *
21410 2f 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  /.    r.default_
21420 72 63 20 3d 20 28 28 31 20 26 20 28 6f 63 20 2d  rc = ((1 & (oc -
21430 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20 3f 20 2d   OP_SeekLT)) ? -
21440 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20 61 73 73  1 : +1);.    ass
21450 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b  ert( oc!=OP_Seek
21460 47 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f  GT || r.default_
21470 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  rc==-1 );.    as
21480 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
21490 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74  kLE || r.default
214a0 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  _rc==-1 );.    a
214b0 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
214c0 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c  ekGE || r.defaul
214d0 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20 20 20 20  t_rc==+1 );.    
214e0 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
214f0 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65 66 61 75  eekLT || r.defau
21500 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20 20  lt_rc==+1 );..  
21510 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
21520 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65  [pOp->p3];.#ifde
21530 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21540 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28     { int i; for(
21550 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b  i=0; i<r.nField;
21560 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65   i++) assert( me
21570 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d  mIsValid(&r.aMem
21580 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66  [i]) ); }.#endif
21590 0a 20 20 20 20 72 2e 65 71 53 65 65 6e 20 3d 20  .    r.eqSeen = 
215a0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
215b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
215c0 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
215d0 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c  ursor, &r, 0, 0,
215e0 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
215f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21600 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
21610 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
21620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 71      }.    if( eq
21630 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53 65 65 6e  Only && r.eqSeen
21640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
21650 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
21660 20 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f 6e       goto seek_n
21670 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a  ot_found;.    }.
21680 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72 72    }.  pC->deferr
21690 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
216a0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
216b0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23  = CACHE_STALE;.#
216c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
216d0 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72  T.  sqlite3_sear
216e0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
216f0 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f  if.  if( oc>=OP_
21700 53 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65 72  SeekGE ){  asser
21710 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45  t( oc==OP_SeekGE
21720 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
21730 54 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  T );.    if( res
21740 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26  <0 || (res==0 &&
21750 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20   oc==OP_SeekGT) 
21760 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30  ){.      res = 0
21770 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
21780 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
21790 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 29  ->uc.pCursor, 0)
217a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
217b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
217c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
217d0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
217e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
217f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
21800 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  res = 1;.       
21810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21820 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
21830 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
21840 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
21860 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
21870 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
21880 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ( oc==OP_SeekLT 
21890 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
218a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3e   );.    if( res>
218b0 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20  0 || (res==0 && 
218c0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20 29  oc==OP_SeekLT) )
218d0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b  {.      res = 0;
218e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
218f0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
21900 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
21910 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
21920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21940 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
21950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
21970 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
21980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21990 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
219a0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
219b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
219c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
219d0 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65   /* res might be
219e0 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73   negative becaus
219f0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  e the table is e
21a00 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a  mpty.  Check to.
21a10 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
21a20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
21a30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21a40 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
21a50 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70 43  reeEof(pC->uc.pC
21a60 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
21a70 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64  }.seek_not_found
21a80 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  :.  assert( pOp-
21a90 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65 42  >p2>0 );.  VdbeB
21aa0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
21ab0 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
21ac0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
21ad0 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 20  _to_p2;.  }else 
21ae0 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20 20  if( eqOnly ){.  
21af0 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
21b00 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  .opcode==OP_IdxL
21b10 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f  T || pOp[1].opco
21b20 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
21b30 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53 6b      pOp++; /* Sk
21b40 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74 20  ip the OP_IdxLt 
21b50 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61 74  or OP_IdxGT that
21b60 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d 0a   follows */.  }.
21b70 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
21b80 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20  pcode: Found P1 
21b90 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
21ba0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
21bb0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
21bc0 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
21bd0 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
21be0 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
21bf0 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
21c00 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
21c10 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
21c20 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
21c30 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
21c40 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
21c50 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75  record..**.** Cu
21c60 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
21c70 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
21c80 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
21c90 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
21ca0 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65  d P4.** is a pre
21cb0 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79  fix of any entry
21cc0 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75   in P1 then a ju
21cd0 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32  mp is made to P2
21ce0 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65   and.** P1 is le
21cf0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
21d00 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
21d10 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  y..**.** This op
21d20 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74  eration leaves t
21d30 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
21d40 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
21d50 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  n be.** advanced
21d60 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
21d70 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  direction.  The 
21d80 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
21d90 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20 62   will work,.** b
21da0 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76 20  ut not the Prev 
21db0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
21dc0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74  ** See also: Not
21dd0 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63  Found, NoConflic
21de0 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53 65  t, NotExists. Se
21df0 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekGe.*/./* Opcod
21e00 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50  e: NotFound P1 P
21e10 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
21e20 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
21e30 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
21e40 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
21e50 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
21e60 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
21e70 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
21e80 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
21e90 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
21ea0 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
21eb0 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
21ec0 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
21ed0 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
21ee0 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
21ef0 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
21f00 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
21f10 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
21f20 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  d P4.** is not t
21f30 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79  he prefix of any
21f40 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
21f50 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
21f60 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a   to P2.  If P1 .
21f70 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  ** does contain 
21f80 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70  an entry whose p
21f90 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68  refix matches th
21fa0 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74  e P3/P4 record t
21fb0 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  hen control.** f
21fc0 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
21fd0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
21fe0 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c  tion and P1 is l
21ff0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22000 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  the.** matching 
22010 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
22020 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76  s operation leav
22030 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
22040 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
22050 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61  t cannot be.** a
22060 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65  dvanced in eithe
22070 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
22080 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
22090 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a  e Next and Prev.
220a0 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f  ** opcodes do no
220b0 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69  t work after thi
220c0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
220d0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
220e0 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 4e  nd, NotExists, N
220f0 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a 2f 2a 20  oConflict.*/./* 
22100 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66 6c 69  Opcode: NoConfli
22110 63 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  ct P1 P2 P3 P4 *
22120 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
22130 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
22140 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
22150 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
22160 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
22170 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
22180 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
22190 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
221a0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
221b0 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
221c0 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
221d0 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
221e0 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
221f0 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
22200 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
22210 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
22220 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 63  y P3 and P4.** c
22230 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
22240 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d   value, jump imm
22250 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
22260 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   If all terms of
22270 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
22280 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68 65 6e  re not-NULL then
22290 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65   a check is done
222a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
222b0 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68 65 0a   any row in the.
222c0 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74 72 65  ** P1 index btre
222d0 65 20 68 61 73 20 61 20 6d 61 74 63 68 69 6e 67  e has a matching
222e0 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20 49 66   key prefix.  If
222f0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
22300 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a 20 69  tches, jump.** i
22310 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
22320 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
22330 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74 68 72   match, fall thr
22340 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65 20 74  ough and leave t
22350 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f 72 20  he P1.** cursor 
22360 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
22370 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a 2a 2a  matching row..**
22380 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
22390 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 4f 50  is similar to OP
223a0 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68 20 74  _NotFound with t
223b0 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20 74 68  he exceptions th
223c0 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e 63 68  at the.** branch
223d0 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65 6e   is always taken
223e0 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
223f0 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20 69  the search key i
22400 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  nput is NULL..**
22410 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
22420 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  on leaves the cu
22430 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
22440 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
22450 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69  be.** advanced i
22460 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
22470 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
22480 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
22490 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65  d Prev.** opcode
224a0 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66  s do not work af
224b0 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  ter this operati
224c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
224d0 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 46 6f  so: NotFound, Fo
224e0 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 0a 2a  und, NotExists.*
224f0 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f 6e 66  /.case OP_NoConf
22500 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a 75 6d  lict:     /* jum
22510 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
22520 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20  P_NotFound:     
22530 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
22540 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a  /.case OP_Found:
22550 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
22560 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
22570 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20  alreadyExists;. 
22580 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b 0a 20   int takeJump;. 
22590 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62 65 43   int ii;.  VdbeC
225a0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74  ursor *pC;.  int
225b0 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64   res;.  Unpacked
225c0 52 65 63 6f 72 64 20 2a 70 46 72 65 65 3b 0a 20  Record *pFree;. 
225d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
225e0 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61  *pIdxKey;.  Unpa
225f0 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 23  ckedRecord r;..#
22600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22610 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  T.  if( pOp->opc
22620 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  ode!=OP_NoConfli
22630 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66 6f 75  ct ) sqlite3_fou
22640 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nd_count++;.#end
22650 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  if..  assert( pO
22660 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
22670 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
22680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
22690 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
226a0 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  2 );.  pC = p->a
226b0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
226c0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
226d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
226e0 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b  DEBUG.  pC->seek
226f0 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  Op = pOp->opcode
22700 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 33 20  ;.#endif.  pIn3 
22710 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
22720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
22730 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
22740 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
22750 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
22760 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
22770 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
22780 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
22790 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20 72  >p4.i>0 ){.    r
227a0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
227b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
227c0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
227d0 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 2e 61  p->p4.i;.    r.a
227e0 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66 64  Mem = pIn3;.#ifd
227f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22800 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
22810 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  <r.nField; ii++)
22820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22830 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
22840 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20 20 20 20  em[ii]) );.     
22850 20 61 73 73 65 72 74 28 20 28 72 2e 61 4d 65 6d   assert( (r.aMem
22860 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  [ii].flags & MEM
22870 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 72 2e 61  _Zero)==0 || r.a
22880 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20 29 3b 0a  Mem[ii].n==0 );.
22890 20 20 20 20 20 20 69 66 28 20 69 69 20 29 20 52        if( ii ) R
228a0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
228b0 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e 61 4d 65  p->p3+ii, &r.aMe
228c0 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  m[ii]);.    }.#e
228d0 6e 64 69 66 0a 20 20 20 20 70 49 64 78 4b 65 79  ndif.    pIdxKey
228e0 20 3d 20 26 72 3b 0a 20 20 20 20 70 46 72 65 65   = &r;.    pFree
228f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22900 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d     assert( pIn3-
22910 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
22920 62 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78  b );.    rc = Ex
22930 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a  pandBlob(pIn3);.
22940 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
22950 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
22960 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
22970 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
22980 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70  to no_mem;.    p
22990 46 72 65 65 20 3d 20 70 49 64 78 4b 65 79 20 3d  Free = pIdxKey =
229a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
229b0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
229c0 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  pC->pKeyInfo);. 
229d0 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
229e0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
229f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22a00 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d  RecordUnpack(pC-
22a10 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d  >pKeyInfo, pIn3-
22a20 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64  >n, pIn3->z, pId
22a30 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xKey);.  }.  pId
22a40 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
22a50 20 3d 20 30 3b 0a 20 20 74 61 6b 65 4a 75 6d 70   = 0;.  takeJump
22a60 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d   = 0;.  if( pOp-
22a70 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 43 6f  >opcode==OP_NoCo
22a80 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 2f 2a  nflict ){.    /*
22a90 20 46 6f 72 20 74 68 65 20 4f 50 5f 4e 6f 43 6f   For the OP_NoCo
22aa0 6e 66 6c 69 63 74 20 6f 70 63 6f 64 65 2c 20 74  nflict opcode, t
22ab0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
22ac0 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  any of the.    *
22ad0 2a 20 69 6e 70 75 74 20 66 69 65 6c 64 73 20 61  * input fields a
22ae0 72 65 20 4e 55 4c 4c 2c 20 73 69 6e 63 65 20 61  re NULL, since a
22af0 6e 79 20 6b 65 79 20 77 69 74 68 20 61 20 4e 55  ny key with a NU
22b00 4c 4c 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  LL will not.    
22b10 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ** conflict */. 
22b20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
22b30 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3b  pIdxKey->nField;
22b40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
22b50 28 20 70 49 64 78 4b 65 79 2d 3e 61 4d 65 6d 5b  ( pIdxKey->aMem[
22b60 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ii].flags & MEM_
22b70 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
22b80 74 61 6b 65 4a 75 6d 70 20 3d 20 31 3b 0a 20 20  takeJump = 1;.  
22b90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22bc0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
22bd0 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
22be0 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20   pIdxKey, 0, 0, 
22bf0 26 72 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  &res);.  if( pFr
22c00 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
22c10 65 65 4e 4e 28 64 62 2c 20 70 46 72 65 65 29 3b  eeNN(db, pFree);
22c20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
22c40 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
22c50 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 73  ror;.  }.  pC->s
22c60 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b  eekResult = res;
22c70 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  .  alreadyExists
22c80 20 3d 20 28 72 65 73 3d 3d 30 29 3b 0a 20 20 70   = (res==0);.  p
22c90 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 2d 61  C->nullRow = 1-a
22ca0 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20 20  lreadyExists;.  
22cb0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
22cc0 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  to = 0;.  pC->ca
22cd0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
22ce0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70  E_STALE;.  if( p
22cf0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  Op->opcode==OP_F
22d00 6f 75 6e 64 20 29 7b 0a 20 20 20 20 56 64 62 65  ound ){.    Vdbe
22d10 42 72 61 6e 63 68 54 61 6b 65 6e 28 61 6c 72 65  BranchTaken(alre
22d20 61 64 79 45 78 69 73 74 73 21 3d 30 2c 32 29 3b  adyExists!=0,2);
22d30 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61 64 79  .    if( already
22d40 45 78 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75  Exists ) goto ju
22d50 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73  mp_to_p2;.  }els
22d60 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  e{.    VdbeBranc
22d70 68 54 61 6b 65 6e 28 74 61 6b 65 4a 75 6d 70 7c  hTaken(takeJump|
22d80 7c 61 6c 72 65 61 64 79 45 78 69 73 74 73 3d 3d  |alreadyExists==
22d90 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 74 61  0,2);.    if( ta
22da0 6b 65 4a 75 6d 70 20 7c 7c 20 21 61 6c 72 65 61  keJump || !alrea
22db0 64 79 45 78 69 73 74 73 20 29 20 67 6f 74 6f 20  dyExists ) goto 
22dc0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
22dd0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22de0 70 63 6f 64 65 3a 20 53 65 65 6b 52 6f 77 69 64  pcode: SeekRowid
22df0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
22e00 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65   Synopsis: intke
22e10 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31  y=r[P3].**.** P1
22e20 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
22e30 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f   a cursor open o
22e40 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 62  n an SQL table b
22e50 74 72 65 65 20 28 77 69 74 68 20 69 6e 74 65 67  tree (with integ
22e60 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 49 66  er.** keys).  If
22e70 20 72 65 67 69 73 74 65 72 20 50 33 20 64 6f 65   register P3 doe
22e80 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
22e90 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 50   integer or if P
22ea0 31 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f  1 does not.** co
22eb0 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
22ec0 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68 65  ith rowid P3 the
22ed0 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
22ee0 6c 79 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 4f  ly to P2.  .** O
22ef0 72 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20 72  r, if P2 is 0, r
22f00 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 43  aise an SQLITE_C
22f10 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49 66  ORRUPT error. If
22f20 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e   P1 does contain
22f30 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 77 69 74  .** a record wit
22f40 68 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20  h rowid P3 then 
22f50 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75  .** leave the cu
22f60 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  rsor pointing at
22f70 20 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64   that record and
22f80 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
22f90 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
22fa0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
22fb0 54 68 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  The OP_NotExists
22fc0 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73   opcode performs
22fd0 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74   the same operat
22fe0 69 6f 6e 2c 20 62 75 74 20 77 69 74 68 20 4f 50  ion, but with OP
22ff0 5f 4e 6f 74 45 78 69 73 74 73 0a 2a 2a 20 74 68  _NotExists.** th
23000 65 20 50 33 20 72 65 67 69 73 74 65 72 20 6d 75  e P3 register mu
23010 73 74 20 62 65 20 67 75 61 72 61 6e 74 65 65 64  st be guaranteed
23020 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69   to contain an i
23030 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 20 57  nteger value.  W
23040 69 74 68 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f  ith this.** opco
23050 64 65 2c 20 72 65 67 69 73 74 65 72 20 50 33 20  de, register P3 
23060 6d 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69  might not contai
23070 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  n an integer..**
23080 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f  .** The OP_NotFo
23090 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  und opcode perfo
230a0 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
230b0 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20  ration on index 
230c0 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20  btrees.** (with 
230d0 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d  arbitrary multi-
230e0 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a  value keys)..**.
230f0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
23100 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
23110 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
23120 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61  e it cannot be a
23130 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69  dvanced.** in ei
23140 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
23150 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
23160 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
23170 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a  ev opcodes will.
23180 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c  ** not work foll
23190 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  owing this opcod
231a0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
231b0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
231c0 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  nd, NoConflict, 
231d0 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 2f 2a 20  SeekRowid.*/./* 
231e0 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74  Opcode: NotExist
231f0 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  s P1 P2 P3 * *.*
23200 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
23210 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50  ey=r[P3].**.** P
23220 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  1 is the index o
23230 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20  f a cursor open 
23240 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  on an SQL table 
23250 62 74 72 65 65 20 28 77 69 74 68 20 69 6e 74 65  btree (with inte
23260 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 50  ger.** keys).  P
23270 33 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  3 is an integer 
23280 72 6f 77 69 64 2e 20 20 49 66 20 50 31 20 64 6f  rowid.  If P1 do
23290 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
232a0 20 72 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20   record with.** 
232b0 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75  rowid P3 then ju
232c0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
232d0 6f 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 50 32  o P2.  Or, if P2
232e0 20 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e 0a   is 0, raise an.
232f0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
23300 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64  T error. If P1 d
23310 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  oes contain a re
23320 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20  cord with rowid 
23330 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76  P3 then .** leav
23340 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  e the cursor poi
23350 6e 74 69 6e 67 20 61 74 20 74 68 61 74 20 72 65  nting at that re
23360 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68  cord and fall th
23370 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
23380 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
23390 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 53  ..**.** The OP_S
233a0 65 65 6b 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  eekRowid opcode 
233b0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d  performs the sam
233c0 65 20 6f 70 65 72 61 74 69 6f 6e 20 62 75 74 20  e operation but 
233d0 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 74 68 65 0a  also allows the.
233e0 2a 2a 20 50 33 20 72 65 67 69 73 74 65 72 20 74  ** P3 register t
233f0 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6e 6f 6e 2d  o contain a non-
23400 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 69  integer value, i
23410 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
23420 20 6a 75 6d 70 20 69 73 0a 2a 2a 20 61 6c 77 61   jump is.** alwa
23430 79 73 20 74 61 6b 65 6e 2e 20 20 54 68 69 73 20  ys taken.  This 
23440 6f 70 63 6f 64 65 20 72 65 71 75 69 72 65 73 20  opcode requires 
23450 74 68 61 74 20 50 33 20 61 6c 77 61 79 73 20 63  that P3 always c
23460 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
23470 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f  r..**.** The OP_
23480 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65 20  NotFound opcode 
23490 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d  performs the sam
234a0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69  e operation on i
234b0 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20 28  ndex btrees.** (
234c0 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20 6d  with arbitrary m
234d0 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73 29  ulti-value keys)
234e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
234f0 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
23500 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65  ursor in a state
23510 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74   where it cannot
23520 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a 20   be advanced.** 
23530 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74  in either direct
23540 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
23550 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61  ords, the Next a
23560 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73 20  nd Prev opcodes 
23570 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
23580 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
23590 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  opcode..**.** Se
235a0 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
235b0 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c  otFound, NoConfl
235c0 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a 2a  ict, SeekRowid.*
235d0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 52 6f  /.case OP_SeekRo
235e0 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  wid: {        /*
235f0 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20   jump, in3 */.  
23600 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
23610 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
23620 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  r;.  int res;.  
23630 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e  u64 iKey;..  pIn
23640 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
23650 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d  3];.  if( (pIn3-
23660 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
23670 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
23680 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20  yAffinity(pIn3, 
23690 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
236a0 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  IC, encoding);. 
236b0 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
236c0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
236d0 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
236e0 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61  _p2;.  }.  /* Fa
236f0 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
23700 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 2a 2f 0a  OP_NotExists */.
23710 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74  case OP_NotExist
23720 73 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  s:          /* j
23730 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 70 49  ump, in3 */.  pI
23740 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
23750 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p3];.  assert( p
23760 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
23770 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  _Int );.  assert
23780 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
23790 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
237a0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
237b0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
237c0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
237d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
237e0 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
237f0 6b 4f 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  kOp = 0;.#endif.
23800 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
23810 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
23820 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
23830 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
23840 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
23850 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
23860 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29  sert( pCrsr!=0 )
23870 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  ;.  res = 0;.  i
23880 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b  Key = pIn3->u.i;
23890 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
238a0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
238b0 65 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65  ed(pCrsr, 0, iKe
238c0 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 61  y, 0, &res);.  a
238d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
238e0 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29  E_OK || res==0 )
238f0 3b 0a 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  ;.  pC->movetoTa
23900 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a  rget = iKey;  /*
23910 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65   Used by OP_Dele
23920 74 65 20 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c  te */.  pC->null
23930 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63  Row = 0;.  pC->c
23940 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
23950 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e  HE_STALE;.  pC->
23960 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
23970 20 30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   0;.  VdbeBranch
23980 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
23990 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c  .  pC->seekResul
239a0 74 20 3d 20 72 65 73 3b 0a 20 20 69 66 28 20 72  t = res;.  if( r
239b0 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  es!=0 ){.    ass
239c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
239d0 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  OK );.    if( pO
239e0 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p2==0 ){.    
239f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
23a00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
23a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
23a20 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
23a30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
23a40 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
23a50 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
23a60 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
23a70 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20 50  e: Sequence P1 P
23a80 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
23a90 73 69 73 3a 20 72 5b 50 32 5d 3d 63 75 72 73 6f  sis: r[P2]=curso
23aa0 72 5b 50 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a  r[P1].ctr++.**.*
23ab0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
23ac0 61 76 61 69 6c 61 62 6c 65 20 73 65 71 75 65 6e  available sequen
23ad0 63 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  ce number for cu
23ae0 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74  rsor P1..** Writ
23af0 65 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e  e the sequence n
23b00 75 6d 62 65 72 20 69 6e 74 6f 20 72 65 67 69 73  umber into regis
23b10 74 65 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73  ter P2..** The s
23b20 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f  equence number o
23b30 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
23b40 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 66 74 65  incremented afte
23b50 72 20 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75  r this.** instru
23b60 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65  ction.  .*/.case
23b70 20 4f 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20   OP_Sequence: { 
23b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
23b90 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  2 */.  assert( p
23ba0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23bb0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
23bd0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d  apCsr[pOp->p1]!=
23be0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23bf0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
23c00 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
23c10 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 4f  YPE_VTAB );.  pO
23c20 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
23c30 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
23c40 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70  Out->u.i = p->ap
23c50 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65  Csr[pOp->p1]->se
23c60 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61  qCount++;.  brea
23c70 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
23c80 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32  : NewRowid P1 P2
23c90 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
23ca0 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64  sis: r[P2]=rowid
23cb0 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77  .**.** Get a new
23cc0 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20   integer record 
23cd0 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72  number (a.k.a "r
23ce0 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20 74  owid") used as t
23cf0 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c  he key to a tabl
23d00 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64  e..** The record
23d10 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70   number is not p
23d20 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61  reviously used a
23d30 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64  s a key in the d
23d40 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
23d50 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20   that cursor P1 
23d60 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20  points to.  The 
23d70 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
23d80 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  r is written.** 
23d90 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73  written to regis
23da0 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
23db0 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73   P3>0 then P3 is
23dc0 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
23dd0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
23de0 20 74 68 69 73 20 56 44 42 45 20 74 68 61 74 20   this VDBE that 
23df0 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61  holds .** the la
23e00 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79  rgest previously
23e10 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
23e20 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77  d number. No new
23e30 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20   record numbers 
23e40 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74  are.** allowed t
23e50 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74  o be less than t
23e60 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20  his value. When 
23e70 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63 68  this value reach
23e80 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20  es its maximum, 
23e90 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 55  .** an SQLITE_FU
23ea0 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  LL error is gene
23eb0 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72 65  rated. The P3 re
23ec0 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74 65  gister is update
23ed0 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a 20  d with the '.** 
23ee0 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64  generated record
23ef0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50 33   number. This P3
23f00 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73   mechanism is us
23f10 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65  ed to help imple
23f20 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f  ment the.** AUTO
23f30 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72  INCREMENT featur
23f40 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  e..*/.case OP_Ne
23f50 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  wRowid: {       
23f60 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
23f70 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 20   i64 v;         
23f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
23f90 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64  ew rowid */.  Vd
23fa0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20  beCursor *pC;   
23fb0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
23fc0 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74  f table to get t
23fd0 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a  he new rowid */.
23fe0 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
23ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
24000 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  lt of an sqlite3
24010 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20  BtreeLast() */. 
24020 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
24030 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
24040 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  er to limit the 
24050 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68  number of search
24060 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  es */.  Mem *pMe
24070 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
24080 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
24090 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  ng largest rowid
240a0 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45   for AUTOINCREME
240b0 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  NT */.  VdbeFram
240c0 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f  e *pFrame;     /
240d0 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20  * Root frame of 
240e0 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30  VDBE */..  v = 0
240f0 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70  ;.  res = 0;.  p
24100 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
24110 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
24120 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
24130 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24140 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
24150 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
24160 3e 70 31 5d 3b 0a 20 20 69 66 28 20 21 70 43 2d  >p1];.  if( !pC-
24170 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
24180 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
24190 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
241a0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
241b0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73  error;.  }.  ass
241c0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
241d0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
241e0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
241f0 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
24200 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
24210 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f 2a  =0 );.  {.    /*
24220 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20   The next rowid 
24230 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  or record number
24240 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d   (different term
24250 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20  s for the same. 
24260 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20     ** thing) is 
24270 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77  obtained in a tw
24280 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d  o-step algorithm
24290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
242a0 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74  First we attempt
242b0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   to find the lar
242c0 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
242d0 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a  wid and add one.
242e0 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20      ** to that. 
242f0 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67   But if the larg
24300 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
24310 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68  id is already th
24320 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a  e maximum.    **
24330 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
24340 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  r, we have to fa
24350 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
24360 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
24370 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c  probabilistic al
24380 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20  gorithm.    **. 
24390 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
243a0 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f   algorithm is to
243b0 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20   select a rowid 
243c0 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65  at random and se
243d0 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61  e if.    ** it a
243e0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
243f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
24400 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
24410 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  t, we have.    *
24420 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66  * succeeded.  If
24430 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69   the random rowi
24440 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65  d does exist, we
24450 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e   select a new on
24460 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79  e.    ** and try
24470 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30   again, up to 10
24480 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 times..    */.
24490 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
244a0 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64  isTable );..#ifd
244b0 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f  ef SQLITE_32BIT_
244c0 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65  ROWID.#   define
244d0 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66   MAX_ROWID 0x7ff
244e0 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20  fffff.#else.    
244f0 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  /* Some compiler
24500 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74  s complain about
24510 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68   constants of th
24520 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66  e form 0x7ffffff
24530 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a  fffffffff..    *
24540 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69  * Others complai
24550 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66  n about 0x7fffff
24560 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20  fffffffffffLL.  
24570 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
24580 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a  cro seems.    **
24590 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
245a0 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d  constant while m
245b0 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c  aking all compil
245c0 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a  ers happy..    *
245d0 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
245e0 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28  _ROWID  (i64)( (
245f0 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66  ((u64)0x7fffffff
24600 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78  )<<32) | (u64)0x
24610 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69  ffffffff ).#endi
24620 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e  f..    if( !pC->
24630 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
24640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24650 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
24660 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72  ->uc.pCursor, &r
24670 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
24680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24690 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
246a0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
246b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
246c0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
246d0 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d    v = 1;   /* IM
246e0 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34  P: R-61914-48074
246f0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
24700 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24710 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24720 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e 75  sorIsValid(pC->u
24730 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  c.pCursor) );.  
24740 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65        v = sqlite
24750 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
24760 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
24770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3e  ;.        if( v>
24780 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  =MAX_ROWID ){.  
24790 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65 52          pC->useR
247a0 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b 0a  andomRowid = 1;.
247b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
247c0 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20 20 20           v++;   
247d0 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33 38 2d  /* IMP: R-29538-
247e0 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20 20 20  34987 */.       
247f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24800 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24810 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
24820 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ENT.    if( pOp-
24830 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >p3 ){.      /* 
24840 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
24850 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
24860 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
24870 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
24880 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
24890 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
248a0 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
248b0 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
248c0 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
248d0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
248e0 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  t);.        /* A
248f0 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
24900 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
24910 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
24920 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
24930 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29  <=pFrame->nMem )
24940 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  ;.        pMem =
24950 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70   &pFrame->aMem[p
24960 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 7d  Op->p3];.      }
24970 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
24980 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
24990 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
249a0 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
249b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
249c0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
249d0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
249e0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26          pMem = &
249f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
24a00 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
24a10 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d 29  oChange(p, pMem)
24a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24a30 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
24a40 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20  id(pMem) );..   
24a50 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
24a60 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29  E(pOp->p3, pMem)
24a70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24a80 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
24a90 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61 73  (pMem);.      as
24aa0 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
24ab0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
24ac0 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20   );  /* mem(P3) 
24ad0 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72  holds an integer
24ae0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4d   */.      if( pM
24af0 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57  em->u.i==MAX_ROW
24b00 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e  ID || pC->useRan
24b10 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
24b20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24b30 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20  FULL;   /* IMP: 
24b40 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20 2a 2f  R-17817-00630 */
24b50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
24b60 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
24b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24b80 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b  if( v<pMem->u.i+
24b90 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  1 ){.        v =
24ba0 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a   pMem->u.i + 1;.
24bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
24bc0 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20  em->u.i = v;.   
24bd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
24be0 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  ( pC->useRandomR
24bf0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  owid ){.      /*
24c00 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
24c10 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38  OF: R-07677-4188
24c20 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 74  1 If the largest
24c30 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20   ROWID is equal 
24c40 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
24c50 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
24c60 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 37   integer (922337
24c70 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20 74  2036854775807) t
24c80 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
24c90 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65  .      ** engine
24ca0 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20   starts picking 
24cb0 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 61  positive candida
24cc0 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e  te ROWIDs at ran
24cd0 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  dom until.      
24ce0 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20  ** it finds one 
24cf0 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76  that is not prev
24d00 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a  iously used. */.
24d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
24d20 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20  p->p3==0 );  /* 
24d30 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20  We cannot be in 
24d40 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64  random rowid mod
24d50 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 20  e if this is.   
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
24d80 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61  AUTOINCREMENT ta
24d90 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6e  ble. */.      cn
24da0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 7b  t = 0;.      do{
24db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24dc0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
24dd0 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20  of(v), &v);.    
24de0 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f      v &= (MAX_RO
24df0 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20 2f  WID>>1); v++;  /
24e00 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 76 20  * Ensure that v 
24e10 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
24e20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d 77  zero */.      }w
24e30 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73 71  hile(  ((rc = sq
24e40 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
24e50 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e  Unpacked(pC->uc.
24e60 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34  pCursor, 0, (u64
24e70 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )v,.            
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d       0, &res))==
24eb0 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20  SQLITE_OK).     
24ec0 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d         && (res==
24ed0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  0).            &
24ee0 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b 0a  & (++cnt<100));.
24ef0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
24f00 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
24f10 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
24f20 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
24f30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f40 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20  FULL;   /* IMP: 
24f50 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f  R-38219-53002 */
24f60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
24f70 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
24f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24f90 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20  assert( v>0 );  
24fa0 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30  /* EV: R-40812-0
24fb0 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  3570 */.    }.  
24fc0 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
24fd0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43  veto = 0;.    pC
24fe0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
24ff0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
25000 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76  .  pOut->u.i = v
25010 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
25020 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 20   Opcode: Insert 
25030 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
25040 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
25050 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d 72 5b  ey=r[P3] data=r[
25060 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  P2].**.** Write 
25070 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
25080 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f  e table of curso
25090 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74  r P1.  A new ent
250a0 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64  ry is.** created
250b0 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61   if it doesn't a
250c0 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20  lready exist or 
250d0 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20  the data for an 
250e0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72  existing.** entr
250f0 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  y is overwritten
25100 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74  .  The data is t
25110 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f  he value MEM_Blo
25120 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  b stored in regi
25130 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  ster.** number P
25140 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74  2. The key is st
25150 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
25160 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73   P3. The key mus
25170 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e  t.** be a MEM_In
25180 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
25190 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66  OPFLAG_NCHANGE f
251a0 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
251b0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63  , then the row c
251c0 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a  hange count is.*
251d0 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f  * incremented (o
251e0 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20  therwise not).  
251f0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41  If the OPFLAG_LA
25200 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20  STROWID flag of 
25210 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  P5 is set,.** th
25220 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72  en rowid is stor
25230 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e  ed for subsequen
25240 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a  t return by the.
25250 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  ** sqlite3_last_
25260 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66  insert_rowid() f
25270 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69  unction (otherwi
25280 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66  se it is unmodif
25290 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ied)..**.** If t
252a0 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
252b0 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20  KRESULT flag of 
252c0 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69  P5 is set, the i
252d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69  mplementation mi
252e0 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65  ght.** run faste
252f0 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e  r by avoiding an
25300 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65   unnecessary see
25310 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20  k on cursor P1. 
25320 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65   However,.** the
25330 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
25340 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20  ESULT flag must 
25350 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74  only be set if t
25360 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
25370 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73  o prior.** seeks
25380 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f   on the cursor o
25390 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r if the most re
253a0 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61  cent seek used a
253b0 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 50 33   key equal to P3
253c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
253d0 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66  PFLAG_ISUPDATE f
253e0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
253f0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
25400 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50  part of an.** UP
25410 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20  DATE operation. 
25420 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   Otherwise (if t
25430 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  he flag is clear
25440 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  ) then this opco
25450 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66  de.** is part of
25460 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61   an INSERT opera
25470 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65  tion.  The diffe
25480 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d  rence is only im
25490 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68  portant to.** th
254a0 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a  e update hook..*
254b0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50  *.** Parameter P
254c0 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  4 may point to a
254d0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
254e0 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  , or may be NULL
254f0 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a 20 6e  . If it is .** n
25500 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
25510 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28 73  e update-hook (s
25520 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65 43 61  qlite3.xUpdateCa
25530 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76 6f 6b  llback) is invok
25540 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ed .** following
25550 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e   a successful in
25560 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52  sert..**.** (WAR
25570 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31  NING/TODO: If P1
25580 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72   is a pseudo-cur
25590 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79  sor and P2 is dy
255a0 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
255b0 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e  ocated, then own
255c0 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20  ership of P2 is 
255d0 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74  transferred to t
255e0 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72  he pseudo-cursor
255f0 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72  .** and register
25600 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65   P2 becomes ephe
25610 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63  meral.  If the c
25620 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64  ursor is changed
25630 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  , the.** value o
25640 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69  f register P2 wi
25650 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20  ll then change. 
25660 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
25670 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73  does not.** caus
25680 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29  e any problems.)
25690 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
256a0 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
256b0 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54  ks on tables.  T
256c0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
256d0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
256e0 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49   indices is OP_I
256f0 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20  dxInsert..*/./* 
25700 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e  Opcode: InsertIn
25710 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
25720 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e  .** Synopsis: in
25730 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72 5b 50  tkey=P3 data=r[P
25740 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  2].**.** This wo
25750 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65  rks exactly like
25760 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70   OP_Insert excep
25770 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69  t that the key i
25780 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  s the.** integer
25790 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74   value P3, not t
257a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
257b0 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 69  integer stored i
257c0 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
257d0 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74  /.case OP_Insert
257e0 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  : .case OP_Inser
257f0 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  tInt: {.  Mem *p
25800 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Data;       /* M
25810 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20  EM cell holding 
25820 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 63  data for the rec
25830 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
25840 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65  ed */.  Mem *pKe
25850 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  y;        /* MEM
25860 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65   cell holding ke
25870 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  y  for the recor
25880 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  d */.  VdbeCurso
25890 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73  r *pC;   /* Curs
258a0 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f  or to table into
258b0 20 77 68 69 63 68 20 69 6e 73 65 72 74 20 69 73   which insert is
258c0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
258d0 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20  t seekResult;   
258e0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69  /* Result of pri
258f0 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20  or seek or 0 if 
25900 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54  no USESEEKRESULT
25910 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74   flag */.  const
25920 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20   char *zDb;  /* 
25930 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20  database name - 
25940 75 73 65 64 20 62 79 20 74 68 65 20 75 70 64 61  used by the upda
25950 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62  te hook */.  Tab
25960 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f  le *pTab;      /
25970 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
25980 65 20 2d 20 75 73 65 64 20 62 79 20 75 70 64 61  e - used by upda
25990 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74  te and pre-updat
259a0 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 42 74 72  e hooks */.  Btr
259b0 65 65 50 61 79 6c 6f 61 64 20 78 3b 20 20 20 2f  eePayload x;   /
259c0 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20 62 65 20  * Payload to be 
259d0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 70  inserted */..  p
259e0 44 61 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Data = &aMem[pOp
259f0 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
25a00 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
25a10 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
25a20 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  r );.  assert( m
25a30 65 6d 49 73 56 61 6c 69 64 28 70 44 61 74 61 29  emIsValid(pData)
25a40 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
25a50 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
25a60 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
25a70 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
25a80 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
25a90 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
25aa0 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
25ab0 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  or!=0 );.  asser
25ac0 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  t( (pOp->p5 & OP
25ad0 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20  FLAG_ISNOOP) || 
25ae0 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
25af0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
25b00 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c  type==P4_TABLE |
25b10 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50  | pOp->p4type>=P
25b20 34 5f 53 54 41 54 49 43 20 29 3b 0a 20 20 52 45  4_STATIC );.  RE
25b30 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
25b40 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20  ->p2, pData);.. 
25b50 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
25b60 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20  ==OP_Insert ){. 
25b70 20 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b     pKey = &aMem[
25b80 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73  pOp->p3];.    as
25b90 73 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67  sert( pKey->flag
25ba0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
25bb0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
25bc0 56 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a 20  Valid(pKey) );. 
25bd0 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
25be0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29  E(pOp->p3, pKey)
25bf0 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70  ;.    x.nKey = p
25c00 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73  Key->u.i;.  }els
25c10 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
25c20 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
25c30 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20 20  nsertInt );.    
25c40 78 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33  x.nKey = pOp->p3
25c50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70  ;.  }..  if( pOp
25c60 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42  ->p4type==P4_TAB
25c70 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41 54 45  LE && HAS_UPDATE
25c80 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20  _HOOK(db) ){.   
25c90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62   assert( pC->iDb
25ca0 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d  >=0 );.    zDb =
25cb0 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62   db->aDb[pC->iDb
25cc0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
25cd0 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pTab = pOp->p4.p
25ce0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
25cf0 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
25d00 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 48 61  AG_ISNOOP) || Ha
25d10 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b 0a  sRowid(pTab) );.
25d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
25d30 62 20 3d 20 30 3b 0a 20 20 20 20 7a 44 62 20 3d  b = 0;.    zDb =
25d40 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
25d50 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63  ed.  Silence a c
25d60 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e  ompiler warning.
25d70 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20   */.  }..#ifdef 
25d80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
25d90 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f  EUPDATE_HOOK.  /
25da0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
25db0 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69 66  -update hook, if
25dc0 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20 70 54   any */.  if( pT
25dd0 61 62 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  ab ){.    if( db
25de0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
25df0 62 61 63 6b 20 26 26 20 21 28 70 4f 70 2d 3e 70  back && !(pOp->p
25e00 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  5 & OPFLAG_ISUPD
25e10 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ATE) ){.      sq
25e20 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61  lite3VdbePreUpda
25e30 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53 51  teHook(p, pC, SQ
25e40 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44 62  LITE_INSERT, zDb
25e50 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c 70  , pTab, x.nKey,p
25e60 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20  Op->p2);.    }. 
25e70 20 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61     if( db->xUpda
25e80 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c  teCallback==0 ||
25e90 20 70 54 61 62 2d 3e 61 43 6f 6c 3d 3d 30 20 29   pTab->aCol==0 )
25ea0 7b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 65  {.      /* Preve
25eb0 6e 74 20 70 6f 73 74 2d 75 70 64 61 74 65 20 68  nt post-update h
25ec0 6f 6f 6b 20 66 72 6f 6d 20 72 75 6e 6e 69 6e 67  ook from running
25ed0 20 69 6e 20 63 61 73 65 73 20 77 68 65 6e 20 69   in cases when i
25ee0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 2a 2f 0a  t should not */.
25ef0 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
25f00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
25f10 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25f20 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b  _ISNOOP ) break;
25f30 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
25f40 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
25f50 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
25f60 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f  ange++;.  if( pO
25f70 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c  p->p5 & OPFLAG_L
25f80 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c  ASTROWID ) db->l
25f90 61 73 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b 65  astRowid = x.nKe
25fa0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  y;.  assert( pDa
25fb0 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  ta->flags & (MEM
25fc0 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29  _Blob|MEM_Str) )
25fd0 3b 0a 20 20 78 2e 70 44 61 74 61 20 3d 20 70 44  ;.  x.pData = pD
25fe0 61 74 61 2d 3e 7a 3b 0a 20 20 78 2e 6e 44 61 74  ata->z;.  x.nDat
25ff0 61 20 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20  a = pData->n;.  
26000 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70  seekResult = ((p
26010 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
26020 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f  USESEEKRESULT) ?
26030 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
26040 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74  : 0);.  if( pDat
26050 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  a->flags & MEM_Z
26060 65 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a 65  ero ){.    x.nZe
26070 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a  ro = pData->u.nZ
26080 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ero;.  }else{.  
26090 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20    x.nZero = 0;. 
260a0 20 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30 3b   }.  x.pKey = 0;
260b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
260c0 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75  treeInsert(pC->u
260d0 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20  c.pCursor, &x,. 
260e0 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20       (pOp->p5 & 
260f0 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f  (OPFLAG_APPEND|O
26100 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
26110 4f 4e 29 29 2c 20 73 65 65 6b 52 65 73 75 6c 74  ON)), seekResult
26120 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 65  .  );.  pC->defe
26130 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
26140 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
26150 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
26160 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
26170 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
26180 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
26190 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
261a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
261b0 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
261c0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
261d0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 21  xUpdateCallback!
261e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
261f0 28 20 70 54 61 62 2d 3e 61 43 6f 6c 21 3d 30 20  ( pTab->aCol!=0 
26200 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61  );.    db->xUpda
26210 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
26220 55 70 64 61 74 65 41 72 67 2c 0a 20 20 20 20 20  UpdateArg,.     
26230 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
26240 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45   OPFLAG_ISUPDATE
26250 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ) ? SQLITE_UPDAT
26260 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  E : SQLITE_INSER
26270 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44  T,.           zD
26280 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  b, pTab->zName, 
26290 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 62  x.nKey);.  }.  b
262a0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
262b0 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50 32  de: Delete P1 P2
262c0 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
262d0 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72  Delete the recor
262e0 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20 50  d at which the P
262f0 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72  1 cursor is curr
26300 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
26310 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
26320 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
26330 20 62 69 74 20 6f 66 20 74 68 65 20 50 35 20 70   bit of the P5 p
26340 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 2c  arameter is set,
26350 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72   then.** the cur
26360 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  sor will be left
26370 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65 69   pointing at  ei
26380 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f 72  ther the next or
26390 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
263a0 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74   record in the t
263b0 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20 6c  able. If it is l
263c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
263d0 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2c  the next record,
263e0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78   then.** the nex
263f0 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  t Next instructi
26400 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  on will be a no-
26410 6f 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  op. As a result,
26420 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   in this case.**
26430 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65 6c   it is ok to del
26440 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ete a record fro
26450 6d 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74 20  m within a Next 
26460 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50 46  loop. If .** OPF
26470 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
26480 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 63 6c   bit of P5 is cl
26490 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ear, then the cu
264a0 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  rsor will be.** 
264b0 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65 66  left in an undef
264c0 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ined state..**.*
264d0 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
264e0 41 55 58 44 45 4c 45 54 45 20 62 69 74 20 69 73  AUXDELETE bit is
264f0 20 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61 74   set on P5, that
26500 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
26510 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20 6f  this.** delete o
26520 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61 73  ne of several as
26530 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 65  sociated with de
26540 6c 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20 72  leting a table r
26550 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a 2a  ow and all its.*
26560 2a 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  * associated ind
26570 65 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78 61  ex entries.  Exa
26580 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  ctly one of thos
26590 65 20 64 65 6c 65 74 65 73 20 69 73 20 74 68 65  e deletes is the
265a0 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64 65   "primary".** de
265b0 6c 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65 72  lete.  The other
265c0 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50 46  s are all on OPF
265d0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63 75  LAG_FORDELETE cu
265e0 72 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61 72  rsors or else ar
265f0 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74 68  e.** marked with
26600 20 74 68 65 20 41 55 58 44 45 4c 45 54 45 20 66   the AUXDELETE f
26610 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lag..**.** If th
26620 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
26630 20 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42 3a   flag of P2 (NB:
26640 20 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20 73   P2 not P5) is s
26650 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
26660 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  .** change count
26670 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
26680 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
26690 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20 6e  .**.** P1 must n
266a0 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61 62  ot be pseudo-tab
266b0 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20 62  le.  It has to b
266c0 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 77  e a real table w
266d0 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  ith.** multiple 
266e0 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  rows..**.** If P
266f0 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  4 is not NULL th
26700 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  en it points to 
26710 61 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 20  a Table object. 
26720 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69 74  In this case eit
26730 68 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64 61  her .** the upda
26740 74 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65  te or pre-update
26750 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c 20   hook, or both, 
26760 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20  may be invoked. 
26770 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  The P1 cursor mu
26780 73 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  st.** have been 
26790 70 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e 67  positioned using
267a0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69   OP_NotFound pri
267b0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
267c0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a 2a  his opcode in .*
267d0 2a 20 74 68 69 73 20 63 61 73 65 2e 20 53 70 65  * this case. Spe
267e0 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f 6e  cifically, if on
267f0 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c  e is configured,
26800 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20   the pre-update 
26810 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76 6f  hook is .** invo
26820 6b 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f 74  ked if P4 is not
26830 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61 74   NULL. The updat
26840 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e-hook is invoke
26850 64 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66  d if one is conf
26860 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20 69  igured, .** P4 i
26870 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
26880 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
26890 47 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  GE flag is set i
268a0 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  n P2..**.** If t
268b0 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41  he OPFLAG_ISUPDA
268c0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  TE flag is set i
268d0 6e 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63 6f  n P2, then P3 co
268e0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
268f0 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d  ss.** of the mem
26900 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f  ory cell that co
26910 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
26920 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
26930 6f 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c 0a  of the row will.
26940 2a 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79 20  ** be set to by 
26950 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63  the update..*/.c
26960 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b  ase OP_Delete: {
26970 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
26980 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
26990 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  *zDb;.  Table *p
269a0 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c 61  Tab;.  int opfla
269b0 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20 3d  gs;..  opflags =
269c0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65   pOp->p2;.  asse
269d0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
269e0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
269f0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
26a00 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
26a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
26a20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26a30 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
26a40 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
26a50 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
26a60 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
26a70 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
26a80 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
26a90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26aa0 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e  EBUG.  if( pOp->
26ab0 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45  p4type==P4_TABLE
26ac0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f 70   && HasRowid(pOp
26ad0 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70 4f  ->p4.pTab) && pO
26ae0 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p5==0 ){.    
26af0 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72 6f  /* If p5 is zero
26b00 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61  , the seek opera
26b10 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74 69  tion that positi
26b20 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72 20  oned the cursor 
26b30 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
26b40 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20 68  OP_Delete will h
26b50 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68 65  ave also set the
26b60 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
26b70 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 72  t field to the r
26b80 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74  owid of.    ** t
26b90 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 62  he row that is b
26ba0 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
26bb0 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 73      i64 iKey = s
26bc0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
26bd0 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
26be0 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72  rsor);.    asser
26bf0 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72  t( pC->movetoTar
26c00 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20 7d  get==iKey );.  }
26c10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
26c20 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
26c30 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d 68   or pre-update-h
26c40 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f  ook will be invo
26c50 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f 0a  ked, set zDb to.
26c60 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
26c70 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73 20   the db to pass 
26c80 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20 73  as to it. Also s
26c90 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74 6f  et local pTab to
26ca0 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66 20   a copy.  ** of 
26cb0 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c 79  p4.pTab. Finally
26cc0 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65 2c  , if p5 is true,
26cd0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
26ce0 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73   this cursor was
26cf0 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65 64  .  ** last moved
26d00 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f 72   with OP_Next or
26d10 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53 65   OP_Prev, not Se
26d20 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c 20  ek or NotFound, 
26d30 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43 75  set .  ** VdbeCu
26d40 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67 65  rsor.movetoTarge
26d50 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
26d60 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69 66   rowid.  */.  if
26d70 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
26d80 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55  4_TABLE && HAS_U
26d90 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29  PDATE_HOOK(db) )
26da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
26db0 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ->iDb>=0 );.    
26dc0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
26dd0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 7a  pTab!=0 );.    z
26de0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d  Db = db->aDb[pC-
26df0 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  >iDb].zDbSName;.
26e00 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e      pTab = pOp->
26e10 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  p4.pTab;.    if(
26e20 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
26e30 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29  AG_SAVEPOSITION)
26e40 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61 62  !=0 && pC->isTab
26e50 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e  le ){.      pC->
26e60 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73  movetoTarget = s
26e70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
26e80 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
26e90 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
26ea0 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
26eb0 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64  0;   /* Not need
26ec0 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63  ed.  Silence a c
26ed0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e  ompiler warning.
26ee0 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 30   */.    pTab = 0
26ef0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
26f00 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d  .  Silence a com
26f10 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a  piler warning. *
26f20 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  /.  }..#ifdef SQ
26f30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
26f40 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20  PDATE_HOOK.  /* 
26f50 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
26f60 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65  pdate-hook if re
26f70 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
26f80 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
26f90 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e  allback && pOp->
26fa0 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 61  p4.pTab ){.    a
26fb0 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67 73  ssert( !(opflags
26fc0 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41   & OPFLAG_ISUPDA
26fd0 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  TE) .         ||
26fe0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d   HasRowid(pTab)=
26ff0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
27000 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66  (aMem[pOp->p3].f
27010 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
27020 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
27030 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
27040 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20 20  Hook(p, pC,.    
27050 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20 4f      (opflags & O
27060 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20  PFLAG_ISUPDATE) 
27070 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ? SQLITE_UPDATE 
27080 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  : SQLITE_DELETE,
27090 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70   .        zDb, p
270a0 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54  Tab, pC->movetoT
270b0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 70  arget,.        p
270c0 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20 20  Op->p3.    );.  
270d0 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20  }.  if( opflags 
270e0 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
270f0 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ) break;.#endif.
27100 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67   .  /* Only flag
27110 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
27120 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54 49  t are SAVEPOISTI
27130 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45  ON and AUXDELETE
27140 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 28   */ .  assert( (
27150 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46 4c  pOp->p5 & ~(OPFL
27160 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 7c  AG_SAVEPOSITION|
27170 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
27180 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
27190 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  t( OPFLAG_SAVEPO
271a0 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53 41  SITION==BTREE_SA
271b0 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20 20  VEPOSITION );.  
271c0 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 41  assert( OPFLAG_A
271d0 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f  UXDELETE==BTREE_
271e0 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23 69  AUXDELETE );..#i
271f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27200 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  G.  if( p->pFram
27210 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
27220 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 3d  pC->isEphemeral=
27230 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70  =0.        && (p
27240 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
27250 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20  AUXDELETE)==0.  
27260 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77 72        && (pC->wr
27270 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46 4f  Flag & OPFLAG_FO
27280 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20  RDELETE)==0.    
27290 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72    ){.      nExtr
272a0 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20 7d  aDelete++;.    }
272b0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
272c0 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
272d0 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  E ){.      nExtr
272e0 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20 7d  aDelete--;.    }
272f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
27300 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
27310 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70 43  Delete(pC->uc.pC
27320 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29 3b  ursor, pOp->p5);
27330 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
27340 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
27350 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
27360 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  lt = 0;.  if( rc
27370 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
27380 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  e_to_error;..  /
27390 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64  * Invoke the upd
273a0 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75  ate-hook if requ
273b0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  ired. */.  if( o
273c0 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
273d0 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 70  NCHANGE ){.    p
273e0 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20  ->nChange++;.   
273f0 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65   if( db->xUpdate
27400 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73 52  Callback && HasR
27410 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
27420 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43      db->xUpdateC
27430 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64  allback(db->pUpd
27440 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44  ateArg, SQLITE_D
27450 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61 62  ELETE, zDb, pTab
27460 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
27470 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
27480 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  get);.      asse
27490 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
274a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
274b0 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  reak;.}./* Opcod
274c0 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20  e: ResetCount * 
274d0 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
274e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
274f0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
27500 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
27510 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
27520 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
27530 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
27540 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
27550 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
27560 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  s())..** Then th
27570 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63  e VMs internal c
27580 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65  hange counter re
27590 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68  sets to 0..** Th
275a0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
275b0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
275c0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
275d0 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74  Count: {.  sqlit
275e0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
275f0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
27600 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
27610 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
27620 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
27630 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50  rCompare P1 P2 P
27640 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  3 P4.** Synopsis
27650 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74 72  : if key(P1)!=tr
27660 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f 74  im(r[P3],P4) got
27670 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  o P2.**.** P1 is
27680 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72   a sorter cursor
27690 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  . This instructi
276a0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70 72  on compares a pr
276b0 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 72  efix of the.** r
276c0 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72 65  ecord blob in re
276d0 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e 73  gister P3 agains
276e0 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  t a prefix of th
276f0 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  e entry that .**
27700 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
27710 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
27720 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74 68  nts to.  Only th
27730 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c 64  e first P4 field
27740 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61 6e  s.** of r[P3] an
27750 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  d the sorter rec
27760 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ord are compared
27770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
27780 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72 74  r P3 or the sort
27790 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  er contains a NU
277a0 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  LL in one of the
277b0 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a  ir significant.*
277c0 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63 6f  * fields (not co
277d0 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66 69  unting the P4 fi
277e0 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 20  elds at the end 
277f0 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72 65  which are ignore
27800 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d) then.** the c
27810 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73 73  omparison is ass
27820 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  umed to be equal
27830 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72  ..**.** Fall thr
27840 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e 73  ough to next ins
27850 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65 20  truction if the 
27860 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d 70  two records comp
27870 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a 20  are equal to.** 
27880 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75 6d  each other.  Jum
27890 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79 20  p to P2 if they 
278a0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a  are different..*
278b0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
278c0 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62  Compare: {.  Vdb
278d0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
278e0 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 4b  nt res;.  int nK
278f0 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20 70  eyCol;..  pC = p
27900 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
27910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
27920 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61 73  rter(pC) );.  as
27930 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
27940 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
27950 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
27960 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f  p->p3];.  nKeyCo
27970 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  l = pOp->p4.i;. 
27980 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d   res = 0;.  rc =
27990 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
279a0 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49  erCompare(pC, pI
279b0 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72 65  n3, nKeyCol, &re
279c0 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  s);.  VdbeBranch
279d0 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
279e0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
279f0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
27a00 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20 29  ror;.  if( res )
27a10 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
27a20 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f  ;.  break;.};../
27a30 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
27a40 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20  Data P1 P2 P3 * 
27a50 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
27a60 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20  [P2]=data.**.** 
27a70 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
27a80 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65  ter P2 the curre
27a90 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66  nt sorter data f
27aa0 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  or sorter cursor
27ab0 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c 65   P1..** Then cle
27ac0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 65  ar the column he
27ad0 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63 75  ader cache on cu
27ae0 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54  rsor P3..**.** T
27af0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
27b00 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d 6f  rmally use to mo
27b10 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74 20  ve a record out 
27b20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  of the sorter an
27b30 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67 69  d into.** a regi
27b40 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68 65  ster that is the
27b50 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70 73   source for a ps
27b60 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f  eudo-table curso
27b70 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  r created using.
27b80 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20 20  ** OpenPseudo.  
27b90 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62 6c  That pseudo-tabl
27ba0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 20  e cursor is the 
27bb0 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65 6e  one that is iden
27bc0 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 72  tified by.** par
27bd0 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65 61  ameter P3.  Clea
27be0 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c 75  ring the P3 colu
27bf0 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72 74  mn cache as part
27c00 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20   of this opcode 
27c10 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f 6d  saves.** us from
27c20 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75 65   having to issue
27c30 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c 6c   a separate Null
27c40 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  Row instruction 
27c50 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63 61  to clear that ca
27c60 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  che..*/.case OP_
27c70 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20  SorterData: {.  
27c80 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
27c90 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
27ca0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d  pOp->p2];.  pC =
27cb0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
27cc0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  1];.  assert( is
27cd0 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20  Sorter(pC) );.  
27ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
27cf0 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c  SorterRowkey(pC,
27d00 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74   pOut);.  assert
27d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27d20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 20  || (pOut->flags 
27d30 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  & MEM_Blob) );. 
27d40 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
27d50 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
27d60 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69  ->nCursor );.  i
27d70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
27d80 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
27d90 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  .  p->apCsr[pOp-
27da0 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74 75  >p3]->cacheStatu
27db0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
27dc0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
27dd0 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20  Opcode: RowData 
27de0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
27df0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
27e00 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  data.**.** Write
27e10 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
27e20 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
27e30 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  ow content for t
27e40 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77 68  he row at .** wh
27e50 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69 73  ich cursor P1 is
27e60 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27e70 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ing..** There is
27e80 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69   no interpretati
27e90 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20  on of the data. 
27ea0 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20   .** It is just 
27eb0 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20  copied onto the 
27ec0 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63  P2 register exac
27ed0 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73  tly as .** it is
27ee0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
27ef0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
27f00 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
27f10 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  is an index, the
27f20 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  n the content is
27f30 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
27f40 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73 6f  row..** If curso
27f50 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65 2c  r P2 is a table,
27f60 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
27f70 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20 74  t extracted is t
27f80 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49  he data..**.** I
27f90 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  f the P1 cursor 
27fa0 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
27fb0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
27fc0 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29  (not a NULL row)
27fd0 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61  .** of a real ta
27fe0 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
27ff0 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  o-table..**.** I
28000 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68 69  f P3!=0 then thi
28010 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c 6f  s opcode is allo
28020 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  wed to make an e
28030 70 68 65 72 6d 65 72 61 6c 20 70 6f 69 6e 74 65  phermeral pointe
28040 72 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61  r.** into the da
28050 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
28060 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
28070 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
28080 20 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69 73   output.** regis
28090 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ter will be inva
280a0 6c 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e 20  lidated as soon 
280b0 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d 6f  as the cursor mo
280c0 76 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67 0a  ves - including.
280d0 2a 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64 20  ** moves caused 
280e0 62 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  by other cursors
280f0 20 74 68 61 74 20 22 73 61 76 65 22 20 74 68 65   that "save" the
28100 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
28110 73 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  sors.** position
28120 20 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20 74   in order that t
28130 68 65 79 20 63 61 6e 20 77 72 69 74 65 20 74 6f  hey can write to
28140 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
28150 20 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74 68    If P3==0.** th
28160 65 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  en a copy of the
28170 20 64 61 74 61 20 69 73 20 6d 61 64 65 20 69 6e   data is made in
28180 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21 3d  to memory.  P3!=
28190 30 20 69 73 20 66 61 73 74 65 72 2c 20 62 75 74  0 is faster, but
281a0 0a 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61 66  .** P3==0 is saf
281b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 21  er..**.** If P3!
281c0 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  =0 then the cont
281d0 65 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72 65  ent of the P2 re
281e0 67 69 73 74 65 72 20 69 73 20 75 6e 73 75 69 74  gister is unsuit
281f0 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  able for use.** 
28200 69 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e 64  in OP_Result and
28210 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20 77   any OP_Result w
28220 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20 74  ill invalidate t
28230 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20 63  he P2 register c
28240 6f 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 50  ontent..** The P
28250 32 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65  2 register conte
28260 6e 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  nt is invalidate
28270 64 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69 6b  d by opcodes lik
28280 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72  e OP_Function or
28290 0a 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20 6f  .** by any use o
282a0 66 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f 72  f another cursor
282b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
282c0 20 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a   same table..*/.
282d0 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a  case OP_RowData:
282e0 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
282f0 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
28300 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b  *pCrsr;.  u32 n;
28310 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ..  pOut = out2P
28320 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
28330 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  );..  assert( pO
28340 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
28350 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
28360 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
28370 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
28380 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
28390 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
283a0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
283b0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
283c0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d  ( isSorter(pC)==
283d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
283e0 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b  C->nullRow==0 );
283f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
28400 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
28410 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
28420 2e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20  .pCursor;..  /* 
28430 54 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f  The OP_RowData o
28440 70 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f  pcodes always fo
28450 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74  llow OP_NotExist
28460 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65 65  s or.  ** OP_See
28470 6b 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65 77  kRowid or OP_Rew
28480 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68  ind/Op_Next with
28490 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20   no intervening 
284a0 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
284b0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76  * that might inv
284c0 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
284d0 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73  or..  ** If this
284e0 20 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20 63   where not the c
284f0 61 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20 66  ase, on of the f
28500 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
28510 29 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66 61  )s.  ** would fa
28520 69 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69 73  il.  Should this
28530 20 65 76 65 72 20 63 68 61 6e 67 65 20 28 62 65   ever change (be
28540 63 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65 73  cause of changes
28550 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20 2a   in the code.  *
28560 2a 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68 65  * generator) the
28570 6e 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64 20  n the fix would 
28580 62 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20 63  be to insert a c
28590 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  all to.  ** sqli
285a0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
285b0 65 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  eto()..  */.  as
285c0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
285d0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
285e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
285f0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
28600 69 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69 66  id(pCrsr) );.#if
28610 20 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75 69   0  /* Not requi
28620 72 65 64 20 64 75 65 20 74 6f 20 74 68 65 20 70  red due to the p
28630 72 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65 72  revious to asser
28640 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
28650 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
28660 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
28670 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  (pC);.  if( rc!=
28680 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
28690 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
286a0 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  ror;.#endif..  n
286b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
286c0 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72  ayloadSize(pCrsr
286d0 29 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32 29  );.  if( n>(u32)
286e0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
286f0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
28700 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
28710 62 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  big;.  }.  testc
28720 61 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 72  ase( n==0 );.  r
28730 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
28740 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73  emFromBtree(pCrs
28750 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b 0a  r, 0, n, pOut);.
28760 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28770 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
28780 6f 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e  or;.  if( !pOp->
28790 70 33 20 29 20 44 65 65 70 68 65 6d 65 72 61 6c  p3 ) Deephemeral
287a0 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50 44  ize(pOut);.  UPD
287b0 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
287c0 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53 54  (pOut);.  REGIST
287d0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
287e0 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  , pOut);.  break
287f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
28800 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20  Rowid P1 P2 * * 
28810 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
28820 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  [P2]=rowid.**.**
28830 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74   Store in regist
28840 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72  er P2 an integer
28850 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6b 65   which is the ke
28860 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65  y of the table e
28870 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20  ntry that.** P1 
28880 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
28890 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  nt to..**.** P1 
288a0 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e  can be either an
288b0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
288c0 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
288d0 6c 65 2e 20 20 54 68 65 72 65 20 75 73 65 64 20  le.  There used 
288e0 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72  to.** be a separ
288f0 61 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70  ate OP_VRowid op
28900 63 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69 74  code for use wit
28910 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
28920 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e  , but this.** on
28930 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72  e opcode now wor
28940 6b 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c  ks for both tabl
28950 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65  e types..*/.case
28960 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20   OP_Rowid: {    
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28980 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75  out2 */.  VdbeCu
28990 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20  rsor *pC;.  i64 
289a0 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v;.  sqlite3_vta
289b0 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
289c0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
289d0 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 4f   *pModule;..  pO
289e0 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
289f0 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
28a00 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
28a10 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
28a20 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
28a30 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
28a40 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
28a50 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
28a60 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  ( pC->eCurType!=
28a70 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c  CURTYPE_PSEUDO |
28a80 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b  | pC->nullRow );
28a90 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52  .  if( pC->nullR
28aa0 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  ow ){.    pOut->
28ab0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
28ac0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
28ad0 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66  else if( pC->def
28ae0 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
28af0 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74     v = pC->movet
28b00 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66  oTarget;.#ifndef
28b10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
28b20 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73  TUALTABLE.  }els
28b30 65 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79  e if( pC->eCurTy
28b40 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42  pe==CURTYPE_VTAB
28b50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28b60 70 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30 20  pC->uc.pVCur!=0 
28b70 29 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20 70  );.    pVtab = p
28b80 43 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74  C->uc.pVCur->pVt
28b90 61 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20  ab;.    pModule 
28ba0 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
28bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
28bc0 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b  odule->xRowid );
28bd0 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  .    rc = pModul
28be0 65 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75 63  e->xRowid(pC->uc
28bf0 2e 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20 20  .pVCur, &v);.   
28c00 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
28c10 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
28c20 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  b);.    if( rc )
28c30 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
28c40 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66  to_error;.#endif
28c50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28c60 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
28c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
28c80 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
28c90 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
28ca0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28cb0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
28cc0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
28cd0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
28ce0 65 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20 20  estore(pC);.    
28cf0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
28d00 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
28d10 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75  ;.    if( pC->nu
28d20 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  llRow ){.      p
28d30 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
28d40 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
28d50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 20  ak;.    }.    v 
28d60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
28d70 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e  tegerKey(pC->uc.
28d80 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
28d90 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20  pOut->u.i = v;. 
28da0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
28db0 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31  code: NullRow P1
28dc0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d   * * * *.**.** M
28dd0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50  ove the cursor P
28de0 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e  1 to a null row.
28df0 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20    Any OP_Column 
28e00 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68  operations.** th
28e10 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74  at occur while t
28e20 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20  he cursor is on 
28e30 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c  the null row wil
28e40 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74  l always.** writ
28e50 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  e a NULL..*/.cas
28e60 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a  e OP_NullRow: {.
28e70 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
28e80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
28e90 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
28ea0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
28eb0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
28ec0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
28ed0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
28ee0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  pC->nullRow = 1;
28ef0 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
28f00 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
28f10 3b 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72  ;.  if( pC->eCur
28f20 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
28f30 52 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  REE ){.    asser
28f40 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
28f50 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  r!=0 );.    sqli
28f60 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
28f70 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  sor(pC->uc.pCurs
28f80 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  or);.  }.  break
28f90 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
28fa0 53 65 65 6b 45 6e 64 20 50 31 20 2a 20 2a 20 2a  SeekEnd P1 * * *
28fb0 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74 69 6f   *.**.** Positio
28fc0 6e 20 63 75 72 73 6f 72 20 50 31 20 61 74 20 74  n cursor P1 at t
28fd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 74  he end of the bt
28fe0 72 65 65 20 66 6f 72 20 74 68 65 20 70 75 72 70  ree for the purp
28ff0 6f 73 65 20 6f 66 0a 2a 2a 20 61 70 70 65 6e 64  ose of.** append
29000 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
29010 6f 6e 74 6f 20 74 68 65 20 62 74 72 65 65 2e 0a  onto the btree..
29020 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
29030 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 75 72  med that the cur
29040 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
29050 20 66 6f 72 20 61 70 70 65 6e 64 69 6e 67 20 61   for appending a
29060 6e 64 20 73 6f 0a 2a 2a 20 69 66 20 74 68 65 20  nd so.** if the 
29070 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2c  cursor is valid,
29080 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
29090 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
290a0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20   pointing.** at 
290b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
290c0 74 72 65 65 20 61 6e 64 20 73 6f 20 6e 6f 20 63  tree and so no c
290d0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
290e0 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  to.** the cursor
290f0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
29100 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Last P1 P2 * * *
29110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
29120 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
29130 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 50 72   or Column or Pr
29140 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ev instruction f
29150 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
29160 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74  efer to the last
29170 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
29180 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
29190 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65  index..** If the
291a0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
291b0 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e  is empty and P2>
291c0 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  0, then jump imm
291d0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
291e0 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72  ** If P2 is 0 or
291f0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   if the table or
29200 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
29210 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
29220 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
29230 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
29240 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
29250 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
29260 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
29270 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76  d to move in rev
29280 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  erse order,.** f
29290 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61  rom the end towa
292a0 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rd the beginning
292b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
292c0 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
292d0 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
292e0 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20  o use Prev, not 
292f0 4e 65 78 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Next..*/.case OP
29300 5f 53 65 65 6b 45 6e 64 3a 0a 63 61 73 65 20 4f  _SeekEnd:.case O
29310 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Last: {       
29320 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
29330 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
29340 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
29350 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
29360 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
29370 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
29380 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
29390 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
293a0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
293b0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
293c0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
293d0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
293e0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
293f0 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72 65 73  c.pCursor;.  res
29400 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
29410 70 43 72 73 72 21 3d 30 20 29 3b 0a 23 69 66 64  pCrsr!=0 );.#ifd
29420 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29430 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70    pC->seekOp = p
29440 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64  Op->opcode;.#end
29450 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  if.  if( pOp->op
29460 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 45 6e 64  code==OP_SeekEnd
29470 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29480 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20  pOp->p2==0 );.  
29490 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
294a0 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73   = -1;.    if( s
294b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
294c0 72 49 73 56 61 6c 69 64 4e 4e 28 70 43 72 73 72  rIsValidNN(pCrsr
294d0 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  ) ){.      break
294e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
294f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
29500 61 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29  ast(pCrsr, &res)
29510 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
29520 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d  = (u8)res;.  pC-
29530 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
29540 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
29550 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
29560 54 41 4c 45 3b 0a 20 20 69 66 28 20 72 63 20 29  TALE;.  if( rc )
29570 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
29580 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
29590 70 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  pOp->p2>0 ){.   
295a0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
295b0 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  (res!=0,2);.    
295c0 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
295d0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
295e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
295f0 63 6f 64 65 3a 20 49 66 53 6d 61 6c 6c 65 72 20  code: IfSmaller 
29600 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
29610 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
29620 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
29630 6e 20 74 68 65 20 74 61 62 6c 65 20 50 31 2e 20  n the table P1. 
29640 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
29650 68 61 74 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  hat.** estimate 
29660 69 73 20 6c 65 73 73 20 74 68 61 6e 20 61 70 70  is less than app
29670 72 6f 78 69 6d 61 74 65 6c 79 20 32 2a 2a 28 30  roximately 2**(0
29680 2e 31 2a 50 33 29 2e 0a 2a 2f 0a 63 61 73 65 20  .1*P3)..*/.case 
29690 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 3a 20 7b 20  OP_IfSmaller: { 
296a0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
296b0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
296c0 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
296d0 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
296e0 3b 0a 20 20 69 36 34 20 73 7a 3b 0a 0a 20 20 61  ;.  i64 sz;..  a
296f0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
29700 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
29710 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
29720 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
29730 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
29740 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20  C!=0 );.  pCrsr 
29750 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
29760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
29770 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
29780 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70 43  te3BtreeFirst(pC
29790 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  rsr, &res);.  if
297a0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
297b0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
297c0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
297d0 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74 65 33      sz = sqlite3
297e0 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
297f0 28 70 43 72 73 72 29 3b 0a 20 20 20 20 69 66 28  (pCrsr);.    if(
29800 20 41 4c 57 41 59 53 28 73 7a 3e 3d 30 29 20 26   ALWAYS(sz>=0) &
29810 26 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  & sqlite3LogEst(
29820 28 75 36 34 29 73 7a 29 3c 70 4f 70 2d 3e 70 33  (u64)sz)<pOp->p3
29830 20 29 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d 0a   ) res = 1;.  }.
29840 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
29850 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
29860 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75  f( res ) goto ju
29870 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
29880 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
29890 3a 20 53 6f 72 74 65 72 53 6f 72 74 20 50 31 20  : SorterSort P1 
298a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
298b0 66 74 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73  fter all records
298c0 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
298d0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 53 6f 72  ted into the Sor
298e0 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 64  ter object.** id
298f0 65 6e 74 69 66 69 65 64 20 62 79 20 50 31 2c 20  entified by P1, 
29900 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
29910 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 64  de to actually d
29920 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 0a 2a  o the sorting..*
29930 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
29940 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
29950 6f 72 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  ords to be sorte
29960 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  d..**.** This op
29970 63 6f 64 65 20 69 73 20 61 6e 20 61 6c 69 61 73  code is an alias
29980 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20 61 6e 64   for OP_Sort and
29990 20 4f 50 5f 52 65 77 69 6e 64 20 74 68 61 74 20   OP_Rewind that 
299a0 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 53  is used.** for S
299b0 6f 72 74 65 72 20 6f 62 6a 65 63 74 73 2e 0a 2a  orter objects..*
299c0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
299d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
299e0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
299f0 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68 65  does exactly the
29a00 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f   same thing as O
29a10 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74 20  P_Rewind except 
29a20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65  that.** it incre
29a30 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d  ments an undocum
29a40 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ented global var
29a50 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74  iable used for t
29a60 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f  esting..**.** So
29a70 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  rting is accompl
29a80 69 73 68 65 64 20 62 79 20 77 72 69 74 69 6e 67  ished by writing
29a90 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20   records into a 
29aa0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a  sorting index,.*
29ab0 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67  * then rewinding
29ac0 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20   that index and 
29ad0 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20  playing it back 
29ae0 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74  from beginning t
29af0 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73  o.** end.  We us
29b00 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70  e the OP_Sort op
29b10 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20  code instead of 
29b20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20  OP_Rewind to do 
29b30 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67  the.** rewinding
29b40 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f   so that the glo
29b50 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c  bal variable wil
29b60 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64  l be incremented
29b70 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69   and.** regressi
29b80 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65 74  on tests can det
29b90 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
29ba0 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69  r not the optimi
29bb0 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63  zer is.** correc
29bc0 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f  tly optimizing o
29bd0 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73  ut sorts..*/.cas
29be0 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 3a  e OP_SorterSort:
29bf0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
29c00 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20  ase OP_Sort: {  
29c10 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
29c20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
29c30 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f  EST.  sqlite3_so
29c40 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  rt_count++;.  sq
29c50 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
29c60 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt--;.#endif.  p
29c70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54  ->aCounter[SQLIT
29c80 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
29c90 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  T]++;.  /* Fall 
29ca0 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
29cb0 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f  Rewind */.}./* O
29cc0 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31  pcode: Rewind P1
29cd0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
29ce0 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20  The next use of 
29cf0 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c  the Rowid or Col
29d00 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74  umn or Next inst
29d10 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a  ruction for P1 .
29d20 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f  ** will refer to
29d30 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29d40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29d50 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
29d60 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
29d70 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70   or index is emp
29d80 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ty, jump immedia
29d90 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49  tely to P2..** I
29da0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
29db0 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74  ndex is not empt
29dc0 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  y, fall through 
29dd0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
29de0 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e   .** instruction
29df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
29e00 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
29e10 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
29e20 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77   to move in forw
29e30 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  ard order,.** fr
29e40 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
29e50 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e   toward the end.
29e60 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
29e70 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
29e80 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
29e90 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50   use Next, not P
29ea0 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rev..*/.case OP_
29eb0 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20 20  Rewind: {       
29ec0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
29ed0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
29ee0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
29ef0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
29f00 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
29f10 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
29f20 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
29f30 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
29f40 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
29f50 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
29f60 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d  ( isSorter(pC)==
29f70 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
29f80 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b 0a  _SorterSort) );.
29f90 20 20 72 65 73 20 3d 20 31 3b 0a 23 69 66 64 65    res = 1;.#ifde
29fa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29fb0 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50   pC->seekOp = OP
29fc0 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64 69 66 0a  _Rewind;.#endif.
29fd0 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
29fe0 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  C) ){.    rc = s
29ff0 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
2a000 52 65 77 69 6e 64 28 70 43 2c 20 26 72 65 73 29  Rewind(pC, &res)
2a010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2a020 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2a030 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2a040 45 45 20 29 3b 0a 20 20 20 20 70 43 72 73 72 20  EE );.    pCrsr 
2a050 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
2a060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2a070 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rsr );.    rc = 
2a080 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
2a090 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
2a0a0 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
2a0b0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
2a0c0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
2a0d0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
2a0e0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
2a0f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2a100 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75 6c  error;.  pC->nul
2a110 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a  lRow = (u8)res;.
2a120 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2a130 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70  2>0 && pOp->p2<p
2a140 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64 62 65 42  ->nOp );.  VdbeB
2a150 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
2a160 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
2a170 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
2a180 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  2;.  break;.}../
2a190 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50  * Opcode: Next P
2a1a0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
2a1b0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73  .** Advance curs
2a1c0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
2a1d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2a1e0 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69  ext key/data pai
2a1f0 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c  r in its.** tabl
2a200 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20  e or index.  If 
2a210 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
2a220 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  e key/value pair
2a230 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
2a240 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
2a250 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
2a260 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
2a270 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20   cursor advance 
2a280 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
2a290 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
2a2a0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
2a2b0 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65   The Next opcode
2a2c0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
2a2d0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b  ollowing an Seek
2a2e0 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a 2a  GT, SeekGE, or.*
2a2f0 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63 6f  * OP_Rewind opco
2a300 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  de used to posit
2a310 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ion the cursor. 
2a320 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c 6c   Next is not all
2a330 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f  owed.** to follo
2a340 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  w SeekLT, SeekLE
2a350 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a 2a  , or OP_Last..**
2a360 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
2a370 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
2a380 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
2a390 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  a pseudo-table. 
2a3a0 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a   P1 must have.**
2a3b0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72 69   been opened pri
2a3c0 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f 64  or to this opcod
2a3d0 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61 6d  e or the program
2a3e0 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
2a3f0 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61 6c  **.** The P3 val
2a400 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ue is a hint to 
2a410 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  the btree implem
2a420 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d  entation. If P3=
2a430 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  =1, that.** mean
2a440 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20 69  s P1 is an SQL i
2a450 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74 68  ndex and that th
2a460 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
2a470 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
2a480 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 61  * omitted if tha
2a490 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  t index had been
2a4a0 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73 20   unique.  P3 is 
2a4b0 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20 69  usually 0.  P3 i
2a4c0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74 68  s.** always eith
2a4d0 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a  er 0 or 1..**.**
2a4e0 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66   P4 is always of
2a4f0 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45   type P4_ADVANCE
2a500 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  . The function p
2a510 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
2a520 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
2a530 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Next()..**.** If
2a540 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
2a550 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
2a560 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
2a570 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
2a580 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
2a590 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2a5a0 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
2a5b0 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
2a5c0 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74 49 66 4f  o: Prev, NextIfO
2a5d0 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  pen.*/./* Opcode
2a5e0 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20 50 31 20  : NextIfOpen P1 
2a5f0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
2a600 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
2a610 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4e 65  rks just like Ne
2a620 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20 69  xt except that i
2a630 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e  f cursor P1 is n
2a640 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65  ot.** open it be
2a650 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  haves a no-op..*
2a660 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65  /./* Opcode: Pre
2a670 76 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  v P1 P2 P3 P4 P5
2a680 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63  .**.** Back up c
2a690 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
2a6a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
2a6b0 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 64  e previous key/d
2a6c0 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
2a6d0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
2a6e0 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  x.  If there is 
2a6f0 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  no previous key/
2a700 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
2a710 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
2a720 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2a730 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
2a740 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
2a750 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75 63  r backup was suc
2a760 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
2a770 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
2a780 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P2..**.**.** The
2a790 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73 20   Prev opcode is 
2a7a0 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f  only valid follo
2a7b0 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c 54 2c 20  wing an SeekLT, 
2a7c0 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a 20 4f 50  SeekLE, or.** OP
2a7d0 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20 75 73 65  _Last opcode use
2a7e0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
2a7f0 65 20 63 75 72 73 6f 72 2e 20 20 50 72 65 76 20  e cursor.  Prev 
2a800 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a  is not allowed.*
2a810 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b  * to follow Seek
2a820 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 20 4f  GT, SeekGE, or O
2a830 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  P_Rewind..**.** 
2a840 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  The P1 cursor mu
2a850 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c  st be for a real
2a860 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
2a870 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 66 20  eudo-table.  If 
2a880 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20 6f 70 65  P1 is.** not ope
2a890 6e 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 76  n then the behav
2a8a0 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ior is undefined
2a8b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76  ..**.** The P3 v
2a8c0 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74  alue is a hint t
2a8d0 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c  o the btree impl
2a8e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50  ementation. If P
2a8f0 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  3==1, that.** me
2a900 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c  ans P1 is an SQL
2a910 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20   index and that 
2a920 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
2a930 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2a940 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74  .** omitted if t
2a950 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65  hat index had be
2a960 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69  en unique.  P3 i
2a970 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33  s usually 0.  P3
2a980 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69   is.** always ei
2a990 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a  ther 0 or 1..**.
2a9a0 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20  ** P4 is always 
2a9b0 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e  of type P4_ADVAN
2a9c0 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  CE. The function
2a9d0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
2a9e0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
2a9f0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a  eePrevious()..**
2aa00 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
2aa10 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
2aa20 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
2aa30 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
2aa40 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
2aa50 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
2aa60 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
2aa70 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f  emented..*/./* O
2aa80 70 63 6f 64 65 3a 20 50 72 65 76 49 66 4f 70 65  pcode: PrevIfOpe
2aa90 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
2aaa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
2aab0 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
2aac0 6b 65 20 50 72 65 76 20 65 78 63 65 70 74 20 74  ke Prev except t
2aad0 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
2aae0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
2aaf0 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
2ab00 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
2ab10 3a 20 53 6f 72 74 65 72 4e 65 78 74 20 50 31 20  : SorterNext P1 
2ab20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  P2 * * P5.**.** 
2ab30 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
2ab40 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 50 5f 4e  s just like OP_N
2ab50 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20  ext except that 
2ab60 50 31 20 6d 75 73 74 20 62 65 20 61 0a 2a 2a 20  P1 must be a.** 
2ab70 73 6f 72 74 65 72 20 6f 62 6a 65 63 74 20 66 6f  sorter object fo
2ab80 72 20 77 68 69 63 68 20 74 68 65 20 4f 50 5f 53  r which the OP_S
2ab90 6f 72 74 65 72 53 6f 72 74 20 6f 70 63 6f 64 65  orterSort opcode
2aba0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 69 6e 76   has been.** inv
2abb0 6f 6b 65 64 2e 20 20 54 68 69 73 20 6f 70 63 6f  oked.  This opco
2abc0 64 65 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  de advances the 
2abd0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
2abe0 78 74 20 73 6f 72 74 65 64 0a 2a 2a 20 72 65 63  xt sorted.** rec
2abf0 6f 72 64 2c 20 6f 72 20 6a 75 6d 70 73 20 74 6f  ord, or jumps to
2ac00 20 50 32 20 69 66 20 74 68 65 72 65 20 61 72 65   P2 if there are
2ac10 20 6e 6f 20 6d 6f 72 65 20 73 6f 72 74 65 64 20   no more sorted 
2ac20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63 61 73 65  records..*/.case
2ac30 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
2ac40 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20  {  /* jump */.  
2ac50 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2ac60 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2ac70 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2ac80 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
2ac90 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
2aca0 74 65 33 56 64 62 65 53 6f 72 74 65 72 4e 65 78  te3VdbeSorterNex
2acb0 74 28 64 62 2c 20 70 43 29 3b 0a 20 20 67 6f 74  t(db, pC);.  got
2acc0 6f 20 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61 73  o next_tail;.cas
2acd0 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a  e OP_PrevIfOpen:
2ace0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2acf0 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  ase OP_NextIfOpe
2ad00 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  n:    /* jump */
2ad10 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b  .  if( p->apCsr[
2ad20 70 4f 70 2d 3e 70 31 5d 3d 3d 30 20 29 20 62 72  pOp->p1]==0 ) br
2ad30 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
2ad40 68 72 6f 75 67 68 20 2a 2f 0a 63 61 73 65 20 4f  hrough */.case O
2ad50 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20 20 20  P_Prev:         
2ad60 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65   /* jump */.case
2ad70 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20 20 20 20   OP_Next:       
2ad80 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
2ad90 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2ada0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2adb0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
2adc0 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41 72  sert( pOp->p5<Ar
2add0 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e  raySize(p->aCoun
2ade0 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20 70  ter) );.  pC = p
2adf0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2ae00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2ae10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2ae20 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2ae30 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
2ae40 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2ae50 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2ae60 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2ae70 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20  opcode!=OP_Next 
2ae80 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61  || pOp->p4.xAdva
2ae90 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  nce==sqlite3Btre
2aea0 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72  eNext );.  asser
2aeb0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  t( pOp->opcode!=
2aec0 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e  OP_Prev || pOp->
2aed0 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c  p4.xAdvance==sql
2aee0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2aef0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
2af00 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e  Op->opcode!=OP_N
2af10 65 78 74 49 66 4f 70 65 6e 20 7c 7c 20 70 4f 70  extIfOpen || pOp
2af20 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
2af30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 20  qlite3BtreeNext 
2af40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2af50 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
2af60 76 49 66 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e  vIfOpen || pOp->
2af70 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c  p4.xAdvance==sql
2af80 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2af90 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4e 65  s);..  /* The Ne
2afa0 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c  xt opcode is onl
2afb0 79 20 75 73 65 64 20 61 66 74 65 72 20 53 65 65  y used after See
2afc0 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 61 6e 64  kGT, SeekGE, and
2afd0 20 52 65 77 69 6e 64 2e 0a 20 20 2a 2a 20 54 68   Rewind..  ** Th
2afe0 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73  e Prev opcode is
2aff0 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65 72   only used after
2b000 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c   SeekLT, SeekLE,
2b010 20 61 6e 64 20 4c 61 73 74 2e 20 2a 2f 0a 20 20   and Last. */.  
2b020 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2b030 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20  ode!=OP_Next || 
2b040 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
2b050 4e 65 78 74 49 66 4f 70 65 6e 0a 20 20 20 20 20  NextIfOpen.     
2b060 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d    || pC->seekOp=
2b070 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 70 43  =OP_SeekGT || pC
2b080 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65  ->seekOp==OP_See
2b090 6b 47 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  kGE.       || pC
2b0a0 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77  ->seekOp==OP_Rew
2b0b0 69 6e 64 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f  ind || pC->seekO
2b0c0 70 3d 3d 4f 50 5f 46 6f 75 6e 64 29 3b 0a 20 20  p==OP_Found);.  
2b0d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2b0e0 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20  ode!=OP_Prev || 
2b0f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
2b100 50 72 65 76 49 66 4f 70 65 6e 0a 20 20 20 20 20  PrevIfOpen.     
2b110 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d    || pC->seekOp=
2b120 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 70 43  =OP_SeekLT || pC
2b130 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65  ->seekOp==OP_See
2b140 6b 4c 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  kLE.       || pC
2b150 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73  ->seekOp==OP_Las
2b160 74 20 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4f 70  t );..  rc = pOp
2b170 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 28 70 43  ->p4.xAdvance(pC
2b180 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f  ->uc.pCursor, pO
2b190 70 2d 3e 70 33 29 3b 0a 6e 65 78 74 5f 74 61 69  p->p3);.next_tai
2b1a0 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  l:.  pC->cacheSt
2b1b0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
2b1c0 4c 45 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  LE;.  VdbeBranch
2b1d0 54 61 6b 65 6e 28 72 63 3d 3d 53 51 4c 49 54 45  Taken(rc==SQLITE
2b1e0 5f 4f 4b 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  _OK,2);.  if( rc
2b1f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b200 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
2b210 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 75 6e   0;.    p->aCoun
2b220 74 65 72 5b 70 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a  ter[pOp->p5]++;.
2b230 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2b240 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
2b250 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
2b260 65 6e 64 69 66 0a 20 20 20 20 67 6f 74 6f 20 6a  endif.    goto j
2b270 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68  ump_to_p2_and_ch
2b280 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
2b290 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
2b2a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 67  =SQLITE_DONE ) g
2b2b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b2c0 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 53  _error;.  rc = S
2b2d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 43 2d 3e  QLITE_OK;.  pC->
2b2e0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 67  nullRow = 1;.  g
2b2f0 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  oto check_for_in
2b300 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f  terrupt;.}../* O
2b310 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74  pcode: IdxInsert
2b320 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2b330 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2b340 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67  =r[P2].**.** Reg
2b350 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61  ister P2 holds a
2b360 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20  n SQL index key 
2b370 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a  made using the.*
2b380 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  * MakeRecord ins
2b390 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  tructions.  This
2b3a0 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74   opcode writes t
2b3b0 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20  hat key.** into 
2b3c0 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20 44  the index P1.  D
2b3d0 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72  ata for the entr
2b3e0 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20  y is nil..**.** 
2b3f0 49 66 20 50 34 20 69 73 20 6e 6f 74 20 7a 65 72  If P4 is not zer
2b400 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
2b410 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  e number of valu
2b420 65 73 20 69 6e 20 74 68 65 20 75 6e 70 61 63 6b  es in the unpack
2b430 65 64 0a 2a 2a 20 6b 65 79 20 6f 66 20 72 65 67  ed.** key of reg
2b440 28 50 32 29 2e 20 20 49 6e 20 74 68 61 74 20 63  (P2).  In that c
2b450 61 73 65 2c 20 50 33 20 69 73 20 74 68 65 20 69  ase, P3 is the i
2b460 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
2b470 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66 6f  t register.** fo
2b480 72 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b  r the unpacked k
2b490 65 79 2e 20 20 54 68 65 20 61 76 61 69 6c 61 62  ey.  The availab
2b4a0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 75 6e 70  ility of the unp
2b4b0 61 63 6b 65 64 20 6b 65 79 20 63 61 6e 20 73 6f  acked key can so
2b4c0 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65 20 61 6e  metimes.** be an
2b4d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
2b4e0 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74  *.** If P5 has t
2b4f0 68 65 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  he OPFLAG_APPEND
2b500 20 62 69 74 20 73 65 74 2c 20 74 68 61 74 20 69   bit set, that i
2b510 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2b520 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20  b-tree layer.** 
2b530 74 68 61 74 20 74 68 69 73 20 69 6e 73 65 72 74  that this insert
2b540 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
2b550 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a   an append..**.*
2b560 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
2b570 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62  OPFLAG_NCHANGE b
2b580 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
2b590 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2b5a0 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
2b5b0 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
2b5c0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 4f  ction.  If the O
2b5d0 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62 69  PFLAG_NCHANGE bi
2b5e0 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a 2a 20 74  t is clear,.** t
2b5f0 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63  hen the change c
2b600 6f 75 6e 74 65 72 20 69 73 20 75 6e 63 68 61 6e  ounter is unchan
2b610 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
2b620 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
2b630 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50  RESULT flag of P
2b640 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69 6d  5 is set, the im
2b650 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
2b660 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65 72  ht.** run faster
2b670 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e 20   by avoiding an 
2b680 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65 6b  unnecessary seek
2b690 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20 20   on cursor P1.  
2b6a0 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20  However,.** the 
2b6b0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
2b6c0 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20 6f  SULT flag must o
2b6d0 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74 68  nly be set if th
2b6e0 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2b6f0 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73 20   prior.** seeks 
2b700 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f 72  on the cursor or
2b710 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   if the most rec
2b720 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61 20  ent seek used a 
2b730 6b 65 79 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a  key equivalent.*
2b740 2a 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20  * to P2. .**.** 
2b750 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2b760 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
2b770 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65 71  indices.  The eq
2b780 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63  uivalent instruc
2b790 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c  tion.** for tabl
2b7a0 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e  es is OP_Insert.
2b7b0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
2b7c0 6f 72 74 65 72 49 6e 73 65 72 74 20 50 31 20 50  orterInsert P1 P
2b7d0 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2b7e0 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a  sis: key=r[P2].*
2b7f0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32  *.** Register P2
2b800 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e   holds an SQL in
2b810 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69  dex key made usi
2b820 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65  ng the.** MakeRe
2b830 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
2b840 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  s.  This opcode 
2b850 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a  writes that key.
2b860 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ** into the sort
2b870 65 72 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72  er P1.  Data for
2b880 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69   the entry is ni
2b890 6c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  l..*/.case OP_So
2b8a0 72 74 65 72 49 6e 73 65 72 74 3a 20 20 20 20 20  rterInsert:     
2b8b0 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 63 61 73 65    /* in2 */.case
2b8c0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3a 20 7b   OP_IdxInsert: {
2b8d0 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a          /* in2 *
2b8e0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2b8f0 70 43 3b 0a 20 20 42 74 72 65 65 50 61 79 6c 6f  pC;.  BtreePaylo
2b900 61 64 20 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad x;..  assert(
2b910 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2b920 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
2b930 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
2b940 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2b950 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2b960 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
2b970 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e  rter(pC)==(pOp->
2b980 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2b990 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20 70 49  rInsert) );.  pI
2b9a0 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2b9b0 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
2b9c0 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
2b9d0 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20 70  _Blob );.  if( p
2b9e0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2b9f0 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
2ba00 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72 74  ange++;.  assert
2ba10 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2ba20 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
2ba30 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2ba40 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 3b  _SorterInsert );
2ba50 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
2ba60 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 72  sTable==0 );.  r
2ba70 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  c = ExpandBlob(p
2ba80 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  In2);.  if( rc )
2ba90 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2baa0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
2bab0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2bac0 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 7b 0a  SorterInsert ){.
2bad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bae0 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
2baf0 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65 6c  pC, pIn2);.  }el
2bb00 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d  se{.    x.nKey =
2bb10 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78 2e   pIn2->n;.    x.
2bb20 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a  pKey = pIn2->z;.
2bb30 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d 65      x.aMem = aMe
2bb40 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  m + pOp->p3;.   
2bb50 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29 70   x.nMem = (u16)p
2bb60 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 63  Op->p4.i;.    rc
2bb70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2bb80 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75  nsert(pC->uc.pCu
2bb90 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20  rsor, &x,.      
2bba0 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
2bbb0 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46  PFLAG_APPEND|OPF
2bbc0 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
2bbd0 29 29 2c 20 0a 20 20 20 20 20 20 20 20 28 28 70  )), .        ((p
2bbe0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2bbf0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f  USESEEKRESULT) ?
2bc00 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
2bc10 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
2bc20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
2bc30 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2bc40 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  0 );.    pC->cac
2bc50 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2bc60 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  _STALE;.  }.  if
2bc70 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f 72 74  ( rc) goto abort
2bc80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2bc90 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2bca0 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20  code: IdxDelete 
2bcb0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
2bcc0 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2bcd0 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P2@P3].**.** The
2bce0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20 72   content of P3 r
2bcf0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
2bd00 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50 32  g at register P2
2bd10 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61   form.** an unpa
2bd20 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
2bd30 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f  This opcode remo
2bd40 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20 66  ves that entry f
2bd50 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65  rom the .** inde
2bd60 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  x opened by curs
2bd70 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  or P1..*/.case O
2bd80 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20  P_IdxDelete: {. 
2bd90 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
2bda0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
2bdb0 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  sr;.  int res;. 
2bdc0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2bdd0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
2bde0 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73  p->p3>0 );.  ass
2bdf0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
2be00 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
2be10 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
2be20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
2be30 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2be40 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2be50 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
2be60 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
2be70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2be80 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
2be90 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2bea0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2beb0 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
2bec0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
2bed0 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d   assert( pCrsr!=
2bee0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2bef0 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 72  Op->p5==0 );.  r
2bf00 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
2bf10 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46  pKeyInfo;.  r.nF
2bf20 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
2bf30 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 75 6c 74  >p3;.  r.default
2bf40 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e 61 4d 65  _rc = 0;.  r.aMe
2bf50 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
2bf60 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  2];.  rc = sqlit
2bf70 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2bf80 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c  acked(pCrsr, &r,
2bf90 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
2bfa0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2bfb0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2bfc0 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
2bfd0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2bfe0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
2bff0 72 73 72 2c 20 42 54 52 45 45 5f 41 55 58 44 45  rsr, BTREE_AUXDE
2c000 4c 45 54 45 29 3b 0a 20 20 20 20 69 66 28 20 72  LETE);.    if( r
2c010 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2c020 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2c030 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
2c040 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
2c050 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   );.  pC->cacheS
2c060 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2c070 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52  ALE;.  pC->seekR
2c080 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 62 72 65  esult = 0;.  bre
2c090 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2c0a0 3a 20 44 65 66 65 72 72 65 64 53 65 65 6b 20 50  : DeferredSeek P
2c0b0 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53  1 * P3 P4 *.** S
2c0c0 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65 20 50 33  ynopsis: Move P3
2c0d0 20 74 6f 20 50 31 2e 72 6f 77 69 64 20 69 66 20   to P1.rowid if 
2c0e0 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a 20 50 31 20  needed.**.** P1 
2c0f0 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e 64 65 78  is an open index
2c100 20 63 75 72 73 6f 72 20 61 6e 64 20 50 33 20 69   cursor and P3 i
2c110 73 20 61 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  s a cursor on th
2c120 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
2c130 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ** table.  This 
2c140 6f 70 63 6f 64 65 20 64 6f 65 73 20 61 20 64 65  opcode does a de
2c150 66 65 72 72 65 64 20 73 65 65 6b 20 6f 66 20 74  ferred seek of t
2c160 68 65 20 50 33 20 74 61 62 6c 65 20 63 75 72 73  he P3 table curs
2c170 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77  or.** to the row
2c180 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2c190 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  s to the current
2c1a0 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a 2a 0a 2a   row of P1..**.*
2c1b0 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65  * This is a defe
2c1c0 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74 68  rred seek.  Noth
2c1d0 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61 70  ing actually hap
2c1e0 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  pens until.** th
2c1f0 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2c200 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f 72   to read a recor
2c210 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69 66  d.  That way, if
2c220 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63 63   no reads.** occ
2c230 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73 61  ur, no unnecessa
2c240 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e 0a  ry I/O happens..
2c250 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20  **.** P4 may be 
2c260 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
2c270 67 65 72 73 20 28 74 79 70 65 20 50 34 5f 49 4e  gers (type P4_IN
2c280 54 41 52 52 41 59 29 20 63 6f 6e 74 61 69 6e 69  TARRAY) containi
2c290 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20  ng.** one entry 
2c2a0 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
2c2b0 69 6e 20 74 68 65 20 50 33 20 74 61 62 6c 65 2e  in the P3 table.
2c2c0 20 20 49 66 20 61 72 72 61 79 20 65 6e 74 72 79    If array entry
2c2d0 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e 6f 6e 2d   a(i).** is non-
2c2e0 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65 61 64 69  zero, then readi
2c2f0 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69 29 2d 31  ng column a(i)-1
2c300 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 50 33 20   from cursor P3 
2c310 69 73 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  is .** equivalen
2c320 74 20 74 6f 20 70 65 72 66 6f 72 6d 69 6e 67 20  t to performing 
2c330 74 68 65 20 64 65 66 65 72 72 65 64 20 73 65 65  the deferred see
2c340 6b 20 61 6e 64 20 74 68 65 6e 20 72 65 61 64 69  k and then readi
2c350 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a 2a 2a 20  ng column i .** 
2c360 66 72 6f 6d 20 50 31 2e 20 20 54 68 69 73 20 69  from P1.  This i
2c370 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 74  nformation is st
2c380 6f 72 65 64 20 69 6e 20 50 33 20 61 6e 64 20 75  ored in P3 and u
2c390 73 65 64 20 74 6f 20 72 65 64 69 72 65 63 74 0a  sed to redirect.
2c3a0 2a 2a 20 72 65 61 64 73 20 61 67 61 69 6e 73 74  ** reads against
2c3b0 20 50 33 20 6f 76 65 72 20 74 6f 20 50 31 2c 20   P3 over to P1, 
2c3c0 74 68 75 73 20 70 6f 73 73 69 62 6c 79 20 61 76  thus possibly av
2c3d0 6f 69 64 69 6e 67 20 74 68 65 20 6e 65 65 64 20  oiding the need 
2c3e0 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e 64 20 72  to.** seek and r
2c3f0 65 61 64 20 63 75 72 73 6f 72 20 50 33 2e 0a 2a  ead cursor P3..*
2c400 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  /./* Opcode: Idx
2c410 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20  Rowid P1 P2 * * 
2c420 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
2c430 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  [P2]=rowid.**.**
2c440 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
2c450 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67  ster P2 an integ
2c460 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
2c470 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2c480 65 20 72 65 63 6f 72 64 20 61 74 0a 2a 2a 20 74  e record at.** t
2c490 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
2c4a0 64 65 78 20 6b 65 79 20 70 6f 69 6e 74 65 64 20  dex key pointed 
2c4b0 74 6f 20 62 79 20 63 75 72 73 6f 72 20 50 31 2e  to by cursor P1.
2c4c0 20 20 54 68 69 73 20 69 6e 74 65 67 65 72 20 73    This integer s
2c4d0 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 65 20  hould be.** the 
2c4e0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 74 61 62  rowid of the tab
2c4f0 6c 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  le entry to whic
2c500 68 20 74 68 69 73 20 69 6e 64 65 78 20 65 6e 74  h this index ent
2c510 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  ry points..**.**
2c520 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f 77 69 64   See also: Rowid
2c530 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 2a 2f  , MakeRecord..*/
2c540 0a 63 61 73 65 20 4f 50 5f 44 65 66 65 72 72 65  .case OP_Deferre
2c550 64 53 65 65 6b 3a 0a 63 61 73 65 20 4f 50 5f 49  dSeek:.case OP_I
2c560 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
2c570 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2c580 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2c590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c5a0 20 54 68 65 20 50 31 20 69 6e 64 65 78 20 63 75   The P1 index cu
2c5b0 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 43 75  rsor */.  VdbeCu
2c5c0 72 73 6f 72 20 2a 70 54 61 62 43 75 72 3b 20 20  rsor *pTabCur;  
2c5d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
2c5e0 74 61 62 6c 65 20 63 75 72 73 6f 72 20 28 4f 50  table cursor (OP
2c5f0 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20 6f 6e  _DeferredSeek on
2c600 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20 72 6f 77  ly) */.  i64 row
2c610 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2c620 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 68       /* Rowid th
2c630 61 74 20 50 31 20 63 75 72 72 65 6e 74 20 70 6f  at P1 current po
2c640 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ints to */..  as
2c650 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2c660 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2c670 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2c680 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2c690 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2c6a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2c6b0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2c6c0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2c6d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
2c6e0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
2c6f0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
2c700 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  able==0 );.  ass
2c710 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
2c720 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
2c730 61 73 73 65 72 74 28 20 21 70 43 2d 3e 6e 75 6c  assert( !pC->nul
2c740 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  lRow || pOp->opc
2c750 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69 64  ode==OP_IdxRowid
2c760 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 49 64   );..  /* The Id
2c770 78 52 6f 77 69 64 20 61 6e 64 20 53 65 65 6b 20  xRowid and Seek 
2c780 6f 70 63 6f 64 65 73 20 61 72 65 20 63 6f 6d 62  opcodes are comb
2c790 69 6e 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  ined because of 
2c7a0 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 79 0a  the commonality.
2c7b0 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33 56    ** of sqlite3V
2c7c0 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
2c7d0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  () and sqlite3Vd
2c7e0 62 65 49 64 78 52 6f 77 69 64 28 29 2e 20 2a 2f  beIdxRowid(). */
2c7f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
2c800 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
2c810 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  (pC);..  /* sqli
2c820 74 65 33 56 62 65 43 75 72 73 6f 72 52 65 73 74  te3VbeCursorRest
2c830 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66  ore() can only f
2c840 61 69 6c 20 69 66 20 74 68 65 20 72 65 63 6f 72  ail if the recor
2c850 64 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  d has been delet
2c860 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d  ed.  ** out from
2c870 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
2c880 72 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 6e 65  r.  That will ne
2c890 76 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72 20  ver happens for 
2c8a0 61 6e 20 49 64 78 52 6f 77 69 64 0a 20 20 2a 2a  an IdxRowid.  **
2c8b0 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f 64 65 20   or Seek opcode 
2c8c0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72  */.  if( NEVER(r
2c8d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20  c!=SQLITE_OK) ) 
2c8e0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2c8f0 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20  o_error;..  if( 
2c900 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a  !pC->nullRow ){.
2c910 20 20 20 20 72 6f 77 69 64 20 3d 20 30 3b 20 20      rowid = 0;  
2c920 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
2c930 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
2c940 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2c950 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2c960 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
2c970 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  db, pC->uc.pCurs
2c980 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  or, &rowid);.   
2c990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c9a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
2c9b0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2c9c0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
2c9d0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2c9e0 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20  OP_DeferredSeek 
2c9f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ca00 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70   pOp->p3>=0 && p
2ca10 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p3<p->nCurso
2ca20 72 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43  r );.      pTabC
2ca30 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
2ca40 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61 73  p->p3];.      as
2ca50 73 65 72 74 28 20 70 54 61 62 43 75 72 21 3d 30  sert( pTabCur!=0
2ca60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ca70 28 20 70 54 61 62 43 75 72 2d 3e 65 43 75 72 54  ( pTabCur->eCurT
2ca80 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2ca90 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EE );.      asse
2caa0 72 74 28 20 70 54 61 62 43 75 72 2d 3e 75 63 2e  rt( pTabCur->uc.
2cab0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
2cac0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2cad0 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  Cur->isTable );.
2cae0 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6e        pTabCur->n
2caf0 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
2cb00 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f 76 65 74    pTabCur->movet
2cb10 6f 54 61 72 67 65 74 20 3d 20 72 6f 77 69 64 3b  oTarget = rowid;
2cb20 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e  .      pTabCur->
2cb30 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
2cb40 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
2cb50 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
2cb60 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c 20 70 4f  4_INTARRAY || pO
2cb70 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29 3b 0a 20  p->p4.ai==0 );. 
2cb80 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 61 41       pTabCur->aA
2cb90 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e 70 34 2e  ltMap = pOp->p4.
2cba0 61 69 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75  ai;.      pTabCu
2cbb0 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72 20 3d 20  r->pAltCursor = 
2cbc0 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pC;.    }else{. 
2cbd0 20 20 20 20 20 70 4f 75 74 20 3d 20 6f 75 74 32       pOut = out2
2cbe0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2cbf0 70 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p);.      pOut->
2cc00 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  u.i = rowid;.   
2cc10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2cc20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2cc30 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69 64  ode==OP_IdxRowid
2cc40 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2cc50 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 26 61  dbeMemSetNull(&a
2cc60 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20  Mem[pOp->p2]);. 
2cc70 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2cc80 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 45 20  * Opcode: IdxGE 
2cc90 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
2cca0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
2ccb0 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54  r[P3@P4].**.** T
2ccc0 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76  he P4 register v
2ccd0 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  alues beginning 
2cce0 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20  with P3 form an 
2ccf0 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a  unpacked index .
2cd00 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74  ** key that omit
2cd10 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
2cd20 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73  Y.  Compare this
2cd30 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e   key value again
2cd40 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  st the index .**
2cd50 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72 72   that P1 is curr
2cd60 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
2cd70 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20  o, ignoring the 
2cd80 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52  PRIMARY KEY or R
2cd90 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20  OWID .** fields 
2cda0 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
2cdb0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2cdc0 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61 74  x entry is great
2cdd0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
2cde0 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75   to the key valu
2cdf0 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74  e.** then jump t
2ce00 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
2ce10 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2ce20 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2ce30 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ction..*/./* Opc
2ce40 6f 64 65 3a 20 49 64 78 47 54 20 50 31 20 50 32  ode: IdxGT P1 P2
2ce50 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2ce60 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2ce70 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2ce80 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2ce90 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2cea0 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2ceb0 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2cec0 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2ced0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 43   PRIMARY KEY.  C
2cee0 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20  ompare this key 
2cef0 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68  value against th
2cf00 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74  e index .** that
2cf10 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
2cf20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67   pointing to, ig
2cf30 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41  noring the PRIMA
2cf40 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 20  RY KEY or ROWID 
2cf50 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74 68  .** fields at th
2cf60 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e end..**.** If 
2cf70 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
2cf80 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ry is greater th
2cf90 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  an the key value
2cfa0 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  .** then jump to
2cfb0 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20   P2.  Otherwise 
2cfc0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
2cfd0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2cfe0 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
2cff0 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32 20  de: IdxLT P1 P2 
2d000 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
2d010 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
2d020 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  4].**.** The P4 
2d030 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20  register values 
2d040 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
2d050 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  3 form an unpack
2d060 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79  ed index .** key
2d070 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
2d080 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52  PRIMARY KEY or R
2d090 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20 74  OWID.  Compare t
2d0a0 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67  his key value ag
2d0b0 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e 64  ainst.** the ind
2d0c0 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ex that P1 is cu
2d0d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2d0e0 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2d0f0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2d100 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68 65  .** ROWID on the
2d110 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   P1 index..**.**
2d120 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78   If the P1 index
2d130 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20 74   entry is less t
2d140 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
2d150 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  e then jump to P
2d160 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  2..** Otherwise 
2d170 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
2d180 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2d190 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
2d1a0 64 65 3a 20 49 64 78 4c 45 20 50 31 20 50 32 20  de: IdxLE P1 P2 
2d1b0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
2d1c0 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
2d1d0 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  4].**.** The P4 
2d1e0 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20  register values 
2d1f0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
2d200 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  3 form an unpack
2d210 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79  ed index .** key
2d220 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
2d230 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52  PRIMARY KEY or R
2d240 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20 74  OWID.  Compare t
2d250 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67  his key value ag
2d260 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e 64  ainst.** the ind
2d270 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ex that P1 is cu
2d280 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2d290 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2d2a0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2d2b0 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68 65  .** ROWID on the
2d2c0 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   P1 index..**.**
2d2d0 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78   If the P1 index
2d2e0 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20 74   entry is less t
2d2f0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2d300 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68  the key value th
2d310 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50 32  en jump.** to P2
2d320 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  . Otherwise fall
2d330 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2d340 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2d350 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
2d360 4c 45 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  LE:          /* 
2d370 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
2d380 49 64 78 47 54 3a 20 20 20 20 20 20 20 20 20 20  IdxGT:          
2d390 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
2d3a0 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20 20  OP_IdxLT:       
2d3b0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
2d3c0 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 20 7b 20  se OP_IdxGE:  { 
2d3d0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2d3e0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2d3f0 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  C;.  int res;.  
2d400 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
2d410 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
2d420 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2d430 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2d440 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2d450 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2d460 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
2d470 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72  assert( pC->isOr
2d480 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72  dered );.  asser
2d490 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2d4a0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2d4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2d4c0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 29 3b 0a  uc.pCursor!=0);.
2d4d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
2d4e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
2d4f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2d500 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  ->p5==0 || pOp->
2d510 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  p5==1 );.  asser
2d520 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
2d530 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 72 2e  P4_INT32 );.  r.
2d540 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
2d550 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46 69  KeyInfo;.  r.nFi
2d560 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e  eld = (u16)pOp->
2d570 70 34 2e 69 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p4.i;.  if( pOp-
2d580 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64 78 4c 54  >opcode<OP_IdxLT
2d590 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d5a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2d5b0 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  IdxLE || pOp->op
2d5c0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
2d5d0 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  ;.    r.default_
2d5e0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
2d5f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
2d600 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2d610 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  xGE || pOp->opco
2d620 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  de==OP_IdxLT );.
2d630 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63      r.default_rc
2d640 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 2e 61 4d   = 0;.  }.  r.aM
2d650 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
2d660 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
2d670 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 69 6e 74  TE_DEBUG.  { int
2d680 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72   i; for(i=0; i<r
2d690 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73  .nField; i++) as
2d6a0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2d6b0 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20  (&r.aMem[i]) ); 
2d6c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 73 20 3d  }.#endif.  res =
2d6d0 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
2d6e0 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74  ed.  Only used t
2d6f0 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e  o silence a warn
2d700 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
2d710 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
2d720 43 6f 6d 70 61 72 65 28 64 62 2c 20 70 43 2c 20  Compare(db, pC, 
2d730 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73  &r, &res);.  ass
2d740 65 72 74 28 20 28 4f 50 5f 49 64 78 4c 45 26 31  ert( (OP_IdxLE&1
2d750 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20  )==(OP_IdxLT&1) 
2d760 26 26 20 28 4f 50 5f 49 64 78 47 45 26 31 29 3d  && (OP_IdxGE&1)=
2d770 3d 28 4f 50 5f 49 64 78 47 54 26 31 29 20 29 3b  =(OP_IdxGT&1) );
2d780 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63  .  if( (pOp->opc
2d790 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c  ode&1)==(OP_IdxL
2d7a0 54 26 31 29 20 29 7b 0a 20 20 20 20 61 73 73 65  T&1) ){.    asse
2d7b0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
2d7c0 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70  =OP_IdxLE || pOp
2d7d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2d7e0 4c 54 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  LT );.    res = 
2d7f0 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -res;.  }else{. 
2d800 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2d810 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45  opcode==OP_IdxGE
2d820 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2d830 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
2d840 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20 20 56 64   res++;.  }.  Vd
2d850 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
2d860 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  s>0,2);.  if( rc
2d870 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2d880 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
2d890 28 20 72 65 73 3e 30 20 29 20 67 6f 74 6f 20 6a  ( res>0 ) goto j
2d8a0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
2d8b0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2d8c0 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50 32 20  : Destroy P1 P2 
2d8d0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c  P3 * *.**.** Del
2d8e0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 64 61  ete an entire da
2d8f0 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
2d900 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74  index whose root
2d910 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2d920 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
2d930 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a   given by P1..**
2d940 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65  .** The table be
2d950 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20 69 73  ing destroyed is
2d960 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
2d970 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 33  abase file if P3
2d980 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d  ==0.  If.** P3==
2d990 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  1 then the table
2d9a0 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20   to be clear is 
2d9b0 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
2d9c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
2d9d0 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  * that is used t
2d9e0 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63  o store tables c
2d9f0 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41  reate using CREA
2da00 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42  TE TEMPORARY TAB
2da10 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  LE..**.** If AUT
2da20 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
2da30 65 64 20 74 68 65 6e 20 69 74 20 69 73 20 70 6f  ed then it is po
2da40 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e 6f 74  ssible that anot
2da50 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  her root page.**
2da60 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65 64 20   might be moved 
2da70 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 64  into the newly d
2da80 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61 67 65  eleted root page
2da90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
2daa0 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  p all.** root pa
2dab0 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73 20 61  ges contiguous a
2dac0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2dad0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2dae0 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20    The former.** 
2daf0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 6f  value of the roo
2db00 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f 76 65  t page that move
2db10 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20 62 65  d - its value be
2db20 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20 6f 63  fore the move oc
2db30 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73  curred -.** is s
2db40 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
2db50 72 20 50 32 2e 20 49 66 20 6e 6f 20 70 61 67 65  r P2. If no page
2db60 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65   movement was re
2db70 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65 20  quired (because 
2db80 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 62 65 69  the.** table bei
2db90 6e 67 20 64 72 6f 70 70 65 64 20 77 61 73 20 61  ng dropped was a
2dba0 6c 72 65 61 64 79 20 74 68 65 20 6c 61 73 74 20  lready the last 
2dbb0 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  one in the datab
2dbc0 61 73 65 29 20 74 68 65 6e 20 61 20 0a 2a 2a 20  ase) then a .** 
2dbd0 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69  zero is stored i
2dbe0 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20  n register P2.  
2dbf0 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
2dc00 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61   disabled then a
2dc10 20 7a 65 72 6f 20 0a 2a 2a 20 69 73 20 73 74 6f   zero .** is sto
2dc20 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
2dc30 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  P2..**.** This o
2dc40 70 63 6f 64 65 20 74 68 72 6f 77 73 20 61 6e 20  pcode throws an 
2dc50 65 72 72 6f 72 20 69 66 20 74 68 65 72 65 20 61  error if there a
2dc60 72 65 20 61 6e 79 20 61 63 74 69 76 65 20 72 65  re any active re
2dc70 61 64 65 72 20 56 4d 73 20 77 68 65 6e 0a 2a 2a  ader VMs when.**
2dc80 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20   it is invoked. 
2dc90 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
2dca0 61 76 6f 69 64 20 74 68 65 20 64 69 66 66 69 63  avoid the diffic
2dcb0 75 6c 74 79 20 61 73 73 6f 63 69 61 74 65 64 20  ulty associated 
2dcc0 77 69 74 68 20 0a 2a 2a 20 75 70 64 61 74 69 6e  with .** updatin
2dcd0 67 20 65 78 69 73 74 69 6e 67 20 63 75 72 73 6f  g existing curso
2dce0 72 73 20 77 68 65 6e 20 61 20 72 6f 6f 74 20 70  rs when a root p
2dcf0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 20  age is moved in 
2dd00 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a  an AUTOVACUUM .*
2dd10 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
2dd20 20 65 72 72 6f 72 20 69 73 20 74 68 72 6f 77 6e   error is thrown
2dd30 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74   even if the dat
2dd40 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6e 20  abase is not an 
2dd50 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20 64  AUTOVACUUM .** d
2dd60 62 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  b in order to av
2dd70 6f 69 64 20 69 6e 74 72 6f 64 75 63 69 6e 67 20  oid introducing 
2dd80 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  an incompatibili
2dd90 74 79 20 62 65 74 77 65 65 6e 20 61 75 74 6f 76  ty between autov
2dda0 61 63 75 75 6d 20 0a 2a 2a 20 61 6e 64 20 6e 6f  acuum .** and no
2ddb0 6e 2d 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  n-autovacuum mod
2ddc0 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  es..**.** See al
2ddd0 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73  so: Clear.*/.cas
2dde0 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20  e OP_Destroy: { 
2ddf0 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
2de00 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20 20 69   int iMoved;.  i
2de10 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
2de20 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
2de30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2de40 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20 20 70 4f  Op->p1>1 );.  pO
2de50 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
2de60 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
2de70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
2de80 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 64 62 2d  _Null;.  if( db-
2de90 3e 6e 56 64 62 65 52 65 61 64 20 3e 20 64 62 2d  >nVdbeRead > db-
2dea0 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20 29 7b 0a  >nVDestroy+1 ){.
2deb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2dec0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65  LOCKED;.    p->e
2ded0 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
2dee0 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f 74 6f 20  Abort;.    goto 
2def0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2df00 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
2df10 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   iDb = pOp->p3;.
2df20 20 20 20 20 61 73 73 65 72 74 28 20 44 62 4d 61      assert( DbMa
2df30 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
2df40 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 20 20 20  ask, iDb) );.   
2df50 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20 20 2f 2a   iMoved = 0;  /*
2df60 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e   Not needed.  On
2df70 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20  ly to silence a 
2df80 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  warning. */.    
2df90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2dfa0 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61  eDropTable(db->a
2dfb0 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70  Db[iDb].pBt, pOp
2dfc0 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a  ->p1, &iMoved);.
2dfd0 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
2dfe0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
2dff0 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65  Out->u.i = iMove
2e000 64 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  d;.    if( rc ) 
2e010 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2e020 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e 64 65 66  o_error;.#ifndef
2e030 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e040 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2e050 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20 20  iMoved!=0 ){.   
2e060 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61     sqlite3RootPa
2e070 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62 2c  geMoved(db, iDb,
2e080 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31   iMoved, pOp->p1
2e090 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  );.      /* All 
2e0a0 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72 61  OP_Destroy opera
2e0b0 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74  tions occur on t
2e0c0 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a 2f  he same btree */
2e0d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2e0e0 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
2e0f0 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63 68  t==0 || resetSch
2e100 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b  emaOnFault==iDb+
2e110 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  1 );.      reset
2e120 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
2e130 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  iDb+1;.    }.#en
2e140 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
2e150 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
2e160 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a  lear P1 P2 P3.**
2e170 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63  .** Delete all c
2e180 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
2e190 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
2e1a0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
2e1b0 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65  t page.** in the
2e1c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2e1d0 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20  s given by P1.  
2e1e0 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74  But, unlike Dest
2e1f0 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  roy, do not.** r
2e200 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
2e210 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  or index from th
2e220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
2e240 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20   being clear is 
2e250 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2e260 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d  base file if P2=
2e270 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31  =0.  If.** P2==1
2e280 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
2e290 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69  to be clear is i
2e2a0 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
2e2b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
2e2c0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
2e2d0 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72   store tables cr
2e2e0 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54  eate using CREAT
2e2f0 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c  E TEMPORARY TABL
2e300 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
2e310 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P3 value is non-
2e320 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74  zero, then the t
2e330 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
2e340 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69   must be an.** i
2e350 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e 20  ntkey table (an 
2e360 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  SQL table, not a
2e370 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68 69  n index). In thi
2e380 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20 63  s case the row c
2e390 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20  hange .** count 
2e3a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
2e3b0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
2e3c0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2e3d0 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e  e being cleared.
2e3e0 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67 72   .** If P3 is gr
2e3f0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
2e400 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2e410 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
2e420 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f  er P3 is.** also
2e430 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
2e440 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2e450 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2e460 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a  being cleared..*
2e470 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44  *.** See also: D
2e480 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f  estroy.*/.case O
2e490 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74  P_Clear: {.  int
2e4a0 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e 43   nChange;. .  nC
2e4b0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73 73  hange = 0;.  ass
2e4c0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
2e4d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e4e0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
2e4f0 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
2e500 32 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  2) );.  rc = sql
2e510 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2e520 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61  ble(.      db->a
2e530 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c  Db[pOp->p2].pBt,
2e540 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e   pOp->p1, (pOp->
2e550 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20  p3 ? &nChange : 
2e560 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f  0).  );.  if( pO
2e570 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e  p->p3 ){.    p->
2e580 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  nChange += nChan
2e590 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ge;.    if( pOp-
2e5a0 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  >p3>0 ){.      a
2e5b0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
2e5c0 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  d(&aMem[pOp->p3]
2e5d0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  ) );.      memAb
2e5e0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
2e5f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
2e600 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e        aMem[pOp->
2e610 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e  p3].u.i += nChan
2e620 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ge;.    }.  }.  
2e630 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2e640 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2e650 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2e660 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 53 6f   Opcode: ResetSo
2e670 72 74 65 72 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  rter P1 * * * *.
2e680 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  **.** Delete all
2e690 20 63 6f 6e 74 65 6e 74 73 20 66 72 6f 6d 20 74   contents from t
2e6a0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2e6b0 6c 65 20 6f 72 20 73 6f 72 74 65 72 0a 2a 2a 20  le or sorter.** 
2e6c0 74 68 61 74 20 69 73 20 6f 70 65 6e 20 6f 6e 20  that is open on 
2e6d0 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a  cursor P1..**.**
2e6e0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 6e 6c   This opcode onl
2e6f0 79 20 77 6f 72 6b 73 20 66 6f 72 20 63 75 72 73  y works for curs
2e700 6f 72 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72  ors used for sor
2e710 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e  ting and.** open
2e720 65 64 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 45  ed with OP_OpenE
2e730 70 68 65 6d 65 72 61 6c 20 6f 72 20 4f 50 5f 53  phemeral or OP_S
2e740 6f 72 74 65 72 4f 70 65 6e 2e 0a 2a 2f 0a 63 61  orterOpen..*/.ca
2e750 73 65 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  se OP_ResetSorte
2e760 72 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  r: {.  VdbeCurso
2e770 72 20 2a 70 43 3b 0a 20 0a 20 20 61 73 73 65 72  r *pC;. .  asser
2e780 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
2e790 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
2e7a0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
2e7b0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
2e7c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
2e7d0 20 29 3b 0a 20 20 69 66 28 20 69 73 53 6f 72 74   );.  if( isSort
2e7e0 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 73 71  er(pC) ){.    sq
2e7f0 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
2e800 65 73 65 74 28 64 62 2c 20 70 43 2d 3e 75 63 2e  eset(db, pC->uc.
2e810 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pSorter);.  }els
2e820 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2e830 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
2e840 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
2e850 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
2e860 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a 20 20 20  Ephemeral );.   
2e870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e880 65 65 43 6c 65 61 72 54 61 62 6c 65 4f 66 43 75  eeClearTableOfCu
2e890 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72  rsor(pC->uc.pCur
2e8a0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sor);.    if( rc
2e8b0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2e8c0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
2e8d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2e8e0 70 63 6f 64 65 3a 20 43 72 65 61 74 65 42 74 72  pcode: CreateBtr
2e8f0 65 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ee P1 P2 P3 * *.
2e900 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
2e910 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 20 66  2]=root iDb=P1 f
2e920 6c 61 67 73 3d 50 33 0a 2a 2a 0a 2a 2a 20 41 6c  lags=P3.**.** Al
2e930 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 62 2d 74  locate a new b-t
2e940 72 65 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ree in the main 
2e950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
2e960 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65   P1==0 or in the
2e970 0a 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73  .** TEMP databas
2e980 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20  e file if P1==1 
2e990 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65  or in an attache
2e9a0 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a  d database if.**
2e9b0 20 50 31 3e 31 2e 20 20 54 68 65 20 50 33 20 61   P1>1.  The P3 a
2e9c0 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
2e9d0 31 20 28 42 54 52 45 45 5f 49 4e 54 4b 45 59 29  1 (BTREE_INTKEY)
2e9e0 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62   for a rowid tab
2e9f0 6c 65 0a 2a 2a 20 69 74 20 6d 75 73 74 20 62 65  le.** it must be
2ea00 20 32 20 28 42 54 52 45 45 5f 42 4c 4f 42 4b 45   2 (BTREE_BLOBKE
2ea10 59 29 20 66 6f 72 20 61 20 69 6e 64 65 78 20 6f  Y) for a index o
2ea20 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
2ea30 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 6f  table..** The ro
2ea40 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
2ea50 66 20 74 68 65 20 6e 65 77 20 62 2d 74 72 65 65  f the new b-tree
2ea60 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
2ea70 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
2ea80 73 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  se OP_CreateBtre
2ea90 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  e: {          /*
2eaa0 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 70   out2 */.  int p
2eab0 67 6e 6f 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  gno;.  Db *pDb;.
2eac0 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
2ead0 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
2eae0 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  ;.  pgno = 0;.  
2eaf0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d  assert( pOp->p3=
2eb00 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 7c 7c  =BTREE_INTKEY ||
2eb10 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f   pOp->p3==BTREE_
2eb20 42 4c 4f 42 4b 45 59 20 29 3b 0a 20 20 61 73 73  BLOBKEY );.  ass
2eb30 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2eb40 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
2eb50 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
2eb60 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
2eb70 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31  reeMask, pOp->p1
2eb80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2eb90 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
2eba0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
2ebb0 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
2ebc0 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
2ebd0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2ebe0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
2ebf0 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70  ble(pDb->pBt, &p
2ec00 67 6e 6f 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  gno, pOp->p3);. 
2ec10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2ec20 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2ec30 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  r;.  pOut->u.i =
2ec40 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a   pgno;.  break;.
2ec50 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 71  }../* Opcode: Sq
2ec60 6c 45 78 65 63 20 2a 20 2a 20 2a 20 50 34 20 2a  lExec * * * P4 *
2ec70 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 53  .**.** Run the S
2ec80 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  QL statement or 
2ec90 73 74 61 74 65 6d 65 6e 74 73 20 73 70 65 63 69  statements speci
2eca0 66 69 65 64 20 69 6e 20 74 68 65 20 50 34 20 73  fied in the P4 s
2ecb0 74 72 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f  tring..*/.case O
2ecc0 50 5f 53 71 6c 45 78 65 63 3a 20 7b 0a 20 20 64  P_SqlExec: {.  d
2ecd0 62 2d 3e 6e 53 71 6c 45 78 65 63 2b 2b 3b 0a 20  b->nSqlExec++;. 
2ece0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2ecf0 65 63 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a  ec(db, pOp->p4.z
2ed00 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  , 0, 0, 0);.  db
2ed10 2d 3e 6e 53 71 6c 45 78 65 63 2d 2d 3b 0a 20 20  ->nSqlExec--;.  
2ed20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2ed30 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2ed40 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2ed50 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63   Opcode: ParseSc
2ed60 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a  hema P1 * * P4 *
2ed70 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  .**.** Read and 
2ed80 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65  parse all entrie
2ed90 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  s from the SQLIT
2eda0 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
2edb0 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a  f database P1.**
2edc0 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
2edd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e  WHERE clause P4.
2ede0 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63   .**.** This opc
2edf0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
2ee00 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65  parser to create
2ee10 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d   a new virtual m
2ee20 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20  achine,.** then 
2ee30 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72  runs the new vir
2ee40 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
2ee50 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65  t is thus a re-e
2ee60 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a  ntrant opcode..*
2ee70 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53  /.case OP_ParseS
2ee80 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69  chema: {.  int i
2ee90 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db;.  const char
2eea0 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61   *zMaster;.  cha
2eeb0 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44  r *zSql;.  InitD
2eec0 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20  ata initData;.. 
2eed0 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64   /* Any prepared
2eee0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2eef0 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63  invokes this opc
2ef00 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75  ode will hold mu
2ef10 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76  texes.  ** on ev
2ef20 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69 73  ery btree.  This
2ef30 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73 69   is a prerequisi
2ef40 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  te for invoking 
2ef50 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69  .  ** sqlite3Ini
2ef60 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a  tCallback()..  *
2ef70 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2ef80 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d  DEBUG.  for(iDb=
2ef90 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
2efa0 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  iDb++){.    asse
2efb0 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71  rt( iDb==1 || sq
2efc0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2efd0 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
2efe0 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65  ].pBt) );.  }.#e
2eff0 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f  ndif..  iDb = pO
2f000 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28  p->p1;.  assert(
2f010 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
2f020 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
2f030 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  rt( DbHasPropert
2f040 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
2f050 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20  hemaLoaded) );. 
2f060 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 61   /* Used to be a
2f070 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20   conditional */ 
2f080 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
2f090 4d 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 20  MASTER_NAME;.   
2f0a0 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64   initData.db = d
2f0b0 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  b;.    initData.
2f0c0 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  iDb = pOp->p1;. 
2f0d0 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72     initData.pzEr
2f0e0 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d  rMsg = &p->zErrM
2f0f0 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  sg;.    zSql = s
2f100 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2f110 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
2f120 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c   name, rootpage,
2f130 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25   sql FROM '%q'.%
2f140 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  s WHERE %s ORDER
2f150 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
2f160 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
2f170 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74 65  zDbSName, zMaste
2f180 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  r, pOp->p4.z);. 
2f190 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
2f1a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2f1b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2f1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f1d0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
2f1e0 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
2f1f0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
2f200 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69 74   = 1;.      init
2f210 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54 45  Data.rc = SQLITE
2f220 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  _OK;.      asser
2f230 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
2f240 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 63  iled );.      rc
2f250 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f260 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65  db, zSql, sqlite
2f270 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26  3InitCallback, &
2f280 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  initData, 0);.  
2f290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f2a0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69  TE_OK ) rc = ini
2f2b0 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20 20  tData.rc;.      
2f2c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
2f2d0 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  db, zSql);.     
2f2e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
2f2f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2f300 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
2f310 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
2f320 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
2f330 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
2f340 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2f350 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
2f360 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  mem;.    }.    g
2f370 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2f380 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
2f390 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64  eak;  .}..#if !d
2f3a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2f3b0 49 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f  IT_ANALYZE)./* O
2f3c0 70 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79  pcode: LoadAnaly
2f3d0 73 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  sis P1 * * * *.*
2f3e0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 73 71  *.** Read the sq
2f3f0 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
2f400 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 50 31   for database P1
2f410 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f   and load the co
2f420 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74  ntent.** of that
2f430 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20   table into the 
2f440 69 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78 20 68  internal index h
2f450 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ash table.  This
2f460 20 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74   will cause.** t
2f470 68 65 20 61 6e 61 6c 79 73 69 73 20 74 6f 20 62  he analysis to b
2f480 65 20 75 73 65 64 20 77 68 65 6e 20 70 72 65 70  e used when prep
2f490 61 72 69 6e 67 20 61 6c 6c 20 73 75 62 73 65 71  aring all subseq
2f4a0 75 65 6e 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f  uent queries..*/
2f4b0 0a 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61  .case OP_LoadAna
2f4c0 6c 79 73 69 73 3a 20 7b 0a 20 20 61 73 73 65 72  lysis: {.  asser
2f4d0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
2f4e0 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
2f4f0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2f500 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64  e3AnalysisLoad(d
2f510 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 69  b, pOp->p1);.  i
2f520 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2f530 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2f540 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65  .  break;  .}.#e
2f550 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2f560 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
2f570 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  LYZE) */../* Opc
2f580 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50  ode: DropTable P
2f590 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2f5a0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
2f5b0 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
2f5c0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2f5d0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
2f5e0 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
2f5f0 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
2f600 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
2f610 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61 62  lled after a tab
2f620 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  le.** is dropped
2f630 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e   from disk (usin
2f640 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70  g the Destroy op
2f650 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74  code) in order t
2f660 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69  o keep .** the i
2f670 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
2f680 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
2f690 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
2f6a0 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
2f6b0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
2f6c0 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b   OP_DropTable: {
2f6d0 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
2f6e0 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
2f6f0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
2f700 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b  >p4.z);.  break;
2f710 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
2f720 72 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20  ropIndex P1 * * 
2f730 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
2f740 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
2f750 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
2f760 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
2f770 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
2f780 69 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69  index named P4 i
2f790 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
2f7a0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
2f7b0 66 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  fter an index.**
2f7c0 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   is dropped from
2f7d0 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65   disk (using the
2f7e0 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29   Destroy opcode)
2f7f0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
2f800 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61  keep the interna
2f810 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
2f820 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
2f830 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
2f840 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
2f850 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
2f860 6f 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c  opIndex: {.  sql
2f870 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2f880 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70  eteIndex(db, pOp
2f890 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
2f8a0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2f8b0 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69   Opcode: DropTri
2f8c0 67 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a  gger P1 * * P4 *
2f8d0 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
2f8e0 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
2f8f0 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
2f900 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
2f910 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67  ribe.** the trig
2f920 67 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ger named P4 in 
2f930 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
2f940 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
2f950 65 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  er a trigger.** 
2f960 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
2f970 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
2f980 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
2f990 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
2f9a0 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
2f9b0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
2f9c0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
2f9d0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
2f9e0 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
2f9f0 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
2fa00 6f 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73  opTrigger: {.  s
2fa10 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2fa20 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
2fa30 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2fa40 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
2fa50 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2fa60 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
2fa70 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65  _CHECK./* Opcode
2fa80 3a 20 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31  : IntegrityCk P1
2fa90 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
2faa0 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ** Do an analysi
2fab0 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
2fac0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
2fad0 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72  .  Store in.** r
2fae0 65 67 69 73 74 65 72 20 50 31 20 74 68 65 20 74  egister P1 the t
2faf0 65 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20  ext of an error 
2fb00 6d 65 73 73 61 67 65 20 64 65 73 63 72 69 62 69  message describi
2fb10 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  ng any problems.
2fb20 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65  .** If no proble
2fb30 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74  ms are found, st
2fb40 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65  ore a NULL in re
2fb50 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a  gister P1..**.**
2fb60 20 54 68 65 20 72 65 67 69 73 74 65 72 20 50 33   The register P3
2fb70 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6c 65   contains one le
2fb80 73 73 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  ss than the maxi
2fb90 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c  mum number of al
2fba0 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a 2a  lowed errors..**
2fbb0 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33 29   At most reg(P3)
2fbc0 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65 20   errors will be 
2fbd0 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e 20  reported..** In 
2fbe0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
2fbf0 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73 20   analysis stops 
2fc00 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28 50  as soon as reg(P
2fc10 31 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a 2a  1) errors are .*
2fc20 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31 29  * seen.  Reg(P1)
2fc30 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2fc40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2fc50 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 2e  rrors remaining.
2fc60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  .**.** The root 
2fc70 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  page numbers of 
2fc80 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2fc90 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 69  e database are i
2fca0 6e 74 65 67 65 72 73 0a 2a 2a 20 73 74 6f 72 65  ntegers.** store
2fcb0 64 20 69 6e 20 50 34 5f 49 4e 54 41 52 52 41 59  d in P4_INTARRAY
2fcc0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2fcd0 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65   If P5 is not ze
2fce0 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69 73  ro, the check is
2fcf0 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75 78   done on the aux
2fd00 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
2fd10 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68 65  ** file, not the
2fd20 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2fd30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
2fd40 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
2fd50 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2fd60 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
2fd70 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65 20  pragma..*/.case 
2fd80 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a 20  OP_IntegrityCk: 
2fd90 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20 20  {.  int nRoot;  
2fda0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fdb0 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63 6b   tables to check
2fdc0 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72 6f  .  (Number of ro
2fdd0 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20 20  ot pages.) */.  
2fde0 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20  int *aRoot;     
2fdf0 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f 74  /* Array of root
2fe00 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  page numbers for
2fe10 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63 68   tables to be ch
2fe20 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecked */.  int n
2fe30 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  Err;       /* Nu
2fe40 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72  mber of errors r
2fe50 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68 61  eported */.  cha
2fe60 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20  r *z;        /* 
2fe70 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72 6f  Text of the erro
2fe80 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65  r report */.  Me
2fe90 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a  m *pnErr;     /*
2fea0 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69 6e   Register keepin
2feb0 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f 72  g track of error
2fec0 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 0a  s remaining */..
2fed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
2fee0 52 65 61 64 65 72 20 29 3b 0a 20 20 6e 52 6f 6f  Reader );.  nRoo
2fef0 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  t = pOp->p2;.  a
2ff00 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 61  Root = pOp->p4.a
2ff10 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 6f  i;.  assert( nRo
2ff20 6f 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ot>0 );.  assert
2ff30 28 20 61 52 6f 6f 74 5b 30 5d 3d 3d 6e 52 6f 6f  ( aRoot[0]==nRoo
2ff40 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2ff50 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
2ff60 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
2ff70 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
2ff80 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d 65 6d  .  pnErr = &aMem
2ff90 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
2ffa0 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61  ert( (pnErr->fla
2ffb0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
2ffc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2ffd0 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 28 4d  nErr->flags & (M
2ffe0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
2fff0 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d  )==0 );.  pIn1 =
30000 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
30010 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
30020 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p5<db->nDb );.  
30030 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
30040 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
30050 20 70 4f 70 2d 3e 70 35 29 20 29 3b 0a 20 20 7a   pOp->p5) );.  z
30060 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
30070 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 64 62  ntegrityCheck(db
30080 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70  ->aDb[pOp->p5].p
30090 42 74 2c 20 26 61 52 6f 6f 74 5b 31 5d 2c 20 6e  Bt, &aRoot[1], n
300a0 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Root,.          
300b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300c0 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e 45 72         (int)pnEr
300d0 72 2d 3e 75 2e 69 2b 31 2c 20 26 6e 45 72 72 29  r->u.i+1, &nErr)
300e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
300f0 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
30100 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 29  .  if( nErr==0 )
30110 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 3d  {.    assert( z=
30120 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
30130 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( z==0 ){.    go
30140 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
30150 73 65 7b 0a 20 20 20 20 70 6e 45 72 72 2d 3e 75  se{.    pnErr->u
30160 2e 69 20 2d 3d 20 6e 45 72 72 2d 31 3b 0a 20 20  .i -= nErr-1;.  
30170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
30180 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c 20  SetStr(pIn1, z, 
30190 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
301a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
301b0 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58    }.  UPDATE_MAX
301c0 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b  _BLOBSIZE(pIn1);
301d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
301e0 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49 6e  angeEncoding(pIn
301f0 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  1, encoding);.  
30200 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
30210 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30220 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
30230 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  /../* Opcode: Ro
30240 77 53 65 74 41 64 64 20 50 31 20 50 32 20 2a 20  wSetAdd P1 P2 * 
30250 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
30260 20 72 6f 77 73 65 74 28 50 31 29 3d 72 5b 50 32   rowset(P1)=r[P2
30270 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74  ].**.** Insert t
30280 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
30290 20 68 65 6c 64 20 62 79 20 72 65 67 69 73 74 65   held by registe
302a0 72 20 50 32 20 69 6e 74 6f 20 61 20 52 6f 77 53  r P2 into a RowS
302b0 65 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 68 65 6c  et object.** hel
302c0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  d in register P1
302d0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73 65 72  ..**.** An asser
302e0 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 50 32  tion fails if P2
302f0 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
30300 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  er..*/.case OP_R
30310 6f 77 53 65 74 41 64 64 3a 20 7b 20 20 20 20 20  owSetAdd: {     
30320 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20 2a 2f    /* in1, in2 */
30330 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
30340 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32  pOp->p1];.  pIn2
30350 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
30360 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  ];.  assert( (pI
30370 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n2->flags & MEM_
30380 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  Int)!=0 );.  if(
30390 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
303a0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
303b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
303c0 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49  eMemSetRowSet(pI
303d0 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  n1);.    if( (pI
303e0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
303f0 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74  RowSet)==0 ) got
30400 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
30410 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73  sqlite3RowSetIns
30420 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77  ert(pIn1->u.pRow
30430 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e 69 29 3b  Set, pIn2->u.i);
30440 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
30450 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 52 65  Opcode: RowSetRe
30460 61 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ad P1 P2 P3 * *.
30470 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
30480 33 5d 3d 72 6f 77 73 65 74 28 50 31 29 0a 2a 2a  3]=rowset(P1).**
30490 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20  .** Extract the 
304a0 73 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66  smallest value f
304b0 72 6f 6d 20 74 68 65 20 52 6f 77 53 65 74 20 6f  rom the RowSet o
304c0 62 6a 65 63 74 20 69 6e 20 50 31 0a 2a 2a 20 61  bject in P1.** a
304d0 6e 64 20 70 75 74 20 74 68 61 74 20 76 61 6c 75  nd put that valu
304e0 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
304f0 50 33 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 52 6f  P3..** Or, if Ro
30500 77 53 65 74 20 6f 62 6a 65 63 74 20 50 31 20 69  wSet object P1 i
30510 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  s initially empt
30520 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75  y, leave P3.** u
30530 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d  nchanged and jum
30540 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
30550 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
30560 52 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20 20  RowSetRead: {   
30570 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
30580 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
30590 76 61 6c 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26  val;..  pIn1 = &
305a0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
305b0 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
305c0 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
305d0 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  =0 .   || sqlite
305e0 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49 6e 31  3RowSetNext(pIn1
305f0 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26 76 61  ->u.pRowSet, &va
30600 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  l)==0.  ){.    /
30610 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e  * The boolean in
30620 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  dex is empty */.
30630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
30640 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
30650 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
30660 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20 20 20 67  aken(1,2);.    g
30670 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61  oto jump_to_p2_a
30680 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  nd_check_for_int
30690 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b  errupt;.  }else{
306a0 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65 20  .    /* A value 
306b0 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20  was pulled from 
306c0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
306d0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
306e0 28 30 2c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  (0,2);.    sqlit
306f0 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
30700 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  4(&aMem[pOp->p3]
30710 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 67 6f  , val);.  }.  go
30720 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  to check_for_int
30730 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70  errupt;.}../* Op
30740 63 6f 64 65 3a 20 52 6f 77 53 65 74 54 65 73 74  code: RowSetTest
30750 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 20   P1 P2 P3 P4.** 
30760 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50  Synopsis: if r[P
30770 33 5d 20 69 6e 20 72 6f 77 73 65 74 28 50 31 29  3] in rowset(P1)
30780 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52   goto P2.**.** R
30790 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61 73  egister P3 is as
307a0 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20  sumed to hold a 
307b0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
307c0 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74 65  alue. If registe
307d0 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  r P1.** contains
307e0 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
307f0 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74   and that RowSet
30800 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
30810 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65  .** the value he
30820 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74  ld in P3, jump t
30830 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f  o register P2. O
30840 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74  therwise, insert
30850 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
30860 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52  in P3 into the R
30870 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  owSet and contin
30880 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ue on to the.** 
30890 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  next opcode..**.
308a0 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62  ** The RowSet ob
308b0 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  ject is optimize
308c0 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  d for the case w
308d0 68 65 72 65 20 73 65 74 73 20 6f 66 20 69 6e 74  here sets of int
308e0 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 69 6e 73  egers.** are ins
308f0 65 72 74 65 64 20 69 6e 20 64 69 73 74 69 6e 63  erted in distinc
30900 74 20 70 68 61 73 65 73 2c 20 77 68 69 63 68 20  t phases, which 
30910 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69 6e  each set contain
30920 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2e  s no duplicates.
30930 0a 2a 2a 20 45 61 63 68 20 73 65 74 20 69 73 20  .** Each set is 
30940 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
30950 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75 65 2e  unique P4 value.
30960 20 54 68 65 20 66 69 72 73 74 20 73 65 74 0a 2a   The first set.*
30970 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d  * must have P4==
30980 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73 65 74  0, the final set
30990 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d 2d   must have P4==-
309a0 31 2c 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 6f  1, and for all o
309b0 74 68 65 72 20 73 65 74 73 0a 2a 2a 20 6d 75 73  ther sets.** mus
309c0 74 20 68 61 76 65 20 50 34 3e 30 2e 0a 2a 2a 0a  t have P4>0..**.
309d0 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f  ** This allows o
309e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61  ptimizations: (a
309f0 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65  ) when P4==0 the
30a00 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
30a10 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 52 6f 77   test.** the Row
30a20 53 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50  Set object for P
30a30 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61 72  3, as it is guar
30a40 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f  anteed not to co
30a50 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29  ntain it,.** (b)
30a60 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65   when P4==-1 the
30a70 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
30a80 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75   insert the valu
30a90 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a  e, as it will.**
30aa0 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65 64   never be tested
30ab0 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68   for, and (c) wh
30ac0 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  en a value that 
30ad0 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  is part of set X
30ae0 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c   is.** inserted,
30af0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
30b00 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73  d to search to s
30b10 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20 76  ee if the same v
30b20 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  alue was.** prev
30b30 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20  iously inserted 
30b40 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  as part of set X
30b50 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73   (only if it was
30b60 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69   previously.** i
30b70 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20  nserted as part 
30b80 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65  of some other se
30b90 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  t)..*/.case OP_R
30ba0 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20  owSetTest: {    
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69   /* jump, in1, i
30bd0 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74  n3 */.  int iSet
30be0 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a  ;.  int exists;.
30bf0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
30c00 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
30c10 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
30c20 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d  ];.  iSet = pOp-
30c30 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28  >p4.i;.  assert(
30c40 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
30c50 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  _Int );..  /* If
30c60 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
30c70 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
30c80 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e  rowset object in
30c90 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c   memory cell P1,
30ca0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20  .  ** delete it 
30cb0 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  now and initiali
30cc0 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d  ze P1 with an em
30cd0 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a  pty rowset.  */.
30ce0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
30cf0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
30d00 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
30d10 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53  e3VdbeMemSetRowS
30d20 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66  et(pIn1);.    if
30d30 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
30d40 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
30d50 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
30d60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
30d70 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
30d80 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
30d90 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53 65   iSet==-1 || iSe
30da0 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53  t>=0 );.  if( iS
30db0 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74 73  et ){.    exists
30dc0 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74   = sqlite3RowSet
30dd0 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Test(pIn1->u.pRo
30de0 77 53 65 74 2c 20 69 53 65 74 2c 20 70 49 6e 33  wSet, iSet, pIn3
30df0 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 56 64 62 65  ->u.i);.    Vdbe
30e00 42 72 61 6e 63 68 54 61 6b 65 6e 28 65 78 69 73  BranchTaken(exis
30e10 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66  ts!=0,2);.    if
30e20 28 20 65 78 69 73 74 73 20 29 20 67 6f 74 6f 20  ( exists ) goto 
30e30 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
30e40 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b    if( iSet>=0 ){
30e50 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53  .    sqlite3RowS
30e60 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75  etInsert(pIn1->u
30e70 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d 3e  .pRowSet, pIn3->
30e80 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  u.i);.  }.  brea
30e90 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
30ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
30eb0 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  ER../* Opcode: P
30ec0 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33 20  rogram P1 P2 P3 
30ed0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63  P4 P5.**.** Exec
30ee0 75 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ute the trigger 
30ef0 70 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20 61  program passed a
30f00 73 20 50 34 20 28 74 79 70 65 20 50 34 5f 53 55  s P4 (type P4_SU
30f10 42 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a  BPROGRAM). .**.*
30f20 2a 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74 68  * P1 contains th
30f30 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
30f40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
30f50 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
30f60 69 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  irst memory .** 
30f70 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
30f80 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20   of values used 
30f90 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  as arguments to 
30fa0 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e  the sub-program.
30fb0 20 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73   P2 .** contains
30fc0 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f 20   the address to 
30fd0 6a 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20 73  jump to if the s
30fe0 75 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f 77  ub-program throw
30ff0 73 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20  s an IGNORE .** 
31000 65 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67 20  exception using 
31010 74 68 65 20 52 41 49 53 45 28 29 20 66 75 6e 63  the RAISE() func
31020 74 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20 50  tion. Register P
31030 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  3 contains the a
31040 64 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20  ddress .** of a 
31050 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
31060 68 69 73 20 28 74 68 65 20 70 61 72 65 6e 74 29  his (the parent)
31070 20 56 4d 20 74 68 61 74 20 69 73 20 75 73 65 64   VM that is used
31080 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
31090 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75   .** memory requ
310a0 69 72 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  ired by the sub-
310b0 76 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65 2e  vdbe at runtime.
310c0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
310d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 4d  ointer to the VM
310e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
310f0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
31100 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
31110 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72  non-zero, then r
31120 65 63 75 72 73 69 76 65 20 70 72 6f 67 72 61 6d  ecursive program
31130 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 20 65   invocation is e
31140 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  nabled..*/.case 
31150 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20  OP_Program: {   
31160 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
31170 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
31180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31190 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  ber of memory re
311a0 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d  gisters for sub-
311b0 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
311c0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
311d0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
311e0 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72   runtime space r
311f0 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d  equired for sub-
31200 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d  program */.  Mem
31210 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20 20   *pRt;          
31220 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
31230 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e   to allocate run
31240 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  time space */.  
31250 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20  Mem *pMem;      
31260 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
31270 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
31280 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  gh memory cells 
31290 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20  */.  Mem *pEnd; 
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
312b0 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  Last memory cell
312c0 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f   in new array */
312d0 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
312e0 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65  rame;      /* Ne
312f0 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20  w vdbe frame to 
31300 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20  execute in */.  
31310 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f  SubProgram *pPro
31320 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70  gram;   /* Sub-p
31330 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
31340 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20  e */.  void *t; 
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31360 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79  * Token identify
31370 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  ing trigger */..
31380 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70    pProgram = pOp
31390 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
313a0 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70   pRt = &aMem[pOp
313b0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
313c0 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30   pProgram->nOp>0
313d0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74   );.  .  /* If t
313e0 68 65 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c  he p5 flag is cl
313f0 65 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73  ear, then recurs
31400 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ive invocation o
31410 66 20 74 72 69 67 67 65 72 73 20 69 73 20 0a 20  f triggers is . 
31420 20 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72   ** disabled for
31430 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
31440 74 69 62 69 6c 69 74 79 20 28 70 35 20 69 73 20  tibility (p5 is 
31450 73 65 74 20 69 66 20 74 68 69 73 20 73 75 62 2d  set if this sub-
31460 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20  program.  ** is 
31470 72 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72  really a trigger
31480 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20  , not a foreign 
31490 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20  key action, and 
314a0 74 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a  the flag set.  *
314b0 2a 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  * and cleared by
314c0 20 74 68 65 20 22 50 52 41 47 4d 41 20 72 65 63   the "PRAGMA rec
314d0 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22  ursive_triggers"
314e0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61   command is clea
314f0 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  r)..  ** .  ** I
31500 74 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  t is recursive i
31510 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
31520 67 67 65 72 73 2c 20 61 74 20 74 68 65 20 53 51  ggers, at the SQ
31530 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73  L level, that is
31540 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e   .  ** disabled.
31550 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61   In some cases a
31560 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
31570 6d 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72  may generate mor
31580 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a  e than one .  **
31590 20 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20   SubProgram (if 
315a0 74 68 65 20 74 72 69 67 67 65 72 20 6d 61 79 20  the trigger may 
315b0 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
315c0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
315d0 69 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f  ifferent .  ** O
315e0 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72  N CONFLICT algor
315f0 69 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61  ithm). SubProgra
31600 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  m structures ass
31610 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 0a 20  ociated with a. 
31620 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67   ** single trigg
31630 65 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20  er all have the 
31640 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74  same value for t
31650 68 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f  he SubProgram.to
31660 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62  ken .  ** variab
31670 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  le.  */.  if( pO
31680 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d  p->p5 ){.    t =
31690 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e   pProgram->token
316a0 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
316b0 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
316c0 6d 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f  me && pFrame->to
316d0 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70  ken!=t; pFrame=p
316e0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
316f0 0a 20 20 20 20 69 66 28 20 70 46 72 61 6d 65 20  .    if( pFrame 
31700 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
31710 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64  if( p->nFrame>=d
31720 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
31730 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
31740 45 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20  EPTH] ){.    rc 
31750 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
31760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
31770 72 72 6f 72 28 70 2c 20 22 74 6f 6f 20 6d 61 6e  rror(p, "too man
31780 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67  y levels of trig
31790 67 65 72 20 72 65 63 75 72 73 69 6f 6e 22 29 3b  ger recursion");
317a0 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
317b0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
317c0 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
317d0 20 70 52 74 20 69 73 20 75 73 65 64 20 74 6f 20   pRt is used to 
317e0 73 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  store the memory
317f0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61 76   required to sav
31800 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
31810 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
31820 70 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68 65  program, and the
31830 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
31840 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 65   at runtime to e
31850 78 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65 20  xecute.  ** the 
31860 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
31870 20 49 66 20 74 68 69 73 20 74 72 69 67 67 65 72   If this trigger
31880 20 68 61 73 20 62 65 65 6e 20 66 69 72 65 64 20   has been fired 
31890 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52 74  before, then pRt
318a0 20 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64   .  ** is alread
318b0 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74 68  y allocated. Oth
318c0 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20  erwise, it must 
318d0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
318e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d 3e   */.  if( (pRt->
318f0 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65 29  flags&MEM_Frame)
31900 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 75  ==0 ){.    /* Su
31910 62 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69 73  bProgram.nMem is
31920 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
31930 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
31940 6c 73 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  ls used by the .
31950 20 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20 73      ** program s
31960 74 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f 67  tored in SubProg
31970 72 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c 6c  ram.aOp. As well
31980 20 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20 6d   as these, one m
31990 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65 6c  emory.    ** cel
319a0 6c 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  l is required fo
319b0 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 75 73  r each cursor us
319c0 65 64 20 62 79 20 74 68 65 20 70 72 6f 67 72 61  ed by the progra
319d0 6d 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20 20  m. Set local.   
319e0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d 65   ** variable nMe
319f0 6d 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56 64  m (and later, Vd
31a00 62 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d 65  beFrame.nChildMe
31a10 6d 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  m) to this value
31a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d 65  ..    */.    nMe
31a30 6d 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d  m = pProgram->nM
31a40 65 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  em + pProgram->n
31a50 43 73 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Csr;.    assert(
31a60 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 69   nMem>0 );.    i
31a70 66 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  f( pProgram->nCs
31a80 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b 2b 3b 0a 20  r==0 ) nMem++;. 
31a90 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
31aa0 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61  8(sizeof(VdbeFra
31ab0 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  me)).           
31ac0 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65     + nMem * size
31ad0 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20  of(Mem).        
31ae0 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d        + pProgram
31af0 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28  ->nCsr * sizeof(
31b00 56 64 62 65 43 75 72 73 6f 72 2a 29 0a 20 20 20  VdbeCursor*).   
31b10 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 70 50             + (pP
31b20 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20 37 29  rogram->nOp + 7)
31b30 2f 38 3b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d  /8;.    pFrame =
31b40 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
31b50 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
31b60 0a 20 20 20 20 69 66 28 20 21 70 46 72 61 6d 65  .    if( !pFrame
31b70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
31b80 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
31b90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
31ba0 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20 20 20  elease(pRt);.   
31bb0 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45   pRt->flags = ME
31bc0 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70 52 74  M_Frame;.    pRt
31bd0 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70 46 72  ->u.pFrame = pFr
31be0 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61 6d 65  ame;..    pFrame
31bf0 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46 72  ->v = p;.    pFr
31c00 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 3d  ame->nChildMem =
31c10 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d   nMem;.    pFram
31c20 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20 70  e->nChildCsr = p
31c30 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20  Program->nCsr;. 
31c40 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d 20     pFrame->pc = 
31c50 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
31c60 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4d  ;.    pFrame->aM
31c70 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20  em = p->aMem;.  
31c80 20 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d    pFrame->nMem =
31c90 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 46   p->nMem;.    pF
31ca0 72 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20 70 2d  rame->apCsr = p-
31cb0 3e 61 70 43 73 72 3b 0a 20 20 20 20 70 46 72 61  >apCsr;.    pFra
31cc0 6d 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 2d  me->nCursor = p-
31cd0 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 46  >nCursor;.    pF
31ce0 72 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61  rame->aOp = p->a
31cf0 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  Op;.    pFrame->
31d00 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
31d10 20 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20    pFrame->token 
31d20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65  = pProgram->toke
31d30 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
31d40 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
31d50 4e 53 54 41 54 55 53 0a 20 20 20 20 70 46 72 61  NSTATUS.    pFra
31d60 6d 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d 3e  me->anExec = p->
31d70 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 0a  anExec;.#endif..
31d80 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62 65      pEnd = &Vdbe
31d90 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29  FrameMem(pFrame)
31da0 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d  [pFrame->nChildM
31db0 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d 65  em];.    for(pMe
31dc0 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  m=VdbeFrameMem(p
31dd0 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70 45  Frame); pMem!=pE
31de0 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  nd; pMem++){.   
31df0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
31e00 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
31e10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d        pMem->db =
31e20 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   db;.    }.  }el
31e30 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d  se{.    pFrame =
31e40 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b 0a   pRt->u.pFrame;.
31e50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 6f      assert( pPro
31e60 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67  gram->nMem+pProg
31e70 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d  ram->nCsr==pFram
31e80 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 0a 20 20  e->nChildMem .  
31e90 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 67 72        || (pProgr
31ea0 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20 26 26 20 70  am->nCsr==0 && p
31eb0 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d  Program->nMem+1=
31ec0 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d  =pFrame->nChildM
31ed0 65 6d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  em) );.    asser
31ee0 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  t( pProgram->nCs
31ef0 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  r==pFrame->nChil
31f00 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dCsr );.    asse
31f10 72 74 28 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  rt( (int)(pOp - 
31f20 61 4f 70 29 3d 3d 70 46 72 61 6d 65 2d 3e 70 63  aOp)==pFrame->pc
31f30 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46   );.  }..  p->nF
31f40 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d 65  rame++;.  pFrame
31f50 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70  ->pParent = p->p
31f60 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d  Frame;.  pFrame-
31f70 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d  >lastRowid = db-
31f80 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46  >lastRowid;.  pF
31f90 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  rame->nChange = 
31fa0 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 46  p->nChange;.  pF
31fb0 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 20  rame->nDbChange 
31fc0 3d 20 70 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65  = p->db->nChange
31fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 61  ;.  assert( pFra
31fe0 6d 65 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20  me->pAuxData==0 
31ff0 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  );.  pFrame->pAu
32000 78 44 61 74 61 20 3d 20 70 2d 3e 70 41 75 78 44  xData = p->pAuxD
32010 61 74 61 3b 0a 20 20 70 2d 3e 70 41 75 78 44 61  ata;.  p->pAuxDa
32020 74 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68  ta = 0;.  p->nCh
32030 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  ange = 0;.  p->p
32040 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
32050 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d    p->aMem = aMem
32060 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
32070 70 46 72 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d  pFrame);.  p->nM
32080 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  em = pFrame->nCh
32090 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75  ildMem;.  p->nCu
320a0 72 73 6f 72 20 3d 20 28 75 31 36 29 70 46 72 61  rsor = (u16)pFra
320b0 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20  me->nChildCsr;. 
320c0 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62   p->apCsr = (Vdb
320d0 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
320e0 5b 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 46 72  [p->nMem];.  pFr
320f0 61 6d 65 2d 3e 61 4f 6e 63 65 20 3d 20 28 75 38  ame->aOnce = (u8
32100 2a 29 26 70 2d 3e 61 70 43 73 72 5b 70 50 72 6f  *)&p->apCsr[pPro
32110 67 72 61 6d 2d 3e 6e 43 73 72 5d 3b 0a 20 20 6d  gram->nCsr];.  m
32120 65 6d 73 65 74 28 70 46 72 61 6d 65 2d 3e 61 4f  emset(pFrame->aO
32130 6e 63 65 2c 20 30 2c 20 28 70 50 72 6f 67 72 61  nce, 0, (pProgra
32140 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f 38 29 3b 0a  m->nOp + 7)/8);.
32150 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20 3d    p->aOp = aOp =
32160 20 70 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b 0a   pProgram->aOp;.
32170 20 20 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f 67    p->nOp = pProg
32180 72 61 6d 2d 3e 6e 4f 70 3b 0a 23 69 66 64 65 66  ram->nOp;.#ifdef
32190 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
321a0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
321b0 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 30 3b 0a   p->anExec = 0;.
321c0 23 65 6e 64 69 66 0a 20 20 70 4f 70 20 3d 20 26  #endif.  pOp = &
321d0 61 4f 70 5b 2d 31 5d 3b 0a 0a 20 20 62 72 65 61  aOp[-1];..  brea
321e0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
321f0 20 50 61 72 61 6d 20 50 31 20 50 32 20 2a 20 2a   Param P1 P2 * *
32200 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
32210 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  code is only eve
32220 72 20 70 72 65 73 65 6e 74 20 69 6e 20 73 75 62  r present in sub
32230 2d 70 72 6f 67 72 61 6d 73 20 63 61 6c 6c 65 64  -programs called
32240 20 76 69 61 20 74 68 65 20 0a 2a 2a 20 4f 50 5f   via the .** OP_
32250 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74  Program instruct
32260 69 6f 6e 2e 20 43 6f 70 79 20 61 20 76 61 6c 75  ion. Copy a valu
32270 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
32280 65 64 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 0a  ed in a memory .
32290 2a 2a 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 63  ** cell of the c
322a0 61 6c 6c 69 6e 67 20 28 70 61 72 65 6e 74 29 20  alling (parent) 
322b0 66 72 61 6d 65 20 74 6f 20 63 65 6c 6c 20 50 32  frame to cell P2
322c0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
322d0 66 72 61 6d 65 73 20 0a 2a 2a 20 61 64 64 72 65  frames .** addre
322e0 73 73 20 73 70 61 63 65 2e 20 54 68 69 73 20 69  ss space. This i
322f0 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65  s used by trigge
32300 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20 61 63  r programs to ac
32310 63 65 73 73 20 74 68 65 20 6e 65 77 2e 2a 20 0a  cess the new.* .
32320 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 76 61 6c  ** and old.* val
32330 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ues..**.** The a
32340 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63 65  ddress of the ce
32350 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ll in the parent
32360 20 66 72 61 6d 65 20 69 73 20 64 65 74 65 72 6d   frame is determ
32370 69 6e 65 64 20 62 79 20 61 64 64 69 6e 67 0a 2a  ined by adding.*
32380 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
32390 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20 74  he P1 argument t
323a0 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
323b0 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20 74  he P1 argument t
323c0 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  o the.** calling
323d0 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74   OP_Program inst
323e0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
323f0 20 4f 50 5f 50 61 72 61 6d 3a 20 7b 20 20 20 20   OP_Param: {    
32400 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
32410 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
32420 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70 49  Frame;.  Mem *pI
32430 6e 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  n;.  pOut = out2
32440 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
32450 70 29 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20 70  p);.  pFrame = p
32460 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e 20  ->pFrame;.  pIn 
32470 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
32480 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d 65  pOp->p1 + pFrame
32490 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70 63  ->aOp[pFrame->pc
324a0 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c 69  ].p1];   .  sqli
324b0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
324c0 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 2c  wCopy(pOut, pIn,
324d0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 62   MEM_Ephem);.  b
324e0 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  reak;.}..#endif 
324f0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
32500 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a  E_OMIT_TRIGGER *
32510 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
32520 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
32530 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  EY./* Opcode: Fk
32540 43 6f 75 6e 74 65 72 20 50 31 20 50 32 20 2a 20  Counter P1 P2 * 
32550 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
32560 20 66 6b 63 74 72 5b 50 31 5d 2b 3d 50 32 0a 2a   fkctr[P1]+=P2.*
32570 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 61  *.** Increment a
32580 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75   "constraint cou
32590 6e 74 65 72 22 20 62 79 20 50 32 20 28 50 32 20  nter" by P2 (P2 
325a0 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 20  may be negative 
325b0 6f 72 20 70 6f 73 69 74 69 76 65 29 2e 0a 2a 2a  or positive)..**
325c0 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65   If P1 is non-ze
325d0 72 6f 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ro, the database
325e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
325f0 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ter is increment
32600 65 64 20 0a 2a 2a 20 28 64 65 66 65 72 72 65 64  ed .** (deferred
32610 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
32620 73 74 72 61 69 6e 74 73 29 2e 20 4f 74 68 65 72  straints). Other
32630 77 69 73 65 2c 20 69 66 20 50 31 20 69 73 20 7a  wise, if P1 is z
32640 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20 73 74 61  ero, the .** sta
32650 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65 72 20 69  tement counter i
32660 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 69  s incremented (i
32670 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
32680 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
32690 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b  )..*/.case OP_Fk
326a0 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20 69 66 28  Counter: {.  if(
326b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
326c0 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 7b 0a  ITE_DeferFKs ){.
326d0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
326e0 64 49 6d 6d 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d  dImmCons += pOp-
326f0 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >p2;.  }else if(
32700 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
32710 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
32720 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  s += pOp->p2;.  
32730 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 46  }else{.    p->nF
32740 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20 70  kConstraint += p
32750 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20 62 72  Op->p2;.  }.  br
32760 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
32770 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50 31 20 50  e: FkIfZero P1 P
32780 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
32790 73 69 73 3a 20 69 66 20 66 6b 63 74 72 5b 50 31  sis: if fkctr[P1
327a0 5d 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  ]==0 goto P2.**.
327b0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74  ** This opcode t
327c0 65 73 74 73 20 69 66 20 61 20 66 6f 72 65 69 67  ests if a foreig
327d0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
327e0 2d 63 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72  -counter is curr
327f0 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20 49  ently zero..** I
32800 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  f so, jump to in
32810 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74  struction P2. Ot
32820 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
32830 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
32840 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  t .** instructio
32850 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69  n..**.** If P1 i
32860 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
32870 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
32880 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
32890 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f  se constraint-co
328a0 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  unter.** is zero
328b0 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 63   (the one that c
328c0 6f 75 6e 74 73 20 64 65 66 65 72 72 65 64 20 63  ounts deferred c
328d0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
328e0 69 6f 6e 73 29 2e 20 49 66 20 50 31 20 69 73 0a  ions). If P1 is.
328f0 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75 6d  ** zero, the jum
32900 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
32910 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 73  e statement cons
32920 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
32930 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65 64  s zero.** (immed
32940 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
32950 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
32960 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73 65  ations)..*/.case
32970 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b 20   OP_FkIfZero: { 
32980 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
32990 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  */.  if( pOp->p1
329a0 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e   ){.    VdbeBran
329b0 63 68 54 61 6b 65 6e 28 64 62 2d 3e 6e 44 65 66  chTaken(db->nDef
329c0 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26 20  erredCons==0 && 
329d0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
329e0 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20 20  Cons==0, 2);.   
329f0 20 69 66 28 20 64 62 2d 3e 6e 44 65 66 65 72 72   if( db->nDeferr
32a00 65 64 43 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d  edCons==0 && db-
32a10 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
32a20 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70  s==0 ) goto jump
32a30 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b  _to_p2;.  }else{
32a40 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
32a50 61 6b 65 6e 28 70 2d 3e 6e 46 6b 43 6f 6e 73 74  aken(p->nFkConst
32a60 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e  raint==0 && db->
32a70 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
32a80 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28  ==0, 2);.    if(
32a90 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
32aa0 74 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  t==0 && db->nDef
32ab0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20  erredImmCons==0 
32ac0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
32ad0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
32ae0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
32af0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32b00 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f 0a 0a  FOREIGN_KEY */..
32b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32b20 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
32b30 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d  T./* Opcode: Mem
32b40 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Max P1 P2 * * *.
32b50 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
32b60 31 5d 3d 6d 61 78 28 72 5b 50 31 5d 2c 72 5b 50  1]=max(r[P1],r[P
32b70 32 5d 29 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  2]).**.** P1 is 
32b80 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  a register in th
32b90 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20  e root frame of 
32ba0 74 68 69 73 20 56 4d 20 28 74 68 65 20 72 6f 6f  this VM (the roo
32bb0 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20 64 69  t frame is.** di
32bc0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
32bd0 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 69   current frame i
32be0 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
32bf0 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78 65 63  on is being exec
32c00 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61  uted.** within a
32c10 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e 20 53   sub-program). S
32c20 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
32c30 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 74  register P1 to t
32c40 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 2a  he maximum of .*
32c50 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  * its current va
32c60 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
32c70 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
32c80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
32c90 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77 73 20  truction throws 
32ca0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
32cb0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20 6e  memory cell is n
32cc0 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20  ot initially.** 
32cd0 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63  an integer..*/.c
32ce0 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20 7b  ase OP_MemMax: {
32cf0 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a          /* in2 *
32d00 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
32d10 46 72 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d 3e  Frame;.  if( p->
32d20 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f  pFrame ){.    fo
32d30 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
32d40 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
32d50 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
32d60 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
32d70 20 20 70 49 6e 31 20 3d 20 26 70 46 72 61 6d 65    pIn1 = &pFrame
32d80 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b  ->aMem[pOp->p1];
32d90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
32da0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
32db0 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  p1];.  }.  asser
32dc0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49  t( memIsValid(pI
32dd0 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  n1) );.  sqlite3
32de0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
32df0 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20  y(pIn1);.  pIn2 
32e00 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
32e10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
32e20 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
32e30 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  2);.  if( pIn1->
32e40 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b 0a  u.i<pIn2->u.i){.
32e50 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20      pIn1->u.i = 
32e60 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pIn2->u.i;.  }. 
32e70 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
32e80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32e90 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f  AUTOINCREMENT */
32ea0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 50  ../* Opcode: IfP
32eb0 6f 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  os P1 P2 P3 * *.
32ec0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
32ed0 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b 50  r[P1]>0 then r[P
32ee0 31 5d 2d 3d 50 33 2c 20 67 6f 74 6f 20 50 32 0a  1]-=P3, goto P2.
32ef0 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
32f00 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61  1 must contain a
32f10 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49 66  n integer..** If
32f20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65   the value of re
32f30 67 69 73 74 65 72 20 50 31 20 69 73 20 31 20 6f  gister P1 is 1 o
32f40 72 20 67 72 65 61 74 65 72 2c 20 73 75 62 74 72  r greater, subtr
32f50 61 63 74 20 50 33 20 66 72 6f 6d 20 74 68 65 0a  act P3 from the.
32f60 2a 2a 20 76 61 6c 75 65 20 69 6e 20 50 31 20 61  ** value in P1 a
32f70 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  nd jump to P2..*
32f80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 69 74  *.** If the init
32f90 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 65 67  ial value of reg
32fa0 69 73 74 65 72 20 50 31 20 69 73 20 6c 65 73 73  ister P1 is less
32fb0 20 74 68 61 6e 20 31 2c 20 74 68 65 6e 20 74 68   than 1, then th
32fc0 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 75 6e  e.** value is un
32fd0 63 68 61 6e 67 65 64 20 61 6e 64 20 63 6f 6e 74  changed and cont
32fe0 72 6f 6c 20 70 61 73 73 65 73 20 74 68 72 6f 75  rol passes throu
32ff0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
33000 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
33010 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b 20  ase OP_IfPos: { 
33020 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
33030 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
33040 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
33050 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
33060 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
33070 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
33080 65 6e 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 2c  en( pIn1->u.i>0,
33090 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d   2);.  if( pIn1-
330a0 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20 70 49  >u.i>0 ){.    pI
330b0 6e 31 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70 2d 3e  n1->u.i -= pOp->
330c0 70 33 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d  p3;.    goto jum
330d0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
330e0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
330f0 64 65 3a 20 4f 66 66 73 65 74 4c 69 6d 69 74 20  de: OffsetLimit 
33100 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
33110 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50  Synopsis: if r[P
33120 31 5d 3e 30 20 74 68 65 6e 20 72 5b 50 32 5d 3d  1]>0 then r[P2]=
33130 72 5b 50 31 5d 2b 6d 61 78 28 30 2c 72 5b 50 33  r[P1]+max(0,r[P3
33140 5d 29 20 65 6c 73 65 20 72 5b 50 32 5d 3d 28 2d  ]) else r[P2]=(-
33150 31 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  1).**.** This op
33160 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 61 20  code performs a 
33170 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 63 6f  commonly used co
33180 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 6f 63 69  mputation associ
33190 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 4c 49 4d  ated with.** LIM
331a0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 70 72  IT and OFFSET pr
331b0 6f 63 65 73 73 2e 20 20 72 5b 50 31 5d 20 68 6f  ocess.  r[P1] ho
331c0 6c 64 73 20 74 68 65 20 6c 69 6d 69 74 20 63 6f  lds the limit co
331d0 75 6e 74 65 72 2e 20 20 72 5b 50 33 5d 0a 2a 2a  unter.  r[P3].**
331e0 20 68 6f 6c 64 73 20 74 68 65 20 6f 66 66 73 65   holds the offse
331f0 74 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 65 20  t counter.  The 
33200 6f 70 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 20  opcode computes 
33210 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 76 61 6c  the combined val
33220 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4c 49 4d  ue.** of the LIM
33230 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 61 6e  IT and OFFSET an
33240 64 20 73 74 6f 72 65 73 20 74 68 61 74 20 76 61  d stores that va
33250 6c 75 65 20 69 6e 20 72 5b 50 32 5d 2e 20 20 54  lue in r[P2].  T
33260 68 65 20 72 5b 50 32 5d 0a 2a 2a 20 76 61 6c 75  he r[P2].** valu
33270 65 20 63 6f 6d 70 75 74 65 64 20 69 73 20 74 68  e computed is th
33280 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
33290 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
332a0 20 6e 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 76   need to be.** v
332b0 69 73 69 74 65 64 20 69 6e 20 6f 72 64 65 72 20  isited in order 
332c0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
332d0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
332e0 72 5b 50 33 5d 20 69 73 20 7a 65 72 6f 20 6f 72  r[P3] is zero or
332f0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74 20   negative, that 
33300 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
33310 6f 20 4f 46 46 53 45 54 0a 2a 2a 20 61 6e 64 20  o OFFSET.** and 
33320 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20  r[P2] is set to 
33330 62 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  be the value of 
33340 74 68 65 20 4c 49 4d 49 54 2c 20 72 5b 50 31 5d  the LIMIT, r[P1]
33350 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 72 5b 50 31 5d  ..**.** if r[P1]
33360 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
33370 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  tive, that means
33380 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   there is no LIM
33390 49 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d 20  IT.** and r[P2] 
333a0 69 73 20 73 65 74 20 74 6f 20 2d 31 2e 20 0a 2a  is set to -1. .*
333b0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
333c0 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20  r[P2] is set to 
333d0 74 68 65 20 73 75 6d 20 6f 66 20 72 5b 50 31 5d  the sum of r[P1]
333e0 20 61 6e 64 20 72 5b 50 33 5d 2e 0a 2a 2f 0a 63   and r[P3]..*/.c
333f0 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  ase OP_OffsetLim
33400 69 74 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 31 2c  it: {    /* in1,
33410 20 6f 75 74 32 2c 20 69 6e 33 20 2a 2f 0a 20 20   out2, in3 */.  
33420 69 36 34 20 78 3b 0a 20 20 70 49 6e 31 20 3d 20  i64 x;.  pIn1 = 
33430 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
33440 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
33450 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4f 75 74 20  Op->p3];.  pOut 
33460 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
33470 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65  (p, pOp);.  asse
33480 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  rt( pIn1->flags 
33490 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  & MEM_Int );.  a
334a0 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
334b0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
334c0 20 20 78 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b    x = pIn1->u.i;
334d0 0a 20 20 69 66 28 20 78 3c 3d 30 20 7c 7c 20 73  .  if( x<=0 || s
334e0 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
334f0 78 2c 20 70 49 6e 33 2d 3e 75 2e 69 3e 30 3f 70  x, pIn3->u.i>0?p
33500 49 6e 33 2d 3e 75 2e 69 3a 30 29 20 29 7b 0a 20  In3->u.i:0) ){. 
33510 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 49 4d     /* If the LIM
33520 49 54 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  IT is less than 
33530 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
33540 2c 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20  , loop forever. 
33550 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
33560 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 42 75 74  documented.  But
33570 20 61 6c 73 6f 2c 20 69 66 20 74 68 65 20 4c 49   also, if the LI
33580 4d 49 54 2b 4f 46 46 53 45 54 20 65 78 63 65 65  MIT+OFFSET excee
33590 64 73 20 32 5e 36 33 20 74 68 65 6e 0a 20 20 20  ds 2^63 then.   
335a0 20 2a 2a 20 61 6c 73 6f 20 6c 6f 6f 70 20 66 6f   ** also loop fo
335b0 72 65 76 65 72 2e 20 20 54 68 69 73 20 69 73 20  rever.  This is 
335c0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49  undocumented.  I
335d0 6e 20 66 61 63 74 2c 20 6f 6e 65 20 63 6f 75 6c  n fact, one coul
335e0 64 20 61 72 67 75 65 0a 20 20 20 20 2a 2a 20 74  d argue.    ** t
335f0 68 61 74 20 74 68 65 20 6c 6f 6f 70 20 73 68 6f  hat the loop sho
33600 75 6c 64 20 74 65 72 6d 69 6e 61 74 65 2e 20 20  uld terminate.  
33610 42 75 74 20 61 73 73 75 6d 69 6e 67 20 31 20 62  But assuming 1 b
33620 69 6c 6c 69 6f 6e 20 69 74 65 72 61 74 69 6f 6e  illion iteration
33630 73 0a 20 20 20 20 2a 2a 20 70 65 72 20 73 65 63  s.    ** per sec
33640 6f 6e 64 20 28 66 61 72 20 65 78 63 65 65 64 69  ond (far exceedi
33650 6e 67 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  ng the capabilit
33660 69 65 73 20 6f 66 20 61 6e 79 20 63 75 72 72 65  ies of any curre
33670 6e 74 20 68 61 72 64 77 61 72 65 29 0a 20 20 20  nt hardware).   
33680 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 74 61 6b   ** it would tak
33690 65 20 6e 65 61 72 6c 79 20 33 30 30 20 79 65 61  e nearly 300 yea
336a0 72 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72  rs to actually r
336b0 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74 2e 20  each the limit. 
336c0 20 53 6f 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 69   So.    ** loopi
336d0 6e 67 20 66 6f 72 65 76 65 72 20 69 73 20 61 20  ng forever is a 
336e0 72 65 61 73 6f 6e 61 62 6c 65 20 61 70 70 72 6f  reasonable appro
336f0 78 69 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ximation. */.   
33700 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2d 31 3b   pOut->u.i = -1;
33710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f  .  }else{.    pO
33720 75 74 2d 3e 75 2e 69 20 3d 20 78 3b 0a 20 20 7d  ut->u.i = x;.  }
33730 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
33740 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 5a 65 72  Opcode: IfNotZer
33750 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  o P1 P2 * * *.**
33760 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
33770 50 31 5d 21 3d 30 20 74 68 65 6e 20 72 5b 50 31  P1]!=0 then r[P1
33780 5d 2d 2d 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  ]--, goto P2.**.
33790 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 6d  ** Register P1 m
337a0 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  ust contain an i
337b0 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
337c0 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
337d0 74 65 72 20 50 31 20 69 73 0a 2a 2a 20 69 6e 69  ter P1 is.** ini
337e0 74 69 61 6c 6c 79 20 67 72 65 61 74 65 72 20 74  tially greater t
337f0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 64  han zero, then d
33800 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ecrement the val
33810 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
33820 31 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  1..** If it is n
33830 6f 6e 2d 7a 65 72 6f 20 28 6e 65 67 61 74 69 76  on-zero (negativ
33840 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 20 61  e or positive) a
33850 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 6a 75 6d  nd then also jum
33860 70 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 49 66  p to P2.  .** If
33870 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
33880 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 2c 20  initially zero, 
33890 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61 6e 67  leave it unchang
338a0 65 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f  ed and fall thro
338b0 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ugh..*/.case OP_
338c0 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b 20 20 20 20  IfNotZero: {    
338d0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
338e0 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
338f0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
33900 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
33910 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  gs&MEM_Int );.  
33920 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
33930 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c 20 32 29 3b  pIn1->u.i<0, 2);
33940 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
33950 20 29 7b 0a 20 20 20 20 20 69 66 28 20 70 49 6e   ){.     if( pIn
33960 31 2d 3e 75 2e 69 3e 30 20 29 20 70 49 6e 31 2d  1->u.i>0 ) pIn1-
33970 3e 75 2e 69 2d 2d 3b 0a 20 20 20 20 20 67 6f 74  >u.i--;.     got
33980 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
33990 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
339a0 20 4f 70 63 6f 64 65 3a 20 44 65 63 72 4a 75 6d   Opcode: DecrJum
339b0 70 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20  pZero P1 P2 * * 
339c0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
339d0 66 20 28 2d 2d 72 5b 50 31 5d 29 3d 3d 30 20 67  f (--r[P1])==0 g
339e0 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67  oto P2.**.** Reg
339f0 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 68 6f  ister P1 must ho
33a00 6c 64 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ld an integer.  
33a10 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Decrement the va
33a20 6c 75 65 20 69 6e 20 50 31 0a 2a 2a 20 61 6e 64  lue in P1.** and
33a30 20 6a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   jump to P2 if t
33a40 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
33a50 65 78 61 63 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2f  exactly zero..*/
33a60 0a 63 61 73 65 20 4f 50 5f 44 65 63 72 4a 75 6d  .case OP_DecrJum
33a70 70 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 2f 2a  pZero: {      /*
33a80 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
33a90 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
33aa0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
33ab0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
33ac0 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49  _Int );.  if( pI
33ad0 6e 31 2d 3e 75 2e 69 3e 53 4d 41 4c 4c 45 53 54  n1->u.i>SMALLEST
33ae0 5f 49 4e 54 36 34 20 29 20 70 49 6e 31 2d 3e 75  _INT64 ) pIn1->u
33af0 2e 69 2d 2d 3b 0a 20 20 56 64 62 65 42 72 61 6e  .i--;.  VdbeBran
33b00 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e  chTaken(pIn1->u.
33b10 69 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  i==0, 2);.  if( 
33b20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 20 67  pIn1->u.i==0 ) g
33b30 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
33b40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
33b50 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 30  Opcode: AggStep0
33b60 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a   * P2 P3 P4 P5.*
33b70 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
33b80 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50  m=r[P3] step(r[P
33b90 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65  2@P5]).**.** Exe
33ba0 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75  cute the step fu
33bb0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
33bc0 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a  gregate.  The.**
33bd0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35   function has P5
33be0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34   arguments.   P4
33bf0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
33c00 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20   the FuncDef.** 
33c10 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 73  structure that s
33c20 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75 6e  pecifies the fun
33c30 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74 65 72  ction.  Register
33c40 20 50 33 20 69 73 20 74 68 65 0a 2a 2a 20 61 63   P3 is the.** ac
33c50 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
33c60 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74   The P5 argument
33c70 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
33c80 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
33c90 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f   its.** successo
33ca0 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  rs..*/./* Opcode
33cb0 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32 20 50  : AggStep * P2 P
33cc0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
33cd0 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d  sis: accum=r[P3]
33ce0 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d 29 0a   step(r[P2@P5]).
33cf0 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  **.** Execute th
33d00 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
33d10 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
33d20 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69  .  The.** functi
33d30 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d 65  on has P5 argume
33d40 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61 20 70  nts.   P4 is a p
33d50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
33d60 69 74 65 33 5f 63 6f 6e 74 65 78 74 0a 2a 2a 20  ite3_context.** 
33d70 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 75  object that is u
33d80 73 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 66  sed to run the f
33d90 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74  unction.  Regist
33da0 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 73 20 74  er P3 is.** as t
33db0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  he accumulator..
33dc0 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67  **.** The P5 arg
33dd0 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e  uments are taken
33de0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
33df0 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63  2 and its.** suc
33e00 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  cessors..**.** T
33e10 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  his opcode is in
33e20 69 74 69 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  itially coded as
33e30 20 4f 50 5f 41 67 67 53 74 65 70 30 2e 20 20 4f   OP_AggStep0.  O
33e40 6e 20 66 69 72 73 74 20 65 76 61 6c 75 61 74 69  n first evaluati
33e50 6f 6e 2c 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44  on,.** the FuncD
33e60 65 66 20 73 74 6f 72 65 64 20 69 6e 20 50 34 20  ef stored in P4 
33e70 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
33e80 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e  o an sqlite3_con
33e90 74 65 78 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20  text and.** the 
33ea0 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65  opcode is change
33eb0 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  d.  In this way,
33ec0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
33ed0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71  ion of the.** sq
33ee0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 6e  lite3_context on
33ef0 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2c  ly happens once,
33f00 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 20 65   instead of on e
33f10 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 65 0a  ach call to the.
33f20 2a 2a 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ** step function
33f30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
33f40 53 74 65 70 30 3a 20 7b 0a 20 20 69 6e 74 20 6e  Step0: {.  int n
33f50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ;.  sqlite3_cont
33f60 65 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73  ext *pCtx;..  as
33f70 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
33f80 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20 29 3b  e==P4_FUNCDEF );
33f90 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  .  n = pOp->p5;.
33fa0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
33fb0 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
33fc0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
33fd0 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73  nCursor) );.  as
33fe0 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28 70  sert( n==0 || (p
33ff0 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
34000 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  >p2+n<=(p->nMem+
34010 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
34020 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
34030 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20  pOp->p3<pOp->p2 
34040 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d  || pOp->p3>=pOp-
34050 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78 20  >p2+n );.  pCtx 
34060 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
34070 63 52 61 77 4e 4e 28 64 62 2c 20 6e 2a 73 69 7a  cRawNN(db, n*siz
34080 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  eof(sqlite3_valu
34090 65 2a 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  e*) +.          
340a0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 70 43 74       (sizeof(pCt
340b0 78 5b 30 5d 29 20 2b 20 73 69 7a 65 6f 66 28 4d  x[0]) + sizeof(M
340c0 65 6d 29 20 2d 20 73 69 7a 65 6f 66 28 73 71 6c  em) - sizeof(sql
340d0 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 29 3b 0a  ite3_value*)));.
340e0 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20    if( pCtx==0 ) 
340f0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
34100 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20  Ctx->pMem = 0;. 
34110 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 28 4d   pCtx->pOut = (M
34120 65 6d 2a 29 26 28 70 43 74 78 2d 3e 61 72 67 76  em*)&(pCtx->argv
34130 5b 6e 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  [n]);.  sqlite3V
34140 64 62 65 4d 65 6d 49 6e 69 74 28 70 43 74 78 2d  dbeMemInit(pCtx-
34150 3e 70 4f 75 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e  >pOut, db, MEM_N
34160 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70 46  ull);.  pCtx->pF
34170 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  unc = pOp->p4.pF
34180 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70  unc;.  pCtx->iOp
34190 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
341a0 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64  Op);.  pCtx->pVd
341b0 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e  be = p;.  pCtx->
341c0 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20 20  skipFlag = 0;.  
341d0 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 3d 20  pCtx->isError = 
341e0 30 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20  0;.  pCtx->argc 
341f0 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = n;.  pOp->p4ty
34200 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b  pe = P4_FUNCCTX;
34210 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20  .  pOp->p4.pCtx 
34220 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f  = pCtx;.  pOp->o
34230 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74  pcode = OP_AggSt
34240 65 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ep;.  /* Fall th
34250 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67  rough into OP_Ag
34260 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20  gStep */.}.case 
34270 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20  OP_AggStep: {.  
34280 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
34290 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
342a0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20    Mem *pMem;..  
342b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
342c0 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43 54 58 20  ype==P4_FUNCCTX 
342d0 29 3b 0a 20 20 70 43 74 78 20 3d 20 70 4f 70 2d  );.  pCtx = pOp-
342e0 3e 70 34 2e 70 43 74 78 3b 0a 20 20 70 4d 65 6d  >p4.pCtx;.  pMem
342f0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
34300 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ];..  /* If this
34310 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 73   function is ins
34320 69 64 65 20 6f 66 20 61 20 74 72 69 67 67 65 72  ide of a trigger
34330 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  , the register a
34340 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a 20  rray in aMem[]. 
34350 20 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65   ** might change
34360 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61 6c 75 61   from one evalua
34370 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78 74  tion to the next
34380 2e 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .  The next bloc
34390 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a 2a 20 63  k of code.  ** c
343a0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
343b0 74 68 65 20 72 65 67 69 73 74 65 72 20 61 72 72  the register arr
343c0 61 79 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  ay has changed, 
343d0 61 6e 64 20 69 66 20 73 6f 20 69 74 0a 20 20 2a  and if so it.  *
343e0 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 73 20  * reinitializes 
343f0 74 68 65 20 72 65 6c 61 76 61 6e 74 20 70 61 72  the relavant par
34400 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ts of the sqlite
34410 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  3_context object
34420 20 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e   */.  if( pCtx->
34430 70 4d 65 6d 20 21 3d 20 70 4d 65 6d 20 29 7b 0a  pMem != pMem ){.
34440 20 20 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d      pCtx->pMem =
34450 20 70 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69   pMem;.    for(i
34460 3d 70 43 74 78 2d 3e 61 72 67 63 2d 31 3b 20 69  =pCtx->argc-1; i
34470 3e 3d 30 3b 20 69 2d 2d 29 20 70 43 74 78 2d 3e  >=0; i--) pCtx->
34480 61 72 67 76 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b  argv[i] = &aMem[
34490 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a  pOp->p2+i];.  }.
344a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
344b0 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
344c0 69 3c 70 43 74 78 2d 3e 61 72 67 63 3b 20 69 2b  i<pCtx->argc; i+
344d0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
344e0 6d 65 6d 49 73 56 61 6c 69 64 28 70 43 74 78 2d  memIsValid(pCtx-
344f0 3e 61 72 67 76 5b 69 5d 29 20 29 3b 0a 20 20 20  >argv[i]) );.   
34500 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
34510 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 43 74 78 2d  pOp->p2+i, pCtx-
34520 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 23  >argv[i]);.  }.#
34530 65 6e 64 69 66 0a 0a 20 20 70 4d 65 6d 2d 3e 6e  endif..  pMem->n
34540 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ++;.  assert( pC
34550 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 3d  tx->pOut->flags=
34560 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 61  =MEM_Null );.  a
34570 73 73 65 72 74 28 20 70 43 74 78 2d 3e 69 73 45  ssert( pCtx->isE
34580 72 72 6f 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rror==0 );.  ass
34590 65 72 74 28 20 70 43 74 78 2d 3e 73 6b 69 70 46  ert( pCtx->skipF
345a0 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 28 70 43 74  lag==0 );.  (pCt
345b0 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  x->pFunc->xSFunc
345c0 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72 67  )(pCtx,pCtx->arg
345d0 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f  c,pCtx->argv); /
345e0 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32  * IMP: R-24505-2
345f0 33 32 33 30 20 2a 2f 0a 20 20 69 66 28 20 70 43  3230 */.  if( pC
34600 74 78 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20  tx->isError ){. 
34610 20 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45     if( pCtx->isE
34620 72 72 6f 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  rror>0 ){.      
34630 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
34640 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  (p, "%s", sqlite
34650 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 43 74  3_value_text(pCt
34660 78 2d 3e 70 4f 75 74 29 29 3b 0a 20 20 20 20 20  x->pOut));.     
34670 20 72 63 20 3d 20 70 43 74 78 2d 3e 69 73 45 72   rc = pCtx->isEr
34680 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
34690 66 28 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61  f( pCtx->skipFla
346a0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
346b0 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
346c0 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
346d0 0a 20 20 20 20 20 20 69 20 3d 20 70 4f 70 5b 2d  .      i = pOp[-
346e0 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28  1].p1;.      if(
346f0 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   i ) sqlite3Vdbe
34700 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65  MemSetInt64(&aMe
34710 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  m[i], 1);.      
34720 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d  pCtx->skipFlag =
34730 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
34740 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
34750 61 73 65 28 70 43 74 78 2d 3e 70 4f 75 74 29 3b  ase(pCtx->pOut);
34760 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 75 74 2d  .    pCtx->pOut-
34770 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
34780 6c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 69 73 45  l;.    pCtx->isE
34790 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  rror = 0;.    if
347a0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
347b0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
347c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
347d0 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 3d  tx->pOut->flags=
347e0 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 61  =MEM_Null );.  a
347f0 73 73 65 72 74 28 20 70 43 74 78 2d 3e 73 6b 69  ssert( pCtx->ski
34800 70 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 62 72  pFlag==0 );.  br
34810 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
34820 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50  e: AggFinal P1 P
34830 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
34840 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 31  psis: accum=r[P1
34850 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 78 65  ] N=P2.**.** Exe
34860 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a  cute the finaliz
34870 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
34880 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 50  an aggregate.  P
34890 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f  1 is.** the memo
348a0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74  ry location that
348b0 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61   is the accumula
348c0 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67 72  tor for the aggr
348d0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  egate..**.** P2 
348e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
348f0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
34900 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
34910 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50  n takes and.** P
34920 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
34930 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f  o the FuncDef fo
34940 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
34950 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75    The P2.** argu
34960 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ment is not used
34970 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
34980 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65    It is only the
34990 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61  re to disambigua
349a0 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  te.** functions 
349b0 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61  that can take va
349c0 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66  rying numbers of
349d0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
349e0 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20  .** P4 argument 
349f0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
34a00 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61 74  or the degenerat
34a10 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  e case where.** 
34a20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
34a30 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f  n was not previo
34a40 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  usly called..*/.
34a50 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c  case OP_AggFinal
34a60 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
34a70 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
34a80 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
34a90 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
34aa0 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
34ab0 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
34ac0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
34ad0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e  (pMem->flags & ~
34ae0 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67  (MEM_Null|MEM_Ag
34af0 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  g))==0 );.  rc =
34b00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
34b10 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f  inalize(pMem, pO
34b20 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20  p->p4.pFunc);.  
34b30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
34b40 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
34b50 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
34b60 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29  value_text(pMem)
34b70 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  );.    goto abor
34b80 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
34b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
34ba0 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
34bb0 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pMem, encoding);
34bc0 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
34bd0 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20  OBSIZE(pMem);.  
34be0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
34bf0 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29  emTooBig(pMem) )
34c00 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
34c10 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ig;.  }.  break;
34c20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
34c30 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f  TE_OMIT_WAL./* O
34c40 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e  pcode: Checkpoin
34c50 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
34c60 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
34c70 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68 69  database P1. Thi
34c80 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
34c90 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  P1 is not curren
34ca0 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f  tly in.** WAL mo
34cb0 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50 32  de. Parameter P2
34cc0 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
34cd0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
34ce0 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20 52  SIVE, FULL,.** R
34cf0 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55 4e 43  ESTART, or TRUNC
34d00 41 54 45 2e 20 20 57 72 69 74 65 20 31 20 6f 72  ATE.  Write 1 or
34d10 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20   0 into mem[P3] 
34d20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  if the checkpoin
34d30 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  t returns.** SQL
34d40 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c  ITE_BUSY or not,
34d50 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
34d60 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
34d70 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
34d80 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74 68  .** WAL after th
34d90 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74  e checkpoint int
34da0 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20  o mem[P3+1] and 
34db0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
34dc0 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41  ges.** in the WA
34dd0 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  L that have been
34de0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 66   checkpointed af
34df0 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
34e00 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20  nt.** completes 
34e10 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20  into mem[P3+2]. 
34e20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20 65   However on an e
34e30 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20  rror, mem[P3+1] 
34e40 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d  and.** mem[P3+2]
34e50 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
34e60 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20   to -1..*/.case 
34e70 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b  OP_Checkpoint: {
34e80 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
34e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ea0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
34eb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73  er */.  int aRes
34ec0 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
34ed0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
34ee0 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ts */.  Mem *pMe
34ef0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
34f00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
34f10 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
34f20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
34f30 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
34f40 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  aRes[0] = 0;.  a
34f50 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32 5d  Res[1] = aRes[2]
34f60 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
34f70 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
34f80 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
34f90 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  IVE.       || pO
34fa0 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
34fb0 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 20  ECKPOINT_FULL.  
34fc0 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d       || pOp->p2=
34fd0 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
34fe0 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20 20 20  NT_RESTART.     
34ff0 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51    || pOp->p2==SQ
35000 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
35010 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20 20  TRUNCATE.  );.  
35020 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
35030 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d 3e  kpoint(db, pOp->
35040 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61 52  p1, pOp->p2, &aR
35050 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d 29  es[1], &aRes[2])
35060 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
35070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35080 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61 62 6f  _BUSY ) goto abo
35090 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
350a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
350b0 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d  _OK;.    aRes[0]
350c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
350d0 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65  i=0, pMem = &aMe
350e0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b  m[pOp->p3]; i<3;
350f0 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
35100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
35110 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20  mSetInt64(pMem, 
35120 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20  (i64)aRes[i]);. 
35130 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a   }    .  break;.
35140 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66  };  .#endif..#if
35150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35160 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64  _PRAGMA./* Opcod
35170 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50  e: JournalMode P
35180 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
35190 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75  * Change the jou
351a0 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74  rnal mode of dat
351b0 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e 20  abase P1 to P3. 
351c0 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  P3 must be one o
351d0 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a  f the.** PAGER_J
351e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76  OURNALMODE_XXX v
351f0 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67 69  alues. If changi
35200 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 76  ng between the v
35210 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a  arious rollback.
35220 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74 65  ** modes (delete
35230 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72 73  , truncate, pers
35240 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d  ist, off and mem
35250 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61 20  ory), this is a 
35260 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74  simple.** operat
35270 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65  ion. No IO is re
35280 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
35290 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f   changing into o
352a0 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64  r out of WAL mod
352b0 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 20  e the procedure 
352c0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61  is more complica
352d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ted..**.** Write
352e0 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
352f0 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 6a  ning the final j
35300 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72  ournal-mode to r
35310 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
35320 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
35330 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32  de: {    /* out2
35340 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
35350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35360 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
35370 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c  o change journal
35380 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61   mode of */.  Pa
35390 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
353b0 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65   Pager associate
353c0 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20  d with pBt */.  
353d0 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20 20  int eNew;       
353e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353f0 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d  /* New journal m
35400 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c  ode */.  int eOl
35410 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
35420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35430 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  old journal mode
35440 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
35450 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63 6f  TE_OMIT_WAL.  co
35460 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
35470 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ame;          /*
35480 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
35490 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  e file for pPage
354a0 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70  r */.#endif..  p
354b0 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
354c0 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
354d0 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  eNew = pOp->p3;.
354e0 20 20 61 73 73 65 72 74 28 20 65 4e 65 77 3d 3d    assert( eNew==
354f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35500 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
35510 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
35520 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
35530 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  CATE .       || 
35540 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
35550 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
35560 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
35570 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35580 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c  DE_OFF.       ||
35590 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
355a0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
355b0 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
355c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
355d0 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  E_WAL.       || 
355e0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
355f0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
35600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
35610 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
35620 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
35630 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
35640 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nly==0 );..  pBt
35650 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
35660 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67 65  p1].pBt;.  pPage
35670 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
35680 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65 4f  Pager(pBt);.  eO
35690 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ld = sqlite3Page
356a0 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
356b0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 65  pPager);.  if( e
356c0 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
356d0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20 65  ALMODE_QUERY ) e
356e0 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66  New = eOld;.  if
356f0 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 4f  ( !sqlite3PagerO
35700 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c  kToChangeJournal
35710 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20 65  Mode(pPager) ) e
35720 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66  New = eOld;..#if
35730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35740 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  _WAL.  zFilename
35750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
35760 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 2c 20  ilename(pPager, 
35770 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  1);..  /* Do not
35780 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74   allow a transit
35790 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d  ion to journal_m
357a0 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61  ode=WAL for a da
357b0 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74  tabase.  ** in t
357c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
357d0 20 6f 72 20 69 66 20 74 68 65 20 56 46 53 20 64   or if the VFS d
357e0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
357f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20  shared memory . 
35800 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d   */.  if( eNew==
35810 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35820 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73 71 6c  E_WAL.   && (sql
35830 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
35840 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20 20  lename)==0      
35850 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c       /* Temp fil
35860 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21  e */.       || !
35870 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53  sqlite3PagerWalS
35880 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72 29  upported(pPager)
35890 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64  )   /* No shared
358a0 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20  -memory support 
358b0 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77  */.  ){.    eNew
358c0 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20   = eOld;.  }..  
358d0 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29  if( (eNew!=eOld)
358e0 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41  .   && (eOld==PA
358f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35900 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47  WAL || eNew==PAG
35910 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
35920 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  AL).  ){.    if(
35930 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
35940 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   || db->nVdbeRea
35950 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d>1 ){.      rc 
35960 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
35970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35980 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20  eError(p,.      
35990 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e      "cannot chan
359a0 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66  ge %s wal mode f
359b0 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61  rom within a tra
359c0 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20  nsaction",.     
359d0 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45       (eNew==PAGE
359e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
359f0 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75  L ? "into" : "ou
35a00 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a  t of").      );.
35a10 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
35a20 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
35a30 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20     }else{. .    
35a40 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45    if( eOld==PAGE
35a50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
35a60 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  L ){.        /* 
35a70 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d  If leaving WAL m
35a80 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c  ode, close the l
35a90 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
35aa0 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c  essful, the call
35ab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50  .        ** to P
35ac0 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63  agerCloseWal() c
35ad0 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64  heckpoints and d
35ae0 65 6c 65 74 65 73 20 74 68 65 20 77 72 69 74 65  eletes the write
35af0 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20  -ahead-log .    
35b00 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20      ** file. An 
35b10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d  EXCLUSIVE lock m
35b20 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64  ay still be held
35b30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35b40 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a   file .        *
35b50 2a 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73  * after a succes
35b60 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20  sful return. .  
35b70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35b90 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65  erCloseWal(pPage
35ba0 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20 20 20  r, db);.        
35bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35bc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
35bd0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
35be0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
35bf0 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , eNew);.       
35c00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
35c10 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  f( eOld==PAGER_J
35c20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
35c30 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  Y ){.        /* 
35c40 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f  Cannot transitio
35c50 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  n directly from 
35c60 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20  MEMORY to WAL.  
35c70 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20  Use mode OFF.   
35c80 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e       ** as an in
35c90 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20  termediate */.  
35ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35cb0 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
35cc0 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a  (pPager, PAGER_J
35cd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b  OURNALMODE_OFF);
35ce0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
35cf0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e    /* Open a tran
35d00 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
35d10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52 65  atabase file. Re
35d20 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
35d30 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
35d40 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61 6e   mode, this tran
35d50 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75  saction always u
35d60 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
35d70 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
35d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
35d90 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
35da0 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  rans(pBt)==0 );.
35db0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35dd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35de0 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28 70  treeSetVersion(p
35df0 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45 52  Bt, (eNew==PAGER
35e00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
35e10 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20 20   ? 2 : 1));.    
35e20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
35e30 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
35e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
35e50 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20 65 4e  /..  if( rc ) eN
35e60 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e 65  ew = eOld;.  eNe
35e70 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  w = sqlite3Pager
35e80 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  SetJournalMode(p
35e90 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20  Pager, eNew);.. 
35ea0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
35eb0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69  EM_Str|MEM_Stati
35ec0 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f  c|MEM_Term;.  pO
35ed0 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  ut->z = (char *)
35ee0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f  sqlite3JournalMo
35ef0 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20  dename(eNew);.  
35f00 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pOut->n = sqlite
35f10 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e  3Strlen30(pOut->
35f20 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  z);.  pOut->enc 
35f30 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
35f40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
35f50 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
35f60 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66   encoding);.  if
35f70 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
35f80 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
35f90 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64    break;.};.#end
35fa0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35fb0 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66  T_PRAGMA */..#if
35fc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
35fd0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26  _OMIT_VACUUM) &&
35fe0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
35ff0 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a  _OMIT_ATTACH)./*
36000 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20   Opcode: Vacuum 
36010 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
36020 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74 69   Vacuum the enti
36030 72 65 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  re database P1. 
36040 20 50 31 20 69 73 20 30 20 66 6f 72 20 22 6d 61   P1 is 0 for "ma
36050 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20 6d 6f  in", and 2 or mo
36060 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 74 74  re.** for an att
36070 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
36080 20 54 68 65 20 22 74 65 6d 70 22 20 64 61 74 61   The "temp" data
36090 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
360a0 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63 61 73  vacuumed..*/.cas
360b0 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20  e OP_Vacuum: {. 
360c0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
360d0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Only==0 );.  rc 
360e0 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75  = sqlite3RunVacu
360f0 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  um(&p->zErrMsg, 
36100 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  db, pOp->p1);.  
36110 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
36120 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
36130 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
36140 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
36150 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
36160 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63  TOVACUUM)./* Opc
36170 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20  ode: IncrVacuum 
36180 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
36190 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
361a0 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20 69  le step of the i
361b0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
361c0 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a  m procedure on.*
361d0 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61 73  * the P1 databas
361e0 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75 6d  e. If the vacuum
361f0 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a   has finished, j
36200 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
36210 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77  on.** P2. Otherw
36220 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ise, fall throug
36230 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
36240 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
36250 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d  se OP_IncrVacuum
36260 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
36270 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  mp */.  Btree *p
36280 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
36290 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
362a0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
362b0 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
362c0 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
362d0 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  k, pOp->p1) );. 
362e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
362f0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42 74  Only==0 );.  pBt
36300 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
36310 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20  p1].pBt;.  rc = 
36320 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
36330 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20 56  Vacuum(pBt);.  V
36340 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72  dbeBranchTaken(r
36350 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 32  c==SQLITE_DONE,2
36360 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
36370 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36380 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61 62  E_DONE ) goto ab
36390 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
363a0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
363b0 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  E_OK;.    goto j
363c0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
363d0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
363e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70  ../* Opcode: Exp
363f0 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ire P1 * * * *.*
36400 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63 6f  *.** Cause preco
36410 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
36420 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20 57 68  s to expire.  Wh
36430 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20 73 74  en an expired st
36440 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78  atement.** is ex
36450 65 63 75 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ecuted using sql
36460 69 74 65 33 5f 73 74 65 70 28 29 20 69 74 20 77  ite3_step() it w
36470 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74 6f 6d  ill either autom
36480 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65 70 72  atically.** repr
36490 65 70 61 72 65 20 69 74 73 65 6c 66 20 28 69 66  epare itself (if
364a0 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
364b0 6c 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ly created using
364c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
364d0 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69 74 20  _v2()).** or it 
364e0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
364f0 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a 2a  QLITE_SCHEMA..**
36500 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c   .** If P1 is 0,
36510 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74   then all SQL st
36520 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20  atements become 
36530 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20 69  expired. If P1 i
36540 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
36550 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72  hen only the cur
36560 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
36570 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78   statement is ex
36580 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pired..*/.case O
36590 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69 66  P_Expire: {.  if
365a0 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  ( !pOp->p1 ){.  
365b0 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
365c0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
365d0 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  s(db);.  }else{.
365e0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
365f0 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
36600 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
36610 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
36620 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ACHE./* Opcode: 
36630 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20  TableLock P1 P2 
36640 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
36650 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f 6f 74  sis: iDb=P1 root
36660 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a 2a 0a  =P2 write=P3.**.
36670 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ** Obtain a lock
36680 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
36690 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73   table. This ins
366a0 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  truction is only
366b0 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68   used when.** th
366c0 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  e shared-cache f
366d0 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65  eature is enable
366e0 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  d. .**.** P1 is 
366f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
36700 20 64 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c   database in sql
36710 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68  ite3.aDb[] of th
36720 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e  e database.** on
36730 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20   which the lock 
36740 69 73 20 61 63 71 75 69 72 65 64 2e 20 20 41 20  is acquired.  A 
36750 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61  readlock is obta
36760 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72  ined if P3==0 or
36770 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  .** a write lock
36780 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a   if P3==1..**.**
36790 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P2 contains the
367a0 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68   root-page of th
367b0 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e  e table to lock.
367c0 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69  .**.** P4 contai
367d0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
367e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
367f0 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b  table being lock
36800 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ed. This is only
36810 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65  .** used to gene
36820 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
36830 73 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63  ssage if the loc
36840 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
36850 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ined..*/.case OP
36860 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20  _TableLock: {.  
36870 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  u8 isWriteLock =
36880 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20   (u8)pOp->p3;.  
36890 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20  if( isWriteLock 
368a0 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73  || 0==(db->flags
368b0 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
368c0 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  mmit) ){.    int
368d0 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a   p1 = pOp->p1; .
368e0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
368f0 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20  0 && p1<db->nDb 
36900 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 44  );.    assert( D
36910 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
36920 65 65 4d 61 73 6b 2c 20 70 31 29 20 29 3b 0a 20  eeMask, p1) );. 
36930 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69     assert( isWri
36940 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57  teLock==0 || isW
36950 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  riteLock==1 );. 
36960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
36970 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64 62  treeLockTable(db
36980 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20 70  ->aDb[p1].pBt, p
36990 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65 4c  Op->p2, isWriteL
369a0 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
369b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72   ){.      if( (r
369c0 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
369d0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
369e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
369f0 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
36a00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36a10 45 72 72 6f 72 28 70 2c 20 22 64 61 74 61 62 61  Error(p, "databa
36a20 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
36a30 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ed: %s", z);.   
36a40 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
36a50 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
36a60 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
36a70 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
36a80 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
36a90 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
36aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36ab0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
36ac0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67  ./* Opcode: VBeg
36ad0 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  in * * * P4 *.**
36ae0 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20  .** P4 may be a 
36af0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
36b00 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
36b10 74 75 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c  ture. If so, cal
36b20 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e  l the .** xBegin
36b30 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74   method for that
36b40 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c   table..**.** Al
36b50 73 6f 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e  so, whether or n
36b60 6f 74 20 50 34 20 69 73 20 73 65 74 2c 20 63 68  ot P4 is set, ch
36b70 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
36b80 20 6e 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65   not being calle
36b90 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e  d from.** within
36ba0 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61   a callback to a
36bb0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
36bc0 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49  Sync() method. I
36bd0 66 20 69 74 20 69 73 2c 20 74 68 65 20 65 72 72  f it is, the err
36be0 6f 72 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  or.** code will 
36bf0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
36c00 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65  _LOCKED..*/.case
36c10 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20   OP_VBegin: {.  
36c20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20  VTable *pVTab;. 
36c30 20 70 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34   pVTab = pOp->p4
36c40 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73  .pVtab;.  rc = s
36c50 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 28  qlite3VtabBegin(
36c60 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66  db, pVTab);.  if
36c70 28 20 70 56 54 61 62 20 29 20 73 71 6c 69 74 65  ( pVTab ) sqlite
36c80 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
36c90 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74 61  g(p, pVTab->pVta
36ca0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
36cb0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36cc0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
36cd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
36ce0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
36cf0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
36d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
36d10 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
36d20 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20 50 31  code: VCreate P1
36d30 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
36d40 50 32 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P2 is a register
36d50 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
36d60 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61  name of a virtua
36d70 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62  l table in datab
36d80 61 73 65 20 0a 2a 2a 20 50 31 2e 20 43 61 6c 6c  ase .** P1. Call
36d90 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   the xCreate met
36da0 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61 62  hod for that tab
36db0 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  le..*/.case OP_V
36dc0 43 72 65 61 74 65 3a 20 7b 0a 20 20 4d 65 6d 20  Create: {.  Mem 
36dd0 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  sMem;          /
36de0 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  * For storing th
36df0 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  e record being d
36e00 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  ecoded */.  cons
36e10 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 2f  t char *zTab;  /
36e20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  * Name of the vi
36e30 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a  rtual table */..
36e40 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20    memset(&sMem, 
36e50 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29  0, sizeof(sMem))
36e60 3b 0a 20 20 73 4d 65 6d 2e 64 62 20 3d 20 64 62  ;.  sMem.db = db
36e70 3b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20 50  ;.  /* Because P
36e80 32 20 69 73 20 61 6c 77 61 79 73 20 61 20 73 74  2 is always a st
36e90 61 74 69 63 20 73 74 72 69 6e 67 2c 20 69 74 20  atic string, it 
36ea0 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
36eb0 72 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  r the.  ** sqlit
36ec0 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 29 20  e3VdbeMemCopy() 
36ed0 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  to fail */.  ass
36ee0 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e  ert( (aMem[pOp->
36ef0 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  p2].flags & MEM_
36f00 53 74 72 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  Str)!=0 );.  ass
36f10 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e  ert( (aMem[pOp->
36f20 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  p2].flags & MEM_
36f30 53 74 61 74 69 63 29 21 3d 30 20 29 3b 0a 20 20  Static)!=0 );.  
36f40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
36f50 4d 65 6d 43 6f 70 79 28 26 73 4d 65 6d 2c 20 26  MemCopy(&sMem, &
36f60 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
36f70 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36f80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a 54 61  LITE_OK );.  zTa
36f90 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
36fa0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
36fb0 65 78 74 28 26 73 4d 65 6d 29 3b 0a 20 20 61 73  ext(&sMem);.  as
36fc0 73 65 72 74 28 20 7a 54 61 62 20 7c 7c 20 64 62  sert( zTab || db
36fd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
36fe0 3b 0a 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a  ;.  if( zTab ){.
36ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37000 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64  VtabCallCreate(d
37010 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 7a 54 61 62  b, pOp->p1, zTab
37020 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  , &p->zErrMsg);.
37030 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
37040 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
37050 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  m);.  if( rc ) g
37060 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
37070 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
37080 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
37090 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
370a0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
370b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
370c0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
370d0 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20 50  code: VDestroy P
370e0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
370f0 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20   P4 is the name 
37100 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
37110 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  le in database P
37120 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44 65  1.  Call the xDe
37130 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20  stroy method.** 
37140 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  of that table..*
37150 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74 72  /.case OP_VDestr
37160 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56 44 65  oy: {.  db->nVDe
37170 73 74 72 6f 79 2b 2b 3b 0a 20 20 72 63 20 3d 20  stroy++;.  rc = 
37180 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44  sqlite3VtabCallD
37190 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e  estroy(db, pOp->
371a0 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
371b0 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2d    db->nVDestroy-
371c0 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  -;.  if( rc ) go
371d0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
371e0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
371f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
37200 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
37210 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
37220 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
37230 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
37240 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20  ode: VOpen P1 * 
37250 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
37260 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
37270 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
37280 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74  object, an sqlit
37290 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
372a0 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75  e..** P1 is a cu
372b0 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68  rsor number.  Th
372c0 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20  is opcode opens 
372d0 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  a cursor to the 
372e0 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
372f0 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74   and stores that
37300 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a   cursor in P1..*
37310 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a  /.case OP_VOpen:
37320 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
37330 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33  *pCur;.  sqlite3
37340 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
37350 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
37360 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f  tab *pVtab;.  co
37370 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
37380 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  le *pModule;..  
37390 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
373a0 61 64 65 72 20 29 3b 0a 20 20 70 43 75 72 20 3d  ader );.  pCur =
373b0 20 30 3b 0a 20 20 70 56 43 75 72 20 3d 20 30 3b   0;.  pVCur = 0;
373c0 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
373d0 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
373e0 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20  .  if( pVtab==0 
373f0 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e  || NEVER(pVtab->
37400 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20  pModule==0) ){. 
37410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
37420 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20  OCKED;.    goto 
37430 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
37440 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75 6c  or;.  }.  pModul
37450 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
37460 6c 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  le;.  rc = pModu
37470 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c  le->xOpen(pVtab,
37480 20 26 70 56 43 75 72 29 3b 0a 20 20 73 71 6c 69   &pVCur);.  sqli
37490 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
374a0 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
374b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
374c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
374d0 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  r;..  /* Initial
374e0 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ize sqlite3_vtab
374f0 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c 61  _cursor base cla
37500 73 73 20 2a 2f 0a 20 20 70 56 43 75 72 2d 3e 70  ss */.  pVCur->p
37510 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20  Vtab = pVtab;.. 
37520 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76   /* Initialize v
37530 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  dbe cursor objec
37540 74 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c  t */.  pCur = al
37550 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
37560 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20  pOp->p1, 0, -1, 
37570 43 55 52 54 59 50 45 5f 56 54 41 42 29 3b 0a 20  CURTYPE_VTAB);. 
37580 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
37590 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 20   pCur->uc.pVCur 
375a0 3d 20 70 56 43 75 72 3b 0a 20 20 20 20 70 56 74  = pVCur;.    pVt
375b0 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 65  ab->nRef++;.  }e
375c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
375d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
375e0 64 20 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  d );.    pModule
375f0 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
37600 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
37610 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
37620 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37630 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
37640 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
37650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
37660 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
37670 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50  de: VFilter P1 P
37680 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
37690 6f 70 73 69 73 3a 20 69 70 6c 61 6e 3d 72 5b 50  opsis: iplan=r[P
376a0 33 5d 20 7a 70 6c 61 6e 3d 27 50 34 27 0a 2a 2a  3] zplan='P4'.**
376b0 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73  .** P1 is a curs
376c0 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  or opened using 
376d0 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61 6e  VOpen.  P2 is an
376e0 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   address to jump
376f0 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66 69   to if.** the fi
37700 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73 65  ltered result se
37710 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  t is empty..**.*
37720 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20 4e  * P4 is either N
37730 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67 20  ULL or a string 
37740 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
37750 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
37760 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ndex.** method o
37770 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20 54  f the module.  T
37780 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  he interpretatio
37790 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72 69  n of the P4 stri
377a0 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74 6f  ng is left.** to
377b0 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c   the module impl
377c0 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ementation..**.*
377d0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
377e0 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74 65  vokes the xFilte
377f0 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20  r method on the 
37800 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 70  virtual table sp
37810 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50 31  ecified.** by P1
37820 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 71  .  The integer q
37830 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d 65  uery plan parame
37840 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20 69  ter to xFilter i
37850 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
37860 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67 69  ster.** P3. Regi
37870 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65 73  ster P3+1 stores
37880 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d 65   the argc parame
37890 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65 64  ter to be passed
378a0 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c 74   to the.** xFilt
378b0 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69 73  er method. Regis
378c0 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31 2b  ters P3+2..P3+1+
378d0 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72 67  argc are the arg
378e0 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  c.** additional 
378f0 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63 68  parameters which
37900 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a 2a   are passed to.*
37910 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72 67  * xFilter as arg
37920 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 32  v. Register P3+2
37930 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30 5d   becomes argv[0]
37940 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 20   when passed to 
37950 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  xFilter..**.** A
37960 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
37970 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75 6c   P2 if the resul
37980 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c 74  t set after filt
37990 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20 65  ering would be e
379a0 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  mpty..*/.case OP
379b0 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f 2a  _VFilter: {   /*
379c0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e   jump */.  int n
379d0 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65 72  Arg;.  int iQuer
379e0 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  y;.  const sqlit
379f0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
37a00 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65 72  le;.  Mem *pQuer
37a10 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 3b  y;.  Mem *pArgc;
37a20 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
37a30 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a 20  cursor *pVCur;. 
37a40 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
37a50 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73  Vtab;.  VdbeCurs
37a60 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
37a70 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  res;.  int i;.  
37a80 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20  Mem **apArg;..  
37a90 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70  pQuery = &aMem[p
37aa0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63  Op->p3];.  pArgc
37ab0 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20   = &pQuery[1];. 
37ac0 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
37ad0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
37ae0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
37af0 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47  pQuery) );.  REG
37b00 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
37b10 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  >p3, pQuery);.  
37b20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43  assert( pCur->eC
37b30 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
37b40 56 54 41 42 20 29 3b 0a 20 20 70 56 43 75 72 20  VTAB );.  pVCur 
37b50 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72  = pCur->uc.pVCur
37b60 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56 43 75  ;.  pVtab = pVCu
37b70 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
37b80 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
37b90 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62  dule;..  /* Grab
37ba0 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65   the index numbe
37bb0 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d  r and argc param
37bc0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
37bd0 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67  t( (pQuery->flag
37be0 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26  s&MEM_Int)!=0 &&
37bf0 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d   pArgc->flags==M
37c00 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67  EM_Int );.  nArg
37c10 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75   = (int)pArgc->u
37c20 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28  .i;.  iQuery = (
37c30 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b  int)pQuery->u.i;
37c40 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
37c50 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
37c60 20 2a 2f 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20   */.  res = 0;. 
37c70 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72   apArg = p->apAr
37c80 67 3b 0a 20 20 66 6f 72 28 69 20 3d 20 30 3b 20  g;.  for(i = 0; 
37c90 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
37ca0 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41    apArg[i] = &pA
37cb0 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20  rgc[i+1];.  }.  
37cc0 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46  rc = pModule->xF
37cd0 69 6c 74 65 72 28 70 56 43 75 72 2c 20 69 51 75  ilter(pVCur, iQu
37ce0 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  ery, pOp->p4.z, 
37cf0 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20  nArg, apArg);.  
37d00 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
37d10 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
37d20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
37d30 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
37d40 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20 70  error;.  res = p
37d50 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 43  Module->xEof(pVC
37d60 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c  ur);.  pCur->nul
37d70 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 56 64 62 65  lRow = 0;.  Vdbe
37d80 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
37d90 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
37da0 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
37db0 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  p2;.  break;.}.#
37dc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37dd0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
37de0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
37df0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
37e00 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
37e10 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20  : VColumn P1 P2 
37e20 50 33 20 2a 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  P3 * P5.** Synop
37e30 73 69 73 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c 75  sis: r[P3]=vcolu
37e40 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74 6f  mn(P2).**.** Sto
37e50 72 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  re in register P
37e60 33 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  3 the value of t
37e70 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20  he P2-th column 
37e80 6f 66 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  of.** the curren
37e90 74 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72  t row of the vir
37ea0 74 75 61 6c 2d 74 61 62 6c 65 20 6f 66 20 63 75  tual-table of cu
37eb0 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 49  rsor P1..**.** I
37ec0 66 20 74 68 65 20 56 43 6f 6c 75 6d 6e 20 6f 70  f the VColumn op
37ed0 63 6f 64 65 20 69 73 20 62 65 69 6e 67 20 75 73  code is being us
37ee0 65 64 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ed to fetch the 
37ef0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 61 6e 20 75  value of.** an u
37f00 6e 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e  nchanging column
37f10 20 64 75 72 69 6e 67 20 61 6e 20 55 50 44 41 54   during an UPDAT
37f20 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65  E operation, the
37f30 6e 20 74 68 65 20 50 35 0a 2a 2a 20 76 61 6c 75  n the P5.** valu
37f40 65 20 69 73 20 31 2e 20 20 4f 74 68 65 72 77 69  e is 1.  Otherwi
37f50 73 65 2c 20 50 35 20 69 73 20 30 2e 20 20 54 68  se, P5 is 0.  Th
37f60 65 20 50 35 20 76 61 6c 75 65 20 69 73 20 72 65  e P5 value is re
37f70 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 73 71 6c  turned.** by sql
37f80 69 74 65 33 5f 76 74 61 62 5f 6e 6f 63 68 61 6e  ite3_vtab_nochan
37f90 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
37fa0 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
37fb0 62 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  by virtual table
37fc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
37fd0 20 74 6f 20 72 65 74 75 72 6e 20 73 70 65 63 69   to return speci
37fe0 61 6c 20 22 6e 6f 2d 63 68 61 6e 67 65 22 0a 2a  al "no-change".*
37ff0 2a 20 6d 61 72 6b 73 20 77 68 69 63 68 20 63 61  * marks which ca
38000 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69  n be more effici
38010 65 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ent, depending o
38020 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
38030 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
38040 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c  VColumn: {.  sql
38050 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
38060 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
38070 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
38080 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b  e;.  Mem *pDest;
38090 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
380a0 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  xt sContext;..  
380b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  VdbeCursor *pCur
380c0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
380d0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
380e0 70 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d  pCur->eCurType==
380f0 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a  CURTYPE_VTAB );.
38100 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
38110 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
38120 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
38130 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 44  nCursor) );.  pD
38140 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  est = &aMem[pOp-
38150 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
38160 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73  ToChange(p, pDes
38170 74 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  t);.  if( pCur->
38180 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73  nullRow ){.    s
38190 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
381a0 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20  Null(pDest);.   
381b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56   break;.  }.  pV
381c0 74 61 62 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70  tab = pCur->uc.p
381d0 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  VCur->pVtab;.  p
381e0 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
381f0 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72  pModule;.  asser
38200 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c  t( pModule->xCol
38210 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  umn );.  memset(
38220 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69  &sContext, 0, si
38230 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b  zeof(sContext));
38240 0a 20 20 73 43 6f 6e 74 65 78 74 2e 70 4f 75 74  .  sContext.pOut
38250 20 3d 20 70 44 65 73 74 3b 0a 20 20 69 66 28 20   = pDest;.  if( 
38260 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 73  pOp->p5 ){.    s
38270 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
38280 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20  Null(pDest);.   
38290 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20   pDest->flags = 
382a0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72  MEM_Null|MEM_Zer
382b0 6f 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 75 2e  o;.    pDest->u.
382c0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 65 6c  nZero = 0;.  }el
382d0 73 65 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79  se{.    MemSetTy
382e0 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d 45  peFlag(pDest, ME
382f0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  M_Null);.  }.  r
38300 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  c = pModule->xCo
38310 6c 75 6d 6e 28 70 43 75 72 2d 3e 75 63 2e 70 56  lumn(pCur->uc.pV
38320 43 75 72 2c 20 26