/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ed88889ca2b71dd27770312b0ebfe06dca85c34ca418d368619a683cdaefe744:


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 23 69 66 64 65 66  pOp->p3];.#ifdef
7740: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7750: 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f  if( pOp->p2==OE_
7760: 41 62 6f 72 74 20 29 7b 20 73 71 6c 69 74 65 33  Abort ){ sqlite3
7770: 56 64 62 65 41 73 73 65 72 74 41 62 6f 72 74 61  VdbeAssertAborta
7780: 62 6c 65 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66  ble(p); }.#endif
7790: 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c  .  if( (pIn3->fl
77a0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
77b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a  =0 ) break;.  /*
77c0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
77d0: 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a  to OP_Halt */.}.
77e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
77f0: 74 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  t P1 P2 * P4 P5.
7800: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
7810: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
7820: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
7830: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
7840: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
7850: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
7860: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
7870: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
7880: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
7890: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
78a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
78b0: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
78c0: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
78d0: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
78e0: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
78f0: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
7900: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
7910: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
7920: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
7930: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7940: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
7950: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7960: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
7970: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
7980: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
7990: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
79a0: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
79b0: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
79c0: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
79d0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
79e0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
79f0: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
7a00: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
7a10: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
7a20: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7a30: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
7a40: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
7a50: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
7a60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
7a70: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69  ring..**.** P5 i
7a80: 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
7a90: 6e 20 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75  n 0 and 4, inclu
7aa0: 73 69 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66  sive, that modif
7ab0: 69 65 73 20 74 68 65 20 50 34 20 73 74 72 69 6e  ies the P4 strin
7ac0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  g..**.**    0:  
7ad0: 28 6e 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20  (no change).**  
7ae0: 20 20 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63    1:  NOT NULL c
7af0: 6f 6e 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  ontraint failed:
7b00: 20 50 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e   P4.**    2:  UN
7b10: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
7b20: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20  failed: P4.**   
7b30: 20 33 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74   3:  CHECK const
7b40: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
7b50: 0a 2a 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49  .**    4:  FOREI
7b60: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
7b70: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a  t failed: P4.**.
7b80: 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20  ** If P5 is not 
7b90: 7a 65 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e  zero and P4 is N
7ba0: 55 4c 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74  ULL, then everyt
7bb0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 22  hing after the "
7bc0: 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64  :" is.** omitted
7bd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
7be0: 20 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c   an implied "Hal
7bf0: 74 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63  t 0 0 0" instruc
7c00: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74  tion inserted at
7c10: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
7c20: 0a 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61  .** every progra
7c30: 6d 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61  m.  So a jump pa
7c40: 73 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  st the last inst
7c50: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ruction of the p
7c60: 72 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65  rogram.** is the
7c70: 20 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69   same as executi
7c80: 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  ng Halt..*/.case
7c90: 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64   OP_Halt: {.  Vd
7ca0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
7cb0: 0a 20 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70  .  int pcx;..  p
7cc0: 63 78 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  cx = (int)(pOp -
7cd0: 20 61 4f 70 29 3b 0a 23 69 66 64 65 66 20 53 51   aOp);.#ifdef SQ
7ce0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
7cf0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
7d00: 72 74 20 29 7b 20 73 71 6c 69 74 65 33 56 64 62  rt ){ sqlite3Vdb
7d10: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65  eAssertAbortable
7d20: 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  (p); }.#endif.  
7d30: 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  if( pOp->p1==SQL
7d40: 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72  ITE_OK && p->pFr
7d50: 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61  ame ){.    /* Ha
7d60: 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  lt the sub-progr
7d70: 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e 74 72  am. Return contr
7d80: 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ol to the parent
7d90: 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70   frame. */.    p
7da0: 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
7db0: 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  e;.    p->pFrame
7dc0: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65   = pFrame->pPare
7dd0: 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d  nt;.    p->nFram
7de0: 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e--;.    sqlite3
7df0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
7e00: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
7e10: 20 20 20 20 70 63 78 20 3d 20 73 71 6c 69 74 65      pcx = sqlite
7e20: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
7e30: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 69  e(pFrame);.    i
7e40: 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49  f( pOp->p2==OE_I
7e50: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f  gnore ){.      /
7e60: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63  * Instruction pc
7e70: 78 20 69 73 20 74 68 65 20 4f 50 5f 50 72 6f 67  x is the OP_Prog
7e80: 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ram that invoked
7e90: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
7ea0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
7eb0: 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c 74 65  ntly being halte
7ec0: 64 2e 20 49 66 20 74 68 65 20 70 32 20 69 6e 73  d. If the p2 ins
7ed0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 69 73  truction of this
7ee0: 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a   OP_Halt.      *
7ef0: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  * instruction is
7f00: 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72   set to OE_Ignor
7f10: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  e, then the sub-
7f20: 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72 6f 77  program is throw
7f30: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ing.      ** an 
7f40: 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e  IGNORE exception
7f50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
7f60: 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64 72 65  ump to the addre
7f70: 73 73 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  ss specified.   
7f80: 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70 32 20     ** as the p2 
7f90: 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f  of the calling O
7fa0: 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20  P_Program.  */. 
7fb0: 20 20 20 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f       pcx = p->aO
7fc0: 70 5b 70 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20  p[pcx].p2-1;.   
7fd0: 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e   }.    aOp = p->
7fe0: 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20  aOp;.    aMem = 
7ff0: 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70  p->aMem;.    pOp
8000: 20 3d 20 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20   = &aOp[pcx];.  
8010: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70    break;.  }.  p
8020: 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ->rc = pOp->p1;.
8030: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
8040: 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a   = (u8)pOp->p2;.
8050: 20 20 70 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20    p->pc = pcx;. 
8060: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
8070: 3c 3d 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  <=4 );.  if( p->
8080: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  rc ){.    if( pO
8090: 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 73  p->p5 ){.      s
80a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
80b0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
80c0: 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22  ] = { "NOT NULL"
80d0: 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 43 48 45  , "UNIQUE", "CHE
80e0: 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CK",.           
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 22 20    "FOREIGN KEY" 
8120: 7d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  };.      testcas
8130: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  e( pOp->p5==1 );
8140: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8150: 20 70 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20   pOp->p5==2 );. 
8160: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8170: 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20  Op->p5==3 );.   
8180: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
8190: 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ->p5==4 );.     
81a0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
81b0: 72 28 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61  r(p, "%s constra
81c0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 20 61 7a 54  int failed", azT
81d0: 79 70 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b  ype[pOp->p5-1]);
81e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
81f0: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  p4.z ){.        
8200: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
8210: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8220: 22 25 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72  "%z: %s", p->zEr
8230: 72 4d 73 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  rMsg, pOp->p4.z)
8240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8250: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8260: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
8270: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
8280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8290: 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20  e3_log(pOp->p1, 
82a0: 22 61 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20  "abort at %d in 
82b0: 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20  [%s]: %s", pcx, 
82c0: 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72  p->zSql, p->zErr
82d0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Msg);.  }.  rc =
82e0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
82f0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
8300: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
8310: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
8320: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
8330: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
8340: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
8350: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8360: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
8370: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
8380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
8390: 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
83a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
83b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
83c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64  ==SQLITE_OK || d
83d0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
83e0: 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  >0 || db->nDefer
83f0: 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a  redImmCons>0 );.
8400: 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f      rc = p->rc ?
8410: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
8420: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8430: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
8440: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
8450: 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 32  e: Integer P1 P2
8460: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
8470: 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a  is: r[P2]=P1.**.
8480: 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e  ** The 32-bit in
8490: 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 69  teger value P1 i
84a0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72  s written into r
84b0: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
84c0: 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20  ase OP_Integer: 
84d0: 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
84e0: 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75  2 */.  pOut = ou
84f0: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
8500: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  pOp);.  pOut->u.
8510: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62  i = pOp->p1;.  b
8520: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8530: 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a  de: Int64 * P2 *
8540: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
8550: 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a  s: r[P2]=P4.**.*
8560: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
8570: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
8580: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
8590: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
85a0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
85b0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
85c0: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
85d0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
85e0: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
85f0: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
8600: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
8610: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
8620: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
8630: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
8640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8650: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
8660: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
8670: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
8680: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
8690: 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34  [P2]=P4.**.** P4
86a0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
86b0: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
86c0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
86d0: 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61  ** Write that va
86e0: 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
86f0: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
8700: 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Real: {        
8710: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8720: 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f  K_FLOAT, out2 */
8730: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8740: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8750: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
8760: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
8770: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
8780: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
8790: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  al) );.  pOut->u
87a0: 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  .r = *pOp->p4.pR
87b0: 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eal;.  break;.}.
87c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
87d0: 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20  e: String8 * P2 
87e0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
87f0: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a  is: r[P2]='P4'.*
8800: 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74  *.** P4 points t
8810: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
8820: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
8830: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
8840: 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20  transformed .** 
8850: 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20 6f 70  into a String op
8860: 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74 20 69  code before it i
8870: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
8880: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 20 20  he first time.  
8890: 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74  During.** this t
88a0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74  ransformation, t
88b0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72  he length of str
88c0: 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70 75 74  ing P4 is comput
88d0: 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
88e0: 20 61 73 20 74 68 65 20 50 31 20 70 61 72 61 6d   as the P1 param
88f0: 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eter..*/.case OP
8900: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
8910: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8920: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a  K_STRING, out2 *
8930: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
8940: 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f  >p4.z!=0 );.  pO
8950: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
8960: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
8970: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
8980: 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70  String;.  pOp->p
8990: 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 = sqlite3Strle
89a0: 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  n30(pOp->p4.z);.
89b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89c0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
89d0: 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54   encoding!=SQLIT
89e0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 72 63  E_UTF8 ){.    rc
89f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
8a00: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
8a10: 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c  p->p4.z, -1, SQL
8a20: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
8a30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73  _STATIC);.    as
8a40: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8a50: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
8a60: 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20  E_TOOBIG );.    
8a70: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
8a80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8a90: 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65  Encoding(pOut, e
8aa0: 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20  ncoding) ) goto 
8ab0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65  no_mem;.    asse
8ac0: 72 74 28 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c  rt( pOut->szMall
8ad0: 6f 63 3e 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d  oc>0 && pOut->zM
8ae0: 61 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29  alloc==pOut->z )
8af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 56 64  ;.    assert( Vd
8b00: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75  beMemDynamic(pOu
8b10: 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75  t)==0 );.    pOu
8b20: 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  t->szMalloc = 0;
8b30: 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
8b40: 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a   |= MEM_Static;.
8b50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
8b60: 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ype==P4_DYNAMIC 
8b70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8b80: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
8b90: 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p4.z);.    }.   
8ba0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
8bb0: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70  4_DYNAMIC;.    p
8bc0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d  Op->p4.z = pOut-
8bd0: 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20  >z;.    pOp->p1 
8be0: 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 20  = pOut->n;.  }. 
8bf0: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
8c00: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a  QLITE_TOOBIG );.
8c10: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70  #endif.  if( pOp
8c20: 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ->p1>db->aLimit[
8c30: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
8c40: 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
8c50: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
8c60: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8c70: 54 45 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61  TE_OK );.  /* Fa
8c80: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
8c90: 65 20 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f  e next case, OP_
8ca0: 53 74 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f  String */.}.  ./
8cb0: 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67  * Opcode: String
8cc0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
8cd0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
8ce0: 32 5d 3d 27 50 34 27 20 28 6c 65 6e 3d 50 31 29  2]='P4' (len=P1)
8cf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  .**.** The strin
8d00: 67 20 76 61 6c 75 65 20 50 34 20 6f 66 20 6c 65  g value P4 of le
8d10: 6e 67 74 68 20 50 31 20 28 62 79 74 65 73 29 20  ngth P1 (bytes) 
8d20: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
8d30: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
8d40: 49 66 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72  If P3 is not zer
8d50: 6f 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  o and the conten
8d60: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
8d70: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50 35 2c   is equal to P5,
8d80: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74   then.** the dat
8d90: 61 74 79 70 65 20 6f 66 20 74 68 65 20 72 65 67  atype of the reg
8da0: 69 73 74 65 72 20 50 32 20 69 73 20 63 6f 6e 76  ister P2 is conv
8db0: 65 72 74 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20  erted to BLOB.  
8dc0: 54 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a  The content is.*
8dd0: 2a 20 74 68 65 20 73 61 6d 65 20 73 65 71 75 65  * the same seque
8de0: 6e 63 65 20 6f 66 20 62 79 74 65 73 2c 20 69 74  nce of bytes, it
8df0: 20 69 73 20 6d 65 72 65 6c 79 20 69 6e 74 65 72   is merely inter
8e00: 70 72 65 74 65 64 20 61 73 20 61 20 42 4c 4f 42  preted as a BLOB
8e10: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
8e20: 20 73 74 72 69 6e 67 2c 20 61 73 20 69 66 20 69   string, as if i
8e30: 74 20 68 61 64 20 62 65 65 6e 20 43 41 53 54 2e  t had been CAST.
8e40: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8e50: 3a 0a 2a 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d  :.**.** if( P3!=
8e60: 30 20 61 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50  0 and reg[P3]==P
8e70: 35 20 29 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43  5 ) reg[P2] := C
8e80: 41 53 54 28 72 65 67 5b 50 32 5d 20 61 73 20 42  AST(reg[P2] as B
8e90: 4c 4f 42 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  LOB).*/.case OP_
8ea0: 53 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20  String: {       
8eb0: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
8ec0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
8ed0: 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d  z!=0 );.  pOut =
8ee0: 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
8ef0: 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
8f00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
8f10: 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
8f20: 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20  Term;.  pOut->z 
8f30: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70  = pOp->p4.z;.  p
8f40: 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31  Out->n = pOp->p1
8f50: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
8f60: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
8f70: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
8f80: 70 4f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  pOut);.#ifndef S
8f90: 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
8fa0: 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20  T_MATCH_BLOBS.  
8fb0: 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b  if( pOp->p3>0 ){
8fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8fd0: 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
8fe0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
8ff0: 3b 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d  ;.    pIn3 = &aM
9000: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
9010: 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
9020: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
9030: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e  ;.    if( pIn3->
9040: 75 2e 69 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70  u.i==pOp->p5 ) p
9050: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
9060: 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63  _Blob|MEM_Static
9070: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23  |MEM_Term;.  }.#
9080: 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d  endif.  break;.}
9090: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
90a0: 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  l P1 P2 P3 * *.*
90b0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
90c0: 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a  ..P3]=NULL.**.**
90d0: 20 57 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e   Write a NULL in
90e0: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e  to registers P2.
90f0: 20 20 49 66 20 50 33 20 67 72 65 61 74 65 72 20    If P3 greater 
9100: 74 68 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c  than P2, then al
9110: 73 6f 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c  so write.** NULL
9120: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
9130: 33 20 61 6e 64 20 65 76 65 72 79 20 72 65 67 69  3 and every regi
9140: 73 74 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ster in between 
9150: 50 32 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50  P2 and P3.  If P
9160: 33 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  3.** is less tha
9170: 6e 20 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20  n P2 (typically 
9180: 50 33 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  P3 is zero) then
9190: 20 6f 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50   only register P
91a0: 32 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e  2 is.** set to N
91b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
91c0: 65 20 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f  e P1 value is no
91d0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73  n-zero, then als
91e0: 6f 20 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c  o set the MEM_Cl
91f0: 65 61 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68  eared flag so th
9200: 61 74 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  at.** NULL value
9210: 73 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61  s will not compa
9220: 72 65 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66  re equal even if
9230: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
9240: 73 20 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e  s set on.** OP_N
9250: 65 20 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63  e or OP_Eq..*/.c
9260: 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20  ase OP_Null: {  
9270: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
9280: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20   */.  int cnt;. 
9290: 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20   u16 nullFlag;. 
92a0: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
92b0: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
92c0: 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d    cnt = pOp->p3-
92d0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
92e0: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
92f0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
9300: 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  sor) );.  pOut->
9310: 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67  flags = nullFlag
9320: 20 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45   = pOp->p1 ? (ME
9330: 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72  M_Null|MEM_Clear
9340: 65 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ed) : MEM_Null;.
9350: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
9360: 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b   while( cnt>0 ){
9370: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20  .    pOut++;.   
9380: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9390: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
93a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
93b0: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20  tNull(pOut);.   
93c0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
93d0: 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 70 4f 75  ullFlag;.    pOu
93e0: 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6e  t->n = 0;.    cn
93f0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t--;.  }.  break
9400: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
9410: 53 6f 66 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20  SoftNull P1 * * 
9420: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
9430: 20 72 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a   r[P1]=NULL.**.*
9440: 2a 20 53 65 74 20 72 65 67 69 73 74 65 72 20 50  * Set register P
9450: 31 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 61  1 to have the va
9460: 6c 75 65 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e  lue NULL as seen
9470: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
9480: 65 63 6f 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63  ecord.** instruc
9490: 74 69 6f 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  tion, but do not
94a0: 20 66 72 65 65 20 61 6e 79 20 73 74 72 69 6e 67   free any string
94b0: 20 6f 72 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20   or blob memory 
94c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
94d0: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 2c  ** the register,
94e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
94f0: 76 61 6c 75 65 20 77 61 73 20 61 20 73 74 72 69  value was a stri
9500: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 20  ng or blob that 
9510: 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
9520: 79 20 63 6f 70 69 65 64 20 75 73 69 6e 67 20 4f  y copied using O
9530: 50 5f 53 43 6f 70 79 2c 20 74 68 65 20 63 6f 70  P_SCopy, the cop
9540: 69 65 73 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  ies will continu
9550: 65 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a  e to be valid..*
9560: 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75  /.case OP_SoftNu
9570: 6c 6c 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  ll: {.  assert( 
9580: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
9590: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
95a0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
95b0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
95c0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
95d0: 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 4f 75 74  t->flags = (pOut
95e0: 2d 3e 66 6c 61 67 73 26 7e 28 4d 45 4d 5f 55 6e  ->flags&~(MEM_Un
95f0: 64 65 66 69 6e 65 64 7c 4d 45 4d 5f 41 66 66 4d  defined|MEM_AffM
9600: 61 73 6b 29 29 7c 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ask))|MEM_Null;.
9610: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9620: 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50  pcode: Blob P1 P
9630: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
9640: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 20 28  psis: r[P2]=P4 (
9650: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34  len=P1).**.** P4
9660: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f   points to a blo
9670: 62 20 6f 66 20 64 61 74 61 20 50 31 20 62 79 74  b of data P1 byt
9680: 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20  es long.  Store 
9690: 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20  this.** blob in 
96a0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
96b0: 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20  case OP_Blob: { 
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96d0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  * out2 */.  asse
96e0: 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53  rt( pOp->p1 <= S
96f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
9700: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   );.  pOut = out
9710: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
9720: 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Op);.  sqlite3Vd
9730: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
9740: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70  , pOp->p4.z, pOp
9750: 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70  ->p1, 0, 0);.  p
9760: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9770: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9780: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9790: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
97a0: 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c   Opcode: Variabl
97b0: 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  e P1 P2 * P4 *.*
97c0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
97d0: 5d 3d 70 61 72 61 6d 65 74 65 72 28 50 31 2c 50  ]=parameter(P1,P
97e0: 34 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  4).**.** Transfe
97f0: 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  r the values of 
9800: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
9810: 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
9820: 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   P2.**.** If the
9830: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61   parameter is na
9840: 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61  med, then its na
9850: 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34  me appears in P4
9860: 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75  ..** The P4 valu
9870: 65 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  e is used by sql
9880: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9890: 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63  ter_name()..*/.c
98a0: 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a  ase OP_Variable:
98b0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
98c0: 20 6f 75 74 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a   out2 */.  Mem *
98d0: 70 56 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56  pVar;       /* V
98e0: 61 6c 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73  alue being trans
98f0: 66 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ferred */..  ass
9900: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
9910: 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56  & pOp->p1<=p->nV
9920: 61 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ar );.  assert( 
9930: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20  pOp->p4.z==0 || 
9940: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 73 71 6c 69 74  pOp->p4.z==sqlit
9950: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
9960: 28 70 2d 3e 70 56 4c 69 73 74 2c 70 4f 70 2d 3e  (p->pVList,pOp->
9970: 70 31 29 20 29 3b 0a 20 20 70 56 61 72 20 3d 20  p1) );.  pVar = 
9980: 26 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31  &p->aVar[pOp->p1
9990: 20 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c   - 1];.  if( sql
99a0: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
99b0: 67 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67  g(pVar) ){.    g
99c0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
99d0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
99e0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69  pOp->p2];.  sqli
99f0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
9a00: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
9a10: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
9a20: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
9a30: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
9a40: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9a50: 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33  e: Move P1 P2 P3
9a60: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9a70: 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40  : r[P2@P3]=r[P1@
9a80: 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  P3].**.** Move t
9a90: 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 6e 20  he P3 values in 
9aa0: 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b  register P1..P1+
9ab0: 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a  P3-1 over into.*
9ac0: 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  * registers P2..
9ad0: 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74  P2+P3-1.  Regist
9ae0: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  ers P1..P1+P3-1 
9af0: 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64  are.** left hold
9b00: 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  ing a NULL.  It 
9b10: 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
9b20: 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a  register ranges.
9b30: 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61  ** P1..P1+P3-1 a
9b40: 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74  nd P2..P2+P3-1 t
9b50: 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 20 69  o overlap.  It i
9b60: 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f  s an error.** fo
9b70: 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 73 20  r P3 to be less 
9b80: 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20  than 1..*/.case 
9b90: 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74  OP_Move: {.  int
9ba0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n;           /*
9bb0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
9bc0: 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f 70  ters left to cop
9bd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20  y */.  int p1;  
9be0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
9bf0: 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d  ter to copy from
9c00: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
9c10: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9c20: 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f  er to copy to */
9c30: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ..  n = pOp->p3;
9c40: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
9c50: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26  .  assert( n>0 &
9c70: 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29  & p1>0 && p2>0 )
9c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e  ;.  assert( p1+n
9c90: 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31  <=p2 || p2+n<=p1
9ca0: 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   );..  pIn1 = &a
9cb0: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
9cc0: 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64  = &aMem[p2];.  d
9cd0: 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
9ce0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e  Out<=&aMem[(p->n
9cf0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9d00: 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  or)] );.    asse
9d10: 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b  rt( pIn1<=&aMem[
9d20: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9d30: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9d40: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
9d50: 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
9d60: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9d70: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
9d80: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
9d90: 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a  ve(pOut, pIn1);.
9da0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9db0: 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f 75 74  BUG.    if( pOut
9dc0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61  ->pScopyFrom>=&a
9dd0: 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d  Mem[p1] && pOut-
9de0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74  >pScopyFrom<pOut
9df0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
9e00: 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f  pScopyFrom += pO
9e10: 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20 20  p->p2 - p1;.    
9e20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 65 65  }.#endif.    Dee
9e30: 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
9e40: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
9e50: 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74  TRACE(p2++, pOut
9e60: 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
9e70: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68     pOut++;.  }wh
9e80: 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72  ile( --n );.  br
9e90: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9ea0: 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33  e: Copy P1 P2 P3
9eb0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9ec0: 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50  : r[P2@P3+1]=r[P
9ed0: 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61  1@P3+1].**.** Ma
9ee0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67  ke a copy of reg
9ef0: 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33  isters P1..P1+P3
9f00: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
9f10: 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a  P2..P2+P3..**.**
9f20: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
9f30: 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63  n makes a deep c
9f40: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
9f50: 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a  .  A duplicate.*
9f60: 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79  * is made of any
9f70: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9f80: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61  constant.  See a
9f90: 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  lso OP_SCopy..*/
9fa0: 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b  .case OP_Copy: {
9fb0: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
9fc0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31   pOp->p3;.  pIn1
9fd0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
9fe0: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
9ff0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
a000: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
a010: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
a020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a030: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
a040: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
a050: 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65 65 70  Ephem);.    Deep
a060: 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
a070: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
a080: 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e  DEBUG.    pOut->
a090: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
a0a0: 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47 49 53  #endif.    REGIS
a0b0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
a0c0: 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75  2+pOp->p3-n, pOu
a0d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d  t);.    if( (n--
a0e0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
a0f0: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49    pOut++;.    pI
a100: 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
a110: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a120: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
a130: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
a140: 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]=r[P1].**.*
a150: 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  * Make a shallow
a160: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
a170: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a180: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a190: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
a1a0: 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  kes a shallow co
a1b0: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
a1c0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
a1d0: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72  * is a string or
a1e0: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65 20   blob, then the 
a1f0: 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20 70  copy is only a p
a200: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
a210: 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68 65   original and he
a220: 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  nce if the origi
a230: 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20 77  nal changes so w
a240: 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a  ill the copy..**
a250: 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20 6f   Worse, if the o
a260: 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c  riginal is deall
a270: 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70 79  ocated, the copy
a280: 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64   becomes invalid
a290: 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70 72  ..** Thus the pr
a2a0: 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72 61  ogram must guara
a2b0: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f 72  ntee that the or
a2c0: 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  iginal will not 
a2d0: 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67  change.** during
a2e0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
a2f0: 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65 20   the copy.  Use 
a300: 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20  OP_Copy to make 
a310: 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f  a complete.** co
a320: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  py..*/.case OP_S
a330: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
a340: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a350: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
a360: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
a370: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a380: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
a390: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
a3a0: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
a3b0: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
a3c0: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64  MEM_Ephem);.#ifd
a3d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a3e0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f    if( pOut->pSco
a3f0: 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74  pyFrom==0 ) pOut
a400: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70  ->pScopyFrom = p
a410: 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72  In1;.#endif.  br
a420: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a430: 65 3a 20 49 6e 74 43 6f 70 79 20 50 31 20 50 32  e: IntCopy P1 P2
a440: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
a450: 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a  is: r[P2]=r[P1].
a460: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
a470: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
a480: 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65   held in registe
a490: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a4a0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a4b0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
a4c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f  d version of SCo
a4d0: 70 79 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e  py that works on
a4e0: 6c 79 20 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ly for integer.*
a4f0: 2a 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73  * values..*/.cas
a500: 65 20 4f 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20  e OP_IntCopy: { 
a510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a520: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
a530: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a540: 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e   assert( (pIn1->
a550: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
a560: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  !=0 );.  pOut = 
a570: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a590: 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 70  SetInt64(pOut, p
a5a0: 49 6e 31 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In1->u.i);.  bre
a5b0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
a5c0: 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50  : ResultRow P1 P
a5d0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
a5e0: 73 69 73 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31  sis: output=r[P1
a5f0: 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  @P2].**.** The r
a600: 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72 6f  egisters P1 thro
a610: 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74  ugh P1+P2-1 cont
a620: 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ain a single row
a630: 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20   of.** results. 
a640: 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75 73  This opcode caus
a650: 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  es the sqlite3_s
a660: 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74 65  tep() call to te
a670: 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20  rminate.** with 
a680: 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72 65  an SQLITE_ROW re
a690: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69 74  turn code and it
a6a0: 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71 6c   sets up the sql
a6b0: 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72  ite3_stmt.** str
a6c0: 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69 64  ucture to provid
a6d0: 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  e access to the 
a6e0: 72 28 50 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31  r(P1)..r(P1+P2-1
a6f0: 29 20 76 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74  ) values as.** t
a700: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a  he result row..*
a710: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74  /.case OP_Result
a720: 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  Row: {.  Mem *pM
a730: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
a740: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f  ssert( p->nResCo
a750: 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b  lumn==pOp->p2 );
a760: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a770: 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p1>0 );.  assert
a780: 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  ( pOp->p1+pOp->p
a790: 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  2<=(p->nMem+1 - 
a7a0: 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
a7b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a7c0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
a7d0: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 52 75 6e  ALLBACK.  /* Run
a7e0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 6f   the progress co
a7f0: 75 6e 74 65 72 20 6a 75 73 74 20 62 65 66 6f 72  unter just befor
a800: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
a810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  /.  if( db->xPro
a820: 67 72 65 73 73 21 3d 30 0a 20 20 20 26 26 20 6e  gress!=0.   && n
a830: 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73  VmStep>=nProgres
a840: 73 4c 69 6d 69 74 20 0a 20 20 20 26 26 20 64 62  sLimit .   && db
a850: 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e  ->xProgress(db->
a860: 70 50 72 6f 67 72 65 73 73 41 72 67 29 21 3d 30  pProgressArg)!=0
a870: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
a880: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
a890: 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
a8a0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
a8b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
a8c0: 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
a8d0: 20 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d   has violated im
a8e0: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
a8f0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  key constraints,
a900: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74   do.  ** not ret
a910: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
a920: 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e  f rows modified.
a930: 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45   And do not RELE
a940: 41 53 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ASE the statemen
a950: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
a960: 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  on. It needs to 
a970: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
a980: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
a990: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
a9a0: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
a9b0: 20 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65   0)) ){.    asse
a9c0: 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  rt( db->flags&SQ
a9d0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
a9e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
a9f0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
aa00: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f   );.    goto abo
aa10: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
aa20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
aa30: 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  e SQLITE_CountRo
aa40: 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  ws flag is set i
aa50: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
aa60: 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a  mask, then .  **
aa70: 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   DML statements 
aa80: 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
aa90: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  de to return the
aaa0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
aab0: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
aac0: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
aad0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
aae0: 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a   that a VM that.
aaf0: 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61    ** opens a sta
ab00: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ab10: 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68  on may invoke th
ab20: 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a  is opcode..  **.
ab30: 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69    ** In case thi
ab40: 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61 74  s is such a stat
ab50: 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79  ement, close any
ab60: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ab70: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  action.  ** open
ab80: 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 65  ed by this VM be
ab90: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63  fore returning c
aba0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73  ontrol to the us
abb0: 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  er. This is to. 
abc0: 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
abd0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
abe0: 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79  ctions are alway
abf0: 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76  s nested, not ov
ac00: 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20  erlapping..  ** 
ac10: 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74  If the open stat
ac20: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
ac30: 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20  n is not closed 
ac40: 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75  here, then the u
ac50: 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65  ser.  ** may ste
ac60: 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61  p another VM tha
ac70: 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20  t opens its own 
ac80: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
ac90: 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a  ction. This.  **
aca0: 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65   may lead to ove
acb0: 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65  rlapping stateme
acc0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  nt transactions.
acd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
ace0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
acf0: 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20  tion is never a 
ad00: 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61  top-level transa
ad10: 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20  ction.  Hence.  
ad20: 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 63  ** the RELEASE c
ad30: 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65  all below can ne
ad40: 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20  ver fail..  */. 
ad50: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
ad60: 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d  tement==0 || db-
ad70: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
ad80: 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20  untRows );.  rc 
ad90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
ada0: 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53  seStatement(p, S
adb0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
adc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
add0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
ade0: 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
adf0: 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  ll ephemeral cur
ae00: 73 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a  sor row caches *
ae10: 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  /.  p->cacheCtr 
ae20: 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b  = (p->cacheCtr +
ae30: 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b   2)|1;..  /* Mak
ae40: 65 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c  e sure the resul
ae50: 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ts of the curren
ae60: 74 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74  t row are \000 t
ae70: 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61  erminated.  ** a
ae80: 6e 64 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  nd have an assig
ae90: 6e 65 64 20 74 79 70 65 2e 20 20 54 68 65 20 72  ned type.  The r
aea0: 65 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70  esults are de-ep
aeb0: 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20  hemeralized as. 
aec0: 20 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65 63   ** a side effec
aed0: 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d  t..  */.  pMem =
aee0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
aef0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
af00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
af10: 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  p->p2; i++){.   
af20: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
af30: 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b  lid(&pMem[i]) );
af40: 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
af50: 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  ize(&pMem[i]);. 
af60: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
af70: 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [i].flags & MEM_
af80: 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20  Ephem)==0.      
af90: 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69        || (pMem[i
afa0: 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ].flags & (MEM_S
afb0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
afc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
afd0: 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61  dbeMemNulTermina
afe0: 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  te(&pMem[i]);.  
aff0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
b000: 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65  (pOp->p1+i, &pMe
b010: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  m[i]);.  }.  if(
b020: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b030: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
b040: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61  ..  if( db->mTra
b050: 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43  ce & SQLITE_TRAC
b060: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d  E_ROW ){.    db-
b070: 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54  >xTrace(SQLITE_T
b080: 52 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54  RACE_ROW, db->pT
b090: 72 61 63 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a  raceArg, p, 0);.
b0a0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
b0b0: 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f   SQLITE_ROW.  */
b0c0: 0a 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29  .  p->pc = (int)
b0d0: 28 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b  (pOp - aOp) + 1;
b0e0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52  .  rc = SQLITE_R
b0f0: 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f  OW;.  goto vdbe_
b100: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70  return;.}../* Op
b110: 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20  code: Concat P1 
b120: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b130: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b140: 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41  2]+r[P1].**.** A
b150: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72  dd the text in r
b160: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20  egister P1 onto 
b170: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
b180: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ext in.** regist
b190: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
b1a0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b1b0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
b1c0: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f   either the P1 o
b1d0: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55  r P2 text are NU
b1e0: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55  LL then store NU
b1f0: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  LL in P3..**.** 
b200: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a    P3 = P2 || P1.
b210: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
b220: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50  gal for P1 and P
b230: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  3 to be the same
b240: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74   register. Somet
b250: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69  imes,.** if P3 i
b260: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  s the same regis
b270: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69  ter as P2, the i
b280: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
b290: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69   able.** to avoi
b2a0: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f  d a memcpy()..*/
b2b0: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a  .case OP_Concat:
b2c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
b2d0: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41  same as TK_CONCA
b2e0: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
b2f0: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65  3 */.  i64 nByte
b300: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
b310: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
b320: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
b330: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
b340: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
b350: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f  assert( pIn1!=pO
b360: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  ut );.  if( (pIn
b370: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
b380: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
b390: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
b3a0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
b3b0: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
b3c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61  ;.  }.  if( Expa
b3d0: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20  ndBlob(pIn1) || 
b3e0: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29  ExpandBlob(pIn2)
b3f0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
b400: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31    Stringify(pIn1
b410: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53  , encoding);.  S
b420: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65  tringify(pIn2, e
b430: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74  ncoding);.  nByt
b440: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49  e = pIn1->n + pI
b450: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79  n2->n;.  if( nBy
b460: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
b470: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
b480: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
b490: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66  oo_big;.  }.  if
b4a0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b4b0: 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
b4c0: 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70  nByte+2, pOut==p
b4d0: 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  In2) ){.    goto
b4e0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d   no_mem;.  }.  M
b4f0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
b500: 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20  ut, MEM_Str);.  
b510: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29  if( pOut!=pIn2 )
b520: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  {.    memcpy(pOu
b530: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70  t->z, pIn2->z, p
b540: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d  In2->n);.  }.  m
b550: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70  emcpy(&pOut->z[p
b560: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a  In2->n], pIn1->z
b570: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f  , pIn1->n);.  pO
b580: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a  ut->z[nByte]=0;.
b590: 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b    pOut->z[nByte+
b5a0: 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e  1] = 0;.  pOut->
b5b0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72  flags |= MEM_Ter
b5c0: 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28  m;.  pOut->n = (
b5d0: 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75  int)nByte;.  pOu
b5e0: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
b5f0: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
b600: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
b610: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
b620: 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32  pcode: Add P1 P2
b630: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b640: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d  sis: r[P3]=r[P1]
b650: 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64  +r[P2].**.** Add
b660: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b670: 67 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65  gister P1 to the
b680: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b690: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
b6a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b6b0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b6c0: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b6d0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b6e0: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b6f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74  ./* Opcode: Mult
b700: 69 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20  iply P1 P2 P3 * 
b710: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
b720: 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d  [P3]=r[P1]*r[P2]
b730: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70  .**.**.** Multip
b740: 6c 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ly the value in 
b750: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
b760: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b770: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b780: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b790: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b7a0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b7b0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b7c0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b7d0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75  */./* Opcode: Su
b7e0: 62 74 72 61 63 74 20 50 31 20 50 32 20 50 33 20  btract P1 P2 P3 
b7f0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
b800: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50   r[P3]=r[P2]-r[P
b810: 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63  1].**.** Subtrac
b820: 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
b830: 65 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20  egister P1 from 
b840: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b850: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
b860: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b870: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
b880: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
b890: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
b8a0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b8b0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .*/./* Opcode: D
b8c0: 69 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a  ivide P1 P2 P3 *
b8d0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
b8e0: 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31  r[P3]=r[P2]/r[P1
b8f0: 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74  ].**.** Divide t
b900: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b910: 73 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76  ster P1 by the v
b920: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b930: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
b940: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
b950: 65 67 69 73 74 65 72 20 50 33 20 28 50 33 3d 50  egister P3 (P3=P
b960: 32 2f 50 31 29 2e 20 49 66 20 74 68 65 20 76 61  2/P1). If the va
b970: 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73  lue in .** regis
b980: 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20  ter P1 is zero, 
b990: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
b9a0: 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68  is NULL. If eith
b9b0: 65 72 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20  er input is .** 
b9c0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b9d0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
b9e0: 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65  Opcode: Remainde
b9f0: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
ba00: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
ba10: 5d 3d 72 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a  ]=r[P2]%r[P1].**
ba20: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
ba30: 72 65 6d 61 69 6e 64 65 72 20 61 66 74 65 72 20  remainder after 
ba40: 69 6e 74 65 67 65 72 20 72 65 67 69 73 74 65 72  integer register
ba50: 20 50 32 20 69 73 20 64 69 76 69 64 65 64 20 62   P2 is divided b
ba60: 79 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  y .** register P
ba70: 31 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  1 and store the 
ba80: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
ba90: 65 72 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68  er P3. .** If th
baa0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
bab0: 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f 20 74  ter P1 is zero t
bac0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
bad0: 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  L..** If either 
bae0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c  operand is NULL,
baf0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
bb00: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
bb10: 41 64 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  Add:            
bb20: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
bb30: 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20  s TK_PLUS, in1, 
bb40: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
bb50: 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20  e OP_Subtract:  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
bb70: 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c  ame as TK_MINUS,
bb80: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
bb90: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69  */.case OP_Multi
bba0: 70 6c 79 3a 20 20 20 20 20 20 20 20 20 20 20 20  ply:            
bbb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
bbc0: 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  STAR, in1, in2, 
bbd0: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
bbe0: 44 69 76 69 64 65 3a 20 20 20 20 20 20 20 20 20  Divide:         
bbf0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
bc00: 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c  s TK_SLASH, in1,
bc10: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
bc20: 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a  se OP_Remainder:
bc30: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
bc40: 73 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20  same as TK_REM, 
bc50: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
bc60: 2f 0a 20 20 63 68 61 72 20 62 49 6e 74 69 6e 74  /.  char bIntint
bc70: 3b 20 20 20 2f 2a 20 53 74 61 72 74 65 64 20 6f  ;   /* Started o
bc80: 75 74 20 61 73 20 74 77 6f 20 69 6e 74 65 67 65  ut as two intege
bc90: 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20  r operands */.  
bca0: 75 31 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20  u16 flags;      
bcb0: 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f  /* Combined MEM_
bcc0: 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74  * flags from bot
bcd0: 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31  h inputs */.  u1
bce0: 36 20 74 79 70 65 31 3b 20 20 20 20 20 20 2f 2a  6 type1;      /*
bcf0: 20 4e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   Numeric type of
bd00: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
bd10: 0a 20 20 75 31 36 20 74 79 70 65 32 3b 20 20 20  .  u16 type2;   
bd20: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79     /* Numeric ty
bd30: 70 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72  pe of right oper
bd40: 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  and */.  i64 iA;
bd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
bd60: 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  ger value of lef
bd70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
bd80: 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f  64 iB;         /
bd90: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
bda0: 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  of right operand
bdb0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b   */.  double rA;
bdc0: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
bdd0: 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  lue of left oper
bde0: 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  and */.  double 
bdf0: 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c  rB;      /* Real
be00: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
be10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49  operand */..  pI
be20: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
be30: 70 31 5d 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e  p1];.  type1 = n
be40: 75 6d 65 72 69 63 54 79 70 65 28 70 49 6e 31 29  umericType(pIn1)
be50: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
be60: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70  [pOp->p2];.  typ
be70: 65 32 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65  e2 = numericType
be80: 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d  (pIn2);.  pOut =
be90: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
bea0: 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d  .  flags = pIn1-
beb0: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66  >flags | pIn2->f
bec0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 74 79 70  lags;.  if( (typ
bed0: 65 31 20 26 20 74 79 70 65 32 20 26 20 4d 45 4d  e1 & type2 & MEM
bee0: 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
bef0: 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a  iA = pIn1->u.i;.
bf00: 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75      iB = pIn2->u
bf10: 2e 69 3b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20  .i;.    bIntint 
bf20: 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28  = 1;.    switch(
bf30: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
bf40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64        case OP_Ad
bf50: 64 3a 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  d:       if( sql
bf60: 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 69 42  ite3AddInt64(&iB
bf70: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d  ,iA) ) goto fp_m
bf80: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ath;  break;.   
bf90: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
bfa0: 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69 74 65  act:  if( sqlite
bfb0: 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c 69 41  3SubInt64(&iB,iA
bfc0: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  ) ) goto fp_math
bfd0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bfe0: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
bff0: 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 75  :  if( sqlite3Mu
c000: 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29  lInt64(&iB,iA) )
c010: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20   goto fp_math;  
c020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c030: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20  e OP_Divide: {. 
c040: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
c050: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
c060: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c070: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
c080: 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41  A==-1 && iB==SMA
c090: 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 67 6f  LLEST_INT64 ) go
c0a0: 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20  to fp_math;.    
c0b0: 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20      iB /= iA;.  
c0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0d0: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
c0e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  lt: {.        if
c0f0: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
c100: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
c110: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
c120: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69    if( iA==-1 ) i
c130: 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  A = 1;.        i
c140: 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20 20 20  B %= iA;.       
c150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c160: 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e      }.    pOut->
c170: 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65  u.i = iB;.    Me
c180: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
c190: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
c1a0: 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
c1b0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
c1c0: 7b 0a 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68  {.    goto arith
c1d0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c1e0: 6e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  null;.  }else{. 
c1f0: 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a     bIntint = 0;.
c200: 66 70 5f 6d 61 74 68 3a 0a 20 20 20 20 72 41 20  fp_math:.    rA 
c210: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
c220: 6c 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  lValue(pIn1);.  
c230: 20 20 72 42 20 3d 20 73 71 6c 69 74 65 33 56 64    rB = sqlite3Vd
c240: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 32  beRealValue(pIn2
c250: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
c260: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
c270: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a      case OP_Add:
c280: 20 20 20 20 20 20 20 20 20 72 42 20 2b 3d 20 72           rB += r
c290: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
c2a0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75        case OP_Su
c2b0: 62 74 72 61 63 74 3a 20 20 20 20 72 42 20 2d 3d  btract:    rB -=
c2c0: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
c2d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
c2e0: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 72 42 20  Multiply:    rB 
c2f0: 2a 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  *= rA;       bre
c300: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c310: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
c320: 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30      /* (double)0
c330: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
c340: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
c350: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20  _POINT... */.   
c360: 20 20 20 20 20 69 66 28 20 72 41 3d 3d 28 64 6f       if( rA==(do
c370: 75 62 6c 65 29 30 20 29 20 67 6f 74 6f 20 61 72  uble)0 ) goto ar
c380: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
c390: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
c3a0: 20 72 42 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20   rB /= rA;.     
c3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c3c0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
c3d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 41 20 3d 20   {.        iA = 
c3e0: 28 69 36 34 29 72 41 3b 0a 20 20 20 20 20 20 20  (i64)rA;.       
c3f0: 20 69 42 20 3d 20 28 69 36 34 29 72 42 3b 0a 20   iB = (i64)rB;. 
c400: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
c410: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
c420: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c430: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
c440: 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a  A==-1 ) iA = 1;.
c450: 20 20 20 20 20 20 20 20 72 42 20 3d 20 28 64 6f          rB = (do
c460: 75 62 6c 65 29 28 69 42 20 25 20 69 41 29 3b 0a  uble)(iB % iA);.
c470: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
c490: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c4a0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
c4b0: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72     pOut->u.i = r
c4c0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
c4d0: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
c4e0: 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Int);.#else.    
c4f0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  if( sqlite3IsNaN
c500: 28 72 42 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  (rB) ){.      go
c510: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c520: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c530: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e    }.    pOut->u.
c540: 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53  r = rB;.    MemS
c550: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
c560: 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20   MEM_Real);.    
c570: 69 66 28 20 28 28 74 79 70 65 31 7c 74 79 70 65  if( ((type1|type
c580: 32 29 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20  2)&MEM_Real)==0 
c590: 26 26 20 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20  && !bIntint ){. 
c5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5b0: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
c5c0: 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pOut);.    }.#en
c5d0: 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
c5e0: 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  ..arithmetic_res
c5f0: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73  ult_is_null:.  s
c600: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c610: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72  Null(pOut);.  br
c620: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c630: 65 3a 20 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20  e: CollSeq P1 * 
c640: 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  * P4.**.** P4 is
c650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c660: 43 6f 6c 6c 53 65 71 20 6f 62 6a 65 63 74 2e 20  CollSeq object. 
c670: 49 66 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  If the next call
c680: 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74   to a user funct
c690: 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67  ion.** or aggreg
c6a0: 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ate calls sqlite
c6b0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
c6c0: 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  ), this collatio
c6d0: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a  n sequence will.
c6e0: 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ** be returned. 
c6f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
c700: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
c710: 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75  (), max() and nu
c720: 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69  llif().** functi
c730: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31  ons..**.** If P1
c740: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
c750: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
c760: 74 65 72 20 74 68 61 74 20 61 20 73 75 62 73 65  ter that a subse
c770: 71 75 65 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a  quent min() or.*
c780: 2a 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  * max() aggregat
c790: 65 20 77 69 6c 6c 20 73 65 74 20 74 6f 20 31 20  e will set to 1 
c7a0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  if the current r
c7b0: 6f 77 20 69 73 20 6e 6f 74 20 74 68 65 20 6d 69  ow is not the mi
c7c0: 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69  nimum or.** maxi
c7d0: 6d 75 6d 2e 20 20 54 68 65 20 50 31 20 72 65 67  mum.  The P1 reg
c7e0: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
c7f0: 69 7a 65 64 20 74 6f 20 30 20 62 79 20 74 68 69  ized to 0 by thi
c800: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
c810: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
c820: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ce used by the i
c830: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
c840: 20 74 68 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f   the aforementio
c850: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ned functions.**
c860: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
c870: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c880: 6e 63 65 20 73 65 74 20 62 79 20 74 68 69 73 20  nce set by this 
c890: 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 76  opcode is not av
c8a0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69  ailable.** publi
c8b0: 63 6c 79 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74  cly.  Only built
c8c0: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  -in functions ha
c8d0: 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 69  ve access to thi
c8e0: 73 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61  s feature..*/.ca
c8f0: 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b  se OP_CollSeq: {
c900: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
c910: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
c920: 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  EQ );.  if( pOp-
c930: 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p1 ){.    sqlit
c940: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
c950: 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  4(&aMem[pOp->p1]
c960: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  , 0);.  }.  brea
c970: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
c980: 20 42 69 74 41 6e 64 20 50 31 20 50 32 20 50 33   BitAnd P1 P2 P3
c990: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
c9a0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b  : r[P3]=r[P1]&r[
c9b0: 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  P2].**.** Take t
c9c0: 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e 44 20  he bit-wise AND 
c9d0: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
c9e0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
c9f0: 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65   P2 and.** store
ca00: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
ca10: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
ca20: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
ca30: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
ca40: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
ca50: 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f 72 20  * Opcode: BitOr 
ca60: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
ca70: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
ca80: 72 5b 50 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]|r[P2].**.*
ca90: 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77  * Take the bit-w
caa0: 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20 76 61  ise OR of the va
cab0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
cac0: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
cad0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
cae0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
caf0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
cb00: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
cb10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
cb20: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
cb30: 20 53 68 69 66 74 4c 65 66 74 20 50 31 20 50 32   ShiftLeft P1 P2
cb40: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
cb50: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
cb60: 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68  <<r[P1].**.** Sh
cb70: 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  ift the integer 
cb80: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
cb90: 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65 66 74  r P2 to the left
cba0: 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   by the.** numbe
cbb0: 72 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66  r of bits specif
cbc0: 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  ied by the integ
cbd0: 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
cbe0: 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  1..** Store the 
cbf0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
cc00: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
cc10: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
cc20: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
cc30: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
cc40: 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68 74 20  ode: ShiftRight 
cc50: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
cc60: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
cc70: 72 5b 50 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]>>r[P1].**.
cc80: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
cc90: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
cca0: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
ccb0: 20 72 69 67 68 74 20 62 79 20 74 68 65 0a 2a 2a   right by the.**
ccc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
ccd0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
cce0: 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69   integer in regi
ccf0: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72  ster P1..** Stor
cd00: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
cd10: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
cd20: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
cd30: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
cd40: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
cd50: 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20  case OP_BitAnd: 
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
cd80: 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  TAND, in1, in2, 
cd90: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
cda0: 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20 20 20  BitOr:          
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
cdc0: 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31  as TK_BITOR, in1
cdd0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
cde0: 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74  ase OP_ShiftLeft
cdf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
ce00: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48  * same as TK_LSH
ce10: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
ce20: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
ce30: 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20 20 20  hiftRight: {    
ce40: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ce50: 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31  s TK_RSHIFT, in1
ce60: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
ce70: 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34 20 75   i64 iA;.  u64 u
ce80: 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20 20 75  A;.  i64 iB;.  u
ce90: 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  8 op;..  pIn1 = 
cea0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
ceb0: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
cec0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20  Op->p2];.  pOut 
ced0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
cee0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
cef0: 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61  lags | pIn2->fla
cf00: 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  gs) & MEM_Null )
cf10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cf20: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
cf30: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
cf40: 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74 65 33  }.  iA = sqlite3
cf50: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
cf60: 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  2);.  iB = sqlit
cf70: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
cf80: 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70  In1);.  op = pOp
cf90: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66 28 20  ->opcode;.  if( 
cfa0: 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b  op==OP_BitAnd ){
cfb0: 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b 0a 20  .    iA &= iB;. 
cfc0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f   }else if( op==O
cfd0: 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20 20 69  P_BitOr ){.    i
cfe0: 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65  A |= iB;.  }else
cff0: 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a 20 20   if( iB!=0 ){.  
d000: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
d010: 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c 20 6f  _ShiftRight || o
d020: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
d030: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 68  );..    /* If sh
d040: 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65 67 61  ifting by a nega
d050: 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69  tive amount, shi
d060: 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ft in the other 
d070: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  direction */.   
d080: 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20   if( iB<0 ){.   
d090: 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 68     assert( OP_Sh
d0a0: 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69  iftRight==OP_Shi
d0b0: 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20 20 20  ftLeft+1 );.    
d0c0: 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66    op = 2*OP_Shif
d0d0: 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a  tLeft + 1 - op;.
d0e0: 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e 28 2d        iB = iB>(-
d0f0: 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a  64) ? -iB : 64;.
d100: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
d110: 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20 20 69  B>=64 ){.      i
d120: 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70  A = (iA>=0 || op
d130: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 29 20  ==OP_ShiftLeft) 
d140: 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65  ? 0 : -1;.    }e
d150: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
d160: 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69 7a 65  y(&uA, &iA, size
d170: 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20 20 69  of(uA));.      i
d180: 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  f( op==OP_ShiftL
d190: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eft ){.        u
d1a0: 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20  A <<= iB;.      
d1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
d1c0: 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20  A >>= iB;.      
d1d0: 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64    /* Sign-extend
d1e0: 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68 69 66   on a right shif
d1f0: 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76 65 20  t of a negative 
d200: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
d210: 20 20 69 66 28 20 69 41 3c 30 20 29 20 75 41 20    if( iA<0 ) uA 
d220: 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66 66 66  |= ((((u64)0xfff
d230: 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78 66 66  fffff)<<32)|0xff
d240: 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34 2d 69  ffffff) << (64-i
d250: 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  B);.      }.    
d260: 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20 26 75    memcpy(&iA, &u
d270: 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a  A, sizeof(iA));.
d280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74      }.  }.  pOut
d290: 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65  ->u.i = iA;.  Me
d2a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
d2b0: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62  t, MEM_Int);.  b
d2c0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
d2d0: 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50  de: AddImm  P1 P
d2e0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
d2f0: 73 69 73 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d  sis: r[P1]=r[P1]
d300: 2b 50 32 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  +P2.** .** Add t
d310: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
d320: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
d330: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
d340: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
d350: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
d360: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
d370: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
d380: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
d390: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
d3a0: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
d3b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
d3c0: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
d3d0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
d3e0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
d3f0: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
d400: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
d410: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
d420: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
d430: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
d440: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
d450: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
d460: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
d470: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
d480: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
d490: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
d4a0: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
d4b0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
d4c0: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
d4d0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
d4e0: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
d4f0: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
d500: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
d510: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
d520: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
d530: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
d540: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
d550: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
d560: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
d570: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
d580: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
d590: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
d5a0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
d5b0: 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
d5c0: 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
d5d0: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
d5e0: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f  FF_NUMERIC, enco
d5f0: 64 69 6e 67 29 3b 0a 20 20 20 20 56 64 62 65 42  ding);.    VdbeB
d600: 72 61 6e 63 68 54 61 6b 65 6e 28 28 70 49 6e 31  ranchTaken((pIn1
d610: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29  ->flags&MEM_Int)
d620: 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28  ==0, 2);.    if(
d630: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
d640: 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
d650: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
d660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
d670: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  c = SQLITE_MISMA
d680: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  TCH;.        got
d690: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
d6a0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
d6b0: 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e{.        goto 
d6c0: 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20  jump_to_p2;.    
d6d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d6e0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
d6f0: 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  In1, MEM_Int);. 
d700: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
d710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
d720: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
d730: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
d740: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
d750: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
d760: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
d770: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
d780: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
d790: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
d7a0: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
d7b0: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
d7c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
d7d0: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
d7e0: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
d7f0: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
d800: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
d810: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
d820: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
d830: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
d840: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
d850: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
d860: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
d870: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
d880: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
d890: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
d8b0: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
d8c0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
d8d0: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
d8e0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
d8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d900: 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20  Realify(pIn1);. 
d910: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
d920: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
d940: 2a 20 4f 70 63 6f 64 65 3a 20 43 61 73 74 20 50  * Opcode: Cast P
d950: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
d960: 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69 74 79  nopsis: affinity
d970: 28 72 5b 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f  (r[P1]).**.** Fo
d980: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
d990: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
d9a0: 62 65 20 74 68 65 20 74 79 70 65 20 64 65 66 69  be the type defi
d9b0: 6e 65 64 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a  ned by P2..** .*
d9c0: 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50  * <ul>.** <li> P
d9d0: 32 3d 3d 27 41 27 20 26 72 61 72 72 3b 20 42 4c  2=='A' &rarr; BL
d9e0: 4f 42 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27  OB.** <li> P2=='
d9f0: 42 27 20 26 72 61 72 72 3b 20 54 45 58 54 0a 2a  B' &rarr; TEXT.*
da00: 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 43 27 20 26  * <li> P2=='C' &
da10: 72 61 72 72 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a  rarr; NUMERIC.**
da20: 20 3c 6c 69 3e 20 50 32 3d 3d 27 44 27 20 26 72   <li> P2=='D' &r
da30: 61 72 72 3b 20 49 4e 54 45 47 45 52 0a 2a 2a 20  arr; INTEGER.** 
da40: 3c 6c 69 3e 20 50 32 3d 3d 27 45 27 20 26 72 61  <li> P2=='E' &ra
da50: 72 72 3b 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c  rr; REAL.** </ul
da60: 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  >.**.** A NULL v
da70: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
da80: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
da90: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
daa0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
dab0: 50 5f 43 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Cast: {       
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
dad0: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  1 */.  assert( p
dae0: 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41  Op->p2>=SQLITE_A
daf0: 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e  FF_BLOB && pOp->
db00: 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  p2<=SQLITE_AFF_R
db10: 45 41 4c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  EAL );.  testcas
db20: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
db30: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
db40: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
db50: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  p2==SQLITE_AFF_B
db60: 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74 63 61 73  LOB );.  testcas
db70: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
db80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
db90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
dba0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
dbb0: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 74  F_INTEGER );.  t
dbc0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
dbd0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
dbe0: 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  L );.  pIn1 = &a
dbf0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
dc00: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
dc10: 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 72 63 20  (p, pIn1);.  rc 
dc20: 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
dc30: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
dc40: 65 4d 65 6d 43 61 73 74 28 70 49 6e 31 2c 20 70  eMemCast(pIn1, p
dc50: 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67  Op->p2, encoding
dc60: 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
dc70: 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
dc80: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
dc90: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
dca0: 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
dcb0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
dcc0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a  OMIT_CAST */../*
dcd0: 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50   Opcode: Eq P1 P
dce0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
dcf0: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
dd00: 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f  ==r[P1].**.** Co
dd10: 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
dd20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
dd30: 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67 28  and P3.  If reg(
dd40: 50 33 29 3d 3d 72 65 67 28 50 31 29 20 74 68 65  P3)==reg(P1) the
dd50: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
dd60: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
dd70: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
dd80: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
dd90: 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74  n P5, then.** st
dda0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ore the result o
ddb0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  f comparison in 
ddc0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
ddd0: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46  ** The SQLITE_AF
dde0: 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f  F_MASK portion o
ddf0: 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20  f P5 must be an 
de00: 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74  affinity charact
de10: 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  er -.** SQLITE_A
de20: 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f  FF_TEXT, SQLITE_
de30: 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64  AFF_INTEGER, and
de40: 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74   so forth. An at
de50: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a  tempt is made .*
de60: 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68  * to coerce both
de70: 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e   inputs accordin
de80: 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69  g to this affini
de90: 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ty before the.**
dea0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
deb0: 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49  ade. If the SQLI
dec0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30  TE_AFF_MASK is 0
ded0: 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  x00, then numeri
dee0: 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73  c.** affinity is
def0: 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74   used. Note that
df00: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f   the affinity co
df10: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74  nversions are st
df20: 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74  ored.** back int
df30: 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
df40: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
df50: 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65    So this opcode
df60: 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65   can cause.** pe
df70: 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73  rsistent changes
df80: 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31   to registers P1
df90: 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f   and P3..**.** O
dfa0: 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  nce any conversi
dfb0: 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ons have taken p
dfc0: 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65  lace, and neithe
dfd0: 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  r value is NULL,
dfe0: 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20   .** the values 
dff0: 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66  are compared. If
e000: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
e010: 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63   blobs then memc
e020: 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20  mp() is.** used 
e030: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
e040: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
e050: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
e060: 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61  both values.** a
e070: 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68  re text, then th
e080: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
e090: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
e0a0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a   specified in.**
e0b0: 20 50 34 20 69 73 20 75 73 65 64 20 74 6f 20 64   P4 is used to d
e0c0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
e0d0: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
e0e0: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
e0f0: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
e100: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
e110: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
e120: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
e130: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
e140: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
e150: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
e160: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
e170: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
e180: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
e190: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
e1a0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
e1b0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
e1c0: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
e1d0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
e1e0: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
e1f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
e200: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
e210: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
e220: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
e230: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
e240: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
e250: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
e260: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
e270: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
e280: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
e290: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
e2a0: 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  ue.  If either o
e2b0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
e2c0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
e2d0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e  s false..** If n
e2e0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e2f0: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
e300: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
e310: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
e320: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
e330: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
e340: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
e350: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51  **.** If both SQ
e360: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64  LITE_STOREP2 and
e370: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
e380: 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20 74   flags are set t
e390: 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  hen the.** conte
e3a0: 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f  nt of r[P2] is o
e3b0: 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
e3c0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
e3d0: 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61 6c 73 65  NULL or 0 (false
e3e0: 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  )..** In other w
e3f0: 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b  ords, a prior r[
e400: 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  P2] value will n
e410: 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ot be overwritte
e420: 6e 20 62 79 20 31 20 28 74 72 75 65 29 2e 0a 2a  n by 1 (true)..*
e430: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20  /./* Opcode: Ne 
e440: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
e450: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
e460: 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]!=r[P1].**.*
e470: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
e480: 74 20 6c 69 6b 65 20 74 68 65 20 45 71 20 6f 70  t like the Eq op
e490: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
e4a0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
e4b0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
e4c0: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
e4d0: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
e4e0: 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65   not equal.  See
e4f0: 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65 20 66   the Eq opcode f
e500: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
e510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
e520: 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49  .** If both SQLI
e530: 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53  TE_STOREP2 and S
e540: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66  QLITE_KEEPNULL f
e550: 6c 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65  lags are set the
e560: 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
e570: 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c   of r[P2] is onl
e580: 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
e590: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55   new value is NU
e5a0: 4c 4c 20 6f 72 20 31 20 28 74 72 75 65 29 2e 0a  LL or 1 (true)..
e5b0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
e5c0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
e5d0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
e5e0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
e5f0: 79 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a  y 0 (false)..*/.
e600: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31  /* Opcode: Lt P1
e610: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
e620: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
e630: 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43  3]<r[P1].**.** C
e640: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
e650: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
e660: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67   and P3.  If reg
e670: 28 50 33 29 3c 72 65 67 28 50 31 29 20 74 68 65  (P3)<reg(P1) the
e680: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
e690: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
e6a0: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
e6b0: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
e6c0: 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68  n P5 store.** th
e6d0: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
e6e0: 61 72 69 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f  arison (0 or 1 o
e6f0: 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67  r NULL) into reg
e700: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
e710: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
e720: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20  MPIFNULL bit of 
e730: 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 65 69  P5 is set and ei
e740: 74 68 65 72 20 72 65 67 28 50 31 29 20 6f 72 0a  ther reg(P1) or.
e750: 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e 55  ** reg(P3) is NU
e760: 4c 4c 20 74 68 65 6e 20 74 68 65 20 74 61 6b 65  LL then the take
e770: 20 74 68 65 20 6a 75 6d 70 2e 20 20 49 66 20 74   the jump.  If t
e780: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
e790: 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20  NULL .** bit is 
e7a0: 63 6c 65 61 72 20 74 68 65 6e 20 66 61 6c 6c 20  clear then fall 
e7b0: 74 68 72 6f 75 67 68 20 69 66 20 65 69 74 68 65  through if eithe
e7c0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
e7d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  L..**.** The SQL
e7e0: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72  ITE_AFF_MASK por
e7f0: 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20  tion of P5 must 
e800: 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  be an affinity c
e810: 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51  haracter -.** SQ
e820: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53  LITE_AFF_TEXT, S
e830: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
e840: 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  R, and so forth.
e850: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
e860: 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63  ade .** to coerc
e870: 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63  e both inputs ac
e880: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
e890: 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
e8a0: 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  the.** compariso
e8b0: 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68  n is made. If th
e8c0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
e8d0: 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20  K is 0x00, then 
e8e0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e  numeric.** affin
e8f0: 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74  ity is used. Not
e900: 65 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  e that the affin
e910: 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ity conversions 
e920: 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61  are stored.** ba
e930: 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75  ck into the inpu
e940: 74 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  t registers P1 a
e950: 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20  nd P3.  So this 
e960: 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65  opcode can cause
e970: 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63  .** persistent c
e980: 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74  hanges to regist
e990: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a  ers P1 and P3..*
e9a0: 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f  *.** Once any co
e9b0: 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74  nversions have t
e9c0: 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20  aken place, and 
e9d0: 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73  neither value is
e9e0: 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76   NULL, .** the v
e9f0: 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72  alues are compar
ea00: 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  ed. If both valu
ea10: 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65  es are blobs the
ea20: 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a  n memcmp() is.**
ea30: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
ea40: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ne the results o
ea50: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
ea60: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
ea70: 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74  s.** are text, t
ea80: 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  hen the appropri
ea90: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ate collating fu
eaa0: 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  nction specified
eab0: 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73   in.** P4 is  us
eac0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  ed to do the com
ead0: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20  parison.  If P4 
eae0: 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  is not specified
eaf0: 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28   then.** memcmp(
eb00: 29 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ) is used to com
eb10: 70 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67  pare text string
eb20: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
eb30: 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63  s are.** numeric
eb40: 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63  , then a numeric
eb50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75   comparison is u
eb60: 73 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20  sed. If the two 
eb70: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66  values.** are of
eb80: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
eb90: 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61  , then numbers a
eba0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
ebb0: 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e  ss than.** strin
ebc0: 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  gs and strings a
ebd0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
ebe0: 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
ebf0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20  /./* Opcode: Le 
ec00: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
ec10: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
ec20: 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]<=r[P1].**.*
ec30: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
ec40: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
ec50: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
ec60: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
ec70: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
ec80: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
ec90: 20 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P3 is less than
eca0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
ecb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
ecc0: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
ecd0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
ece0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
ecf0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
ed00: 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50   Opcode: Gt P1 P
ed10: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
ed20: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
ed30: 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  >r[P1].**.** Thi
ed40: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
ed50: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ed60: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
ed70: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
ed80: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
ed90: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
eda0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
edb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
edc0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
edd0: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
ede0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
edf0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
ee00: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31  /* Opcode: Ge P1
ee10: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
ee20: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
ee30: 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  3]>=r[P1].**.** 
ee40: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
ee50: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
ee60: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
ee70: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
ee80: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
ee90: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
eea0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
eeb0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
eec0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
eed0: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
eee0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
eef0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
ef00: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
ef10: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20  ase OP_Eq:      
ef20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ef30: 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c   as TK_EQ, jump,
ef40: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
ef50: 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20  e OP_Ne:        
ef60: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ef70: 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69  s TK_NE, jump, i
ef80: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
ef90: 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Lt:          
efa0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
efb0: 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LT, jump, in1
efc0: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
efd0: 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Le:            
efe0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
eff0: 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LE, jump, in1, 
f000: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
f010: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
f020: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
f030: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
f040: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a  3 */.case OP_Ge:
f050: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
f060: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c  * same as TK_GE,
f070: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
f080: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 65  */.  int res, re
f090: 73 32 3b 20 20 20 20 20 20 2f 2a 20 52 65 73 75  s2;      /* Resu
f0a0: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
f0b0: 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61  ison of pIn1 aga
f0c0: 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63  inst pIn3 */.  c
f0d0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
f0e0: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
f0f0: 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
f100: 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  ison */.  u16 fl
f110: 61 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags1;         /*
f120: 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   Copy of initial
f130: 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e   value of pIn1->
f140: 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66  flags */.  u16 f
f150: 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f  lags3;         /
f160: 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  * Copy of initia
f170: 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d  l value of pIn3-
f180: 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e  >flags */..  pIn
f190: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
f1a0: 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
f1b0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
f1c0: 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c  lags1 = pIn1->fl
f1d0: 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20  ags;.  flags3 = 
f1e0: 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn3->flags;.  i
f1f0: 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61  f( (flags1 | fla
f200: 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs3)&MEM_Null ){
f210: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62  .    /* One or b
f220: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
f230: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
f240: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
f250: 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20  E_NULLEQ ){.    
f260: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e    /* If SQLITE_N
f270: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77 68  ULLEQ is set (wh
f280: 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ich will only ha
f290: 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65 72  ppen if the oper
f2a0: 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ator is.      **
f2b0: 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29   OP_Eq or OP_Ne)
f2c0: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
f2d0: 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ump or not depen
f2e0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
f2f0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20        ** or not 
f300: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
f310: 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  e null..      */
f320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f330: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
f340: 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  q || pOp->opcode
f350: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
f360: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 31   assert( (flags1
f370: 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d   & MEM_Cleared)=
f380: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
f390: 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  rt( (pOp->p5 & S
f3a0: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
f3b0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
f3c0: 28 20 28 66 6c 61 67 73 31 26 66 6c 61 67 73 33  ( (flags1&flags3
f3d0: 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20  &MEM_Null)!=0.  
f3e0: 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26       && (flags3&
f3f0: 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a  MEM_Cleared)==0.
f400: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
f410: 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4f 70   res = 0;  /* Op
f420: 65 72 61 6e 64 73 20 61 72 65 20 65 71 75 61 6c  erands are equal
f430: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
f440: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31  .        res = 1
f450: 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61  ;  /* Operands a
f460: 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a  re not equal */.
f470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f480: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  e{.      /* SQLI
f490: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65  TE_NULLEQ is cle
f4a0: 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ar and at least 
f4b0: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
f4c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ULL,.      ** th
f4d0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
f4e0: 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20   always NULL..  
f4f0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20      ** The jump 
f500: 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
f510: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
f520: 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20 20  L bit is set..  
f530: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f540: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
f550: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
f560: 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65       pOut = &aMe
f570: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
f580: 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 31      iCompare = 1
f590: 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73  ;    /* Operands
f5a0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a   are not equal *
f5b0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f  /.        memAbo
f5c0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
f5d0: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ut);.        Mem
f5e0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
f5f0: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
f600: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
f610: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
f620: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
f630: 0a 20 20 20 20 20 20 20 20 56 64 62 65 42 72 61  .        VdbeBra
f640: 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b 0a 20  nchTaken(2,3);. 
f650: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
f660: 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
f670: 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
f680: 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
f690: 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _p2;.        }. 
f6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f6b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ak;.    }.  }els
f6c0: 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  e{.    /* Neithe
f6d0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f6e0: 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  L.  Do a compari
f6f0: 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69  son. */.    affi
f700: 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26  nity = pOp->p5 &
f710: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
f720: 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69  ;.    if( affini
f730: 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty>=SQLITE_AFF_N
f740: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
f750: 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c  if( (flags1 | fl
f760: 61 67 73 33 29 26 4d 45 4d 5f 53 74 72 20 29 7b  ags3)&MEM_Str ){
f770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 66 6c  .        if( (fl
f780: 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  ags1 & (MEM_Int|
f790: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
f7a0: 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
f7b0: 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75           applyNu
f7c0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
f7d0: 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n1,0);.         
f7e0: 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
f7f0: 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29  3!=pIn3->flags )
f800: 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65 20 69 66  ; /* Possible if
f810: 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a 2f 0a 20   pIn1==pIn3 */. 
f820: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20           flags3 
f830: 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20  = pIn3->flags;. 
f840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f850: 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20 28   if( (flags3 & (
f860: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
f870: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
f880: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
f890: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
f8a0: 69 6e 69 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20  inity(pIn3,0);. 
f8b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f8c0: 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  .      /* Handle
f8d0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
f8e0: 20 6f 66 20 69 6e 74 65 67 65 72 20 63 6f 6d 70   of integer comp
f8f0: 61 72 69 73 6f 6e 20 68 65 72 65 2c 20 61 73 20  arison here, as 
f900: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  an.      ** opti
f910: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f  mization, to avo
f920: 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
f930: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
f940: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
f950: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e  In1->flags & pIn
f960: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
f970: 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
f980: 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20    if( pIn3->u.i 
f990: 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72  > pIn1->u.i ){ r
f9a0: 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f  es = +1; goto co
f9b0: 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20  mpare_op; }.    
f9c0: 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
f9d0: 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b  i < pIn1->u.i ){
f9e0: 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20   res = -1; goto 
f9f0: 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20  compare_op; }.  
fa00: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
fa10: 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70         goto comp
fa20: 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  are_op;.      }.
fa30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66      }else if( af
fa40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
fa50: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  FF_TEXT ){.     
fa60: 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 4d   if( (flags1 & M
fa70: 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66  EM_Str)==0 && (f
fa80: 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74  lags1 & (MEM_Int
fa90: 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29  |MEM_Real))!=0 )
faa0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
fab0: 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  se( pIn1->flags 
fac0: 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
fad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fae0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
faf0: 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Real );.       
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fb10: 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
fb20: 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20  ncoding, 1);.   
fb30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
fb40: 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79 6e 29 20  flags1&MEM_Dyn) 
fb50: 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26  != (pIn1->flags&
fb60: 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20  MEM_Dyn) );.    
fb70: 20 20 20 20 66 6c 61 67 73 31 20 3d 20 28 70 49      flags1 = (pI
fb80: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d  n1->flags & ~MEM
fb90: 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c  _TypeMask) | (fl
fba0: 61 67 73 31 20 26 20 4d 45 4d 5f 54 79 70 65 4d  ags1 & MEM_TypeM
fbb0: 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ask);.        as
fbc0: 73 65 72 74 28 20 70 49 6e 31 21 3d 70 49 6e 33  sert( pIn1!=pIn3
fbd0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
fbe0: 20 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20    if( (flags3 & 
fbf0: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28  MEM_Str)==0 && (
fc00: 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e  flags3 & (MEM_In
fc10: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20  t|MEM_Real))!=0 
fc20: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
fc30: 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ase( pIn3->flags
fc40: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
fc50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fc60: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
fc70: 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  M_Real );.      
fc80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
fc90: 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33 2c 20  Stringify(pIn3, 
fca0: 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20  encoding, 1);.  
fcb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fcc0: 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79 6e 29  (flags3&MEM_Dyn)
fcd0: 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73   != (pIn3->flags
fce0: 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20  &MEM_Dyn) );.   
fcf0: 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 28 70       flags3 = (p
fd00: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45  In3->flags & ~ME
fd10: 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66  M_TypeMask) | (f
fd20: 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79 70 65  lags3 & MEM_Type
fd30: 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Mask);.      }. 
fd40: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
fd50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
fd60: 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d  _COLLSEQ || pOp-
fd70: 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a  >p4.pColl==0 );.
fd80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
fd90: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33  3MemCompare(pIn3
fda0: 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e  , pIn1, pOp->p4.
fdb0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63 6f 6d 70  pColl);.  }.comp
fdc0: 61 72 65 5f 6f 70 3a 0a 20 20 2f 2a 20 41 74 20  are_op:.  /* At 
fdd0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 72 65 73 20  this point, res 
fde0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
fdf0: 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
fe00: 66 20 72 65 67 5b 50 31 5d 20 69 73 0a 20 20 2a  f reg[P1] is.  *
fe10: 2a 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  * less than, equ
fe20: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
fe30: 72 20 74 68 61 6e 20 72 65 67 5b 50 33 5d 2c 20  r than reg[P3], 
fe40: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 43  respectively.  C
fe50: 6f 6d 70 75 74 65 0a 20 20 2a 2a 20 74 68 65 20  ompute.  ** the 
fe60: 61 6e 73 77 65 72 20 74 6f 20 74 68 69 73 20 6f  answer to this o
fe70: 70 65 72 61 74 6f 72 20 69 6e 20 72 65 73 32 2c  perator in res2,
fe80: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
fe90: 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  at the compariso
fea0: 6e 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  n.  ** operator 
feb0: 61 63 74 75 61 6c 6c 79 20 69 73 2e 20 20 54 68  actually is.  Th
fec0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
fed0: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
fee0: 74 68 65 20 66 61 63 74 0a 20 20 2a 2a 20 74 68  the fact.  ** th
fef0: 61 74 20 74 68 65 20 36 20 63 6f 6d 70 61 72 69  at the 6 compari
ff00: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 61 72  son operators ar
ff10: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  e consecutive in
ff20: 74 65 67 65 72 73 20 69 6e 20 74 68 69 73 0a 20  tegers in this. 
ff30: 20 2a 2a 20 6f 72 64 65 72 3a 20 20 4e 45 2c 20   ** order:  NE, 
ff40: 45 51 2c 20 47 54 2c 20 4c 45 2c 20 4c 54 2c 20  EQ, GT, LE, LT, 
ff50: 47 45 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  GE */.  assert( 
ff60: 4f 50 5f 45 71 3d 3d 4f 50 5f 4e 65 2b 31 20 29  OP_Eq==OP_Ne+1 )
ff70: 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47 74 3d  ; assert( OP_Gt=
ff80: 3d 4f 50 5f 4e 65 2b 32 20 29 3b 20 61 73 73 65  =OP_Ne+2 ); asse
ff90: 72 74 28 20 4f 50 5f 4c 65 3d 3d 4f 50 5f 4e 65  rt( OP_Le==OP_Ne
ffa0: 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +3 );.  assert( 
ffb0: 4f 50 5f 4c 74 3d 3d 4f 50 5f 4e 65 2b 34 20 29  OP_Lt==OP_Ne+4 )
ffc0: 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47 65 3d  ; assert( OP_Ge=
ffd0: 3d 4f 50 5f 4e 65 2b 35 20 29 3b 0a 20 20 69 66  =OP_Ne+5 );.  if
ffe0: 28 20 72 65 73 3c 30 20 29 7b 20 20 20 20 20 20  ( res<0 ){      
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 2f 2a 20 6e 65 2c 20 65 71 2c 20 67 74 2c    /* ne, eq, gt,
10010 20 6c 65 2c 20 6c 74 2c 20 67 65 20 2a 2f 0a 20   le, lt, ge */. 
10020 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10030 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4c  unsigned char aL
10040 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30 2c 20  Tb[] = { 1,  0, 
10050 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 30 20 7d   0,  1,  1,  0 }
10060 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 4c 54  ;.    res2 = aLT
10070 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20  b[pOp->opcode - 
10080 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65 20  OP_Ne];.  }else 
10090 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
100a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
100b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 45 51  nsigned char aEQ
100c0 62 5b 5d 20 3d 20 7b 20 30 2c 20 20 31 2c 20 20  b[] = { 0,  1,  
100d0 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 20 7d 3b  0,  1,  0,  1 };
100e0 0a 20 20 20 20 72 65 73 32 20 3d 20 61 45 51 62  .    res2 = aEQb
100f0 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f  [pOp->opcode - O
10100 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  P_Ne];.  }else{.
10110 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
10130 47 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30 2c  GTb[] = { 1,  0,
10140 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 31 20    1,  0,  0,  1 
10150 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 47  };.    res2 = aG
10160 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d  Tb[pOp->opcode -
10170 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 0a 0a 20 20   OP_Ne];.  }..  
10180 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e  /* Undo any chan
10190 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70 6c  ges made by appl
101a0 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20 74  yAffinity() to t
101b0 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
101c0 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rs. */.  assert(
101d0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
101e0 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61  MEM_Dyn) == (fla
101f0 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29  gs1 & MEM_Dyn) )
10200 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
10210 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73 73 65  = flags1;.  asse
10220 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  rt( (pIn3->flags
10230 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28   & MEM_Dyn) == (
10240 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44 79 6e  flags3 & MEM_Dyn
10250 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61  ) );.  pIn3->fla
10260 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a 20 20  gs = flags3;..  
10270 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
10280 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
10290 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d      pOut = &aMem
102a0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 69  [pOp->p2];.    i
102b0 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b 0a 20  Compare = res;. 
102c0 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20     if( (pOp->p5 
102d0 26 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  & SQLITE_KEEPNUL
102e0 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  L)!=0 ){.      /
102f0 2a 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66  * The KEEPNULL f
10300 6c 61 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f  lag prevents OP_
10310 45 71 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74  Eq from overwrit
10320 69 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20  ing a NULL with 
10330 31 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70  1.      ** and p
10340 72 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72  revents OP_Ne fr
10350 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e  om overwriting N
10360 55 4c 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69  ULL with 0.  Thi
10370 73 20 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  s flag.      ** 
10380 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20  is only used in 
10390 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 65  contexts where e
103a0 69 74 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20  ither:.      ** 
103b0 20 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20    (1) op==OP_Eq 
103c0 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20  && (r[P2]==NULL 
103d0 7c 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20  || r[P2]==0).   
103e0 20 20 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d     **   (2) op==
103f0 4f 50 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d  OP_Ne && (r[P2]=
10400 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d  =NULL || r[P2]==
10410 31 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  1).      ** Ther
10420 65 66 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20  efore it is not 
10430 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 68 65  necessary to che
10440 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ck the content o
10450 66 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20  f r[P2] for.    
10460 20 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20    ** NULL. */.  
10470 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
10480 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c  >opcode==OP_Ne |
10490 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
104a0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
104b0 73 65 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c  sert( res2==0 ||
104c0 20 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20   res2==1 );.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
104e0 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 && pOp->opco
104f0 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  de==OP_Eq );.   
10500 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
10510 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==1 && pOp->opc
10520 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  ode==OP_Eq );.  
10530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
10540 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==0 && pOp->op
10550 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  code==OP_Ne );. 
10560 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
10570 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f  es2==1 && pOp->o
10580 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  pcode==OP_Ne );.
10590 20 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e        if( (pOp->
105a0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d  opcode==OP_Eq)==
105b0 72 65 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  res2 ) break;.  
105c0 20 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74    }.    memAbout
105d0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
105e0 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  );.    MemSetTyp
105f0 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
10600 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Int);.    pOut->
10610 75 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20  u.i = res2;.    
10620 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
10630 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
10640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
10650 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
10660 3d 30 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  =0, (pOp->p5 & S
10670 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a  QLITE_NULLEQ)?2:
10680 33 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32  3);.    if( res2
10690 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a   ){.      goto j
106a0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d  ump_to_p2;.    }
106b0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
106c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65  ./* Opcode: Else
106d0 4e 6f 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a  NotEq * P2 * * *
106e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
106f0 64 65 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74  de must immediat
10700 65 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50  ely follow an OP
10710 5f 4c 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d  _Lt or OP_Gt com
10720 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
10730 2e 0a 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f  ..** If result o
10740 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61  f an OP_Eq compa
10750 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d  rison on the sam
10760 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a  e two operands.*
10770 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20  * would have be 
10780 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30  NULL or false (0
10790 29 2c 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d  ), then then jum
107a0 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20  p to P2. .** If 
107b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  the result of an
107c0 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f   OP_Eq compariso
107d0 6e 20 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65  n on the two pre
107e0 76 69 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a  vious operands.*
107f0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
10800 6e 20 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e  n true (1), then
10810 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
10820 2f 0a 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f  /.case OP_ElseNo
10830 74 45 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  tEq: {       /* 
10840 73 61 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50  same as TK_ESCAP
10850 45 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  E, jump */.  ass
10860 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a  ert( pOp>aOp );.
10870 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
10880 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20  ].opcode==OP_Lt 
10890 7c 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  || pOp[-1].opcod
108a0 65 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  e==OP_Gt );.  as
108b0 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35  sert( pOp[-1].p5
108c0 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
108d0 32 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  2 );.  VdbeBranc
108e0 68 54 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21  hTaken(iCompare!
108f0 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43  =0, 2);.  if( iC
10900 6f 6d 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f  ompare!=0 ) goto
10910 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
10920 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
10930 6f 64 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e  ode: Permutation
10940 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
10950 2a 20 53 65 74 20 74 68 65 20 70 65 72 6d 75 74  * Set the permut
10960 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  ation used by th
10970 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65  e OP_Compare ope
10980 72 61 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78  rator in the nex
10990 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
109a0 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  .  The permutati
109b0 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
109c0 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a  the P4 operand..
109d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
109e0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
109f0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
10a00 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68  xt OP_Compare th
10a10 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50  at has.** the OP
10a20 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
10a30 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69   set in P5. Typi
10a40 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72  cally the OP_Per
10a50 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mutation should 
10a60 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69  .** occur immedi
10a70 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
10a80 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
10a90 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69  *.** The first i
10aa0 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 50 34  nteger in the P4
10ab0 20 69 6e 74 65 67 65 72 20 61 72 72 61 79 20 69   integer array i
10ac0 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
10ad0 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64  the array.** and
10ae0 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65   does not become
10af0 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 65 72   part of the per
10b00 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  mutation..*/.cas
10b10 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
10b20 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
10b30 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
10b40 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65  TARRAY );.  asse
10b50 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29  rt( pOp->p4.ai )
10b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
10b70 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  1].opcode==OP_Co
10b80 6d 70 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72  mpare );.  asser
10b90 74 28 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f  t( pOp[1].p5 & O
10ba0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b  PFLAG_PERMUTE );
10bb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
10bc0 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20  Opcode: Compare 
10bd0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
10be0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31  * Synopsis: r[P1
10bf0 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33  @P3] <-> r[P2@P3
10c00 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ].**.** Compare 
10c10 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
10c20 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
10c30 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
10c40 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
10c50 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
10c60 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
10c70 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
10c80 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
10c90 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
10ca0 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
10cb0 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
10cc0 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
10cd0 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
10ce0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
10cf0 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
10d00 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72   order of compar
10d10 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72  ison is.** deter
10d20 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  mined by the mos
10d30 74 20 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d  t recent OP_Perm
10d40 75 74 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  utation operator
10d50 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46  .  If the.** OPF
10d60 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
10d70 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72  is clear, then r
10d80 65 67 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70  egister are comp
10d90 61 72 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69  ared in sequenti
10da0 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a  al.** order..**.
10db0 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e  ** P4 is a KeyIn
10dc0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
10dd0 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74  t defines collat
10de0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e  ing sequences an
10df0 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73  d sort.** orders
10e00 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
10e10 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74  son.  The permut
10e20 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f  ation applies to
10e30 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e   registers.** on
10e40 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ly.  The KeyInfo
10e50 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73   elements are us
10e60 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e  ed sequentially.
10e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
10e80 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20  rison is a sort 
10e90 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e  comparison, so N
10ea0 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75  ULLs compare equ
10eb0 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65  al,.** NULLs are
10ec0 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65   less than numbe
10ed0 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  rs, numbers are 
10ee0 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67  less than string
10ef0 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67  s,.** and string
10f00 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
10f10 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  blobs..*/.case O
10f20 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69  P_Compare: {.  i
10f30 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
10f40 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70   int p1;.  int p
10f50 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  2;.  const KeyIn
10f60 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
10f70 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53  int idx;.  CollS
10f80 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
10f90 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
10fa0 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68  nce to use on th
10fb0 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  is term */.  int
10fc0 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
10fd0 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43  /* True for DESC
10fe0 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65  ENDING sort orde
10ff0 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  r */.  int *aPer
11000 6d 75 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  mute;     /* The
11010 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a   permutation */.
11020 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20  .  if( (pOp->p5 
11030 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  & OPFLAG_PERMUTE
11040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72  )==0 ){.    aPer
11050 6d 75 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  mute = 0;.  }els
11060 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11070 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  Op>aOp );.    as
11080 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
11090 63 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61  code==OP_Permuta
110a0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  tion );.    asse
110b0 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79  rt( pOp[-1].p4ty
110c0 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20  pe==P4_INTARRAY 
110d0 29 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20  );.    aPermute 
110e0 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20  = pOp[-1].p4.ai 
110f0 2b 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  + 1;.    assert(
11100 20 61 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a   aPermute!=0 );.
11110 20 20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70    }.  n = pOp->p
11120 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  3;.  pKeyInfo = 
11130 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
11140 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
11150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
11160 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31  yInfo!=0 );.  p1
11170 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32   = pOp->p1;.  p2
11180 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64   = pOp->p2;.#ifd
11190 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
111a0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
111b0 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20  {.    int k, mx 
111c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
111d0 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20  ; k<n; k++) if( 
111e0 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29  aPermute[k]>mx )
111f0 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b   mx = aPermute[k
11200 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
11210 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70  1>0 && p1+mx<=(p
11220 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
11230 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20  ursor)+1 );.    
11240 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
11250 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p2+mx<=(p->nMem+
11260 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
11270 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1 );.  }else{.  
11280 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26    assert( p1>0 &
11290 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p1+n<=(p->nMem
112a0 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
112b0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
112c0 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d  ( p2>0 && p2+n<=
112d0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
112e0 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
112f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11300 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f  TE_DEBUG */.  fo
11310 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
11320 7b 0a 20 20 20 20 69 64 78 20 3d 20 61 50 65 72  {.    idx = aPer
11330 6d 75 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b  mute ? aPermute[
11340 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65  i] : i;.    asse
11350 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
11360 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b  aMem[p1+idx]) );
11370 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
11380 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32  IsValid(&aMem[p2
11390 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45  +idx]) );.    RE
113a0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b  GISTER_TRACE(p1+
113b0 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64  idx, &aMem[p1+id
113c0 78 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  x]);.    REGISTE
113d0 52 5f 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20  R_TRACE(p2+idx, 
113e0 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a  &aMem[p2+idx]);.
113f0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b      assert( i<pK
11400 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
11410 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  d );.    pColl =
11420 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
11430 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  [i];.    bRev = 
11440 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
11450 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f  rder[i];.    iCo
11460 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  mpare = sqlite3M
11470 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b  emCompare(&aMem[
11480 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70  p1+idx], &aMem[p
11490 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a  2+idx], pColl);.
114a0 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65      if( iCompare
114b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 52   ){.      if( bR
114c0 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20 3d 20  ev ) iCompare = 
114d0 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  -iCompare;.     
114e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
114f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
11500 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31   Opcode: Jump P1
11510 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
11520 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69 6e 73   Jump to the ins
11530 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72  truction at addr
11540 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72 20 50  ess P1, P2, or P
11550 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  3 depending on w
11560 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65  hether.** in the
11570 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f   most recent OP_
11580 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75 63 74  Compare instruct
11590 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63 74 6f  ion the P1 vecto
115a0 72 20 77 61 73 20 6c 65 73 73 20 74 68 61 6e 0a  r was less than.
115b0 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
115c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
115d0 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65 73 70   P2 vector, resp
115e0 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73  ectively..*/.cas
115f0 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20  e OP_Jump: {    
11600 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
11610 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d 70 61   */.  if( iCompa
11620 72 65 3c 30 20 29 7b 0a 20 20 20 20 56 64 62 65  re<0 ){.    Vdbe
11630 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29  BranchTaken(0,3)
11640 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70  ; pOp = &aOp[pOp
11650 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c  ->p1 - 1];.  }el
11660 73 65 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d  se if( iCompare=
11670 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  =0 ){.    VdbeBr
11680 61 6e 63 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20  anchTaken(1,3); 
11690 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e  pOp = &aOp[pOp->
116a0 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65  p2 - 1];.  }else
116b0 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
116c0 54 61 6b 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20  Taken(2,3); pOp 
116d0 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d  = &aOp[pOp->p3 -
116e0 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   1];.  }.  break
116f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
11700 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
11710 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
11720 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b  P3]=(r[P1] && r[
11730 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
11740 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20  the logical AND 
11750 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
11760 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
11770 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74  d P2 and.** writ
11780 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74  e the result int
11790 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
117a0 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
117b0 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61  1 or P2 is 0 (fa
117c0 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65  lse) then the re
117d0 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69  sult is 0 even i
117e0 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69  f.** the other i
117f0 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
11800 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f   NULL and true o
11810 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65  r two NULLs give
11820 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75  .** a NULL outpu
11830 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t..*/./* Opcode:
11840 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a   Or P1 P2 P3 * *
11850 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
11860 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b  P3]=(r[P1] || r[
11870 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
11880 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f  the logical OR o
11890 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
118a0 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
118b0 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
118c0 74 68 65 20 61 6e 73 77 65 72 20 69 6e 20 72 65  the answer in re
118d0 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
118e0 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
118f0 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28   P2 is nonzero (
11900 74 72 75 65 29 20 74 68 65 6e 20 74 68 65 20 72  true) then the r
11910 65 73 75 6c 74 20 69 73 20 31 20 28 74 72 75 65  esult is 1 (true
11920 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ).** even if the
11930 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
11940 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
11950 64 20 66 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e  d false or two N
11960 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e  ULLs.** give a N
11970 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63  ULL output..*/.c
11980 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20  ase OP_And:     
11990 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
119a0 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c   as TK_AND, in1,
119b0 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
119c0 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20  se OP_Or: {     
119d0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
119e0 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69  as TK_OR, in1, i
119f0 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e  n2, out3 */.  in
11a00 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74  t v1;    /* Left
11a10 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41   operand:  0==FA
11a20 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
11a30 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
11a40 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b 20 20 20   */.  int v2;   
11a50 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
11a60 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  d: 0==FALSE, 1==
11a70 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
11a80 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 76   or NULL */..  v
11a90 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 42  1 = sqlite3VdbeB
11aa0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26 61 4d 65  ooleanValue(&aMe
11ab0 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 32 29 3b 0a  m[pOp->p1], 2);.
11ac0 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64    v2 = sqlite3Vd
11ad0 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26  beBooleanValue(&
11ae0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2c 20 32  aMem[pOp->p2], 2
11af0 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
11b00 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a  code==OP_And ){.
11b10 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
11b20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
11b30 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  nd_logic[] = { 0
11b40 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c  , 0, 0, 0, 1, 2,
11b50 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20   0, 2, 2 };.    
11b60 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76  v1 = and_logic[v
11b70 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65  1*3+v2];.  }else
11b80 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
11b90 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11ba0 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20   or_logic[] = { 
11bb0 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31  0, 1, 2, 1, 1, 1
11bc0 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20  , 2, 1, 2 };.   
11bd0 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76   v1 = or_logic[v
11be0 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70  1*3+v2];.  }.  p
11bf0 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
11c00 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d  >p3];.  if( v1==
11c10 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  2 ){.    MemSetT
11c20 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
11c30 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  M_Null);.  }else
11c40 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  {.    pOut->u.i 
11c50 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = v1;.    MemSet
11c60 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
11c70 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62  EM_Int);.  }.  b
11c80 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
11c90 64 65 3a 20 49 73 54 72 75 65 20 50 31 20 50 32  de: IsTrue P1 P2
11ca0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
11cb0 70 73 69 73 3a 20 72 5b 50 32 5d 20 3d 20 63 6f  psis: r[P2] = co
11cc0 61 6c 65 73 63 65 28 72 5b 50 31 5d 3d 3d 54 52  alesce(r[P1]==TR
11cd0 55 45 2c 50 33 29 20 5e 20 50 34 0a 2a 2a 0a 2a  UE,P3) ^ P4.**.*
11ce0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6d  * This opcode im
11cf0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 49 53 20  plements the IS 
11d00 54 52 55 45 2c 20 49 53 20 46 41 4c 53 45 2c 20  TRUE, IS FALSE, 
11d10 49 53 20 4e 4f 54 20 54 52 55 45 2c 20 61 6e 64  IS NOT TRUE, and
11d20 0a 2a 2a 20 49 53 20 4e 4f 54 20 46 41 4c 53 45  .** IS NOT FALSE
11d30 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
11d40 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
11d50 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
11d60 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61  r P1 as a boolea
11d70 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20  n value.  Store 
11d80 74 68 61 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  that.** boolean 
11d90 28 61 20 30 20 6f 72 20 31 29 20 69 6e 20 72 65  (a 0 or 1) in re
11da0 67 69 73 74 65 72 20 50 32 2e 20 20 4f 72 20 69  gister P2.  Or i
11db0 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
11dc0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 0a 2a  egister P1 is .*
11dd0 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  * NULL, then the
11de0 20 50 33 20 69 73 20 73 74 6f 72 65 64 20 69 6e   P3 is stored in
11df0 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
11e00 6e 76 65 72 74 20 74 68 65 20 61 6e 73 77 65 72  nvert the answer
11e10 20 69 66 20 50 34 0a 2a 2a 20 69 73 20 31 2e 0a   if P4.** is 1..
11e20 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 67 69 63 20  **.** The logic 
11e30 69 73 20 73 75 6d 6d 61 72 69 7a 65 64 20 6c 69  is summarized li
11e40 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 3c  ke this:.**.** <
11e50 75 6c 3e 20 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20  ul> .** <li> If 
11e60 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d 3d 30 20  P3==0 and P4==0 
11e70 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20   then  r[P2] := 
11e80 72 5b 50 31 5d 20 49 53 20 54 52 55 45 0a 2a 2a  r[P1] IS TRUE.**
11e90 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 31 20 61   <li> If P3==1 a
11ea0 6e 64 20 50 34 3d 3d 31 20 20 74 68 65 6e 20 20  nd P4==1  then  
11eb0 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d 20 49  r[P2] := r[P1] I
11ec0 53 20 46 41 4c 53 45 0a 2a 2a 20 3c 6c 69 3e 20  S FALSE.** <li> 
11ed0 49 66 20 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d  If P3==0 and P4=
11ee0 3d 31 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20  =1  then  r[P2] 
11ef0 3a 3d 20 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20  := r[P1] IS NOT 
11f00 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20  TRUE.** <li> If 
11f10 50 33 3d 3d 31 20 61 6e 64 20 50 34 3d 3d 30 20  P3==1 and P4==0 
11f20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20   then  r[P2] := 
11f30 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20 46 41 4c  r[P1] IS NOT FAL
11f40 53 45 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2f 0a 63  SE.** </ul>.*/.c
11f50 61 73 65 20 4f 50 5f 49 73 54 72 75 65 3a 20 7b  ase OP_IsTrue: {
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f70 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  * in1, out2 */. 
11f80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
11f90 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
11fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
11fb0 3e 70 34 2e 69 3d 3d 30 20 7c 7c 20 70 4f 70 2d  >p4.i==0 || pOp-
11fc0 3e 70 34 2e 69 3d 3d 31 20 29 3b 0a 20 20 61 73  >p4.i==1 );.  as
11fd0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30  sert( pOp->p3==0
11fe0 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 31 20 29   || pOp->p3==1 )
11ff0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
12000 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
12010 5b 70 4f 70 2d 3e 70 32 5d 2c 0a 20 20 20 20 20  [pOp->p2],.     
12020 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c   sqlite3VdbeBool
12030 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70  eanValue(&aMem[p
12040 4f 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33  Op->p1], pOp->p3
12050 29 20 5e 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  ) ^ pOp->p4.i);.
12060 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12070 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32  pcode: Not P1 P2
12080 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
12090 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50 31  is: r[P2]= !r[P1
120a0 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ].**.** Interpre
120b0 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
120c0 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61 20  egister P1 as a 
120d0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
120e0 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f  Store the.** boo
120f0 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20  lean complement 
12100 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  in register P2. 
12110 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   If the value in
12120 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
12130 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61  .** NULL, then a
12140 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64 20   NULL is stored 
12150 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  in P2..*/.case O
12160 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20  P_Not: {        
12170 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
12180 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c 20  as TK_NOT, in1, 
12190 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d  out2 */.  pIn1 =
121a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
121b0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
121c0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
121d0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
121e0 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Null)==0 ){. 
121f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
12200 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20  mSetInt64(pOut, 
12210 21 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c  !sqlite3VdbeBool
12220 65 61 6e 56 61 6c 75 65 28 70 49 6e 31 2c 30 29  eanValue(pIn1,0)
12230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12240 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
12250 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d  tNull(pOut);.  }
12260 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12270 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50  Opcode: BitNot P
12280 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
12290 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20 7e  nopsis: r[P1]= ~
122a0 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  r[P1].**.** Inte
122b0 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e  rpret the conten
122c0 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  t of register P1
122d0 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   as an integer. 
122e0 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e   Store the.** on
122f0 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66  es-complement of
12300 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e   the P1 value in
12310 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
12320 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20   If P1 holds.** 
12330 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  a NULL then stor
12340 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a  e a NULL in P2..
12350 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f  */.case OP_BitNo
12360 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
12370 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
12380 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32  ITNOT, in1, out2
12390 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
123a0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
123b0 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
123c0 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2];.  sqlite3V
123d0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
123e0 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  ut);.  if( (pIn1
123f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
12400 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  ll)==0 ){.    pO
12410 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
12420 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  Int;.    pOut->u
12430 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33 56 64 62  .i = ~sqlite3Vdb
12440 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b  eIntValue(pIn1);
12450 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
12460 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65  ./* Opcode: Once
12470 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
12480 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** Fall through 
12490 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
124a0 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 72 73  ruction the firs
124b0 74 20 74 69 6d 65 20 74 68 69 73 20 6f 70 63 6f  t time this opco
124c0 64 65 20 69 73 0a 2a 2a 20 65 6e 63 6f 75 6e 74  de is.** encount
124d0 65 72 65 64 20 6f 6e 20 65 61 63 68 20 69 6e 76  ered on each inv
124e0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ocation of the b
124f0 79 74 65 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d  yte-code program
12500 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 0a 2a 2a  .  Jump to P2.**
12510 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   on the second a
12520 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
12530 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 64 75 72  t encounters dur
12540 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e 76  ing the same inv
12550 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
12560 6f 70 2d 6c 65 76 65 6c 20 70 72 6f 67 72 61 6d  op-level program
12570 73 20 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73  s determine firs
12580 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 62 79 20  t invocation by 
12590 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 50 31  comparing the P1
125a0 0a 2a 2a 20 6f 70 65 72 61 6e 64 20 61 67 61 69  .** operand agai
125b0 6e 73 74 20 74 68 65 20 50 31 20 6f 70 65 72 61  nst the P1 opera
125c0 6e 64 20 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69  nd on the OP_Ini
125d0 74 20 6f 70 63 6f 64 65 20 61 74 20 74 68 65 20  t opcode at the 
125e0 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 6f 66 20  beginning.** of 
125f0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 66  the program.  If
12600 20 74 68 65 20 50 31 20 76 61 6c 75 65 73 20 64   the P1 values d
12610 69 66 66 65 72 2c 20 74 68 65 6e 20 66 61 6c 6c  iffer, then fall
12620 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6d 61 6b   through and mak
12630 65 0a 2a 2a 20 74 68 65 20 50 31 20 6f 66 20 74  e.** the P1 of t
12640 68 69 73 20 6f 70 63 6f 64 65 20 65 71 75 61 6c  his opcode equal
12650 20 74 6f 20 74 68 65 20 50 31 20 6f 66 20 4f 50   to the P1 of OP
12660 5f 49 6e 69 74 2e 20 20 49 66 20 50 31 20 76 61  _Init.  If P1 va
12670 6c 75 65 73 20 61 72 65 0a 2a 2a 20 74 68 65 20  lues are.** the 
12680 73 61 6d 65 20 74 68 65 6e 20 74 61 6b 65 20 74  same then take t
12690 68 65 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 46  he jump..**.** F
126a0 6f 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2c 20  or subprograms, 
126b0 74 68 65 72 65 20 69 73 20 61 20 62 69 74 6d 61  there is a bitma
126c0 73 6b 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  sk in the VdbeFr
126d0 61 6d 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ame that determi
126e0 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
126f0 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 73  r not the jump s
12700 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 2e 20  hould be taken. 
12710 20 54 68 65 20 62 69 74 6d 61 73 6b 20 69 73 20   The bitmask is 
12720 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
12730 61 75 73 65 20 74 68 65 20 73 65 6c 66 2d 61 6c  ause the self-al
12740 74 65 72 69 6e 67 20 63 6f 64 65 20 74 72 69 63  tering code tric
12750 6b 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  k does not work 
12760 66 6f 72 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  for recursive.**
12770 20 74 72 69 67 67 65 72 73 2e 0a 2a 2f 0a 63 61   triggers..*/.ca
12780 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20  se OP_Once: {   
12790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
127a0 70 20 2a 2f 0a 20 20 75 33 32 20 69 41 64 64 72  p */.  u32 iAddr
127b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
127d0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
127e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
127f0 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  aOp[0].opcode==O
12800 50 5f 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  P_Init );.  if( 
12810 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
12820 20 69 41 64 64 72 20 3d 20 28 69 6e 74 29 28 70   iAddr = (int)(p
12830 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 3b 0a 20 20  Op - p->aOp);.  
12840 20 20 69 66 28 20 28 70 2d 3e 70 46 72 61 6d 65    if( (p->pFrame
12850 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d  ->aOnce[iAddr/8]
12860 20 26 20 28 31 3c 3c 28 69 41 64 64 72 20 26 20   & (1<<(iAddr & 
12870 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
12880 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
12890 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f  (1, 2);.      go
128a0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
128b0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 46 72 61     }.    p->pFra
128c0 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f  me->aOnce[iAddr/
128d0 38 5d 20 7c 3d 20 31 3c 3c 28 69 41 64 64 72 20  8] |= 1<<(iAddr 
128e0 26 20 37 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  & 7);.  }else{. 
128f0 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30 5d     if( p->aOp[0]
12900 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a  .p1==pOp->p1 ){.
12910 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
12920 54 61 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20  Taken(1, 2);.   
12930 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
12940 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p2;.    }.  }.  
12950 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
12960 30 2c 20 32 29 3b 0a 20 20 70 4f 70 2d 3e 70 31  0, 2);.  pOp->p1
12970 20 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b   = p->aOp[0].p1;
12980 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12990 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32  Opcode: If P1 P2
129a0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
129b0 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
129c0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
129d0 72 20 50 31 20 69 73 20 74 72 75 65 2e 20 20 54  r P1 is true.  T
129e0 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63  he value.** is c
129f0 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65 20 69  onsidered true i
12a00 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20  f it is numeric 
12a10 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49  and non-zero.  I
12a20 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
12a30 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65  n P1 is NULL the
12a40 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
12a50 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50  if and only if P
12a60 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  3 is non-zero..*
12a70 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 7b  /.case OP_If:  {
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a90 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
12aa0 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 73 71   int c;.  c = sq
12ab0 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e  lite3VdbeBoolean
12ac0 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d  Value(&aMem[pOp-
12ad0 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  >p1], pOp->p3);.
12ae0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
12af0 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66  n(c!=0, 2);.  if
12b00 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ( c ) goto jump_
12b10 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
12b20 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
12b30 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Not P1 P2 P3 * *
12b40 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
12b50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
12b60 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
12b70 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c   False.  The val
12b80 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
12b90 72 65 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  red false if it 
12ba0 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61  has a numeric va
12bb0 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66  lue of zero.  If
12bc0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e   the value.** in
12bd0 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P1 is NULL then
12be0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
12bf0 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33  f and only if P3
12c00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f   is non-zero..*/
12c10 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20  .case OP_IfNot: 
12c20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
12c30 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69  jump, in1 */.  i
12c40 6e 74 20 63 3b 0a 20 20 63 20 3d 20 21 73 71 6c  nt c;.  c = !sql
12c50 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56  ite3VdbeBooleanV
12c60 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alue(&aMem[pOp->
12c70 70 31 5d 2c 20 21 70 4f 70 2d 3e 70 33 29 3b 0a  p1], !pOp->p3);.
12c80 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
12c90 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66  n(c!=0, 2);.  if
12ca0 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ( c ) goto jump_
12cb0 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
12cc0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73  }../* Opcode: Is
12cd0 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a  Null P1 P2 * * *
12ce0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
12cf0 20 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20 67 6f 74   r[P1]==NULL got
12d00 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20  o P2.**.** Jump 
12d10 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
12d20 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
12d30 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  1 is NULL..*/.ca
12d40 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20  se OP_IsNull: { 
12d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
12d60 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c  me as TK_ISNULL,
12d70 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
12d80 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12d90 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
12da0 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
12db0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
12dc0 6c 29 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)!=0, 2);.  if(
12dd0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
12de0 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a  MEM_Null)!=0 ){.
12df0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
12e00 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
12e10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12e20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20  NotNull P1 P2 * 
12e30 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
12e40 20 69 66 20 72 5b 50 31 5d 21 3d 4e 55 4c 4c 20   if r[P1]!=NULL 
12e50 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75  goto P2.**.** Ju
12e60 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
12e70 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12e80 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  r P1 is not NULL
12e90 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  .  .*/.case OP_N
12ea0 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  otNull: {       
12eb0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
12ec0 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70  TK_NOTNULL, jump
12ed0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
12ee0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
12ef0 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
12f00 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ken( (pIn1->flag
12f10 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
12f20 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  , 2);.  if( (pIn
12f30 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12f40 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67  ull)==0 ){.    g
12f50 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
12f60 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12f70 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 75 6c  /* Opcode: IfNul
12f80 6c 52 6f 77 20 50 31 20 50 32 20 50 33 20 2a 20  lRow P1 P2 P3 * 
12f90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
12fa0 66 20 50 31 2e 6e 75 6c 6c 52 6f 77 20 74 68 65  f P1.nullRow the
12fb0 6e 20 72 5b 50 33 5d 3d 4e 55 4c 4c 2c 20 67 6f  n r[P3]=NULL, go
12fc0 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 43 68 65 63  to P2.**.** Chec
12fd0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  k the cursor P1 
12fe0 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
12ff0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
13000 6e 67 20 61 74 20 61 20 4e 55 4c 4c 20 72 6f 77  ng at a NULL row
13010 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74  ..** If it is, t
13020 68 65 6e 20 73 65 74 20 72 65 67 69 73 74 65 72  hen set register
13030 20 50 33 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20   P3 to NULL and 
13040 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
13050 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 31   to P2..** If P1
13060 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 4e 55 4c   is not on a NUL
13070 4c 20 72 6f 77 2c 20 74 68 65 6e 20 66 61 6c 6c  L row, then fall
13080 20 74 68 72 6f 75 67 68 20 77 69 74 68 6f 75 74   through without
13090 20 6d 61 6b 69 6e 67 20 61 6e 79 0a 2a 2a 20 63   making any.** c
130a0 68 61 6e 67 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  hanges..*/.case 
130b0 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 3a 20 7b 20  OP_IfNullRow: { 
130c0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
130d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
130e0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
130f0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
13100 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
13110 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20  Csr[pOp->p1]!=0 
13120 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
13130 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 6e 75 6c 6c  r[pOp->p1]->null
13140 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Row ){.    sqlit
13150 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
13160 28 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 29  (aMem + pOp->p3)
13170 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  ;.    goto jump_
13180 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
13190 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ak;.}..#ifdef SQ
131a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
131b0 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 20 4f  ET_SQL_FUNC./* O
131c0 70 63 6f 64 65 3a 20 4f 66 66 73 65 74 20 50 31  pcode: Offset P1
131d0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
131e0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 20 3d 20  nopsis: r[P3] = 
131f0 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 28 50 31  sqlite_offset(P1
13200 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e  ).**.** Store in
13210 20 72 65 67 69 73 74 65 72 20 72 5b 50 33 5d 20   register r[P3] 
13220 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
13230 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
13240 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 74  e file that is t
13250 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  he.** start of t
13260 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  he payload for t
13270 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69  he record at whi
13280 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  ch that cursor P
13290 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  1 is currently.*
132a0 2a 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  * pointing..**.*
132b0 2a 20 50 32 20 69 73 20 74 68 65 20 63 6f 6c 75  * P2 is the colu
132c0 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  mn number for th
132d0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
132e0 65 20 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 28  e sqlite_offset(
132f0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ) function..** T
13300 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
13310 6e 6f 74 20 75 73 65 20 50 32 20 69 74 73 65 6c  not use P2 itsel
13320 66 2c 20 62 75 74 20 74 68 65 20 50 32 20 76 61  f, but the P2 va
13330 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20 74  lue is used by t
13340 68 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  he.** code gener
13350 61 74 6f 72 2e 20 20 54 68 65 20 50 31 2c 20 50  ator.  The P1, P
13360 32 2c 20 61 6e 64 20 50 33 20 6f 70 65 72 61 6e  2, and P3 operan
13370 64 73 20 74 6f 20 74 68 69 73 20 6f 70 63 6f 64  ds to this opcod
13380 65 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  e are the.** sam
13390 65 20 61 73 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  e as for OP_Colu
133a0 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  mn..**.** This o
133b0 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 61 76  pcode is only av
133c0 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74  ailable if SQLit
133d0 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
133e0 74 68 20 74 68 65 0a 2a 2a 20 2d 44 53 51 4c 49  th the.** -DSQLI
133f0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
13400 5f 53 51 4c 5f 46 55 4e 43 20 6f 70 74 69 6f 6e  _SQL_FUNC option
13410 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66  ..*/.case OP_Off
13420 73 65 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  set: {          
13430 2f 2a 20 6f 75 74 33 20 2a 2f 0a 20 20 56 64 62  /* out3 */.  Vdb
13440 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
13450 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
13460 6f 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  or */.  assert( 
13470 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
13480 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
13490 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
134a0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
134b0 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
134c0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
134d0 4e 45 56 45 52 28 70 43 3d 3d 30 29 20 7c 7c 20  NEVER(pC==0) || 
134e0 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
134f0 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20  RTYPE_BTREE ){. 
13500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
13510 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
13520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
13530 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
13540 74 36 34 28 70 4f 75 74 2c 20 73 71 6c 69 74 65  t64(pOut, sqlite
13550 33 42 74 72 65 65 4f 66 66 73 65 74 28 70 43 2d  3BtreeOffset(pC-
13560 3e 75 63 2e 70 43 75 72 73 6f 72 29 29 3b 0a 20  >uc.pCursor));. 
13570 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
13580 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13590 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
135a0 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  _FUNC */../* Opc
135b0 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
135c0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
135d0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 50 58  nopsis: r[P3]=PX
135e0 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
135f0 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 63   the data that c
13600 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20  ursor P1 points 
13610 74 6f 20 61 73 20 61 20 73 74 72 75 63 74 75 72  to as a structur
13620 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  e built using.**
13630 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
13640 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53  instruction.  (S
13650 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ee the MakeRecor
13660 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  d opcode for add
13670 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
13680 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
13690 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64   format of the d
136a0 61 74 61 2e 29 20 20 45 78 74 72 61 63 74 20 74  ata.)  Extract t
136b0 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a  he P2-th column.
136c0 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63  ** from this rec
136d0 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65 20 61  ord.  If there a
136e0 72 65 20 6c 65 73 73 20 74 68 61 74 20 28 50 32  re less that (P2
136f0 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69  +1) .** values i
13700 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78  n the record, ex
13710 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a  tract a NULL..**
13720 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78  .** The value ex
13730 74 72 61 63 74 65 64 20 69 73 20 73 74 6f 72 65  tracted is store
13740 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
13750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
13760 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 66  ecord contains f
13770 65 77 65 72 20 74 68 61 6e 20 50 32 20 66 69 65  ewer than P2 fie
13780 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63  lds, then extrac
13790 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a  t a NULL.  Or,.*
137a0 2a 20 69 66 20 74 68 65 20 50 34 20 61 72 67 75  * if the P4 argu
137b0 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d  ment is a P4_MEM
137c0 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f   use the value o
137d0 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
137e0 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  t as.** the resu
137f0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
13800 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
13810 48 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e  HE bit is set on
13820 20 50 35 20 61 6e 64 20 50 31 20 69 73 20 61 20   P5 and P1 is a 
13830 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72  pseudo-table cur
13840 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sor,.** then the
13850 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
13860 72 73 6f 72 20 69 73 20 72 65 73 65 74 20 70 72  rsor is reset pr
13870 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74 69 6e  ior to extractin
13880 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  g the column..**
13890 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f 43 6f   The first OP_Co
138a0 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61 20 70  lumn against a p
138b0 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66 74 65  seudo-table afte
138c0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  r the value of t
138d0 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65  he content.** re
138e0 67 69 73 74 65 72 20 68 61 73 20 63 68 61 6e 67  gister has chang
138f0 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  ed should have t
13900 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a 2a 0a  his bit set..**.
13910 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
13920 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64 20 4f  _LENGTHARG and O
13930 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
13940 62 69 74 73 20 61 72 65 20 73 65 74 20 6f 6e 20  bits are set on 
13950 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 72  P5 then.** the r
13960 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
13970 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65 20 75  eed to only be u
13980 73 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  sed as the argum
13990 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74 68 28  ent of a length(
139a0 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66 28 29  ).** or typeof()
139b0 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73 70 65   function, respe
139c0 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 6c 6f  ctively.  The lo
139d0 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65 20 62  ading of large b
139e0 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a 20 73  lobs can be.** s
139f0 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e 67 74  kipped for lengt
13a00 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f 6e 74  h() and all cont
13a10 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61 6e 20  ent loading can 
13a20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72 20 74  be skipped for t
13a30 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61 73 65  ypeof()..*/.case
13a40 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
13a50 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
13a60 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
13a70 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
13a80 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
13a90 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
13aa0 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
13ab0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
13ac0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
13ad0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20  cursor */.  u32 
13ae0 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  *aOffset;      /
13af0 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20  * aOffset[i] is 
13b00 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  offset to start 
13b10 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68  of data for i-th
13b20 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
13b30 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
13b40 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  /* The length of
13b50 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
13b60 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c  data for the col
13b70 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  umn */.  int i; 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13b90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13ba0 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20   Mem *pDest;    
13bb0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13bc0 77 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63  write the extrac
13bd0 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  ted value */.  M
13be0 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20  em sMem;        
13bf0 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67    /* For storing
13c00 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
13c10 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63  g decoded */.  c
13c20 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 20  onst u8 *zData; 
13c30 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65    /* Part of the
13c40 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
13c50 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
13c60 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20 2f 2a   u8 *zHdr;    /*
13c70 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64 20 62   Next unparsed b
13c80 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
13c90 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  r */.  const u8 
13ca0 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50 6f 69  *zEndHdr; /* Poi
13cb0 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 62 79  nter to first by
13cc0 74 65 20 61 66 74 65 72 20 74 68 65 20 68 65 61  te after the hea
13cd0 64 65 72 20 2a 2f 0a 20 20 75 36 34 20 6f 66 66  der */.  u64 off
13ce0 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a 20 36  set64;      /* 6
13cf0 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a 2f 0a  4-bit offset */.
13d00 20 20 75 33 32 20 74 3b 20 20 20 20 20 20 20 20    u32 t;        
13d10 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 63       /* A type c
13d20 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63  ode from the rec
13d30 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ord header */.  
13d40 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20  Mem *pReg;      
13d50 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c     /* PseudoTabl
13d60 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
13d70 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61   */..  pC = p->a
13d80 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
13d90 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 0a   p2 = pOp->p2;..
13da0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
13db0 6f 72 20 63 61 63 68 65 20 69 73 20 73 74 61 6c  or cache is stal
13dc0 65 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  e (meaning it is
13dd0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
13de0 6f 69 6e 74 20 61 74 0a 20 20 2a 2a 20 74 68 65  oint at.  ** the
13df0 20 63 6f 72 72 65 63 74 20 72 6f 77 29 20 74 68   correct row) th
13e00 65 6e 20 62 72 69 6e 67 20 69 74 20 75 70 2d 74  en bring it up-t
13e10 6f 2d 64 61 74 65 20 62 79 20 64 6f 69 6e 67 20  o-date by doing 
13e20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 20  the necessary . 
13e30 20 2a 2a 20 42 2d 54 72 65 65 20 73 65 65 6b 2e   ** B-Tree seek.
13e40 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
13e50 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
13e60 74 6f 28 26 70 43 2c 20 26 70 32 29 3b 0a 20 20  to(&pC, &p2);.  
13e70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
13e80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
13e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
13ea0 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
13eb0 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
13ec0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
13ed0 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70   pDest = &aMem[p
13ee0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p3];.  memAb
13ef0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
13f00 44 65 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Dest);.  assert(
13f10 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
13f20 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
13f30 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
13f40 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
13f50 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 20  ( p2<pC->nField 
13f60 29 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 70  );.  aOffset = p
13f70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 61 73  C->aOffset;.  as
13f80 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
13f90 70 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42  pe!=CURTYPE_VTAB
13fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13fb0 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
13fc0 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43  YPE_PSEUDO || pC
13fd0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 61  ->nullRow );.  a
13fe0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
13ff0 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52  ype!=CURTYPE_SOR
14000 54 45 52 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  TER );..  if( pC
14010 2d 3e 63 61 63 68 65 53 74 61 74 75 73 21 3d 70  ->cacheStatus!=p
14020 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 20 20 20  ->cacheCtr ){   
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f               /*O
14040 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46  PTIMIZATION-IF-F
14050 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALSE*/.    if( p
14060 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
14070 20 20 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72      if( pC->eCur
14080 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53  Type==CURTYPE_PS
14090 45 55 44 4f 20 29 7b 0a 20 20 20 20 20 20 20 20  EUDO ){.        
140a0 2f 2a 20 46 6f 72 20 74 68 65 20 73 70 65 63 69  /* For the speci
140b0 61 6c 20 63 61 73 65 20 6f 66 20 61 73 20 70 73  al case of as ps
140c0 65 75 64 6f 2d 63 75 72 73 6f 72 2c 20 74 68 65  eudo-cursor, the
140d0 20 73 65 65 6b 52 65 73 75 6c 74 20 66 69 65 6c   seekResult fiel
140e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 64 65  d.        ** ide
140f0 6e 74 69 66 69 65 73 20 74 68 65 20 72 65 67 69  ntifies the regi
14100 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
14110 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
14120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14130 2d 3e 73 65 65 6b 52 65 73 75 6c 74 3e 30 20 29  ->seekResult>0 )
14140 3b 0a 20 20 20 20 20 20 20 20 70 52 65 67 20 3d  ;.        pReg =
14150 20 26 61 4d 65 6d 5b 70 43 2d 3e 73 65 65 6b 52   &aMem[pC->seekR
14160 65 73 75 6c 74 5d 3b 0a 20 20 20 20 20 20 20 20  esult];.        
14170 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c  assert( pReg->fl
14180 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
14190 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
141a0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65  ( memIsValid(pRe
141b0 67 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  g) );.        pC
141c0 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20  ->payloadSize = 
141d0 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 52 65 67  pC->szRow = pReg
141e0 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ->n;.        pC-
141f0 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 65  >aRow = (u8*)pRe
14200 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g->z;.      }els
14210 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14220 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
14230 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20  (pDest);.       
14240 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
14250 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
14260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
14270 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
14280 72 73 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rsor;.      asse
14290 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
142a0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
142b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
142c0 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20 20 20   pCrsr );.      
142d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
142e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
142f0 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20  d(pCrsr) );.    
14300 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a    pC->payloadSiz
14310 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
14320 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73  PayloadSize(pCrs
14330 72 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 61 52  r);.      pC->aR
14340 6f 77 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ow = sqlite3Btre
14350 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 70 43  ePayloadFetch(pC
14360 72 73 72 2c 20 26 70 43 2d 3e 73 7a 52 6f 77 29  rsr, &pC->szRow)
14370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14380 70 43 2d 3e 73 7a 52 6f 77 3c 3d 70 43 2d 3e 70  pC->szRow<=pC->p
14390 61 79 6c 6f 61 64 53 69 7a 65 20 29 3b 0a 20 20  ayloadSize );.  
143a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
143b0 73 7a 52 6f 77 3c 3d 36 35 35 33 36 20 29 3b 20  szRow<=65536 ); 
143c0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65   /* Maximum page
143d0 20 73 69 7a 65 20 69 73 20 36 34 4b 69 42 20 2a   size is 64KiB *
143e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e  /.      if( pC->
143f0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75  payloadSize > (u
14400 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
14410 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14420 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  H] ){.        go
14430 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20  to too_big;.    
14440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
14450 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14460 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20  p->cacheCtr;.   
14470 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 20   pC->iHdrOffset 
14480 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
14490 2d 3e 61 52 6f 77 2c 20 61 4f 66 66 73 65 74 5b  ->aRow, aOffset[
144a0 30 5d 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 48 64  0]);.    pC->nHd
144b0 72 50 61 72 73 65 64 20 3d 20 30 3b 0a 0a 0a 20  rParsed = 0;... 
144c0 20 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77     if( pC->szRow
144d0 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b 20 20  <aOffset[0] ){  
144e0 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49      /*OPTIMIZATI
144f0 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
14500 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52 6f 77 20      /* pC->aRow 
14510 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
14520 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
14530 20 72 6f 77 2c 20 62 75 74 20 69 74 20 64 6f 65   row, but it doe
14540 73 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  s at least.     
14550 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63 6f 76 65   ** need to cove
14560 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  r the header of 
14570 74 68 65 20 72 65 63 6f 72 64 2e 20 20 49 66 20  the record.  If 
14580 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e 6f  pC->aRow does no
14590 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  t contain.      
145a0 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ** the complete 
145b0 68 65 61 64 65 72 2c 20 74 68 65 6e 20 73 65 74  header, then set
145c0 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20 66 6f 72   it to zero, for
145d0 63 69 6e 67 20 74 68 65 20 68 65 61 64 65 72 20  cing the header 
145e0 74 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 64  to be.      ** d
145f0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
14600 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ated. */.      p
14610 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20  C->aRow = 0;.   
14620 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 30     pC->szRow = 0
14630 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
14640 20 73 75 72 65 20 61 20 63 6f 72 72 75 70 74 20   sure a corrupt 
14650 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
14660 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f 76 65   given us an ove
14670 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a 20 20  rsize header..  
14680 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e      ** Do this n
14690 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f  ow to avoid an o
146a0 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61  versize memory a
146b0 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  llocation..     
146c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 79 70   **.      ** Typ
146d0 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20 62 65  e entries can be
146e0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 35   between 1 and 5
146f0 20 62 79 74 65 73 20 65 61 63 68 2e 20 20 42 75   bytes each.  Bu
14700 74 20 34 20 61 6e 64 20 35 20 62 79 74 65 0a 20  t 4 and 5 byte. 
14710 20 20 20 20 20 2a 2a 20 74 79 70 65 73 20 75 73       ** types us
14720 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61 20 73  e so much data s
14730 70 61 63 65 20 74 68 61 74 20 74 68 65 72 65 20  pace that there 
14740 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30 39 36  can only be 4096
14750 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20 20 20   and 32 of.     
14760 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63   ** them, respec
14770 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20  tively.  So the 
14780 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c  maximum header l
14790 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20 66 72  ength results fr
147a0 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a 20 33 2d  om a.      ** 3-
147b0 62 79 74 65 20 74 79 70 65 20 66 6f 72 20 65 61  byte type for ea
147c0 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75  ch of the maximu
147d0 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d  m of 32768 colum
147e0 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20  ns plus three.  
147f0 20 20 20 20 2a 2a 20 65 78 74 72 61 20 62 79 74      ** extra byt
14800 65 73 20 66 6f 72 20 74 68 65 20 68 65 61 64 65  es for the heade
14810 72 20 6c 65 6e 67 74 68 20 69 74 73 65 6c 66 2e  r length itself.
14820 20 20 33 32 37 36 38 2a 33 20 2b 20 33 20 3d 20    32768*3 + 3 = 
14830 39 38 33 30 37 2e 0a 20 20 20 20 20 20 2a 2f 0a  98307..      */.
14840 20 20 20 20 20 20 69 66 28 20 61 4f 66 66 73 65        if( aOffse
14850 74 5b 30 5d 20 3e 20 39 38 33 30 37 20 7c 7c 20  t[0] > 98307 || 
14860 61 4f 66 66 73 65 74 5b 30 5d 20 3e 20 70 43 2d  aOffset[0] > pC-
14870 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a  >payloadSize ){.
14880 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
14890 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74 3b 0a  column_corrupt;.
148a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
148b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
148c0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
148d0 69 6f 6e 2e 20 20 42 79 20 73 6b 69 70 70 69 6e  ion.  By skippin
148e0 67 20 6f 76 65 72 20 74 68 65 20 66 69 72 73 74  g over the first
148f0 20 66 65 77 20 74 65 73 74 73 0a 20 20 20 20 20   few tests.     
14900 20 2a 2a 20 28 65 78 3a 20 70 43 2d 3e 6e 48 64   ** (ex: pC->nHd
14910 72 50 61 72 73 65 64 3c 3d 70 32 29 20 69 6e 20  rParsed<=p2) in 
14920 74 68 65 20 6e 65 78 74 20 73 65 63 74 69 6f 6e  the next section
14930 2c 20 77 65 20 61 63 68 69 65 76 65 20 61 0a 20  , we achieve a. 
14940 20 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 61 62       ** measurab
14950 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  le performance g
14960 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ain..      **.  
14970 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
14980 63 68 20 69 73 20 74 61 6b 65 6e 20 65 76 65 6e  ch is taken even
14990 20 69 66 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d   if aOffset[0]==
149a0 30 2e 20 20 53 75 63 68 20 61 20 72 65 63 6f 72  0.  Such a recor
149b0 64 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  d is never.     
149c0 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 62 79   ** generated by
149d0 20 53 51 4c 69 74 65 2c 20 61 6e 64 20 63 6f 75   SQLite, and cou
149e0 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ld be considered
149f0 20 63 6f 72 72 75 70 74 69 6f 6e 2c 20 62 75 74   corruption, but
14a00 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63   we.      ** acc
14a10 65 70 74 20 69 74 20 66 6f 72 20 68 69 73 74 6f  ept it for histo
14a20 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  rical reasons.  
14a30 57 68 65 6e 20 61 4f 66 66 73 65 74 5b 30 5d 3d  When aOffset[0]=
14a40 3d 30 2c 20 74 68 65 20 63 6f 64 65 20 74 68 69  =0, the code thi
14a50 73 0a 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63  s.      ** branc
14a60 68 20 6a 75 6d 70 73 20 74 6f 20 72 65 61 64 73  h jumps to reads
14a70 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
14a80 20 74 68 65 20 72 65 63 6f 72 64 2c 20 62 75 74   the record, but
14a90 20 6e 65 76 65 72 20 6d 6f 72 65 0a 20 20 20 20   never more.    
14aa0 20 20 2a 2a 20 74 68 61 6e 20 61 20 66 65 77 20    ** than a few 
14ab0 62 79 74 65 73 2e 20 20 45 76 65 6e 20 69 66 20  bytes.  Even if 
14ac0 74 68 65 20 72 65 63 6f 72 64 20 6f 63 63 75 72  the record occur
14ad0 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
14ae0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
14af0 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 20  * content area, 
14b00 74 68 65 20 22 70 61 67 65 20 68 65 61 64 65 72  the "page header
14b10 22 20 63 6f 6d 65 73 20 61 66 74 65 72 20 74 68  " comes after th
14b20 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
14b30 6e 64 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nd so.      ** t
14b40 68 69 73 20 6f 76 65 72 72 65 61 64 20 69 73 20  his overread is 
14b50 68 61 72 6d 6c 65 73 73 2e 20 20 53 69 6d 69 6c  harmless.  Simil
14b60 61 72 20 6f 76 65 72 72 65 61 64 73 20 63 61 6e  ar overreads can
14b70 20 6f 63 63 75 72 20 66 6f 72 20 61 20 63 6f 72   occur for a cor
14b80 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 64 61  rupt.      ** da
14b90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
14ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a 44 61 74     */.      zDat
14bb0 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20  a = pC->aRow;.  
14bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
14bd0 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29  nHdrParsed<=p2 )
14be0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ;         /* Con
14bf0 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70 70 65 64  ditional skipped
14c00 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
14c10 73 65 28 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d  se( aOffset[0]==
14c20 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 );.      goto 
14c30 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68  op_column_read_h
14c40 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  eader;.    }.  }
14c50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
14c60 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 66 69   at least the fi
14c70 72 73 74 20 70 32 2b 31 20 65 6e 74 72 69 65 73  rst p2+1 entries
14c80 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 68   of the header h
14c90 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61  ave been.  ** pa
14ca0 72 73 65 64 20 61 6e 64 20 76 61 6c 69 64 20 69  rsed and valid i
14cb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e  nformation is in
14cc0 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 70   aOffset[] and p
14cd0 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20 20 2a 2f  C->aType[]..  */
14ce0 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50  .  if( pC->nHdrP
14cf0 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20  arsed<=p2 ){.   
14d00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14d10 6d 6f 72 65 20 68 65 61 64 65 72 20 61 76 61 69  more header avai
14d20 6c 61 62 6c 65 20 66 6f 72 20 70 61 72 73 69 6e  lable for parsin
14d30 67 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c  g in the record,
14d40 20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 65   try.    ** to e
14d50 78 74 72 61 63 74 20 61 64 64 69 74 69 6f 6e 61  xtract additiona
14d60 6c 20 66 69 65 6c 64 73 20 75 70 20 74 68 72 6f  l fields up thro
14d70 75 67 68 20 74 68 65 20 70 32 2b 31 2d 74 68 20  ugh the p2+1-th 
14d80 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f 0a 20 20  field .    */.  
14d90 20 20 69 66 28 20 70 43 2d 3e 69 48 64 72 4f 66    if( pC->iHdrOf
14da0 66 73 65 74 3c 61 4f 66 66 73 65 74 5b 30 5d 20  fset<aOffset[0] 
14db0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ){.      /* Make
14dc0 20 73 75 72 65 20 7a 44 61 74 61 20 70 6f 69 6e   sure zData poin
14dd0 74 73 20 74 6f 20 65 6e 6f 75 67 68 20 6f 66 20  ts to enough of 
14de0 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 63 6f  the record to co
14df0 76 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ver the header. 
14e00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d  */.      if( pC-
14e10 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  >aRow==0 ){.    
14e20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d      memset(&sMem
14e30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d  , 0, sizeof(sMem
14e40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
14e50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
14e60 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e  romBtree(pC->uc.
14e70 70 43 75 72 73 6f 72 2c 20 30 2c 20 61 4f 66 66  pCursor, 0, aOff
14e80 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d 29 3b 0a  set[0], &sMem);.
14e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
14eb0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
14ec0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a 44 61  ror;.        zDa
14ed0 74 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d 2e 7a  ta = (u8*)sMem.z
14ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14ef0 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70         zData = p
14f00 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 7d  C->aRow;.      }
14f10 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c  .  .      /* Fil
14f20 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70 65 5b 69  l in pC->aType[i
14f30 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d  ] and aOffset[i]
14f40 20 76 61 6c 75 65 73 20 74 68 72 6f 75 67 68 20   values through 
14f50 74 68 65 20 70 32 2d 74 68 20 66 69 65 6c 64 2e  the p2-th field.
14f60 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c 75 6d   */.    op_colum
14f70 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3a 0a 20  n_read_header:. 
14f80 20 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e 48 64       i = pC->nHd
14f90 72 50 61 72 73 65 64 3b 0a 20 20 20 20 20 20 6f  rParsed;.      o
14fa0 66 66 73 65 74 36 34 20 3d 20 61 4f 66 66 73 65  ffset64 = aOffse
14fb0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48 64 72  t[i];.      zHdr
14fc0 20 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d 3e 69   = zData + pC->i
14fd0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
14fe0 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61 74 61   zEndHdr = zData
14ff0 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b 0a 20   + aOffset[0];. 
15000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 7a       testcase( z
15010 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 29 3b 0a  Hdr>=zEndHdr );.
15020 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
15030 20 20 69 66 28 20 28 74 20 3d 20 7a 48 64 72 5b    if( (t = zHdr[
15040 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20 20 20  0])<0x80 ){.    
15050 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a 20 20        zHdr++;.  
15060 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36 34          offset64
15070 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f   += sqlite3VdbeO
15080 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
15090 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
150a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
150b0 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   zHdr += sqlite3
150c0 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48 64 72  GetVarint32(zHdr
150d0 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20 20 20  , &t);.         
150e0 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c   offset64 += sql
150f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15100 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
15110 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 2d 3e    }.        pC->
15120 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20 74 3b 0a  aType[i++] = t;.
15130 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b          aOffset[
15140 69 5d 20 3d 20 28 75 33 32 29 28 6f 66 66 73 65  i] = (u32)(offse
15150 74 36 34 20 26 20 30 78 66 66 66 66 66 66 66 66  t64 & 0xffffffff
15160 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
15170 20 69 3c 3d 70 32 20 26 26 20 7a 48 64 72 3c 7a   i<=p2 && zHdr<z
15180 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20 20 20 20  EndHdr );..     
15190 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69   /* The record i
151a0 73 20 63 6f 72 72 75 70 74 20 69 66 20 61 6e 79  s corrupt if any
151b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
151c0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
151d0 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62 79 74    ** (1) the byt
151e0 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  es of the header
151f0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
15200 20 64 65 63 6c 61 72 65 64 20 68 65 61 64 65 72   declared header
15210 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 28   size.      ** (
15220 32 29 20 74 68 65 20 65 6e 74 69 72 65 20 68 65  2) the entire he
15230 61 64 65 72 20 77 61 73 20 75 73 65 64 20 62 75  ader was used bu
15240 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61 20 77  t not all data w
15250 61 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  as used.      **
15260 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f 66 20   (3) the end of 
15270 74 68 65 20 64 61 74 61 20 65 78 74 65 6e 64 73  the data extends
15280 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e 64 20   beyond the end 
15290 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20  of the record.. 
152a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
152b0 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72  ( (zHdr>=zEndHdr
152c0 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64 48 64   && (zHdr>zEndHd
152d0 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21 3d 70  r || offset64!=p
152e0 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29 29  C->payloadSize))
152f0 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66 66 73  .       || (offs
15300 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79 6c 6f  et64 > pC->paylo
15310 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 29 7b  adSize).      ){
15320 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4f 66  .        if( aOf
15330 66 73 65 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  fset[0]==0 ){.  
15340 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
15350 20 20 20 20 20 20 20 20 20 7a 48 64 72 20 3d 20           zHdr = 
15360 7a 45 6e 64 48 64 72 3b 0a 20 20 20 20 20 20 20  zEndHdr;.       
15370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15380 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d    if( pC->aRow==
15390 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  0 ) sqlite3VdbeM
153a0 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
153b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
153c0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75   op_column_corru
153d0 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pt;.        }.  
153e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 43 2d      }..      pC-
153f0 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 69 3b  >nHdrParsed = i;
15400 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64 72 4f  .      pC->iHdrO
15410 66 66 73 65 74 20 3d 20 28 75 33 32 29 28 7a 48  ffset = (u32)(zH
15420 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20 20  dr - zData);.   
15430 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d     if( pC->aRow=
15440 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
15450 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d  MemRelease(&sMem
15460 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15470 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20 20 7d      t = 0;.    }
15480 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74 65  ..    /* If afte
15490 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74 72  r trying to extr
154a0 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73 20  act new entries 
154b0 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72 2c  from the header,
154c0 20 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a 20   nHdrParsed is. 
154d0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74 20     ** still not 
154e0 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20 6d  up to p2, that m
154f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
15500 63 6f 72 64 20 68 61 73 20 66 65 77 65 72 20 74  cord has fewer t
15510 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63 6f  han p2.    ** co
15520 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20 72  lumns.  So the r
15530 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65 69  esult will be ei
15540 74 68 65 72 20 74 68 65 20 64 65 66 61 75 6c 74  ther the default
15550 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c 4c   value or a NULL
15560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15570 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
15580 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =p2 ){.      if(
15590 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
155a0 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  _MEM ){.        
155b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
155c0 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c  allowCopy(pDest,
155d0 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d   pOp->p4.pMem, M
155e0 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EM_Static);.    
155f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15600 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
15610 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20  etNull(pDest);. 
15620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
15630 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b  o op_column_out;
15640 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15650 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79 70      t = pC->aTyp
15660 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e[p2];.  }..  /*
15670 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f 6e   Extract the con
15680 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32 2b  tent for the p2+
15690 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  1-th column.  Co
156a0 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20  ntrol can only. 
156b0 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20 70   ** reach this p
156c0 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74 5b  oint if aOffset[
156d0 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32 2b  p2], aOffset[p2+
156e0 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79 70  1], and pC->aTyp
156f0 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20 61  e[p2] are.  ** a
15700 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20  ll valid..  */. 
15710 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e   assert( p2<pC->
15720 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20 20  nHdrParsed );.  
15730 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
15740 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
15750 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
15760 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
15770 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66 28  (pDest) );.  if(
15780 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
15790 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 73 71  pDest) ){.    sq
157a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
157b0 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a  ull(pDest);.  }.
157c0 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70 43 2d    assert( t==pC-
157d0 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a 20 20  >aType[p2] );.  
157e0 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e 3d 61  if( pC->szRow>=a
157f0 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29 7b 0a  Offset[p2+1] ){.
15800 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
15810 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
15820 68 65 72 65 20 74 68 65 20 64 65 73 69 72 65 64  here the desired
15830 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20 6f 6e   content fits on
15840 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
15850 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68 65 72    ** page - wher
15860 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  e the content is
15870 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65 72 66   not on an overf
15880 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  low page */.    
15890 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77  zData = pC->aRow
158a0 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d 3b 0a   + aOffset[p2];.
158b0 20 20 20 20 69 66 28 20 74 3c 31 32 20 29 7b 0a      if( t<12 ){.
158c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
158d0 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61 74 61  eSerialGet(zData
158e0 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , t, pDest);.   
158f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
15900 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   If the column v
15910 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
15920 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65 72 73  , we need a pers
15930 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20 6e 6f  istent value, no
15940 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d 45 4d  t.      ** a MEM
15950 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20 20 54  _Ephem value.  T
15960 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 20  his branch is a 
15970 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74 20 74  fast short-cut t
15980 68 61 74 20 69 73 20 65 71 75 69 76 61 6c 65 6e  hat is equivalen
15990 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 63 61  t.      ** to ca
159a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  lling sqlite3Vdb
159b0 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
159c0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 65 70   sqlite3VdbeDeep
159d0 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a 20 20  hemeralize()..  
159e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
159f0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
15a00 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
15a10 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  ob, MEM_Str|MEM_
15a20 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20 70 44  Term };.      pD
15a30 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d 20 28  est->n = len = (
15a40 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  t-12)/2;.      p
15a50 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
15a60 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66 28 20  ding;.      if( 
15a70 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  pDest->szMalloc 
15a80 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20 20 20  < len+2 ){.     
15a90 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
15aa0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
15ab0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
15ac0 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65 73 74  dbeMemGrow(pDest
15ad0 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20 67 6f  , len+2, 0) ) go
15ae0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
15af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15b00 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65 73 74  pDest->z = pDest
15b10 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20  ->zMalloc;.     
15b20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
15b30 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74 61 2c  pDest->z, zData,
15b40 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70 44 65   len);.      pDe
15b50 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  st->z[len] = 0;.
15b60 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b 6c        pDest->z[l
15b70 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  en+1] = 0;.     
15b80 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20   pDest->flags = 
15b90 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20 20 20  aFlag[t&1];.    
15ba0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
15bb0 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
15bc0 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54 68 69  ding;.    /* Thi
15bd0 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e 73  s branch happens
15be0 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74 65   only when conte
15bf0 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c 6f  nt is on overflo
15c00 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 69  w pages */.    i
15c10 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 28  f( ((pOp->p5 & (
15c20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
15c30 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
15c40 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  G))!=0.         
15c50 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20 28   && ((t>=12 && (
15c60 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f 70  t&1)==0) || (pOp
15c70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54 59  ->p5 & OPFLAG_TY
15c80 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20 20  PEOFARG)!=0)).  
15c90 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71 6c     || (len = sql
15ca0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15cb0 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20 20  peLen(t))==0.   
15cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
15cd0 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76 61  tent is irreleva
15ce0 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  nt for.      ** 
15cf0 20 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f 66     1. the typeof
15d00 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 20  () function,.   
15d10 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65 20     **    2. the 
15d20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74 69  length(X) functi
15d30 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c 6f  on if X is a blo
15d40 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  b, and.      ** 
15d50 20 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f 6e     3. if the con
15d60 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20 7a  tent length is z
15d70 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ero..      ** So
15d80 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   we might as wel
15d90 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e 74  l use bogus cont
15da0 65 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  ent rather than 
15db0 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  reading.      **
15dc0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
15dd0 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sk. .      **.  
15de0 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67 68 20      ** Although 
15df0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15e00 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61 64 20  lGet() may read 
15e10 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65 73 20  at most 8 bytes 
15e20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 2a  from the.      *
15e30 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
15e40 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69 6e 67  to it, debugging
15e50 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65 4d 65   function VdbeMe
15e60 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29 20 6d  mPrettyPrint() m
15e70 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  ay.      ** read
15e80 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20 31 36   up to 16. So 16
15e90 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75 73 20   bytes of bogus 
15ea0 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70 70 6c  content is suppl
15eb0 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ied..      */.  
15ec0 20 20 20 20 73 74 61 74 69 63 20 75 38 20 61 5a      static u8 aZ
15ed0 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54 68 69  ero[16];  /* Thi
15ee0 73 20 69 73 20 74 68 65 20 62 6f 67 75 73 20 63  s is the bogus c
15ef0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  ontent */.      
15f00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15f10 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20 70  lGet(aZero, t, p
15f20 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Dest);.    }else
15f30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15f40 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
15f50 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72  tree(pC->uc.pCur
15f60 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d  sor, aOffset[p2]
15f70 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a 20  , len, pDest);. 
15f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15f90 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
15fa0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
15fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15fc0 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 63 6f  dbeSerialGet((co
15fd0 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d 3e 7a  nst u8*)pDest->z
15fe0 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , t, pDest);.   
15ff0 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
16000 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  &= ~MEM_Ephem;. 
16010 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c     }.  }..op_col
16020 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54  umn_out:.  UPDAT
16030 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
16040 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54 45  Dest);.  REGISTE
16050 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
16060 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61 6b   pDest);.  break
16070 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72  ;..op_column_cor
16080 72 75 70 74 3a 0a 20 20 69 66 28 20 61 4f 70 5b  rupt:.  if( aOp[
16090 30 5d 2e 70 33 3e 30 20 29 7b 0a 20 20 20 20 70  0].p3>0 ){.    p
160a0 4f 70 20 3d 20 26 61 4f 70 5b 61 4f 70 5b 30 5d  Op = &aOp[aOp[0]
160b0 2e 70 33 2d 31 5d 3b 0a 20 20 20 20 62 72 65 61  .p3-1];.    brea
160c0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
160d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
160e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
160f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
16100 65 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  error;.  }.}../*
16110 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74   Opcode: Affinit
16120 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  y P1 P2 * P4 *.*
16130 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69  * Synopsis: affi
16140 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29 0a 2a  nity(r[P1@P2]).*
16150 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e  *.** Apply affin
16160 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65  ities to a range
16170 20 6f 66 20 50 32 20 72 65 67 69 73 74 65 72 73   of P2 registers
16180 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 50   starting with P
16190 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  1..**.** P4 is a
161a0 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
161b0 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  P2 characters lo
161c0 6e 67 2e 20 54 68 65 20 4e 2d 74 68 20 63 68 61  ng. The N-th cha
161d0 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a  racter of the.**
161e0 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65   string indicate
161f0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  s the column aff
16200 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
16210 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
16220 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79  e N-th.** memory
16230 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61 6e   cell in the ran
16240 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ge..*/.case OP_A
16250 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f 6e  ffinity: {.  con
16260 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69  st char *zAffini
16270 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66 66  ty;   /* The aff
16280 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c  inity to be appl
16290 69 65 64 20 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e  ied */..  zAffin
162a0 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ity = pOp->p4.z;
162b0 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
162c0 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  nity!=0 );.  ass
162d0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
162e0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
162f0 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d  inity[pOp->p2]==
16300 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  0 );.  pIn1 = &a
16310 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
16320 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
16330 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
16340 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  [(p->nMem+1 - p-
16350 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20  >nCursor)] );.  
16360 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
16370 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
16380 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
16390 70 49 6e 31 2c 20 2a 28 7a 41 66 66 69 6e 69 74  pIn1, *(zAffinit
163a0 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  y++), encoding);
163b0 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d  .    pIn1++;.  }
163c0 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79  while( zAffinity
163d0 5b 30 5d 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  [0] );.  break;.
163e0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
163f0 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
16400 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
16410 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28  is: r[P3]=mkrec(
16420 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  r[P1@P2]).**.** 
16430 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69 73  Convert P2 regis
16440 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
16450 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20  ith P1 into the 
16460 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a  [record format].
16470 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74 61  ** use as a data
16480 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
16490 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
164a0 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
164b0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f   index.  The OP_
164c0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61  Column opcode ca
164d0 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 63  n decode the rec
164e0 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a  ord later..**.**
164f0 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72   P4 may be a str
16500 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
16510 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
16520 20 54 68 65 20 4e 2d 74 68 20 63 68 61 72 61 63   The N-th charac
16530 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  ter of the.** st
16540 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74  ring indicates t
16550 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
16560 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
16570 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4e  e used for the N
16580 2d 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  -th.** field of 
16590 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a  the index key..*
165a0 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67  *.** The mapping
165b0 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20   from character 
165c0 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67  to affinity is g
165d0 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49  iven by the SQLI
165e0 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f  TE_AFF_.** macro
165f0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
16600 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20  iteInt.h..**.** 
16610 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68  If P4 is NULL th
16620 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65  en all index fie
16630 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66  lds have the aff
16640 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f 0a 63  inity BLOB..*/.c
16650 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  ase OP_MakeRecor
16660 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52  d: {.  u8 *zNewR
16670 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a  ecord;        /*
16680 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
16690 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  d the data for t
166a0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
166b0 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20  .  Mem *pRec;   
166c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
166d0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
166e0 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20   u64 nData;     
166f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16700 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
16710 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e  ta space */.  in
16720 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20  t nHdr;         
16730 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16740 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
16750 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34  r space */.  i64
16760 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
16770 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63      /* Data spac
16780 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
16790 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  his record */.  
167a0 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  i64 nZero;      
167b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
167c0 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61   of zero bytes a
167d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
167e0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
167f0 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20   nVarint;       
16800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16810 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69   bytes in a vari
16820 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  nt */.  u32 seri
16830 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f  al_type;       /
16840 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a  * Type field */.
16850 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20    Mem *pData0;  
16860 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16870 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f  t field to be co
16880 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20  mbined into the 
16890 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
168a0 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  *pLast;         
168b0 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64     /* Last field
168c0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
168d0 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
168e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
168f0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
16900 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
16910 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74    char *zAffinit
16920 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
16930 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16940 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
16950 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  /.  int file_for
16960 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69  mat;       /* Fi
16970 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  le format to use
16980 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f   for encoding */
16990 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
169a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
169b0 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52  ce used in zNewR
169c0 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72 20 2a  ecord[] header *
169d0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
169e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
169f0 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77  ace used in zNew
16a00 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 6e 74  Record[] content
16a10 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a30 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c  Length of a fiel
16a40 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d  d */..  /* Assum
16a50 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63  ing the record c
16a60 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
16a70 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  , the record for
16a80 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c  mat looks.  ** l
16a90 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
16aa0 20 2a 2a 20 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 2d 2d 2d 2d 2d  ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ------------.  *
16af0 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74  * | hdr-size | t
16b00 79 70 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c  ype 0 | type 1 |
16b10 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20   ... | type N-1 
16b20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20  | data0 | ... | 
16b30 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a  data N-1 | .  **
16b40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20  ---------.  **. 
16b90 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20 74   ** Data(0) is t
16ba0 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74  aken from regist
16bb0 65 72 20 50 31 2e 20 20 44 61 74 61 28 31 29 20  er P1.  Data(1) 
16bc0 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73  comes from regis
16bd0 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e  ter P1+1.  ** an
16be0 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a 2a  d so forth..  **
16bf0 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20  .  ** Each type 
16c00 66 69 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e  field is a varin
16c10 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  t representing t
16c20 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
16c30 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72  f the .  ** corr
16c40 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65  esponding data e
16c50 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69  lement (see sqli
16c60 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16c70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68  e()). The.  ** h
16c80 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  dr-size field is
16c90 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77   also a varint w
16ca0 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 66 73  hich is the offs
16cb0 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
16cc0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
16cd0 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61  e record to data
16ce0 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20  0..  */.  nData 
16cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
16d00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16d10 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f  of data space */
16d20 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20  .  nHdr = 0;    
16d30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16d40 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64  of bytes of head
16d50 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a  er space */.  nZ
16d60 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
16d70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65   /* Number of ze
16d80 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
16d90 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72  end of the recor
16da0 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20  d */.  nField = 
16db0 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69  pOp->p1;.  zAffi
16dc0 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
16dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  ;.  assert( nFie
16de0 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e  ld>0 && pOp->p2>
16df0 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69  0 && pOp->p2+nFi
16e00 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  eld<=(p->nMem+1 
16e10 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
16e20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61  );.  pData0 = &a
16e30 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e  Mem[nField];.  n
16e40 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b  Field = pOp->p2;
16e50 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74  .  pLast = &pDat
16e60 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  a0[nField-1];.  
16e70 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d  file_format = p-
16e80 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
16e90 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  mat;..  /* Ident
16ea0 69 66 79 20 74 68 65 20 6f 75 74 70 75 74 20 72  ify the output r
16eb0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73  egister */.  ass
16ec0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
16ed0 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p1 || pOp->p3>
16ee0 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32  =pOp->p1+pOp->p2
16ef0 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
16f00 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d  em[pOp->p3];.  m
16f10 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
16f20 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20  p, pOut);..  /* 
16f30 41 70 70 6c 79 20 74 68 65 20 72 65 71 75 65 73  Apply the reques
16f40 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 6f 20  ted affinity to 
16f50 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f 0a  all inputs.  */.
16f60 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 30    assert( pData0
16f70 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69 66 28  <=pLast );.  if(
16f80 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   zAffinity ){.  
16f90 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b    pRec = pData0;
16fa0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
16fb0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
16fc0 63 2b 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74 79  c++, *(zAffinity
16fd0 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  ++), encoding);.
16fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 41        assert( zA
16ff0 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c  ffinity[0]==0 ||
17000 20 70 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a   pRec<=pLast );.
17010 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66      }while( zAff
17020 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a  inity[0] );.  }.
17030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17040 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a  NABLE_NULL_TRIM.
17050 20 20 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e 20 62    /* NULLs can b
17060 65 20 73 61 66 65 6c 79 20 74 72 69 6d 6d 65 64  e safely trimmed
17070 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
17080 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 73 20   the record, as 
17090 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a 20 61 73 20  long as.  ** as 
170a0 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 6d 61  the schema forma
170b0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
170c0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f  nd none of the o
170d0 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73 0a 20  mitted columns. 
170e0 20 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e   ** have a non-N
170f0 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
17100 65 2e 20 20 41 6c 73 6f 2c 20 74 68 65 20 72 65  e.  Also, the re
17110 63 6f 72 64 20 6d 75 73 74 20 62 65 20 6c 65 66  cord must be lef
17120 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 74 20 6c  t with.  ** at l
17130 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 2e 20  east one field. 
17140 20 49 66 20 50 35 3e 30 20 74 68 65 6e 20 69 74   If P5>0 then it
17150 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f 72   will be one mor
17160 65 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  e than the.  ** 
17170 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 69 67  index of the rig
17180 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 77  ht-most column w
17190 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64  ith a non-NULL d
171a0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
171b0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
171c0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 4c 61  .    while( (pLa
171d0 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  st->flags & MEM_
171e0 4e 75 6c 6c 29 21 3d 30 20 26 26 20 6e 46 69 65  Null)!=0 && nFie
171f0 6c 64 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  ld>pOp->p5 ){.  
17200 20 20 20 20 70 4c 61 73 74 2d 2d 3b 0a 20 20 20      pLast--;.   
17210 20 20 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20 20     nField--;.   
17220 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
17230 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17240 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68   the elements th
17250 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20  at will make up 
17260 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69  the record to fi
17270 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f  gure.  ** out ho
17280 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
17290 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
172a0 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a   new record..  *
172b0 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61 73 74  /.  pRec = pLast
172c0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
172d0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
172e0 52 65 63 29 20 29 3b 0a 20 20 20 20 73 65 72 69  Rec) );.    seri
172f0 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
17300 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
17310 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pRec, file_forma
17320 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  t, &len);.    if
17330 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20  ( pRec->flags & 
17340 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
17350 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
17360 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
17370 2f 2a 20 56 61 6c 75 65 73 20 77 69 74 68 20 4d  /* Values with M
17380 45 4d 5f 4e 75 6c 6c 20 61 6e 64 20 4d 45 4d 5f  EM_Null and MEM_
17390 5a 65 72 6f 20 61 72 65 20 63 72 65 61 74 65 64  Zero are created
173a0 20 62 79 20 78 43 6f 6c 75 6d 6e 20 76 69 72 74   by xColumn virt
173b0 75 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ual.        ** t
173c0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 74 68 61  able methods tha
173d0 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 73  t never invoke s
173e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78 78  qlite3_result_xx
173f0 78 78 78 28 29 20 77 68 69 6c 65 0a 20 20 20 20  xxx() while.    
17400 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 69 6e 67      ** computing
17410 20 61 6e 20 75 6e 63 68 61 6e 67 69 6e 67 20 63   an unchanging c
17420 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
17430 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
17440 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 47  nt..        ** G
17450 69 76 65 20 73 75 63 68 20 76 61 6c 75 65 73 20  ive such values 
17460 61 20 73 70 65 63 69 61 6c 20 69 6e 74 65 72 6e  a special intern
17470 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 73 65 72 69  al-use-only seri
17480 61 6c 2d 74 79 70 65 20 6f 66 20 31 30 0a 20 20  al-type of 10.  
17490 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
174a0 20 74 68 65 79 20 63 61 6e 20 62 65 20 70 61 73   they can be pas
174b0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 78  sed through to x
174c0 55 70 64 61 74 65 20 61 6e 64 20 68 61 76 65 0a  Update and have.
174d0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 75          ** a tru
174e0 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
174f0 6e 6f 63 68 61 6e 67 65 28 29 2e 20 2a 2f 0a 20  nochange(). */. 
17500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17510 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 4e  Op->p5==OPFLAG_N
17520 4f 43 48 4e 47 5f 4d 41 47 49 43 20 7c 7c 20 43  OCHNG_MAGIC || C
17530 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
17540 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
17550 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 7d 65 6c   = 10;.      }el
17560 73 65 20 69 66 28 20 6e 44 61 74 61 20 29 7b 0a  se if( nData ){.
17570 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
17580 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64  te3VdbeMemExpand
17590 42 6c 6f 62 28 70 52 65 63 29 20 29 20 67 6f 74  Blob(pRec) ) got
175a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
175b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
175c0 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e  Zero += pRec->u.
175d0 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c  nZero;.        l
175e0 65 6e 20 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a  en -= pRec->u.nZ
175f0 65 72 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ero;.      }.   
17600 20 7d 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20   }.    nData += 
17610 6c 65 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73  len;.    testcas
17620 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
17630 31 32 37 20 29 3b 0a 20 20 20 20 74 65 73 74 63  127 );.    testc
17640 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
17650 3d 3d 31 32 38 20 29 3b 0a 20 20 20 20 6e 48 64  ==128 );.    nHd
17660 72 20 2b 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  r += serial_type
17670 3c 3d 31 32 37 20 3f 20 31 20 3a 20 73 71 6c 69  <=127 ? 1 : sqli
17680 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
17690 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
176a0 52 65 63 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72  Rec->uTemp = ser
176b0 69 61 6c 5f 74 79 70 65 3b 0a 20 20 20 20 69 66  ial_type;.    if
176c0 28 20 70 52 65 63 3d 3d 70 44 61 74 61 30 20 29  ( pRec==pData0 )
176d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 65 63   break;.    pRec
176e0 2d 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  --;.  }while(1);
176f0 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
17700 4f 46 3a 20 52 2d 32 32 35 36 34 2d 31 31 36 34  OF: R-22564-1164
17710 37 20 54 68 65 20 68 65 61 64 65 72 20 62 65 67  7 The header beg
17720 69 6e 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ins with a singl
17730 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 77 68  e varint.  ** wh
17740 69 63 68 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ich determines t
17750 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
17760 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
17770 68 65 61 64 65 72 2e 20 54 68 65 20 76 61 72 69  header. The vari
17780 6e 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 69 73  nt.  ** value is
17790 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
177a0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
177b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73   including the s
177c0 69 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20  ize varint.  ** 
177d0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74 65 73  itself. */.  tes
177e0 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 36  tcase( nHdr==126
177f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17800 6e 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20 20 69  nHdr==127 );.  i
17810 66 28 20 6e 48 64 72 3c 3d 31 32 36 20 29 7b 0a  f( nHdr<=126 ){.
17820 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f      /* The commo
17830 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e 48  n case */.    nH
17840 64 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dr += 1;.  }else
17850 7b 0a 20 20 20 20 2f 2a 20 52 61 72 65 20 63 61  {.    /* Rare ca
17860 73 65 20 6f 66 20 61 20 72 65 61 6c 6c 79 20 6c  se of a really l
17870 61 72 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  arge header */. 
17880 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c     nVarint = sql
17890 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48  ite3VarintLen(nH
178a0 64 72 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d  dr);.    nHdr +=
178b0 20 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20 69 66   nVarint;.    if
178c0 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69 74 65  ( nVarint<sqlite
178d0 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29  3VarintLen(nHdr)
178e0 20 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20   ) nHdr++;.  }. 
178f0 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44   nByte = nHdr+nD
17900 61 74 61 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ata;.  if( nByte
17910 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69  +nZero>db->aLimi
17920 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
17930 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
17940 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
17950 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
17960 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  the output regis
17970 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72  ter has a buffer
17980 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
17990 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65   store .  ** the
179a0 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65   new record. The
179b0 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
179c0 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f   (pOp->p3) is no
179d0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a  t allowed to.  *
179e0 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  * be one of the 
179f0 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
17a00 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c  (because the fol
17a10 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20  lowing call to. 
17a20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d   ** sqlite3VdbeM
17a30 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
17a40 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72  () could clobber
17a50 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
17a60 65 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20  e it is used).. 
17a70 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
17a80 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
17a90 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e  Resize(pOut, (in
17aa0 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  t)nByte) ){.    
17ab0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
17ac0 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20  .  zNewRecord = 
17ad0 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a  (u8 *)pOut->z;..
17ae0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
17af0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70  ecord */.  i = p
17b00 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52  utVarint32(zNewR
17b10 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20  ecord, nHdr);.  
17b20 6a 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73 73 65  j = nHdr;.  asse
17b30 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73  rt( pData0<=pLas
17b40 74 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 70 44  t );.  pRec = pD
17b50 61 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ata0;.  do{.    
17b60 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 70 52  serial_type = pR
17b70 65 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20 20 2f  ec->uTemp;.    /
17b80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17b90 2d 30 36 35 32 39 2d 34 37 33 36 32 20 46 6f 6c  -06529-47362 Fol
17ba0 6c 6f 77 69 6e 67 20 74 68 65 20 73 69 7a 65 20  lowing the size 
17bb0 76 61 72 69 6e 74 20 61 72 65 20 6f 6e 65 20 6f  varint are one o
17bc0 72 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 61 64  r more.    ** ad
17bd0 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e 74 73  ditional varints
17be0 2c 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75 6d 6e  , one per column
17bf0 2e 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 70 75  . */.    i += pu
17c00 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52  tVarint32(&zNewR
17c10 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c  ecord[i], serial
17c20 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20 20 20  _type);         
17c30 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70     /* serial typ
17c40 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  e */.    /* EVID
17c50 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 33 36  ENCE-OF: R-64536
17c60 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c 75 65  -51728 The value
17c70 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
17c80 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 0a  n in the record.
17c90 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
17ca0 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 68 65  ly follow the he
17cb0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b  ader. */.    j +
17cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17cd0 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f  ialPut(&zNewReco
17ce0 72 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73 65 72  rd[j], pRec, ser
17cf0 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20 63 6f  ial_type); /* co
17d00 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68 69 6c  ntent */.  }whil
17d10 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70 4c 61  e( (++pRec)<=pLa
17d20 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
17d30 69 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61 73 73  i==nHdr );.  ass
17d40 65 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20 29 3b  ert( j==nByte );
17d50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
17d60 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
17d70 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
17d80 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
17d90 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e  pOut->n = (int)n
17da0 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  Byte;.  pOut->fl
17db0 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  ags = MEM_Blob;.
17dc0 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20    if( nZero ){. 
17dd0 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f     pOut->u.nZero
17de0 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f   = nZero;.    pO
17df0 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ut->flags |= MEM
17e00 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 52 45 47  _Zero;.  }.  REG
17e10 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
17e20 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50  >p3, pOut);.  UP
17e30 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
17e40 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
17e50 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17e60 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
17e70 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
17e80 5b 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a  [P2]=count().**.
17e90 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d  ** Store the num
17ea0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28  ber of entries (
17eb0 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
17ec0 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  ) in the table o
17ed0 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e  r index .** open
17ee0 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20  ed by cursor P1 
17ef0 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
17f00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17f10 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
17f20 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20  .case OP_Count: 
17f30 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
17f40 32 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  2 */.  i64 nEntr
17f50 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
17f60 43 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Crsr;..  assert(
17f70 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
17f80 31 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  1]->eCurType==CU
17f90 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
17fa0 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73   pCrsr = p->apCs
17fb0 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70  r[pOp->p1]->uc.p
17fc0 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
17fd0 28 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e  ( pCrsr );.  nEn
17fe0 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  try = 0;  /* Not
17ff0 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
18000 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
18010 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72   warning. */.  r
18020 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18030 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
18040 6e 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20  ntry);.  if( rc 
18050 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
18060 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75  _to_error;.  pOu
18070 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
18080 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
18090 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79  ut->u.i = nEntry
180a0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
180b0 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
180c0 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a  Savepoint P1 * *
180d0 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e   P4 *.**.** Open
180e0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
180f0 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f  lback the savepo
18100 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72  int named by par
18110 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e  ameter P4, depen
18120 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76  ding.** on the v
18130 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f  alue of P1. To o
18140 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f  pen a new savepo
18150 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72  int, P1==0. To r
18160 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
18170 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73  an.** existing s
18180 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c  avepoint, P1==1,
18190 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20   or to rollback 
181a0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65  an existing save
181b0 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a  point P1==2..*/.
181c0 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
181d0 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20  t: {.  int p1;  
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
18200 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  of P1 operand */
18210 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61     /* Name of sa
18240 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  vepoint */.  int
18250 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f   nName;.  Savepo
18260 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76  int *pNew;.  Sav
18270 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
18280 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  nt;.  Savepoint 
18290 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61  *pTmp;.  int iSa
182a0 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69  vepoint;.  int i
182b0 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e  i;..  p1 = pOp->
182c0 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f  p1;.  zName = pO
182d0 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41  p->p4.z;..  /* A
182e0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70  ssert that the p
182f0 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76  1 parameter is v
18300 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20  alid. Also that 
18310 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  if there is no o
18320 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  pen.  ** transac
18330 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65  tion, then there
18340 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73   cannot be any s
18350 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f  avepoints. .  */
18360 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
18370 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20  Savepoint==0 || 
18380 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
18390 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
183a0 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
183b0 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  IN||p1==SAVEPOIN
183c0 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53  T_RELEASE||p1==S
183d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
183e0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  K );.  assert( d
183f0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c  b->pSavepoint ||
18400 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
18410 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  onSavepoint==0 )
18420 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63  ;.  assert( chec
18430 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28  kSavepointCount(
18440 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  db) );.  assert(
18450 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
18460 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45  ..  if( p1==SAVE
18470 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20  POINT_BEGIN ){. 
18480 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
18490 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20  Write>0 ){.     
184a0 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
184b0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
184c0 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
184d0 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
184e0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
184f0 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
18500 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
18510 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
18520 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
18530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18540 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74  Error(p, "cannot
18550 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   open savepoint 
18560 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
18570 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
18580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18590 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
185a0 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  e{.      nName =
185b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
185c0 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65  (zName);..#ifnde
185d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
185e0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
185f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
18600 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73   Ok even if this
18610 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
18620 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63  tually a transac
18630 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61  tion.      ** sa
18640 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65  vepoint (and the
18650 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f  refore should no
18660 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f  t prompt xSavepo
18670 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73  int()) callbacks
18680 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
18690 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  is is a transact
186a0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65  ion savepoint be
186b0 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69  ing opened, it i
186c0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20  s guaranteed.   
186d0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64     ** that the d
186e0 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
186f0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f  ay is empty.  */
18700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
18710 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
18720 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d   || db->nVTrans=
18730 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18740 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
18750 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
18760 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20  INT_BEGIN,.     
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e             db->n
18790 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
187a0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
187b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
187c0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
187d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65  due_to_error;.#e
187e0 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43  ndif..      /* C
187f0 72 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65  reate a new save
18800 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e  point structure.
18810 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   */.      pNew =
18820 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18830 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
18840 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d  (Savepoint)+nNam
18850 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e+1);.      if( 
18860 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
18870 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
18880 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
18890 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
188a0 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
188b0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
188c0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
188d0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
188e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
188f0 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20  en mark this as 
18900 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
18910 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f    ** "transactio
18920 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f  n savepoint". */
18930 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
18940 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
18950 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
18960 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
18970 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
18980 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
18990 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
189a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
189b0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b  db->nSavepoint++
189c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
189d0 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65       /* Link the
189e0 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69   new savepoint i
189f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18a00 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20   handle's list. 
18a10 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
18a20 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61  >pNext = db->pSa
18a30 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
18a40 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
18a50 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
18a60 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43  pNew->nDeferredC
18a70 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
18a80 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
18a90 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
18aa0 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  ImmCons = db->nD
18ab0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
18ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65  }else{.    iSave
18ae0 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  point = 0;..    
18af0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  /* Find the name
18b00 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  d savepoint. If 
18b10 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
18b20 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
18b30 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   an.    ** an er
18b40 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18b50 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f  to the user.  */
18b60 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20  .    for(.      
18b70 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  pSavepoint = db-
18b80 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20  >pSavepoint; .  
18b90 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26      pSavepoint &
18ba0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
18bb0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61  (pSavepoint->zNa
18bc0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
18bd0 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70    pSavepoint = p
18be0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
18bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53  .    ){.      iS
18c00 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
18c10 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65  }.    if( !pSave
18c20 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  point ){.      s
18c30 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
18c40 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65  p, "no such save
18c50 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d  point: %s", zNam
18c60 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  e);.      rc = S
18c70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
18c80 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e   }else if( db->n
18c90 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70  VdbeWrite>0 && p
18ca0 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
18cb0 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EASE ){.      /*
18cc0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18cd0 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28  ble to release (
18ce0 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
18cf0 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65  int if there are
18d00 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76   .      ** activ
18d10 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e  e write statemen
18d20 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ts..      */.   
18d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
18d40 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72  ror(p, "cannot r
18d50 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74  elease savepoint
18d60 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18d80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
18d90 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
18da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18db0 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
18dc0 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ..      /* Deter
18dd0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
18de0 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72  not this is a tr
18df0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
18e00 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  int. If so,.    
18e10 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73    ** and this is
18e20 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61   a RELEASE comma
18e30 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
18e40 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
18e50 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f   .      ** is co
18e60 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20  mmitted. .      
18e70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
18e80 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61  ransaction = pSa
18e90 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d  vepoint->pNext==
18ea0 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73  0 && db->isTrans
18eb0 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b  actionSavepoint;
18ec0 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61  .      if( isTra
18ed0 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d  nsaction && p1==
18ee0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
18ef0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E ){.        if(
18f00 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64   (rc = sqlite3Vd
18f10 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29  beCheckFk(p, 1))
18f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
18f40 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
18f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
18f60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
18f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18f80 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
18f90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
18fa0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20            p->pc 
18fb0 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
18fc0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  p);.          db
18fd0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
18fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
18ff0 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
19000 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
19010 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19030 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
19040 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
19050 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
19060 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65   p->rc;.      }e
19070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
19080 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b   isSchemaChange;
19090 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f  .        iSavepo
190a0 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70  int = db->nSavep
190b0 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e  oint - iSavepoin
190c0 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t - 1;.        i
190d0 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
190e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
190f0 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
19100 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62  hange = (db->mDb
19110 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
19120 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 3b  chemaChange)!=0;
19130 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
19140 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
19150 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
19160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19170 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
19180 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ors(db->aDb[ii].
19190 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pBt,.           
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
191c0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
191d0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65            isSche
19200 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20  maChange==0);.  
19210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
19220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19230 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
19240 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
19250 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
19260 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63  {.          isSc
19270 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a  hemaChange = 0;.
19280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19290 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
192a0 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
192b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
192c0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
192d0 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  int(db->aDb[ii].
192e0 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  pBt, p1, iSavepo
192f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
19300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
19320 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19330 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
19340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
19350 20 20 20 20 20 20 20 20 69 66 28 20 69 73 53 63          if( isSc
19360 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
19370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19380 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
19390 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
193a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
193b0 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
193c0 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
193d0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 44 62           db->mDb
193e0 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
193f0 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
19400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19410 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61    .      /* Rega
19420 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
19430 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  r this is a RELE
19440 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c  ASE or ROLLBACK,
19450 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20   destroy all .  
19460 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
19470 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20  s nested inside 
19480 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
19490 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20   being operated 
194a0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  on. */.      whi
194b0 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
194c0 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29  nt!=pSavepoint )
194d0 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d  {.        pTmp =
194e0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
194f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
19500 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
19510 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
19520 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19530 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   pTmp);.        
19540 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
19550 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19560 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52   /* If it is a R
19570 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73  ELEASE, then des
19580 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
19590 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
195a0 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  d on .      ** t
195b0 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52  oo. If it is a R
195c0 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e  OLLBACK TO, then
195d0 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
195e0 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20  of deferred .   
195f0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
19600 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73   violations pres
19610 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
19620 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ase to the value
19630 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a   stored.      **
19640 20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f   when the savepo
19650 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
19660 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
19670 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
19680 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  EASE ){.        
19690 61 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69  assert( pSavepoi
196a0 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  nt==db->pSavepoi
196b0 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  nt );.        db
196c0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
196d0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
196e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
196f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76  3DbFree(db, pSav
19700 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
19710 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74   if( !isTransact
19720 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
19730 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d   db->nSavepoint-
19740 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
19750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19760 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
19770 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ons = pSavepoint
19780 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
19790 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  .        db->nDe
197a0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
197b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66  pSavepoint->nDef
197c0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
197d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
197e0 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20   !isTransaction 
197f0 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  || p1==SAVEPOINT
19800 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
19810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19820 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
19830 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e  b, p1, iSavepoin
19840 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
19850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19860 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19870 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
19880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19890 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
198a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a  _due_to_error;..
198b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
198c0 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69  pcode: AutoCommi
198d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
198e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61  .** Set the data
198f0 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  base auto-commit
19900 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f   flag to P1 (1 o
19910 72 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74  r 0). If P2 is t
19920 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63  rue, roll.** bac
19930 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  k any currently 
19940 61 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61  active btree tra
19950 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  nsactions. If th
19960 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69  ere are any acti
19970 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74  ve.** VMs (apart
19980 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c   from this one),
19990 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b   then a ROLLBACK
199a0 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49   fails.  A COMMI
199b0 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68  T fails if.** th
199c0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77  ere are active w
199d0 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63  riting VMs or ac
199e0 74 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73  tive VMs that us
199f0 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a  e shared cache..
19a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
19a10 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68  uction causes th
19a20 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f  e VM to halt..*/
19a30 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d  .case OP_AutoCom
19a40 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73  mit: {.  int des
19a50 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a  iredAutoCommit;.
19a60 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b    int iRollback;
19a70 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43  ..  desiredAutoC
19a80 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b  ommit = pOp->p1;
19a90 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  .  iRollback = p
19aa0 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
19ab0 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19ac0 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65  mit==1 || desire
19ad0 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  dAutoCommit==0 )
19ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
19af0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
19b00 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30   || iRollback==0
19b10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
19b20 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
19b30 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  );  /* At least 
19b40 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61  this one VM is a
19b50 63 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  ctive */.  asser
19b60 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
19b70 29 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72 65  );..  if( desire
19b80 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d  dAutoCommit!=db-
19b90 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
19ba0 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b     if( iRollback
19bb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19bc0 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19bd0 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mit==1 );.      
19be0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
19bf0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
19c00 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
19c10 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
19c20 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  mit = 1;.    }el
19c30 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75  se if( desiredAu
19c40 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  toCommit && db->
19c50 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a  nVdbeWrite>0 ){.
19c60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
19c70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70   instruction imp
19c80 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54  lements a COMMIT
19c90 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61   and other VMs a
19ca0 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 20  re writing.     
19cb0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72   ** return an er
19cc0 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ror indicating t
19cd0 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d  hat the other VM
19ce0 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  s must complete 
19cf0 66 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a 2f  first. .      */
19d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d10 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e  beError(p, "cann
19d20 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61  ot commit transa
19d30 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20  ction - ".      
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
19d60 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
19d70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
19d80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
19d90 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19da0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65  to_error;.    }e
19db0 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
19dc0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
19dd0 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f  (p, 1))!=SQLITE_
19de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19df0 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
19e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
19e10 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19e20 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43  (u8)desiredAutoC
19e30 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ommit;.    }.   
19e40 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
19e50 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
19e60 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d  BUSY ){.      p-
19e70 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
19e80 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 62  - aOp);.      db
19e90 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
19ea0 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 74  u8)(1-desiredAut
19eb0 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  oCommit);.      
19ec0 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c  p->rc = rc = SQL
19ed0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19ee0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19f00 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
19f10 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  nt==0 );.    sql
19f20 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
19f30 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  nts(db);.    if(
19f40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19f50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19f60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
19f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19f80 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
19f90 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
19fa0 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d  vdbe_return;.  }
19fb0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19fc0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20  3VdbeError(p,.  
19fd0 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
19fe0 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
19ff0 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
1a000 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
1a010 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
1a020 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
1a030 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
1a040 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
1a050 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
1a060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a070 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
1a080 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
1a090 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
1a0a0 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
1a0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1a0c0 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  R;.    goto abor
1a0d0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1a0e0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1a0f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73  /* Opcode: Trans
1a100 61 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20  action P1 P2 P3 
1a110 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69  P4 P5.**.** Begi
1a120 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
1a130 6f 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 69  on database P1 i
1a140 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1a150 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1a160 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66 20  * active..** If 
1a170 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P2 is non-zero, 
1a180 74 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  then a write-tra
1a190 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1a1a0 74 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a 2a  ted, or if a .**
1a1b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a1c0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1a1d0 69 76 65 2c 20 69 74 20 69 73 20 75 70 67 72 61  ive, it is upgra
1a1e0 64 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d 74  ded to a write-t
1a1f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49  ransaction..** I
1a200 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P2 is zero, th
1a210 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
1a220 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1a230 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ..**.** P1 is th
1a240 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
1a250 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
1a260 77 68 69 63 68 20 74 68 65 20 74 72 61 6e 73 61  which the transa
1a270 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72  ction is.** star
1a280 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73  ted.  Index 0 is
1a290 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1a2a0 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64 65  se file and inde
1a2b0 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66 69  x 1 is the.** fi
1a2c0 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  le used for temp
1a2d0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
1a2e0 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20 6d  ndices of 2 or m
1a2f0 6f 72 65 20 61 72 65 20 75 73 65 64 20 66 6f 72  ore are used for
1a300 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
1a310 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  abases..**.** If
1a320 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1a330 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1a340 61 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73 65  and the Vdbe.use
1a350 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c 61  sStmtJournal fla
1a360 67 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74 68  g is.** true (th
1a370 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  is flag is set i
1a380 66 20 74 68 65 20 56 64 62 65 20 6d 61 79 20 6d  f the Vdbe may m
1a390 6f 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e 20  odify more than 
1a3a0 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79 0a  one row and may.
1a3b0 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
1a3c0 54 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61 20  T exception), a 
1a3d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1a3e0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20 62  ction may also b
1a3f0 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72  e opened..** Mor
1a400 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1a410 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1a420 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
1a430 64 20 69 66 66 20 74 68 65 20 64 61 74 61 62 61  d iff the databa
1a440 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
1a450 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
1a460 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  t in autocommit 
1a470 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65 72  mode, or if ther
1a480 65 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20 61  e are other.** a
1a490 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1a4a0 2e 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74 72  . A statement tr
1a4b0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  ansaction allows
1a4c0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
1a4d0 65 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44 42  e by this.** VDB
1a4e0 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  E to be rolled b
1a4f0 61 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72 72  ack after an err
1a500 6f 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  or without havin
1a510 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  g to roll back t
1a520 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72 61  he.** entire tra
1a530 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f 20  nsaction. If no 
1a540 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1a550 65 72 65 64 2c 20 74 68 65 20 73 74 61 74 65 6d  ered, the statem
1a560 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
1a570 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ** will automati
1a580 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68 65  cally commit whe
1a590 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73  n the VDBE halts
1a5a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30  ..**.** If P5!=0
1a5b0 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
1a5c0 65 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  e also checks th
1a5d0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1a5e0 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61 6e  against P3.** an
1a5f0 64 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e  d the schema gen
1a600 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  eration counter 
1a610 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20 54  against P4..** T
1a620 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  he cookie change
1a630 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e  s its value when
1a640 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
1a650 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
1a660 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  ..** This operat
1a670 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64  ion is used to d
1a680 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20  etect when that 
1a690 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63  the cookie has c
1a6a0 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68  hanged.** and th
1a6b0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1a6c0 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20  rocess needs to 
1a6d0 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d  reread the schem
1a6e0 61 2e 20 20 49 66 20 74 68 65 20 73 63 68 65 6d  a.  If the schem
1a6f0 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20 50  a.** cookie in P
1a700 33 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  3 differs from t
1a710 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1a720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a730 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69 66   header or.** if
1a740 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65   the schema gene
1a750 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  ration counter i
1a760 6e 20 50 34 20 64 69 66 66 65 72 73 20 66 72 6f  n P4 differs fro
1a770 6d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  m the current.**
1a780 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
1a790 74 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  ter, then an SQL
1a7a0 49 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f 72  ITE_SCHEMA error
1a7b0 20 69 73 20 72 61 69 73 65 64 20 61 6e 64 20 65   is raised and e
1a7c0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74  xecution.** halt
1a7d0 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1a7e0 73 74 65 70 28 29 20 77 72 61 70 70 65 72 20 66  step() wrapper f
1a7f0 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74 68  unction might th
1a800 65 6e 20 72 65 70 72 65 70 61 72 65 20 74 68 65  en reprepare the
1a810 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  .** statement an
1a820 64 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d 20  d rerun it from 
1a830 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a  the beginning..*
1a840 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61  /.case OP_Transa
1a850 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65  ction: {.  Btree
1a860 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d 65   *pBt;.  int iMe
1a870 74 61 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ta = 0;..  asser
1a880 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
1a890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1a8a0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70  readOnly==0 || p
1a8b0 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 61  Op->p2==0 );.  a
1a8c0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1a8d0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
1a8e0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1a8f0 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1a900 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
1a910 70 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  p1) );.  if( pOp
1a920 2d 3e 70 32 20 26 26 20 28 64 62 2d 3e 66 6c 61  ->p2 && (db->fla
1a930 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65 72  gs & SQLITE_Quer
1a940 79 4f 6e 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20  yOnly)!=0 ){.   
1a950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1a960 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1a970 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a980 6f 72 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20  or;.  }.  pBt = 
1a990 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1a9a0 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 42 74  .pBt;..  if( pBt
1a9b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a9c0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a9d0 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e 70 32  ans(pBt, pOp->p2
1a9e0 2c 20 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 74  , &iMeta);.    t
1a9f0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
1aa00 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1aa10 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
1aa20 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
1aa30 53 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a 20  SY_RECOVERY );. 
1aa40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aa50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1aa60 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
1aa70 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
1aa80 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74      p->pc = (int
1aa90 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
1aaa0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
1aab0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
1aac0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
1aad0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61    }.      goto a
1aae0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1aaf0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1ab00 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e  ( pOp->p2 && p->
1ab10 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
1ab20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75  .     && (db->au
1ab30 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
1ab40 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20  b->nVdbeRead>1) 
1ab50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1ab60 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1ab70 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
1ab80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1ab90 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >iStatement==0 )
1aba0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1abb0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
1abc0 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65  >=0 && db->nSave
1abd0 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20  point>=0 );.    
1abe0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
1abf0 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70  nt++; .        p
1ac00 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64  ->iStatement = d
1ac10 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20  b->nSavepoint + 
1ac20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a  db->nStatement;.
1ac30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
1ac40 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
1ac50 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
1ac60 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d  EPOINT_BEGIN, p-
1ac70 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a  >iStatement-1);.
1ac80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ac90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1acb0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42  treeBeginStmt(pB
1acc0 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t, p->iStatement
1acd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1ace0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63    /* Store the c
1acf0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
1ad00 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1ad10 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
1ad20 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a  nstraint.      *
1ad30 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68  * counter. If th
1ad40 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1ad50 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
1ad60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
1ad70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
1ad80 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e  lue of this coun
1ad90 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ter needs to be 
1ada0 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a  restored too.  *
1adb0 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  /.      p->nStmt
1adc0 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  DefCons = db->nD
1add0 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20  eferredCons;.   
1ade0 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d     p->nStmtDefIm
1adf0 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  mCons = db->nDef
1ae00 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
1ae10 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1ae20 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20  ( pOp->p5==0 || 
1ae30 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1ae40 49 4e 54 33 32 20 29 3b 0a 20 20 69 66 28 20 70  INT32 );.  if( p
1ae50 4f 70 2d 3e 70 35 0a 20 20 20 26 26 20 28 69 4d  Op->p5.   && (iM
1ae60 65 74 61 21 3d 70 4f 70 2d 3e 70 33 0a 20 20 20  eta!=pOp->p3.   
1ae70 20 20 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 70 4f     || db->aDb[pO
1ae80 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
1ae90 69 47 65 6e 65 72 61 74 69 6f 6e 21 3d 70 4f 70  iGeneration!=pOp
1aea0 2d 3e 70 34 2e 69 29 0a 20 20 29 7b 0a 20 20 20  ->p4.i).  ){.   
1aeb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4c 45   /*.    ** IMPLE
1aec0 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
1aed0 30 33 31 38 39 2d 35 31 31 33 35 20 41 73 20 65  03189-51135 As e
1aee0 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
1aef0 74 20 72 75 6e 73 2c 20 74 68 65 20 73 63 68 65  t runs, the sche
1af00 6d 61 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  ma.    ** versio
1af10 6e 20 69 73 20 63 68 65 63 6b 65 64 20 74 6f 20  n is checked to 
1af20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1af30 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
1af40 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1af50 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
1af60 65 6d 65 6e 74 20 77 61 73 20 70 72 65 70 61 72  ement was prepar
1af70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
1af80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1af90 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1afa0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
1afb0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1afc0 62 2c 20 22 64 61 74 61 62 61 73 65 20 73 63 68  b, "database sch
1afd0 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
1afe0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
1aff0 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66   schema-cookie f
1b000 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1b010 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68   file matches th
1b020 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a  e cookie .    **
1b030 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
1b040 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
1b050 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1b060 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20   schema, do.    
1b070 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68  ** not reload th
1b080 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68  e schema from th
1b090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b0a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1b0b0 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73  f virtual-tables
1b0c0 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69   are in use, thi
1b0d0 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e  s is not just an
1b0e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
1b0f0 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74     ** Often, v-t
1b100 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69  ables store thei
1b110 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20  r data in other 
1b120 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77  SQLite tables, w
1b130 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20  hich.    ** are 
1b140 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74  queried from wit
1b150 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20  hin xNext() and 
1b160 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65  other v-table me
1b170 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20  thods using.    
1b180 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75 65 72  ** prepared quer
1b190 69 65 73 2e 20 49 66 20 73 75 63 68 20 61 20 71  ies. If such a q
1b1a0 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64  uery is out-of-d
1b1b0 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77  ate, we do not w
1b1c0 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  ant to.    ** di
1b1d0 73 63 61 72 64 20 74 68 65 20 64 61 74 61 62 61  scard the databa
1b1e0 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68  se schema, as th
1b1f0 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c  e user code impl
1b200 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20  ementing the.   
1b210 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c   ** v-table woul
1b220 64 20 68 61 76 65 20 74 6f 20 62 65 20 72 65 61  d have to be rea
1b230 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  dy for the sqlit
1b240 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
1b250 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20  e itself.    ** 
1b260 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
1b270 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  d whenever sqlit
1b280 65 33 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c  e3_step() is cal
1b290 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
1b2a0 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c  .    ** a v-tabl
1b2b0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f  e method..    */
1b2c0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
1b2d0 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d  [pOp->p1].pSchem
1b2e0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1b2f0 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20  !=iMeta ){.     
1b300 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
1b310 53 63 68 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e  Schema(db, pOp->
1b320 70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  p1);.    }.    p
1b330 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1b340 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
1b350 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 69 66 28  CHEMA;.  }.  if(
1b360 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1b370 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1b380 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1b390 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69 65  code: ReadCookie
1b3a0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1b3b0 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69 65 20  .** Read cookie 
1b3c0 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d 20 64  number P3 from d
1b3d0 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 77  atabase P1 and w
1b3e0 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72 65 67  rite it into reg
1b3f0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50 33 3d  ister P2..** P3=
1b400 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1b410 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d 3d 32   version.  P3==2
1b420 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1b430 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d 3d   format..** P3==
1b440 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1b450 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1b460 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f   size, and so fo
1b470 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a  rth.  P1==0 is.*
1b480 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
1b490 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
1b4a0 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =1 is the databa
1b4b0 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
1b4c0 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
1b4d0 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
1b4e0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1b4f0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1b500 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  e database (eith
1b510 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  er a transaction
1b520 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61 72  .** must be star
1b530 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75 73  ted or there mus
1b540 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1b550 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65  sor) before.** e
1b560 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69 6e  xecuting this in
1b570 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
1b580 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  se OP_ReadCookie
1b590 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
1b5a0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
1b5b0 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20  nt iMeta;.  int 
1b5c0 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  iDb;.  int iCook
1b5d0 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ie;..  assert( p
1b5e0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
1b5f0 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a   iDb = pOp->p1;.
1b600 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d    iCookie = pOp-
1b610 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p3;.  assert( p
1b620 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f  Op->p3<SQLITE_N_
1b630 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20  BTREE_META );.  
1b640 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1b650 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1b660 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
1b670 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29  Db[iDb].pBt!=0 )
1b680 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
1b690 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
1b6a0 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 0a 20 20  ask, iDb) );..  
1b6b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
1b6c0 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  eta(db->aDb[iDb]
1b6d0 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28  .pBt, iCookie, (
1b6e0 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20  u32 *)&iMeta);. 
1b6f0 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
1b700 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
1b710 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
1b720 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eta;.  break;.}.
1b730 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74 43  ./* Opcode: SetC
1b740 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a  ookie P1 P2 P3 *
1b750 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
1b760 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
1b770 20 50 33 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20   P3 into cookie 
1b780 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
1b790 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d  abase P1..** P2=
1b7a0 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1b7b0 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 32   version.  P2==2
1b7c0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1b7d0 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d   format..** P2==
1b7e0 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1b7f0 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1b800 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73   .** size, and s
1b810 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
1b820 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
1b830 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
1b840 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64  ==1 is the .** d
1b850 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
1b860 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f  d to store tempo
1b870 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
1b880 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
1b890 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b8a0 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e   before executin
1b8b0 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
1b8c0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f  /.case OP_SetCoo
1b8d0 6b 69 65 3a 20 7b 0a 20 20 44 62 20 2a 70 44 62  kie: {.  Db *pDb
1b8e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
1b8f0 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
1b900 28 70 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  (p, 0);.  assert
1b910 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45  ( pOp->p2<SQLITE
1b920 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
1b930 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1b940 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1b950 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
1b960 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
1b970 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
1b980 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73  Op->p1) );.  ass
1b990 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
1b9a0 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  ==0 );.  pDb = &
1b9b0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1b9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ;.  assert( pDb-
1b9d0 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
1b9e0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1b9f0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ba00 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20  pOp->p1, 0) );. 
1ba10 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61 62 6f   /* See note abo
1ba20 75 74 20 69 6e 64 65 78 20 73 68 69 66 74 69 6e  ut index shiftin
1ba30 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  g on OP_ReadCook
1ba40 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  ie */.  rc = sql
1ba50 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
1ba60 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 70 4f  eta(pDb->pBt, pO
1ba70 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29 3b  p->p2, pOp->p3);
1ba80 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d  .  if( pOp->p2==
1ba90 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
1baa0 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 57  SION ){.    /* W
1bab0 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63  hen the schema c
1bac0 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20 72  ookie changes, r
1bad0 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63 6f  ecord the new co
1bae0 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  okie internally 
1baf0 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  */.    pDb->pSch
1bb00 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
1bb10 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ie = pOp->p3;.  
1bb20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
1bb30 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
1bb40 68 61 6e 67 65 3b 0a 20 20 7d 65 6c 73 65 20 69  hange;.  }else i
1bb50 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45  f( pOp->p2==BTRE
1bb60 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b  E_FILE_FORMAT ){
1bb70 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63  .    /* Record c
1bb80 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69  hanges in the fi
1bb90 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20  le format */.   
1bba0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
1bbb0 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 4f 70  ile_format = pOp
1bbc0 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ->p3;.  }.  if( 
1bbd0 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20  pOp->p1==1 ){.  
1bbe0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20    /* Invalidate 
1bbf0 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61  all prepared sta
1bc00 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65 72  tements whenever
1bc10 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1bc20 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  se.    ** schema
1bc30 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54 69   is changed.  Ti
1bc40 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20 20  cket #1644 */.  
1bc50 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
1bc60 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
1bc70 73 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78  s(db);.    p->ex
1bc80 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  pired = 0;.  }. 
1bc90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
1bca0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1bcb0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
1bcc0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65  * Opcode: OpenRe
1bcd0 61 64 20 50 31 20 50 32 20 50 33 20 50 34 20 50  ad P1 P2 P3 P4 P
1bce0 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
1bcf0 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a  oot=P2 iDb=P3.**
1bd00 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
1bd10 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20  only cursor for 
1bd20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
1bd30 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
1bd40 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61  ge is.** P2 in a
1bd50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bd60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1bd70 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  le is determined
1bd80 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d   by P3. .** P3==
1bd90 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  0 means the main
1bda0 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31   database, P3==1
1bdb0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1bdc0 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  ase used for .**
1bdd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bde0 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e  s, and P3>1 mean
1bdf0 73 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65  s used the corre
1be00 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65  sponding attache
1be10 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  d.** database.  
1be20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72  Give the new cur
1be30 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  sor an identifie
1be40 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31  r of P1.  The P1
1be50 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20  .** values need 
1be60 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75  not be contiguou
1be70 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c  s but all P1 val
1be80 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d  ues should be sm
1be90 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  all integers..**
1bea0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
1beb0 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67  for P1 to be neg
1bec0 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ative..**.** All
1bed0 6f 77 65 64 20 50 35 20 62 69 74 73 3a 0a 2a 2a  owed P5 bits:.**
1bee0 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c   <ul>.** <li>  <
1bef0 62 3e 30 78 30 32 20 4f 50 46 4c 41 47 5f 53 45  b>0x02 OPFLAG_SE
1bf00 45 4b 45 51 3c 2f 62 3e 3a 20 54 68 69 73 20 63  EKEQ</b>: This c
1bf10 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
1bf20 62 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  be used for.**  
1bf30 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 6c 6f       equality lo
1bf40 6f 6b 75 70 73 20 28 69 6d 70 6c 65 6d 65 6e 74  okups (implement
1bf50 65 64 20 61 73 20 61 20 70 61 69 72 20 6f 66 20  ed as a pair of 
1bf60 6f 70 63 6f 64 65 73 20 4f 50 5f 53 65 65 6b 47  opcodes OP_SeekG
1bf70 45 2f 4f 50 5f 49 64 78 47 54 0a 2a 2a 20 20 20  E/OP_IdxGT.**   
1bf80 20 20 20 20 6f 66 20 4f 50 5f 53 65 65 6b 4c 45      of OP_SeekLE
1bf90 2f 4f 50 5f 49 64 78 47 54 29 0a 2a 2a 20 3c 2f  /OP_IdxGT).** </
1bfa0 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  ul>.**.** The P4
1bfb0 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69   value may be ei
1bfc0 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
1bfd0 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20  (P4_INT32) or a 
1bfe0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
1bff0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1c000 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20  e (P4_KEYINFO). 
1c010 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74  If it is a point
1c020 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
1c030 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e  .** object, then
1c040 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70 65   table being ope
1c050 6e 65 64 20 6d 75 73 74 20 62 65 20 61 6e 20 5b  ned must be an [
1c060 69 6e 64 65 78 20 62 2d 74 72 65 65 5d 20 77 68  index b-tree] wh
1c070 65 72 65 20 74 68 65 0a 2a 2a 20 4b 65 79 49 6e  ere the.** KeyIn
1c080 66 6f 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65  fo object define
1c090 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  s the content an
1c0a0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20  d collating .** 
1c0b0 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 61 74  sequence of that
1c0c0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
1c0d0 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
1c0e0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
1c0f0 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  * value, then th
1c100 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70  e table being op
1c110 65 6e 65 64 20 6d 75 73 74 20 62 65 20 61 20 5b  ened must be a [
1c120 74 61 62 6c 65 20 62 2d 74 72 65 65 5d 20 77 69  table b-tree] wi
1c130 74 68 20 61 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  th a.** number o
1c140 66 20 63 6f 6c 75 6d 6e 73 20 6e 6f 20 6c 65 73  f columns no les
1c150 73 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  s than the value
1c160 20 6f 66 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 53 65   of P4..**.** Se
1c170 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69 74  e also: OpenWrit
1c180 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a  e, ReopenIdx.*/.
1c190 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70 65  /* Opcode: Reope
1c1a0 6e 49 64 78 20 50 31 20 50 32 20 50 33 20 50 34  nIdx P1 P2 P3 P4
1c1b0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1c1c0 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a   root=P2 iDb=P3.
1c1d0 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e  **.** The Reopen
1c1e0 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73  Idx opcode works
1c1f0 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 52 65 61   like OP_OpenRea
1c200 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  d except that it
1c210 20 66 69 72 73 74 0a 2a 2a 20 63 68 65 63 6b 73   first.** checks
1c220 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
1c230 75 72 73 6f 72 20 6f 6e 20 50 31 20 69 73 20 61  ursor on P1 is a
1c240 6c 72 65 61 64 79 20 6f 70 65 6e 20 6f 6e 20 74  lready open on t
1c250 68 65 20 73 61 6d 65 0a 2a 2a 20 62 2d 74 72 65  he same.** b-tre
1c260 65 20 61 6e 64 20 69 66 20 69 74 20 69 73 20 74  e and if it is t
1c270 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f 6d  his opcode becom
1c280 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20  es a no-op.  In 
1c290 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20  other words,.** 
1c2a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1c2b0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 64   already open, d
1c2c0 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74 2e  o not reopen it.
1c2d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65  .**.** The Reope
1c2e0 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79 20  nIdx opcode may 
1c2f0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
1c300 68 20 50 35 3d 3d 30 20 6f 72 20 50 35 3d 3d 4f  h P5==0 or P5==O
1c310 50 46 4c 41 47 5f 53 45 45 4b 45 51 0a 2a 2a 20  PFLAG_SEEKEQ.** 
1c320 61 6e 64 20 77 69 74 68 20 50 34 20 62 65 69 6e  and with P4 bein
1c330 67 20 61 20 50 34 5f 4b 45 59 49 4e 46 4f 20 6f  g a P4_KEYINFO o
1c340 62 6a 65 63 74 2e 20 20 46 75 72 74 68 65 72 6d  bject.  Furtherm
1c350 6f 72 65 2c 20 74 68 65 20 50 33 20 76 61 6c 75  ore, the P3 valu
1c360 65 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  e must.** be the
1c370 20 73 61 6d 65 20 61 73 20 65 76 65 72 79 20 6f   same as every o
1c380 74 68 65 72 20 52 65 6f 70 65 6e 49 64 78 20 6f  ther ReopenIdx o
1c390 72 20 4f 70 65 6e 52 65 61 64 20 66 6f 72 20 74  r OpenRead for t
1c3a0 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 0a 2a  he same cursor.*
1c3b0 2a 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  * number..**.** 
1c3c0 41 6c 6c 6f 77 65 64 20 50 35 20 62 69 74 73 3a  Allowed P5 bits:
1c3d0 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e  .** <ul>.** <li>
1c3e0 20 20 3c 62 3e 30 78 30 32 20 4f 50 46 4c 41 47    <b>0x02 OPFLAG
1c3f0 5f 53 45 45 4b 45 51 3c 2f 62 3e 3a 20 54 68 69  _SEEKEQ</b>: Thi
1c400 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e  s cursor will on
1c410 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 0a 2a  ly be used for.*
1c420 2a 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79  *       equality
1c430 20 6c 6f 6f 6b 75 70 73 20 28 69 6d 70 6c 65 6d   lookups (implem
1c440 65 6e 74 65 64 20 61 73 20 61 20 70 61 69 72 20  ented as a pair 
1c450 6f 66 20 6f 70 63 6f 64 65 73 20 4f 50 5f 53 65  of opcodes OP_Se
1c460 65 6b 47 45 2f 4f 50 5f 49 64 78 47 54 0a 2a 2a  ekGE/OP_IdxGT.**
1c470 20 20 20 20 20 20 20 6f 66 20 4f 50 5f 53 65 65         of OP_See
1c480 6b 4c 45 2f 4f 50 5f 49 64 78 47 54 29 0a 2a 2a  kLE/OP_IdxGT).**
1c490 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 53 65 65   </ul>.**.** See
1c4a0 20 61 6c 73 6f 3a 20 4f 50 5f 4f 70 65 6e 52 65   also: OP_OpenRe
1c4b0 61 64 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  ad, OP_OpenWrite
1c4c0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1c4d0 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50  penWrite P1 P2 P
1c4e0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
1c4f0 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62  sis: root=P2 iDb
1c500 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  =P3.**.** Open a
1c510 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   read/write curs
1c520 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74  or named P1 on t
1c530 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1c540 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20  x whose root.** 
1c550 70 61 67 65 20 69 73 20 50 32 20 28 6f 72 20 77  page is P2 (or w
1c560 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
1c570 73 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74  s held in regist
1c580 65 72 20 50 32 20 69 66 20 74 68 65 0a 2a 2a 20  er P2 if the.** 
1c590 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 20 62  OPFLAG_P2ISREG b
1c5a0 69 74 20 69 73 20 73 65 74 20 69 6e 20 50 35 20  it is set in P5 
1c5b0 2d 20 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a  - see below)..**
1c5c0 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
1c5d0 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
1c5e0 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e  n integer (P4_IN
1c5f0 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65  T32) or a pointe
1c600 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66  r to.** a KeyInf
1c610 6f 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f  o structure (P4_
1c620 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20  KEYINFO). If it 
1c630 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1c640 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 6f 62  a KeyInfo .** ob
1c650 6a 65 63 74 2c 20 74 68 65 6e 20 74 61 62 6c 65  ject, then table
1c660 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 6d 75   being opened mu
1c670 73 74 20 62 65 20 61 6e 20 5b 69 6e 64 65 78 20  st be an [index 
1c680 62 2d 74 72 65 65 5d 20 77 68 65 72 65 20 74 68  b-tree] where th
1c690 65 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  e.** KeyInfo obj
1c6a0 65 63 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  ect defines the 
1c6b0 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c  content and coll
1c6c0 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e  ating .** sequen
1c6d0 63 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  ce of that index
1c6e0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
1c6f0 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
1c700 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
1c710 65 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  e, then the tabl
1c720 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 6d  e being opened m
1c730 75 73 74 20 62 65 20 61 20 5b 74 61 62 6c 65 20  ust be a [table 
1c740 62 2d 74 72 65 65 5d 20 77 69 74 68 20 61 0a 2a  b-tree] with a.*
1c750 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * number of colu
1c760 6d 6e 73 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e  mns no less than
1c770 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 34   the value of P4
1c780 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ..**.** Allowed 
1c790 50 35 20 62 69 74 73 3a 0a 2a 2a 20 3c 75 6c 3e  P5 bits:.** <ul>
1c7a0 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78 30  .** <li>  <b>0x0
1c7b0 32 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3c  2 OPFLAG_SEEKEQ<
1c7c0 2f 62 3e 3a 20 54 68 69 73 20 63 75 72 73 6f 72  /b>: This cursor
1c7d0 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
1c7e0 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
1c7f0 65 71 75 61 6c 69 74 79 20 6c 6f 6f 6b 75 70 73  equality lookups
1c800 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73   (implemented as
1c810 20 61 20 70 61 69 72 20 6f 66 20 6f 70 63 6f 64   a pair of opcod
1c820 65 73 20 4f 50 5f 53 65 65 6b 47 45 2f 4f 50 5f  es OP_SeekGE/OP_
1c830 49 64 78 47 54 0a 2a 2a 20 20 20 20 20 20 20 6f  IdxGT.**       o
1c840 66 20 4f 50 5f 53 65 65 6b 4c 45 2f 4f 50 5f 49  f OP_SeekLE/OP_I
1c850 64 78 47 54 29 0a 2a 2a 20 3c 6c 69 3e 20 20 3c  dxGT).** <li>  <
1c860 62 3e 30 78 30 38 20 4f 50 46 4c 41 47 5f 46 4f  b>0x08 OPFLAG_FO
1c870 52 44 45 4c 45 54 45 3c 2f 62 3e 3a 20 54 68 69  RDELETE</b>: Thi
1c880 73 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  s cursor is used
1c890 20 6f 6e 6c 79 20 74 6f 20 73 65 65 6b 0a 2a 2a   only to seek.**
1c8a0 20 20 20 20 20 20 20 61 6e 64 20 73 75 62 73 65         and subse
1c8b0 71 75 65 6e 74 6c 79 20 64 65 6c 65 74 65 20 65  quently delete e
1c8c0 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 69 6e 64  ntries in an ind
1c8d0 65 78 20 62 74 72 65 65 2e 20 20 54 68 69 73 20  ex btree.  This 
1c8e0 69 73 20 61 0a 2a 2a 20 20 20 20 20 20 20 68 69  is a.**       hi
1c8f0 6e 74 20 74 6f 20 74 68 65 20 73 74 6f 72 61 67  nt to the storag
1c900 65 20 65 6e 67 69 6e 65 20 74 68 61 74 20 74 68  e engine that th
1c910 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
1c920 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a   is allowed to.*
1c930 2a 20 20 20 20 20 20 20 69 67 6e 6f 72 65 2e 20  *       ignore. 
1c940 20 54 68 65 20 68 69 6e 74 20 69 73 20 6e 6f 74   The hint is not
1c950 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 66 66   used by the off
1c960 69 63 69 61 6c 20 53 51 4c 69 74 65 20 62 2a 74  icial SQLite b*t
1c970 72 65 65 20 73 74 6f 72 61 67 65 0a 2a 2a 20 20  ree storage.**  
1c980 20 20 20 20 20 65 6e 67 69 6e 65 2c 20 62 75 74       engine, but
1c990 20 69 73 20 75 73 65 64 20 62 79 20 43 4f 4d 44   is used by COMD
1c9a0 42 32 2e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e  B2..** <li>  <b>
1c9b0 30 78 31 30 20 4f 50 46 4c 41 47 5f 50 32 49 53  0x10 OPFLAG_P2IS
1c9c0 52 45 47 3c 2f 62 3e 3a 20 55 73 65 20 74 68 65  REG</b>: Use the
1c9d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
1c9e0 73 74 65 72 20 50 32 0a 2a 2a 20 20 20 20 20 20  ster P2.**      
1c9f0 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   as the root pag
1ca00 65 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65  e, not the value
1ca10 20 6f 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a   of P2 itself..*
1ca20 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68  * </ul>.**.** Th
1ca30 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  is instruction w
1ca40 6f 72 6b 73 20 6c 69 6b 65 20 4f 70 65 6e 52 65  orks like OpenRe
1ca50 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ad except that i
1ca60 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73  t opens the curs
1ca70 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72  or.** in read/wr
1ca80 69 74 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ite mode..**.** 
1ca90 53 65 65 20 61 6c 73 6f 3a 20 4f 50 5f 4f 70 65  See also: OP_Ope
1caa0 6e 52 65 61 64 2c 20 4f 50 5f 52 65 6f 70 65 6e  nRead, OP_Reopen
1cab0 49 64 78 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  Idx.*/.case OP_R
1cac0 65 6f 70 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e  eopenIdx: {.  in
1cad0 74 20 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49  t nField;.  KeyI
1cae0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1caf0 20 69 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69   int p2;.  int i
1cb00 44 62 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67  Db;.  int wrFlag
1cb10 3b 0a 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20  ;.  Btree *pX;. 
1cb20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75   VdbeCursor *pCu
1cb30 72 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  r;.  Db *pDb;.. 
1cb40 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
1cb50 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ==0 || pOp->p5==
1cb60 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b  OPFLAG_SEEKEQ );
1cb70 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1cb80 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e  p4type==P4_KEYIN
1cb90 46 4f 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  FO );.  pCur = p
1cba0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1cbb0 3b 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  ;.  if( pCur && 
1cbc0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
1cbd0 28 75 33 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a  (u32)pOp->p2 ){.
1cbe0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1cbf0 2d 3e 69 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29  ->iDb==pOp->p3 )
1cc00 3b 20 20 20 20 20 20 2f 2a 20 47 75 61 72 61 6e  ;      /* Guaran
1cc10 74 65 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  teed by the code
1cc20 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20   generator */.  
1cc30 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73    goto open_curs
1cc40 6f 72 5f 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20  or_set_hints;.  
1cc50 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  }.  /* If the cu
1cc60 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
1cc70 65 6e 74 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73  ently open or is
1cc80 20 6f 70 65 6e 20 6f 6e 20 61 20 64 69 66 66 65   open on a diffe
1cc90 72 65 6e 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  rent.  ** index,
1cca0 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
1ccb0 67 68 20 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52  gh into OP_OpenR
1ccc0 65 61 64 20 74 6f 20 66 6f 72 63 65 20 61 20 72  ead to force a r
1ccd0 65 6f 70 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50  eopen */.case OP
1cce0 5f 4f 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20  _OpenRead:.case 
1ccf0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20  OP_OpenWrite:.. 
1cd00 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
1cd10 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
1cd20 74 65 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30  te || pOp->p5==0
1cd30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46   || pOp->p5==OPF
1cd40 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20  LAG_SEEKEQ );.  
1cd50 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
1cd60 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
1cd70 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
1cd80 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f  P_OpenRead || pO
1cd90 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65  p->opcode==OP_Re
1cda0 6f 70 65 6e 49 64 78 0a 20 20 20 20 20 20 20 20  openIdx.        
1cdb0 20 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79    || p->readOnly
1cdc0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
1cdd0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
1cde0 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52  rc = SQLITE_ABOR
1cdf0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
1ce00 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1ce10 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
1ce20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b  nField = 0;.  pK
1ce30 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32  eyInfo = 0;.  p2
1ce40 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44   = pOp->p2;.  iD
1ce50 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  b = pOp->p3;.  a
1ce60 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1ce70 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1ce80 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
1ce90 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
1cea0 6b 2c 20 69 44 62 29 20 29 3b 0a 20 20 70 44 62  k, iDb) );.  pDb
1ceb0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
1cec0 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d 3e 70 42  ;.  pX = pDb->pB
1ced0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 58 21  t;.  assert( pX!
1cee0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
1cef0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e  >opcode==OP_Open
1cf00 57 72 69 74 65 20 29 7b 0a 20 20 20 20 61 73 73  Write ){.    ass
1cf10 65 72 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44  ert( OPFLAG_FORD
1cf20 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52  ELETE==BTREE_FOR
1cf30 44 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 77 72  DELETE );.    wr
1cf40 46 6c 61 67 20 3d 20 42 54 52 45 45 5f 57 52 43  Flag = BTREE_WRC
1cf50 53 52 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20  SR | (pOp->p5 & 
1cf60 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
1cf70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1cf80 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1cf90 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
1cfa0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62  ) );.    if( pDb
1cfb0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
1cfc0 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57  format < p->minW
1cfd0 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29  riteFileFormat )
1cfe0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72  {.      p->minWr
1cff0 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
1d000 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1d010 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d  le_format;.    }
1d020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72  .  }else{.    wr
1d030 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Flag = 0;.  }.  
1d040 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
1d050 46 4c 41 47 5f 50 32 49 53 52 45 47 20 29 7b 0a  FLAG_P2ISREG ){.
1d060 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30      assert( p2>0
1d070 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d080 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p2<=(p->nMem+1 -
1d090 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
1d0a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1d0b0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e  >opcode==OP_Open
1d0c0 57 72 69 74 65 20 29 3b 0a 20 20 20 20 70 49 6e  Write );.    pIn
1d0d0 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20  2 = &aMem[p2];. 
1d0e0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
1d0f0 56 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20  Valid(pIn2) );. 
1d100 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32     assert( (pIn2
1d110 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1d120 74 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  t)!=0 );.    sql
1d130 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
1d140 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20  erify(pIn2);.   
1d150 20 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d   p2 = (int)pIn2-
1d160 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65  >u.i;.    /* The
1d170 20 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73   p2 value always
1d180 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72   comes from a pr
1d190 69 6f 72 20 4f 50 5f 43 72 65 61 74 65 42 74 72  ior OP_CreateBtr
1d1a0 65 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20  ee opcode and.  
1d1b0 20 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65    ** that opcode
1d1c0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74   will always set
1d1d0 20 74 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f   the p2 value to
1d1e0 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c   2 or more or el
1d1f0 73 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20  se fail..    ** 
1d200 49 66 20 74 68 65 72 65 20 77 65 72 65 20 61 20  If there were a 
1d210 66 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65  failure, the pre
1d220 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
1d230 77 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65  would have halte
1d240 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  d.    ** before 
1d250 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e  reaching this in
1d260 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  struction. */.  
1d270 20 20 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20    assert( p2>=2 
1d280 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  );.  }.  if( pOp
1d290 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
1d2a0 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79  INFO ){.    pKey
1d2b0 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
1d2c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73  KeyInfo;.    ass
1d2d0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  ert( pKeyInfo->e
1d2e0 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20  nc==ENC(db) );. 
1d2f0 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
1d300 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  nfo->db==db );. 
1d310 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79     nField = pKey
1d320 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3b  Info->nAllField;
1d330 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
1d340 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
1d350 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64  32 ){.    nField
1d360 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
1d370 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  }.  assert( pOp-
1d380 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p1>=0 );.  asse
1d390 72 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b  rt( nField>=0 );
1d3a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 46 69  .  testcase( nFi
1d3b0 65 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61  eld==0 );  /* Ta
1d3c0 62 6c 65 20 77 69 74 68 20 49 4e 54 45 47 45 52  ble with INTEGER
1d3d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1d3e0 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f   nothing else */
1d3f0 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61  .  pCur = alloca
1d400 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
1d410 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62  >p1, nField, iDb
1d420 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29  , CURTYPE_BTREE)
1d430 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20  ;.  if( pCur==0 
1d440 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
1d450 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d   pCur->nullRow =
1d460 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72   1;.  pCur->isOr
1d470 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 70 43 75  dered = 1;.  pCu
1d480 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32  r->pgnoRoot = p2
1d490 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1d4a0 44 45 42 55 47 0a 20 20 70 43 75 72 2d 3e 77 72  DEBUG.  pCur->wr
1d4b0 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23  Flag = wrFlag;.#
1d4c0 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c  endif.  rc = sql
1d4d0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1d4e0 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20  pX, p2, wrFlag, 
1d4f0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e  pKeyInfo, pCur->
1d500 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70  uc.pCursor);.  p
1d510 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1d520 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53  pKeyInfo;.  /* S
1d530 65 74 20 74 68 65 20 56 64 62 65 43 75 72 73 6f  et the VdbeCurso
1d540 72 2e 69 73 54 61 62 6c 65 20 76 61 72 69 61 62  r.isTable variab
1d550 6c 65 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72  le. Previous ver
1d560 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51  sions of.  ** SQ
1d570 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63 68 65  Lite used to che
1d580 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70  ck if the root-p
1d590 61 67 65 20 66 6c 61 67 73 20 77 65 72 65 20 73  age flags were s
1d5a0 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ane at this poin
1d5b0 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72  t.  ** and repor
1d5c0 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  t database corru
1d5d0 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65  ption if they we
1d5e0 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73  re not, but this
1d5f0 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20   check has.  ** 
1d600 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f  since moved into
1d610 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
1d620 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e  .  */  .  pCur->
1d630 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70  isTable = pOp->p
1d640 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46  4type!=P4_KEYINF
1d650 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f  O;..open_cursor_
1d660 73 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73  set_hints:.  ass
1d670 65 72 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  ert( OPFLAG_BULK
1d680 43 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  CSR==BTREE_BULKL
1d690 4f 41 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OAD );.  assert(
1d6a0 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d   OPFLAG_SEEKEQ==
1d6b0 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b  BTREE_SEEK_EQ );
1d6c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70  .  testcase( pOp
1d6d0 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 42 55  ->p5 & OPFLAG_BU
1d6e0 4c 4b 43 53 52 20 29 3b 0a 23 69 66 64 65 66 20  LKCSR );.#ifdef 
1d6f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
1d700 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65 73  RSOR_HINTS.  tes
1d710 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 20 26  tcase( pOp->p2 &
1d720 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29   OPFLAG_SEEKEQ )
1d730 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1d740 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
1d750 74 46 6c 61 67 73 28 70 43 75 72 2d 3e 75 63 2e  tFlags(pCur->uc.
1d760 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20  pCursor,.       
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35          (pOp->p5
1d790 20 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43   & (OPFLAG_BULKC
1d7a0 53 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  SR|OPFLAG_SEEKEQ
1d7b0 29 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  )));.  if( rc ) 
1d7c0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1d7d0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
1d7e0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1d7f0 4f 70 65 6e 44 75 70 20 50 31 20 50 32 20 2a 20  OpenDup P1 P2 * 
1d800 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  * *.**.** Open a
1d810 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20 74   new cursor P1 t
1d820 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  hat points to th
1d830 65 20 73 61 6d 65 20 65 70 68 65 6d 65 72 61 6c  e same ephemeral
1d840 20 74 61 62 6c 65 20 61 73 0a 2a 2a 20 63 75 72   table as.** cur
1d850 73 6f 72 20 50 32 2e 20 20 54 68 65 20 50 32 20  sor P2.  The P2 
1d860 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1d870 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
1d880 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1d890 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70 63 6f  phemeral.** opco
1d8a0 64 65 2e 20 20 4f 6e 6c 79 20 65 70 68 65 6d 65  de.  Only epheme
1d8b0 72 61 6c 20 63 75 72 73 6f 72 73 20 6d 61 79 20  ral cursors may 
1d8c0 62 65 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  be duplicated..*
1d8d0 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 65  *.** Duplicate e
1d8e0 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73  phemeral cursors
1d8f0 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 73 65   are used for se
1d900 6c 66 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61 74 65  lf-joins of mate
1d910 72 69 61 6c 69 7a 65 64 20 76 69 65 77 73 2e 0a  rialized views..
1d920 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 44  */.case OP_OpenD
1d930 75 70 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  up: {.  VdbeCurs
1d940 6f 72 20 2a 70 4f 72 69 67 3b 20 20 20 20 2f 2a  or *pOrig;    /*
1d950 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 75   The original cu
1d960 72 73 6f 72 20 74 6f 20 62 65 20 64 75 70 6c 69  rsor to be dupli
1d970 63 61 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43  cated */.  VdbeC
1d980 75 72 73 6f 72 20 2a 70 43 78 3b 20 20 20 20 20  ursor *pCx;     
1d990 20 2f 2a 20 54 68 65 20 6e 65 77 20 63 75 72 73   /* The new curs
1d9a0 6f 72 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d  or */..  pOrig =
1d9b0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1d9c0 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
1d9d0 72 69 67 2d 3e 70 42 74 78 21 3d 30 20 29 3b 20  rig->pBtx!=0 ); 
1d9e0 20 2f 2a 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72   /* Only ephemer
1d9f0 61 6c 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62  al cursors can b
1da00 65 20 64 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a  e duplicated */.
1da10 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74  .  pCx = allocat
1da20 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1da30 70 31 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c  p1, pOrig->nFiel
1da40 64 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42  d, -1, CURTYPE_B
1da50 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 78  TREE);.  if( pCx
1da60 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1da70 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f  m;.  pCx->nullRo
1da80 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73  w = 1;.  pCx->is
1da90 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20  Ephemeral = 1;. 
1daa0 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d   pCx->pKeyInfo =
1dab0 20 70 4f 72 69 67 2d 3e 70 4b 65 79 49 6e 66 6f   pOrig->pKeyInfo
1dac0 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65  ;.  pCx->isTable
1dad0 20 3d 20 70 4f 72 69 67 2d 3e 69 73 54 61 62 6c   = pOrig->isTabl
1dae0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1daf0 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 4f 72  3BtreeCursor(pOr
1db00 69 67 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52  ig->pBtx, MASTER
1db10 5f 52 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43  _ROOT, BTREE_WRC
1db20 53 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  SR,.            
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1db40 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78  x->pKeyInfo, pCx
1db50 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1db60 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 42   /* The sqlite3B
1db70 74 72 65 65 43 75 72 73 6f 72 28 29 20 72 6f 75  treeCursor() rou
1db80 74 69 6e 65 20 63 61 6e 20 6f 6e 6c 79 20 66 61  tine can only fa
1db90 69 6c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  il for the first
1dba0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 6f 70 65   cursor.  ** ope
1dbb0 6e 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  ned for a databa
1dbc0 73 65 2e 20 20 53 69 6e 63 65 20 74 68 65 72 65  se.  Since there
1dbd0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 6f   is already an o
1dbe0 70 65 6e 20 63 75 72 73 6f 72 20 77 68 65 6e 20  pen cursor when 
1dbf0 74 68 69 73 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  this.  ** opcode
1dc00 20 69 73 20 72 75 6e 2c 20 74 68 65 20 73 71 6c   is run, the sql
1dc10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1dc20 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
1dc30 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1dc40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 62 72  QLITE_OK );.  br
1dc50 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f  eak;.}.../* Opco
1dc60 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  de: OpenEphemera
1dc70 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  l P1 P2 * P4 P5.
1dc80 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f  ** Synopsis: nCo
1dc90 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70  lumn=P2.**.** Op
1dca0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1dcb0 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e  P1 to a transien
1dcc0 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  t table..** The 
1dcd0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1dce0 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
1dcf0 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74  te even if .** t
1dd00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1dd10 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   is read-only.  
1dd20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a  The ephemeral.**
1dd30 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65   table is delete
1dd40 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1dd50 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1dd60 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
1dd70 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P2 is the numbe
1dd80 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1dd90 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
1dda0 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73  ble..** The curs
1ddb0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42  or points to a B
1ddc0 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34  Tree table if P4
1ddd0 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72  ==0 and to a BTr
1dde0 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50  ee index.** if P
1ddf0 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20  4 is not 0.  If 
1de00 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P4 is not NULL, 
1de10 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  it points to a K
1de20 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1de30 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73  .** that defines
1de40 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b   the format of k
1de50 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  eys in the index
1de60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70  ..**.** The P5 p
1de70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
1de80 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54  a mask of the BT
1de90 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  REE_* flags defi
1dea0 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e  ned.** in btree.
1deb0 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  h.  These flags 
1dec0 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20  control aspects 
1ded0 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  of the operation
1dee0 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   of.** the btree
1def0 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49  .  The BTREE_OMI
1df00 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54  T_JOURNAL and BT
1df10 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73  REE_SINGLE flags
1df20 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75   are.** added au
1df30 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
1df40 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41  /* Opcode: OpenA
1df50 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a  utoindex P1 P2 *
1df60 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
1df70 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a  s: nColumn=P2.**
1df80 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1df90 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61  works the same a
1dfa0 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
1dfb0 61 6c 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a  al.  It has a.**
1dfc0 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20   different name 
1dfd0 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 69  to distinguish i
1dfe0 74 73 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20  ts use.  Tables 
1dff0 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  created using.**
1e000 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20   by this opcode 
1e010 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
1e020 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1e030 72 65 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74  reated transient
1e040 0a 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a  .** indices in j
1e050 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  oins..*/.case OP
1e060 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20  _OpenAutoindex: 
1e070 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68  .case OP_OpenEph
1e080 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65  emeral: {.  Vdbe
1e090 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b  Cursor *pCx;.  K
1e0a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1e0b0 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ;..  static cons
1e0c0 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d  t int vfsFlags =
1e0d0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1e0e0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1e0f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1e100 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1e110 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1e120 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53  LUSIVE |.      S
1e130 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1e140 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
1e150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
1e160 4e 53 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73  NSIENT_DB;.  ass
1e170 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1e180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1e190 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78  ->p2>=0 );.  pCx
1e1a0 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1e1b0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  r(p, pOp->p1, pO
1e1c0 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59  p->p2, -1, CURTY
1e1d0 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28  PE_BTREE);.  if(
1e1e0 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1e1f0 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1e200 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1e210 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20  ->isEphemeral = 
1e220 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
1e230 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
1e240 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78  Vfs, 0, db, &pCx
1e250 2d 3e 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20  ->pBtx, .       
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1e280 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47  NAL | BTREE_SING
1e290 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20 76 66  LE | pOp->p5, vf
1e2a0 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72  sFlags);.  if( r
1e2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e2c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e2d0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
1e2e0 70 43 78 2d 3e 70 42 74 78 2c 20 31 2c 20 30 29  pCx->pBtx, 1, 0)
1e2f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1e300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e310 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65   /* If a transie
1e320 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71 75  nt index is requ
1e330 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74 20  ired, create it 
1e340 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a  by calling.    *
1e350 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  * sqlite3BtreeCr
1e360 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74 68  eateTable() with
1e370 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b   the BTREE_BLOBK
1e380 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20  EY flag before. 
1e390 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74     ** opening it
1e3a0 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74  . If a transient
1e3b0 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72   table is requir
1e3c0 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ed, just use the
1e3d0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1e3e0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61  cally created ta
1e3f0 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1e400 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e  ge 1 (an BLOB_IN
1e410 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20  TKEY table)..   
1e420 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 78   */.    if( (pCx
1e430 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1e440 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
1e450 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a  pKeyInfo)!=0 ){.
1e460 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a        int pgno;.
1e470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1e480 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
1e490 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72  YINFO );.      r
1e4a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e4b0 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d  CreateTable(pCx-
1e4c0 3e 70 42 74 78 2c 20 26 70 67 6e 6f 2c 20 42 54  >pBtx, &pgno, BT
1e4d0 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f  REE_BLOBKEY | pO
1e4e0 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20 69  p->p5); .      i
1e4f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e500 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e510 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52  rt( pgno==MASTER
1e520 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20  _ROOT+1 );.     
1e530 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
1e540 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  nfo->db==db );. 
1e550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e560 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e  KeyInfo->enc==EN
1e570 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20 20  C(db) );.       
1e580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e590 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42  eeCursor(pCx->pB
1e5a0 74 78 2c 20 70 67 6e 6f 2c 20 42 54 52 45 45 5f  tx, pgno, BTREE_
1e5b0 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20  WRCSR,.         
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2c         pKeyInfo,
1e5e0 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
1e5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e600 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1e610 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e630 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d  BtreeCursor(pCx-
1e640 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52 4f  >pBtx, MASTER_RO
1e650 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52 2c  OT, BTREE_WRCSR,
1e660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1e680 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  , pCx->uc.pCurso
1e690 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e 69  r);.      pCx->i
1e6a0 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  sTable = 1;.    
1e6b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
1e6c0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1e6d0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78 2d  to_error;.  pCx-
1e6e0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70 4f  >isOrdered = (pO
1e6f0 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f  p->p5!=BTREE_UNO
1e700 52 44 45 52 45 44 29 3b 0a 20 20 62 72 65 61 6b  RDERED);.  break
1e710 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1e720 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50 32  SorterOpen P1 P2
1e730 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54   P3 P4 *.**.** T
1e740 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73  his opcode works
1e750 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68   like OP_OpenEph
1e760 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74 68  emeral except th
1e770 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61  at it opens.** a
1e780 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
1e790 20 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69   that is specifi
1e7a0 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 74  cally designed t
1e7b0 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20  o sort large.** 
1e7c0 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20  tables using an 
1e7d0 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73  external merge-s
1e7e0 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a  ort algorithm..*
1e7f0 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1e800 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P3 is non-zero,
1e810 20 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61 74   then it indicat
1e820 65 73 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  es that the sort
1e830 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d 65  er may.** assume
1e840 20 74 68 61 74 20 61 20 73 74 61 62 6c 65 20 73   that a stable s
1e850 6f 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ort considering 
1e860 74 68 65 20 66 69 72 73 74 20 50 33 20 66 69 65  the first P3 fie
1e870 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20 6b  lds of each.** k
1e880 65 79 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ey is sufficient
1e890 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20   to produce the 
1e8a0 72 65 71 75 69 72 65 64 20 72 65 73 75 6c 74 73  required results
1e8b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
1e8c0 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62  terOpen: {.  Vdb
1e8d0 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20  eCursor *pCx;.. 
1e8e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1e8f0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1e900 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
1e910 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1e920 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1e930 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43  , pOp->p2, -1, C
1e940 55 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b 0a  URTYPE_SORTER);.
1e950 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1e960 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1e970 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  x->pKeyInfo = pO
1e980 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1e990 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
1e9a0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20  KeyInfo->db==db 
1e9b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78  );.  assert( pCx
1e9c0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d  ->pKeyInfo->enc=
1e9d0 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72 63  =ENC(db) );.  rc
1e9e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f   = sqlite3VdbeSo
1e9f0 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f 70  rterInit(db, pOp
1ea00 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69 66  ->p3, pCx);.  if
1ea10 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
1ea20 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1ea30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1ea40 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 54  pcode: SequenceT
1ea50 65 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  est P1 P2 * * *.
1ea60 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 28  ** Synopsis: if(
1ea70 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b   cursor[P1].ctr+
1ea80 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a 2a  + ) pc = P2.**.*
1ea90 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72  * P1 is a sorter
1eaa0 20 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65 20   cursor. If the 
1eab0 73 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65 72  sequence counter
1eac0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65   is currently ze
1ead0 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50  ro, jump.** to P
1eae0 32 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  2. Regardless of
1eaf0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1eb00 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
1eb10 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  n, increment the
1eb20 0a 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63 65  .** the sequence
1eb30 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20   value..*/.case 
1eb40 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 3a  OP_SequenceTest:
1eb50 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
1eb60 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *pC;.  assert( p
1eb70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1eb80 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1eb90 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
1eba0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
1ebb0 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
1ebc0 70 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70 43  pC) );.  if( (pC
1ebd0 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d 30  ->seqCount++)==0
1ebe0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d   ){.    goto jum
1ebf0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
1ec00 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1ec10 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20 50  de: OpenPseudo P
1ec20 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
1ec30 79 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c 75  ynopsis: P3 colu
1ec40 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a 0a  mns in r[P2].**.
1ec50 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75  ** Open a new cu
1ec60 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  rsor that points
1ec70 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c 65   to a fake table
1ec80 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1ec90 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f   single.** row o
1eca0 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f 6e  f data.  The con
1ecb0 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  tent of that one
1ecc0 20 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e 74   row is the cont
1ecd0 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ent of memory.**
1ece0 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
1ecf0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
1ed00 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65 73  ursor P1 becomes
1ed10 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68   an alias for th
1ed20 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63  e .** MEM_Blob c
1ed30 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65 64  ontent contained
1ed40 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
1ed50 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d  .**.** A pseudo-
1ed60 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62 79  table created by
1ed70 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
1ed80 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 73  used to hold a s
1ed90 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74  ingle.** row out
1eda0 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  put from the sor
1edb0 74 65 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  ter so that the 
1edc0 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f 6d  row can be decom
1edd0 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e  posed into.** in
1ede0 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73  dividual columns
1edf0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f   using the OP_Co
1ee00 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68  lumn opcode.  Th
1ee10 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
1ee20 64 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c  de.** is the onl
1ee30 79 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65 20  y cursor opcode 
1ee40 74 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68 20  that works with 
1ee50 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
1ee60 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65 20  **.** P3 is the 
1ee70 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1ee80 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73 20   in the records 
1ee90 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
1eea0 72 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 73  red by.** the ps
1eeb0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63  eudo-table..*/.c
1eec0 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  ase OP_OpenPseud
1eed0 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  o: {.  VdbeCurso
1eee0 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65 72  r *pCx;..  asser
1eef0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b  t( pOp->p1>=0 );
1ef00 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1ef10 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p3>=0 );.  pCx =
1ef20 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1ef30 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1ef40 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50 45  >p3, -1, CURTYPE
1ef50 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28 20  _PSEUDO);.  if( 
1ef60 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  pCx==0 ) goto no
1ef70 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c  _mem;.  pCx->nul
1ef80 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d  lRow = 1;.  pCx-
1ef90 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 70 4f  >seekResult = pO
1efa0 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d 3e 69 73  p->p2;.  pCx->is
1efb0 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 2f 2a 20  Table = 1;.  /* 
1efc0 47 69 76 65 20 74 68 69 73 20 70 73 65 75 64 6f  Give this pseudo
1efd0 2d 63 75 72 73 6f 72 20 61 20 66 61 6b 65 20 42  -cursor a fake B
1efe0 74 43 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20  tCursor pointer 
1eff0 73 6f 20 74 68 61 74 20 70 43 78 0a 20 20 2a 2a  so that pCx.  **
1f000 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 70   can be safely p
1f010 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1f020 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
1f030 28 29 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ().  This avoids
1f040 20 61 20 74 65 73 74 0a 20 20 2a 2a 20 66 6f 72   a test.  ** for
1f050 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
1f060 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 69 6e  CURTYPE_BTREE in
1f070 73 69 64 65 20 6f 66 20 73 71 6c 69 74 65 33 56  side of sqlite3V
1f080 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
1f090 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  ).  ** which is 
1f0a0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1f0b0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
1f0c0 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 20  pCx->uc.pCursor 
1f0d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
1f0e0 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 29 3b  keValidCursor();
1f0f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1f100 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61 6b  p5==0 );.  break
1f110 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1f120 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a  Close P1 * * * *
1f130 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  .**.** Close a c
1f140 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79  ursor previously
1f150 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20   opened as P1.  
1f160 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  If P1 is not.** 
1f170 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1f180 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1f190 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1f1a0 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b  case OP_Close: {
1f1b0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1f1c0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1f1d0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1f1e0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1f1f0 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1f200 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  sr[pOp->p1]);.  
1f210 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1f220 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  ] = 0;.  break;.
1f230 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f240 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
1f250 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f  SED_MASK./* Opco
1f260 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65 64 20  de: ColumnsUsed 
1f270 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
1f280 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 28 77  * This opcode (w
1f290 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73 74 73  hich only exists
1f2a0 20 69 66 20 53 51 4c 69 74 65 20 77 61 73 20 63   if SQLite was c
1f2b0 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20  ompiled with.** 
1f2c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
1f2d0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 29 20  LUMN_USED_MASK) 
1f2e0 69 64 65 6e 74 69 66 69 65 73 20 77 68 69 63 68  identifies which
1f2f0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1f300 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
1f310 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 20  x for cursor P1 
1f320 61 72 65 20 75 73 65 64 2e 20 20 50 34 20 69 73  are used.  P4 is
1f330 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1f340 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34 29 20  r.** (P4_INT64) 
1f350 69 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 72  in which the fir
1f360 73 74 20 36 33 20 62 69 74 73 20 61 72 65 20 6f  st 63 bits are o
1f370 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ne for each of t
1f380 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33 20 63  he.** first 63 c
1f390 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1f3a0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
1f3b0 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  t are actually u
1f3c0 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  sed.** by the cu
1f3d0 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67 68 2d  rsor.  The high-
1f3e0 6f 72 64 65 72 20 62 69 74 20 69 73 20 73 65 74  order bit is set
1f3f0 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 61   if any column a
1f400 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34 74 68  fter.** the 64th
1f410 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63 61 73   is used..*/.cas
1f420 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  e OP_ColumnsUsed
1f430 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1f440 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70 2d 3e   *pC;.  pC = p->
1f450 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1f460 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
1f470 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
1f480 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d 3e 6d  BTREE );.  pC->m
1f490 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36 34 2a  askUsed = *(u64*
1f4a0 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20  )pOp->p4.pI64;. 
1f4b0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
1f4c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  ../* Opcode: See
1f4d0 6b 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20  kGE P1 P2 P3 P4 
1f4e0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
1f4f0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
1f500 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1f510 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1f520 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1f530 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1f540 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1f550 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1f560 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20 6b  ster P3 as the k
1f570 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20 50  ey.  If cursor P
1f580 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1f590 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1f5a0 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1f5b0 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1f5c0 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1f5d0 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1f5e0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1f5f0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1f600 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1f610 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1f620 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1f630 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1f640 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1f650 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1f660 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
1f670 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1f680 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20   no records .** 
1f690 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1f6a0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1f6b0 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1f6c0 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1f6d0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o P2..**.** If t
1f6e0 68 65 20 63 75 72 73 6f 72 20 50 31 20 77 61 73  he cursor P1 was
1f6f0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
1f700 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20  e OPFLAG_SEEKEQ 
1f710 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a  flag, then this.
1f720 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61  ** opcode will a
1f730 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20  lways land on a 
1f740 72 65 63 6f 72 64 20 74 68 61 74 20 65 71 75 61  record that equa
1f750 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b  lly equals the k
1f760 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a  ey, or.** else j
1f770 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
1f780 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65  to P2.  When the
1f790 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41   cursor is OPFLA
1f7a0 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a  G_SEEKEQ, this.*
1f7b0 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65  * opcode must be
1f7c0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
1f7d0 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 74  IdxLE opcode wit
1f7e0 68 20 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d  h the same argum
1f7f0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78  ents..** The Idx
1f800 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  LE opcode will b
1f810 65 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69  e skipped if thi
1f820 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64  s opcode succeed
1f830 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64  s, but the.** Id
1f840 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  xLE opcode will 
1f850 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65  be used on subse
1f860 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61  quent loop itera
1f870 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
1f880 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
1f890 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
1f8a0 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
1f8b0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
1f8c0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
1f8d0 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
1f8e0 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
1f8f0 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
1f900 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
1f910 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
1f920 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20  not Prev..**.** 
1f930 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1f940 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c   NotFound, SeekL
1f950 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c  t, SeekGt, SeekL
1f960 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  e.*/./* Opcode: 
1f970 53 65 65 6b 47 54 20 50 31 20 50 32 20 50 33 20  SeekGT P1 P2 P3 
1f980 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
1f990 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
1f9a0 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1f9b0 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1f9c0 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1f9d0 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1f9e0 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1f9f0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1fa00 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1fa10 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1fa20 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1fa30 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1fa40 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1fa50 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1fa60 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1fa70 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1fa80 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1fa90 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1faa0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1fab0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1fac0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1fad0 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1fae0 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1faf0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
1fb00 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1fb10 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1fb20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1fb30 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1fb40 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1fb50 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1fb60 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1fb70 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
1fb80 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
1fb90 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20  move in forward 
1fba0 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
1fbb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77  he beginning tow
1fbc0 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e  ard the end.  In
1fbd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1fbe0 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
1fbf0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
1fc00 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e   Next, not Prev.
1fc10 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1fc20 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1fc30 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 65  , SeekLt, SeekGe
1fc40 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1fc50 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20 50 31  pcode: SeekLT P1
1fc60 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a 2a 20   P2 P3 P4 * .** 
1fc70 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1fc80 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1fc90 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1fca0 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1fcb0 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1fcc0 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1fcd0 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1fce0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1fcf0 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1fd00 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1fd10 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1fd20 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1fd30 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1fd40 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1fd50 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1fd60 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1fd70 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1fd80 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1fd90 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1fda0 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1fdb0 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  s to the largest
1fdc0 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1fdd0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1fde0 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1fdf0 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1fe00 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  rds less than .*
1fe10 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  * the key and P2
1fe20 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1fe30 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1fe40 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
1fe50 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1fe60 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  or configured to
1fe70 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65   move in reverse
1fe80 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20   order,.** from 
1fe90 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74  the end toward t
1fea0 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49  he beginning.  I
1feb0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1fec0 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  he cursor is.** 
1fed0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1fee0 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74  e Prev, not Next
1fef0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1ff00 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1ff10 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47  d, SeekGt, SeekG
1ff20 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20  e, SeekLe.*/./* 
1ff30 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45 20 50  Opcode: SeekLE P
1ff40 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
1ff50 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1ff60 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1ff70 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ff80 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1ff90 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1ffa0 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1ffb0 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1ffc0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1ffd0 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1ffe0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1fff0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
20000 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
20010 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
20020 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
20030 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
20040 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
20050 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
20060 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
20070 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
20080 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
20090 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20   to the largest 
200a0 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69  entry that .** i
200b0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
200c0 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
200d0 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
200e0 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a  are no records .
200f0 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  ** less than or 
20100 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
20110 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
20120 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
20130 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  o P2..**.** This
20140 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
20150 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67  he cursor config
20160 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20  ured to move in 
20170 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a  reverse order,.*
20180 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74  * from the end t
20190 6f 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e  oward the beginn
201a0 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ing.  In other w
201b0 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
201c0 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65   is.** configure
201d0 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e  d to use Prev, n
201e0 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49  ot Next..**.** I
201f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  f the cursor P1 
20200 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
20210 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b   the OPFLAG_SEEK
20220 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68  EQ flag, then th
20230 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c  is.** opcode wil
20240 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e  l always land on
20250 20 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65   a record that e
20260 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68  qually equals th
20270 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73  e key, or.** els
20280 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  e jump immediate
20290 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20  ly to P2.  When 
202a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50  the cursor is OP
202b0 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69  FLAG_SEEKEQ, thi
202c0 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74  s.** opcode must
202d0 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   be followed by 
202e0 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  an IdxGE opcode 
202f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72  with the same ar
20300 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  guments..** The 
20310 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxGE opcode wil
20320 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20  l be skipped if 
20330 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63  this opcode succ
20340 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a  eeds, but the.**
20350 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69   IdxGE opcode wi
20360 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75  ll be used on su
20370 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74  bsequent loop it
20380 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
20390 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
203a0 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47   NotFound, SeekG
203b0 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
203c0 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
203d0 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLT:         /* 
203e0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
203f0 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20 20 20  e OP_SeekLE:    
20400 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
20410 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
20420 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGE:         /* 
20430 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
20440 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b 20 20  e OP_SeekGT: {  
20450 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
20460 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  3 */.  int res; 
20470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
20480 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 2a  parison result *
20490 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20 20 20  /.  int oc;     
204a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
204b0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
204c0 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20   *pC;    /* The 
204d0 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b 20 2a  cursor to seek *
204e0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
204f0 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b 65  rd r;  /* The ke
20500 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a 2f  y to seek for */
20510 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
20520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20530 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66 69  of columns or fi
20540 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65 79 20  elds in the key 
20550 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20  */.  i64 iKey;  
20560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
20570 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f 20 73  owid we are to s
20580 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
20590 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 2f  eqOnly;        /
205a0 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74 65  * Only intereste
205b0 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73 20  d in == results 
205c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
205d0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
205e0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
205f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
20600 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d  >p2!=0 );.  pC =
20610 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
20620 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
20630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20640 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
20650 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
20660 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
20670 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54  kLE == OP_SeekLT
20680 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
20690 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50 5f  OP_SeekGE == OP_
206a0 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61 73  SeekLT+2 );.  as
206b0 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 20  sert( OP_SeekGT 
206c0 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20 29  == OP_SeekLT+3 )
206d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
206e0 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61  isOrdered );.  a
206f0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
20700 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f 63  ursor!=0 );.  oc
20710 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
20720 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20    eqOnly = 0;.  
20730 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
20740 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20750 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f  EBUG.  pC->seekO
20760 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
20770 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
20780 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20  C->isTable ){.  
20790 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45 5f 53    /* The BTREE_S
207a0 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73 20 6f  EEK_EQ flag is o
207b0 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64 65 78  nly set on index
207c0 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20 20   cursors */.    
207d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
207e0 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e  treeCursorHasHin
207f0 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
20800 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29  , BTREE_SEEK_EQ)
20810 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
20820 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
20830 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69  );..    /* The i
20840 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20 50 33  nput value in P3
20850 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61 6e 79   might be of any
20860 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72 2c 20   type: integer, 
20870 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20  real, string,.  
20880 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55    ** blob, or NU
20890 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64  LL.  But it need
208a0 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  s to be an integ
208b0 65 72 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e  er before we can
208c0 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   do.    ** the s
208d0 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72 74 20  eek, so convert 
208e0 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 33 20  it. */.    pIn3 
208f0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
20900 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d  ;.    if( (pIn3-
20910 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
20920 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53  t|MEM_Real|MEM_S
20930 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b  tr))==MEM_Str ){
20940 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65  .      applyNume
20950 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33  ricAffinity(pIn3
20960 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
20970 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  iKey = sqlite3Vd
20980 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33 29  beIntValue(pIn3)
20990 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
209a0 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c 64 20   P3 value could 
209b0 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64  not be converted
209c0 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
209d0 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
209e0 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
209f0 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69 61  ion, then specia
20a00 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  l processing is 
20a10 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20  required... */. 
20a20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
20a30 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
20a40 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
20a50 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
20a60 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
20a70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
20a80 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20  P3 value cannot 
20a90 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
20aa0 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20  o any kind of a 
20ab0 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20  number,.        
20ac0 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b  ** then the seek
20ad0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
20ae0 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20  , so jump to P2 
20af0 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 42  */.        VdbeB
20b00 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
20b10 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
20b20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20b30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20b40 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72 6f 78  /* If the approx
20b50 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69 73 20  imation iKey is 
20b60 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
20b70 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72  actual real sear
20b80 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d  ch.      ** term
20b90 2c 20 73 75 62 73 74 69 74 75 74 65 20 3e 3d 20  , substitute >= 
20ba0 66 6f 72 20 3e 20 61 6e 64 20 3c 20 66 6f 72 20  for > and < for 
20bb0 3c 3d 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20  <=. e.g. if the 
20bc0 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20 20 20  search term.    
20bd0 20 20 2a 2a 20 69 73 20 34 2e 39 20 61 6e 64 20    ** is 4.9 and 
20be0 74 68 65 20 69 6e 74 65 67 65 72 20 61 70 70 72  the integer appr
20bf0 6f 78 69 6d 61 74 69 6f 6e 20 35 3a 0a 20 20 20  oximation 5:.   
20c00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
20c10 20 20 20 20 20 20 28 78 20 3e 20 20 34 2e 39 29        (x >  4.9)
20c20 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3e 3d      ->     (x >=
20c30 20 35 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   5).      **    
20c40 20 20 20 20 28 78 20 3c 3d 20 34 2e 39 29 20 20      (x <= 4.9)  
20c50 20 20 2d 3e 20 20 20 20 20 28 78 20 3c 20 20 35    ->     (x <  5
20c60 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ).      */.     
20c70 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3c 28   if( pIn3->u.r<(
20c80 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20  double)iKey ){. 
20c90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f         assert( O
20ca0 50 5f 53 65 65 6b 47 45 3d 3d 28 4f 50 5f 53 65  P_SeekGE==(OP_Se
20cb0 65 6b 47 54 2d 31 29 20 29 3b 0a 20 20 20 20 20  ekGT-1) );.     
20cc0 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
20cd0 65 6b 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45  ekLT==(OP_SeekLE
20ce0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  -1) );.        a
20cf0 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c  ssert( (OP_SeekL
20d00 45 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50  E & 0x0001)==(OP
20d10 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30 30 31  _SeekGT & 0x0001
20d20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
20d30 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d   (oc & 0x0001)==
20d40 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30  (OP_SeekGT & 0x0
20d50 30 30 31 29 20 29 20 6f 63 2d 2d 3b 0a 20 20 20  001) ) oc--;.   
20d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
20d70 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  f the approximat
20d80 69 6f 6e 20 69 4b 65 79 20 69 73 20 73 6d 61 6c  ion iKey is smal
20d90 6c 65 72 20 74 68 61 6e 20 74 68 65 20 61 63 74  ler than the act
20da0 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a  ual real search.
20db0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73        ** term, s
20dc0 75 62 73 74 69 74 75 74 65 20 3c 3d 20 66 6f 72  ubstitute <= for
20dd0 20 3c 20 61 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e   < and > for >=.
20de0 20 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 20    */.      else 
20df0 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3e 28 64  if( pIn3->u.r>(d
20e00 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20  ouble)iKey ){.  
20e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50        assert( OP
20e20 5f 53 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65  _SeekLE==(OP_See
20e30 6b 4c 54 2b 31 29 20 29 3b 0a 20 20 20 20 20 20  kLT+1) );.      
20e40 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
20e50 6b 47 54 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 2b  kGT==(OP_SeekGE+
20e60 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
20e70 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c 54  sert( (OP_SeekLT
20e80 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f   & 0x0001)==(OP_
20e90 53 65 65 6b 47 45 20 26 20 30 78 30 30 30 31 29  SeekGE & 0x0001)
20ea0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
20eb0 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d 28  (oc & 0x0001)==(
20ec0 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30  OP_SeekLT & 0x00
20ed0 30 31 29 20 29 20 6f 63 2b 2b 3b 0a 20 20 20 20  01) ) oc++;.    
20ee0 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 72    }.    } .    r
20ef0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20f00 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
20f10 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  C->uc.pCursor, 0
20f20 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30 2c 20  , (u64)iKey, 0, 
20f30 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6d  &res);.    pC->m
20f40 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b  ovetoTarget = iK
20f50 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20  ey;  /* Used by 
20f60 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  OP_Delete */.   
20f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
20f90 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
20fa0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ror;.    }.  }el
20fb0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
20fc0 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 65   cursor with the
20fd0 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 68   BTREE_SEEK_EQ h
20fe0 69 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 20 4f 50  int, only the OP
20ff0 5f 53 65 65 6b 47 45 20 61 6e 64 0a 20 20 20 20  _SeekGE and.    
21000 2a 2a 20 4f 50 5f 53 65 65 6b 4c 45 20 6f 70 63  ** OP_SeekLE opc
21010 6f 64 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  odes are allowed
21020 2c 20 61 6e 64 20 74 68 65 73 65 20 6d 75 73 74  , and these must
21030 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   be immediately 
21040 66 6f 6c 6c 6f 77 65 64 0a 20 20 20 20 2a 2a 20  followed.    ** 
21050 62 79 20 61 6e 20 4f 50 5f 49 64 78 47 54 20 6f  by an OP_IdxGT o
21060 72 20 4f 50 5f 49 64 78 4c 54 20 6f 70 63 6f 64  r OP_IdxLT opcod
21070 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  e, respectively,
21080 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
21090 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ey..    */.    i
210a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
210b0 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d  ursorHasHint(pC-
210c0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52  >uc.pCursor, BTR
210d0 45 45 5f 53 45 45 4b 5f 45 51 29 20 29 7b 0a 20  EE_SEEK_EQ) ){. 
210e0 20 20 20 20 20 65 71 4f 6e 6c 79 20 3d 20 31 3b       eqOnly = 1;
210f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21100 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
21110 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  eekGE || pOp->op
21120 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  code==OP_SeekLE 
21130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21140 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
21150 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b  OP_IdxLT || pOp[
21160 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
21170 78 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xGT );.      ass
21180 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d  ert( pOp[1].p1==
21190 70 4f 70 5b 30 5d 2e 70 31 20 29 3b 0a 20 20 20  pOp[0].p1 );.   
211a0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31     assert( pOp[1
211b0 5d 2e 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20  ].p2==pOp[0].p2 
211c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
211d0 20 70 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f 70 5b   pOp[1].p3==pOp[
211e0 30 5d 2e 70 33 20 29 3b 0a 20 20 20 20 20 20 61  0].p3 );.      a
211f0 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 34  ssert( pOp[1].p4
21200 2e 69 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e 69 20  .i==pOp[0].p4.i 
21210 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  );.    }..    nF
21220 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
21230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
21240 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
21250 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T32 );.    asser
21260 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  t( nField>0 );. 
21270 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20     r.pKeyInfo = 
21280 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  pC->pKeyInfo;.  
21290 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31    r.nField = (u1
212a0 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20 2f  6)nField;..    /
212b0 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e 65 20  * The next line 
212c0 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74 65 73  of code computes
212d0 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c   as follows, onl
212e0 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20 2a 2a  y faster:.    **
212f0 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65     if( oc==OP_Se
21300 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekGT || oc==OP_S
21310 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a 2a 20  eekLE ){.    ** 
21320 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63      r.default_rc
21330 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20 20 20   = -1;.    **   
21340 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
21350 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
21360 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 0a   +1;.    **   }.
21370 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64 65 66      */.    r.def
21380 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20 26 20  ault_rc = ((1 & 
21390 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 54 29  (oc - OP_SeekLT)
213a0 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a 20 20  ) ? -1 : +1);.  
213b0 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
213c0 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64 65 66  _SeekGT || r.def
213d0 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20  ault_rc==-1 );. 
213e0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
213f0 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e 64 65  P_SeekLE || r.de
21400 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a  fault_rc==-1 );.
21410 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
21420 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72 2e 64  OP_SeekGE || r.d
21430 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b  efault_rc==+1 );
21440 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21  .    assert( oc!
21450 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 72 2e  =OP_SeekLT || r.
21460 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29  default_rc==+1 )
21470 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20  ;..    r.aMem = 
21480 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
21490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
214a0 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b  BUG.    { int i;
214b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46   for(i=0; i<r.nF
214c0 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72  ield; i++) asser
214d0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
214e0 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23  .aMem[i]) ); }.#
214f0 65 6e 64 69 66 0a 20 20 20 20 72 2e 65 71 53 65  endif.    r.eqSe
21500 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  en = 0;.    rc =
21510 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
21520 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
21530 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20  uc.pCursor, &r, 
21540 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
21550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
21570 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
21580 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
21590 66 28 20 65 71 4f 6e 6c 79 20 26 26 20 72 2e 65  f( eqOnly && r.e
215a0 71 53 65 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  qSeen==0 ){.    
215b0 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
215c0 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   );.      goto s
215d0 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20  eek_not_found;. 
215e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 2d 3e 64     }.  }.  pC->d
215f0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
21600 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
21610 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
21620 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LE;.#ifdef SQLIT
21630 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
21640 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
21650 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 63  .#endif.  if( oc
21660 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b 20 20  >=OP_SeekGE ){  
21670 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
21680 65 65 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekGE || oc==OP_
21690 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 69 66  SeekGT );.    if
216a0 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d  ( res<0 || (res=
216b0 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65  =0 && oc==OP_See
216c0 6b 47 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65  kGT) ){.      re
216d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
216e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
216f0 78 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  xt(pC->uc.pCurso
21700 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
21710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21720 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
21730 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
21740 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
21760 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20       res = 1;.  
21770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21780 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
21790 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
217a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
217b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
217c0 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
217d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
217e0 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
217f0 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekLT || oc==OP_S
21800 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  eekLE );.    if(
21810 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d   res>0 || (res==
21820 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
21830 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LT) ){.      res
21840 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
21850 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
21860 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70 43 75  vious(pC->uc.pCu
21870 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rsor, 0);.      
21880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
218a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
218b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
218c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
218d0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b          res = 1;
218e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
218f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
21900 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
21910 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
21920 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21930 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67        /* res mig
21940 68 74 20 62 65 20 6e 65 67 61 74 69 76 65 20 62  ht be negative b
21950 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
21960 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63   is empty.  Chec
21970 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
21980 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
21990 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   case..      */.
219a0 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
219b0 74 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e  te3BtreeEof(pC->
219c0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
219d0 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f   }.  }.seek_not_
219e0 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72 74 28  found:.  assert(
219f0 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
21a00 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
21a10 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
21a20 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f   res ){.    goto
21a30 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
21a40 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c 79 20  else if( eqOnly 
21a50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
21a60 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  Op[1].opcode==OP
21a70 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d  _IdxLT || pOp[1]
21a80 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  .opcode==OP_IdxG
21a90 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b 20  T );.    pOp++; 
21aa0 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50 5f 49  /* Skip the OP_I
21ab0 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78 47 54  dxLt or OP_IdxGT
21ac0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f   that follows */
21ad0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
21ae0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
21af0 48 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Hit P1 P2 * * *.
21b00 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 73 65 65  ** Synopsis: see
21b10 6b 48 69 74 3d 50 32 0a 2a 2a 0a 2a 2a 20 53 65  kHit=P2.**.** Se
21b20 74 20 74 68 65 20 73 65 65 6b 48 69 74 20 66 6c  t the seekHit fl
21b30 61 67 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 20  ag on cursor P1 
21b40 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
21b50 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 65 6b 48  P2..** The seekH
21b60 69 74 20 66 6c 61 67 20 69 73 20 75 73 65 64 20  it flag is used 
21b70 62 79 20 74 68 65 20 49 66 4e 6f 48 6f 70 65 20  by the IfNoHope 
21b80 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 50 31  opcode..**.** P1
21b90 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64   must be a valid
21ba0 20 62 2d 74 72 65 65 20 63 75 72 73 6f 72 2e 20   b-tree cursor. 
21bb0 20 50 32 20 6d 75 73 74 20 62 65 20 61 20 62 6f   P2 must be a bo
21bc0 6f 6c 65 61 6e 20 76 61 6c 75 65 2c 0a 2a 2a 20  olean value,.** 
21bd0 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a  either 0 or 1..*
21be0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 48 69  /.case OP_SeekHi
21bf0 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  t: {.  VdbeCurso
21c00 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28  r *pC;.  assert(
21c10 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
21c20 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
21c30 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
21c40 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
21c50 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
21c70 3e 70 32 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  >p2==0 || pOp->p
21c80 32 3d 3d 31 20 29 3b 0a 20 20 70 43 2d 3e 73 65  2==1 );.  pC->se
21c90 65 6b 48 69 74 20 3d 20 70 4f 70 2d 3e 70 32 20  ekHit = pOp->p2 
21ca0 26 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  & 1;.  break;.}.
21cb0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e  ./* Opcode: Foun
21cc0 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
21cd0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
21ce0 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
21cf0 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65  If P4==0 then re
21d00 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20  gister P3 holds 
21d10 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74  a blob construct
21d20 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64  ed by MakeRecord
21d30 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68  .  If.** P4>0 th
21d40 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  en register P3 i
21d50 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50  s the first of P
21d60 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74  4 registers that
21d70 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65   form an unpacke
21d80 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  d.** record..**.
21d90 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
21da0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  on an index btre
21db0 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72  e.  If the recor
21dc0 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  d identified by 
21dd0 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20  P3 and P4.** is 
21de0 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20  a prefix of any 
21df0 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e  entry in P1 then
21e00 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
21e10 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20  to P2 and.** P1 
21e20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
21e30 20 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67   at the matching
21e40 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
21e50 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61  is operation lea
21e60 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69  ves the cursor i
21e70 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20  n a state where 
21e80 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61 64 76  it can be.** adv
21e90 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66 6f 72  anced in the for
21ea0 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e 2e 20  ward direction. 
21eb0 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74 72 75   The Next instru
21ec0 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c  ction will work,
21ed0 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68 65 20  .** but not the 
21ee0 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e  Prev instruction
21ef0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
21f00 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f  : NotFound, NoCo
21f10 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69 73 74  nflict, NotExist
21f20 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20  s. SeekGe.*/./* 
21f30 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64  Opcode: NotFound
21f40 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
21f50 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
21f60 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
21f70 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67  f P4==0 then reg
21f80 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61  ister P3 holds a
21f90 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65   blob constructe
21fa0 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e  d by MakeRecord.
21fb0 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65    If.** P4>0 the
21fc0 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
21fd0 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34   the first of P4
21fe0 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20   registers that 
21ff0 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
22000 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a  .** record..** .
22010 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
22020 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  on an index btre
22030 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72  e.  If the recor
22040 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  d identified by 
22050 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20  P3 and P4.** is 
22060 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20 6f  not the prefix o
22070 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50  f any entry in P
22080 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73  1 then a jump is
22090 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66   made to P2.  If
220a0 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e   P1 .** does con
220b0 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68  tain an entry wh
220c0 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63 68  ose prefix match
220d0 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65 63  es the P3/P4 rec
220e0 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c  ord then control
220f0 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  .** falls throug
22100 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
22110 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31  struction and P1
22120 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
22130 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63  g at the.** matc
22140 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  hing entry..**.*
22150 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
22160 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
22170 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68  or in a state wh
22180 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  ere it cannot be
22190 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69 6e 20  .** advanced in 
221a0 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e  either direction
221b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
221c0 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20  s, the Next and 
221d0 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65 73 20  Prev.** opcodes 
221e0 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66 74 65  do not work afte
221f0 72 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  r this operation
22200 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
22210 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73  : Found, NotExis
22220 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  ts, NoConflict, 
22230 49 66 4e 6f 48 6f 70 65 0a 2a 2f 0a 2f 2a 20 4f  IfNoHope.*/./* O
22240 70 63 6f 64 65 3a 20 49 66 4e 6f 48 6f 70 65 20  pcode: IfNoHope 
22250 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
22260 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
22270 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 52 65  [P3@P4].**.** Re
22280 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
22290 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
222a0 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
222b0 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
222c0 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75  record..**.** Cu
222d0 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
222e0 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
222f0 66 20 74 68 65 20 73 65 65 6b 48 69 74 20 66 6c  f the seekHit fl
22300 61 67 20 69 73 20 73 65 74 20 6f 6e 20 50 31 2c  ag is set on P1,
22310 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 6f 70   then.** this op
22320 63 6f 64 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  code is a no-op.
22330 20 20 42 75 74 20 69 66 20 74 68 65 20 73 65 65    But if the see
22340 6b 48 69 74 20 66 6c 61 67 20 6f 66 20 50 31 20  kHit flag of P1 
22350 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 0a 2a  is clear, then.*
22360 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * check to see i
22370 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 65  f there is any e
22380 6e 74 72 79 20 69 6e 20 50 31 20 74 68 61 74 20  ntry in P1 that 
22390 6d 61 74 63 68 65 73 20 74 68 65 0a 2a 2a 20 70  matches the.** p
223a0 72 65 66 69 78 20 69 64 65 6e 74 69 66 69 65 64  refix identified
223b0 20 62 79 20 50 33 20 61 6e 64 20 50 34 2e 20 20   by P3 and P4.  
223c0 49 66 20 6e 6f 20 65 6e 74 72 79 20 6d 61 74 63  If no entry matc
223d0 68 65 73 20 74 68 65 20 70 72 65 66 69 78 2c 0a  hes the prefix,.
223e0 2a 2a 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  ** jump to P2.  
223f0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
22400 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  hrough..**.** Th
22410 69 73 20 6f 70 63 6f 64 65 20 62 65 68 61 76 65  is opcode behave
22420 73 20 6c 69 6b 65 20 4f 50 5f 4e 6f 74 46 6f 75  s like OP_NotFou
22430 6e 64 20 69 66 20 74 68 65 20 73 65 65 6b 48 69  nd if the seekHi
22440 74 0a 2a 2a 20 66 6c 61 67 20 69 73 20 63 6c 65  t.** flag is cle
22450 61 72 20 61 6e 64 20 69 74 20 62 65 68 61 76 65  ar and it behave
22460 73 20 6c 69 6b 65 20 4f 50 5f 4e 6f 6f 70 20 69  s like OP_Noop i
22470 66 20 74 68 65 20 73 65 65 6b 48 69 74 20 66 6c  f the seekHit fl
22480 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ag is set..**.**
22490 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
224a0 75 73 65 64 20 69 6e 20 49 4e 20 63 6c 61 75 73  used in IN claus
224b0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
224c0 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20   a multi-column 
224d0 6b 65 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4e  key..** If an IN
224e0 20 63 6c 61 75 73 65 20 69 73 20 61 74 74 61 63   clause is attac
224f0 68 65 64 20 74 6f 20 61 6e 20 65 6c 65 6d 65 6e  hed to an elemen
22500 74 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 74 68  t of the key oth
22510 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 6c  er than the.** l
22520 65 66 74 2d 6d 6f 73 74 20 65 6c 65 6d 65 6e 74  eft-most element
22530 2c 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 61  , and if there a
22540 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 20 6f 6e  re no matches on
22550 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
22560 0a 2a 2a 20 73 65 65 6b 20 6f 76 65 72 20 74 68  .** seek over th
22570 65 20 77 68 6f 6c 65 20 6b 65 79 2c 20 74 68 65  e whole key, the
22580 6e 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  n it might be th
22590 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
225a0 79 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 74 6f 20  y element.** to 
225b0 74 68 65 20 6c 65 66 74 20 69 73 20 70 72 6f 68  the left is proh
225c0 69 62 69 74 69 6e 67 20 61 20 6d 61 74 63 68 2c  ibiting a match,
225d0 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 72 65   and hence there
225e0 20 69 73 20 22 6e 6f 20 68 6f 70 65 22 20 6f 66   is "no hope" of
225f0 0a 2a 2a 20 61 6e 79 20 6d 61 74 63 68 20 72 65  .** any match re
22600 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f 77 20  gardless of how 
22610 6d 61 6e 79 20 49 4e 20 63 6c 61 75 73 65 20 65  many IN clause e
22620 6c 65 6d 65 6e 74 73 20 61 72 65 20 63 68 65 63  lements are chec
22630 6b 65 64 2e 0a 2a 2a 20 49 6e 20 73 75 63 68 20  ked..** In such 
22640 61 20 63 61 73 65 2c 20 77 65 20 61 62 61 6e 64  a case, we aband
22650 6f 6e 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  on the IN clause
22660 20 73 65 61 72 63 68 20 65 61 72 6c 79 2c 20 75   search early, u
22670 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 6f 70 63  sing this.** opc
22680 6f 64 65 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  ode.  The opcode
22690 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d   name comes from
226a0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
226b0 68 65 0a 2a 2a 20 6a 75 6d 70 20 69 73 20 74 61  he.** jump is ta
226c0 6b 65 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ken if there is 
226d0 22 6e 6f 20 68 6f 70 65 22 20 6f 66 20 61 63 68  "no hope" of ach
226e0 69 65 76 69 6e 67 20 61 20 6d 61 74 63 68 2e 0a  ieving a match..
226f0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
22700 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 48 69  NotFound, SeekHi
22710 74 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  t.*/./* Opcode: 
22720 4e 6f 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32  NoConflict P1 P2
22730 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
22740 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
22750 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d  4].**.** If P4==
22760 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
22770 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20  P3 holds a blob 
22780 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d  constructed by M
22790 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a  akeRecord.  If.*
227a0 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69  * P4>0 then regi
227b0 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66  ster P3 is the f
227c0 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73  irst of P4 regis
227d0 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61  ters that form a
227e0 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65  n unpacked.** re
227f0 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72  cord..** .** Cur
22800 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
22810 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
22820 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
22830 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
22840 20 50 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   P4.** contains 
22850 61 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  any NULL value, 
22860 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
22870 20 74 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20   to P2.  If all 
22880 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
22890 72 65 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e  record are not-N
228a0 55 4c 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  ULL then a check
228b0 20 69 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65   is done to dete
228c0 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77  rmine if any row
228d0 20 69 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e   in the.** P1 in
228e0 64 65 78 20 62 74 72 65 65 20 68 61 73 20 61 20  dex btree has a 
228f0 6d 61 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65  matching key pre
22900 66 69 78 2e 20 20 49 66 20 74 68 65 72 65 20 61  fix.  If there a
22910 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a  re no matches, j
22920 75 6d 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ump.** immediate
22930 6c 79 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68  ly to P2.  If th
22940 65 72 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20  ere is a match, 
22950 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64  fall through and
22960 20 6c 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a   leave the P1.**
22970 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
22980 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67   to the matching
22990 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
229a0 20 6f 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c   opcode is simil
229b0 61 72 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e  ar to OP_NotFoun
229c0 64 20 77 69 74 68 20 74 68 65 20 65 78 63 65 70  d with the excep
229d0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a  tions that the.*
229e0 2a 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61  * branch is alwa
229f0 79 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20  ys taken if any 
22a00 70 61 72 74 20 6f 66 20 74 68 65 20 73 65 61 72  part of the sear
22a10 63 68 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20  ch key input is 
22a20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
22a30 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65   operation leave
22a40 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
22a50 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
22a60 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64   cannot be.** ad
22a70 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72  vanced in either
22a80 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
22a90 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
22aa0 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a   Next and Prev.*
22ab0 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74  * opcodes do not
22ac0 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73   work after this
22ad0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
22ae0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46  * See also: NotF
22af0 6f 75 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74  ound, Found, Not
22b00 45 78 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f  Exists.*/.case O
22b10 50 5f 49 66 4e 6f 48 6f 70 65 3a 20 7b 20 20 20  P_IfNoHope: {   
22b20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
22b30 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
22b40 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  pC;.  assert( pO
22b50 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
22b60 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
22b70 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
22b80 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
22b90 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
22ba0 20 69 66 28 20 70 43 2d 3e 73 65 65 6b 48 69 74   if( pC->seekHit
22bb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46   ) break;.  /* F
22bc0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
22bd0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 2a 2f 0a   OP_NotFound */.
22be0 7d 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f 6e 66  }.case OP_NoConf
22bf0 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a 75 6d  lict:     /* jum
22c00 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
22c10 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20  P_NotFound:     
22c20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
22c30 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a  /.case OP_Found:
22c40 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
22c50 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
22c60 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20  alreadyExists;. 
22c70 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b 0a 20   int takeJump;. 
22c80 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62 65 43   int ii;.  VdbeC
22c90 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74  ursor *pC;.  int
22ca0 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64   res;.  Unpacked
22cb0 52 65 63 6f 72 64 20 2a 70 46 72 65 65 3b 0a 20  Record *pFree;. 
22cc0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22cd0 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61  *pIdxKey;.  Unpa
22ce0 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 23  ckedRecord r;..#
22cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22d00 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  T.  if( pOp->opc
22d10 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  ode!=OP_NoConfli
22d20 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66 6f 75  ct ) sqlite3_fou
22d30 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nd_count++;.#end
22d40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  if..  assert( pO
22d50 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
22d60 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
22d70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
22d80 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
22d90 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  2 );.  pC = p->a
22da0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
22db0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
22dc0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22dd0 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b  DEBUG.  pC->seek
22de0 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  Op = pOp->opcode
22df0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 33 20  ;.#endif.  pIn3 
22e00 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
22e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
22e20 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
22e30 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
22e40 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
22e50 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
22e60 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
22e70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
22e80 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20 72  >p4.i>0 ){.    r
22e90 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
22ea0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
22eb0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
22ec0 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 2e 61  p->p4.i;.    r.a
22ed0 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66 64  Mem = pIn3;.#ifd
22ee0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22ef0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
22f00 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  <r.nField; ii++)
22f10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22f20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
22f30 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20 20 20 20  em[ii]) );.     
22f40 20 61 73 73 65 72 74 28 20 28 72 2e 61 4d 65 6d   assert( (r.aMem
22f50 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  [ii].flags & MEM
22f60 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 72 2e 61  _Zero)==0 || r.a
22f70 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20 29 3b 0a  Mem[ii].n==0 );.
22f80 20 20 20 20 20 20 69 66 28 20 69 69 20 29 20 52        if( ii ) R
22f90 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
22fa0 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e 61 4d 65  p->p3+ii, &r.aMe
22fb0 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  m[ii]);.    }.#e
22fc0 6e 64 69 66 0a 20 20 20 20 70 49 64 78 4b 65 79  ndif.    pIdxKey
22fd0 20 3d 20 26 72 3b 0a 20 20 20 20 70 46 72 65 65   = &r;.    pFree
22fe0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22ff0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d     assert( pIn3-
23000 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
23010 62 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78  b );.    rc = Ex
23020 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a  pandBlob(pIn3);.
23030 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
23040 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
23050 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
23060 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
23070 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70  to no_mem;.    p
23080 46 72 65 65 20 3d 20 70 49 64 78 4b 65 79 20 3d  Free = pIdxKey =
23090 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
230a0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
230b0 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  pC->pKeyInfo);. 
230c0 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
230d0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
230e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
230f0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d  RecordUnpack(pC-
23100 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d  >pKeyInfo, pIn3-
23110 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64  >n, pIn3->z, pId
23120 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xKey);.  }.  pId
23130 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
23140 20 3d 20 30 3b 0a 20 20 74 61 6b 65 4a 75 6d 70   = 0;.  takeJump
23150 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d   = 0;.  if( pOp-
23160 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 43 6f  >opcode==OP_NoCo
23170 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 2f 2a  nflict ){.    /*
23180 20 46 6f 72 20 74 68 65 20 4f 50 5f 4e 6f 43 6f   For the OP_NoCo
23190 6e 66 6c 69 63 74 20 6f 70 63 6f 64 65 2c 20 74  nflict opcode, t
231a0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
231b0 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  any of the.    *
231c0 2a 20 69 6e 70 75 74 20 66 69 65 6c 64 73 20 61  * input fields a
231d0 72 65 20 4e 55 4c 4c 2c 20 73 69 6e 63 65 20 61  re NULL, since a
231e0 6e 79 20 6b 65 79 20 77 69 74 68 20 61 20 4e 55  ny key with a NU
231f0 4c 4c 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  LL will not.    
23200 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ** conflict */. 
23210 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
23220 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3b  pIdxKey->nField;
23230 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
23240 28 20 70 49 64 78 4b 65 79 2d 3e 61 4d 65 6d 5b  ( pIdxKey->aMem[
23250 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ii].flags & MEM_
23260 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
23270 74 61 6b 65 4a 75 6d 70 20 3d 20 31 3b 0a 20 20  takeJump = 1;.  
23280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23290 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
232a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
232b0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
232c0 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
232d0 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20   pIdxKey, 0, 0, 
232e0 26 72 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  &res);.  if( pFr
232f0 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
23300 65 65 4e 4e 28 64 62 2c 20 70 46 72 65 65 29 3b  eeNN(db, pFree);
23310 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
23330 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
23340 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 73  ror;.  }.  pC->s
23350 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b  eekResult = res;
23360 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  .  alreadyExists
23370 20 3d 20 28 72 65 73 3d 3d 30 29 3b 0a 20 20 70   = (res==0);.  p
23380 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 2d 61  C->nullRow = 1-a
23390 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20 20  lreadyExists;.  
233a0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
233b0 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  to = 0;.  pC->ca
233c0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
233d0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70  E_STALE;.  if( p
233e0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  Op->opcode==OP_F
233f0 6f 75 6e 64 20 29 7b 0a 20 20 20 20 56 64 62 65  ound ){.    Vdbe
23400 42 72 61 6e 63 68 54 61 6b 65 6e 28 61 6c 72 65  BranchTaken(alre
23410 61 64 79 45 78 69 73 74 73 21 3d 30 2c 32 29 3b  adyExists!=0,2);
23420 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61 64 79  .    if( already
23430 45 78 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75  Exists ) goto ju
23440 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73  mp_to_p2;.  }els
23450 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  e{.    VdbeBranc
23460 68 54 61 6b 65 6e 28 74 61 6b 65 4a 75 6d 70 7c  hTaken(takeJump|
23470 7c 61 6c 72 65 61 64 79 45 78 69 73 74 73 3d 3d  |alreadyExists==
23480 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 74 61  0,2);.    if( ta
23490 6b 65 4a 75 6d 70 20 7c 7c 20 21 61 6c 72 65 61  keJump || !alrea
234a0 64 79 45 78 69 73 74 73 20 29 20 67 6f 74 6f 20  dyExists ) goto 
234b0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
234c0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
234d0 70 63 6f 64 65 3a 20 53 65 65 6b 52 6f 77 69 64  pcode: SeekRowid
234e0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
234f0 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65   Synopsis: intke
23500 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31  y=r[P3].**.** P1
23510 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
23520 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f   a cursor open o
23530 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 62  n an SQL table b
23540 74 72 65 65 20 28 77 69 74 68 20 69 6e 74 65 67  tree (with integ
23550 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 49 66  er.** keys).  If
23560 20 72 65 67 69 73 74 65 72 20 50 33 20 64 6f 65   register P3 doe
23570 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
23580 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 50   integer or if P
23590 31 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f  1 does not.** co
235a0 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
235b0 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68 65  ith rowid P3 the
235c0 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
235d0 6c 79 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 4f  ly to P2.  .** O
235e0 72 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20 72  r, if P2 is 0, r
235f0 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 43  aise an SQLITE_C
23600 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49 66  ORRUPT error. If
23610 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e   P1 does contain
23620 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 77 69 74  .** a record wit
23630 68 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20  h rowid P3 then 
23640 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75  .** leave the cu
23650 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  rsor pointing at
23660 20 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64   that record and
23670 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
23680 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
23690 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
236a0 54 68 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  The OP_NotExists
236b0 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73   opcode performs
236c0 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74   the same operat
236d0 69 6f 6e 2c 20 62 75 74 20 77 69 74 68 20 4f 50  ion, but with OP
236e0 5f 4e 6f 74 45 78 69 73 74 73 0a 2a 2a 20 74 68  _NotExists.** th
236f0 65 20 50 33 20 72 65 67 69 73 74 65 72 20 6d 75  e P3 register mu
23700 73 74 20 62 65 20 67 75 61 72 61 6e 74 65 65 64  st be guaranteed
23710 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69   to contain an i
23720 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 20 57  nteger value.  W
23730 69 74 68 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f  ith this.** opco
23740 64 65 2c 20 72 65 67 69 73 74 65 72 20 50 33 20  de, register P3 
23750 6d 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69  might not contai
23760 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  n an integer..**
23770 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f  .** The OP_NotFo
23780 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  und opcode perfo
23790 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
237a0 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20  ration on index 
237b0 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20  btrees.** (with 
237c0 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d  arbitrary multi-
237d0 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a  value keys)..**.
237e0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
237f0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
23800 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
23810 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61  e it cannot be a
23820 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69  dvanced.** in ei
23830 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
23840 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
23850 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
23860 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a  ev opcodes will.
23870 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c  ** not work foll
23880 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  owing this opcod
23890 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
238a0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
238b0 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  nd, NoConflict, 
238c0 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 2f 2a 20  SeekRowid.*/./* 
238d0 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74  Opcode: NotExist
238e0 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  s P1 P2 P3 * *.*
238f0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
23900 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50  ey=r[P3].**.** P
23910 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  1 is the index o
23920 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20  f a cursor open 
23930 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  on an SQL table 
23940 62 74 72 65 65 20 28 77 69 74 68 20 69 6e 74 65  btree (with inte
23950 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 50  ger.** keys).  P
23960 33 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  3 is an integer 
23970 72 6f 77 69 64 2e 20 20 49 66 20 50 31 20 64 6f  rowid.  If P1 do
23980 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
23990 20 72 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20   record with.** 
239a0 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75  rowid P3 then ju
239b0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
239c0 6f 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 50 32  o P2.  Or, if P2
239d0 20 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e 0a   is 0, raise an.
239e0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
239f0 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64  T error. If P1 d
23a00 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  oes contain a re
23a10 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20  cord with rowid 
23a20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76  P3 then .** leav
23a30 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  e the cursor poi
23a40 6e 74 69 6e 67 20 61 74 20 74 68 61 74 20 72 65  nting at that re
23a50 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68  cord and fall th
23a60 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
23a70 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
23a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 53  ..**.** The OP_S
23a90 65 65 6b 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  eekRowid opcode 
23aa0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d  performs the sam
23ab0 65 20 6f 70 65 72 61 74 69 6f 6e 20 62 75 74 20  e operation but 
23ac0 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 74 68 65 0a  also allows the.
23ad0 2a 2a 20 50 33 20 72 65 67 69 73 74 65 72 20 74  ** P3 register t
23ae0 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6e 6f 6e 2d  o contain a non-
23af0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 69  integer value, i
23b00 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
23b10 20 6a 75 6d 70 20 69 73 0a 2a 2a 20 61 6c 77 61   jump is.** alwa
23b20 79 73 20 74 61 6b 65 6e 2e 20 20 54 68 69 73 20  ys taken.  This 
23b30 6f 70 63 6f 64 65 20 72 65 71 75 69 72 65 73 20  opcode requires 
23b40 74 68 61 74 20 50 33 20 61 6c 77 61 79 73 20 63  that P3 always c
23b50 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
23b60 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f  r..**.** The OP_
23b70 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65 20  NotFound opcode 
23b80 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d  performs the sam
23b90 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69  e operation on i
23ba0 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20 28  ndex btrees.** (
23bb0 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20 6d  with arbitrary m
23bc0 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73 29  ulti-value keys)
23bd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
23be0 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
23bf0 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65  ursor in a state
23c00 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74   where it cannot
23c10 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a 20   be advanced.** 
23c20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74  in either direct
23c30 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
23c40 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61  ords, the Next a
23c50 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73 20  nd Prev opcodes 
23c60 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
23c70 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
23c80 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  opcode..**.** Se
23c90 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
23ca0 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c  otFound, NoConfl
23cb0 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a 2a  ict, SeekRowid.*
23cc0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 52 6f  /.case OP_SeekRo
23cd0 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  wid: {        /*
23ce0 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20   jump, in3 */.  
23cf0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
23d00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
23d10 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  r;.  int res;.  
23d20 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e  u64 iKey;..  pIn
23d30 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
23d40 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d  3];.  if( (pIn3-
23d50 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
23d60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
23d70 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20  yAffinity(pIn3, 
23d80 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
23d90 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  IC, encoding);. 
23da0 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
23db0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
23dc0 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
23dd0 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61  _p2;.  }.  /* Fa
23de0 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
23df0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 2a 2f 0a  OP_NotExists */.
23e00 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74  case OP_NotExist
23e10 73 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  s:          /* j
23e20 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 70 49  ump, in3 */.  pI
23e30 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
23e40 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p3];.  assert( p
23e50 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
23e60 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  _Int );.  assert
23e70 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
23e80 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
23e90 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
23ea0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
23eb0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
23ec0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
23ed0 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
23ee0 6b 4f 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  kOp = 0;.#endif.
23ef0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
23f00 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
23f10 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
23f20 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
23f30 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
23f40 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
23f50 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29  sert( pCrsr!=0 )
23f60 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  ;.  res = 0;.  i
23f70 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b  Key = pIn3->u.i;
23f80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
23f90 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
23fa0 65 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65  ed(pCrsr, 0, iKe
23fb0 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 61  y, 0, &res);.  a
23fc0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
23fd0 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29  E_OK || res==0 )
23fe0 3b 0a 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  ;.  pC->movetoTa
23ff0 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a  rget = iKey;  /*
24000 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65   Used by OP_Dele
24010 74 65 20 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c  te */.  pC->null
24020 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63  Row = 0;.  pC->c
24030 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
24040 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e  HE_STALE;.  pC->
24050 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
24060 20 30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   0;.  VdbeBranch
24070 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
24080 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c  .  pC->seekResul
24090 74 20 3d 20 72 65 73 3b 0a 20 20 69 66 28 20 72  t = res;.  if( r
240a0 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  es!=0 ){.    ass
240b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
240c0 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  OK );.    if( pO
240d0 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p2==0 ){.    
240e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
240f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24100 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
24110 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
24120 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
24130 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
24140 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
24150 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
24160 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20 50  e: Sequence P1 P
24170 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
24180 73 69 73 3a 20 72 5b 50 32 5d 3d 63 75 72 73 6f  sis: r[P2]=curso
24190 72 5b 50 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a  r[P1].ctr++.**.*
241a0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
241b0 61 76 61 69 6c 61 62 6c 65 20 73 65 71 75 65 6e  available sequen
241c0 63 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  ce number for cu
241d0 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74  rsor P1..** Writ
241e0 65 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e  e the sequence n
241f0 75 6d 62 65 72 20 69 6e 74 6f 20 72 65 67 69 73  umber into regis
24200 74 65 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73  ter P2..** The s
24210 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f  equence number o
24220 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
24230 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 66 74 65  incremented afte
24240 72 20 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75  r this.** instru
24250 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65  ction.  .*/.case
24260 20 4f 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20   OP_Sequence: { 
24270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
24280 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  2 */.  assert( p
24290 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
242a0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
242b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
242c0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d  apCsr[pOp->p1]!=
242d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
242e0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
242f0 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
24300 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 4f  YPE_VTAB );.  pO
24310 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
24320 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
24330 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70  Out->u.i = p->ap
24340 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65  Csr[pOp->p1]->se
24350 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61  qCount++;.  brea
24360 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
24370 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32  : NewRowid P1 P2
24380 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
24390 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64  sis: r[P2]=rowid
243a0 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77  .**.** Get a new
243b0 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20   integer record 
243c0 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72  number (a.k.a "r
243d0 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20 74  owid") used as t
243e0 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c  he key to a tabl
243f0 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64  e..** The record
24400 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70   number is not p
24410 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61  reviously used a
24420 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64  s a key in the d
24430 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
24440 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20   that cursor P1 
24450 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20  points to.  The 
24460 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
24470 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  r is written.** 
24480 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73  written to regis
24490 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
244a0 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73   P3>0 then P3 is
244b0 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
244c0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
244d0 20 74 68 69 73 20 56 44 42 45 20 74 68 61 74 20   this VDBE that 
244e0 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61  holds .** the la
244f0 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79  rgest previously
24500 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
24510 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77  d number. No new
24520 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20   record numbers 
24530 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74  are.** allowed t
24540 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74  o be less than t
24550 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20  his value. When 
24560 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63 68  this value reach
24570 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20  es its maximum, 
24580 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 55  .** an SQLITE_FU
24590 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  LL error is gene
245a0 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72 65  rated. The P3 re
245b0 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74 65  gister is update
245c0 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a 20  d with the '.** 
245d0 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64  generated record
245e0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50 33   number. This P3
245f0 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73   mechanism is us
24600 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65  ed to help imple
24610 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f  ment the.** AUTO
24620 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72  INCREMENT featur
24630 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  e..*/.case OP_Ne
24640 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  wRowid: {       
24650 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
24660 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 20   i64 v;         
24670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
24680 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64  ew rowid */.  Vd
24690 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20  beCursor *pC;   
246a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
246b0 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74  f table to get t
246c0 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a  he new rowid */.
246d0 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
246e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
246f0 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  lt of an sqlite3
24700 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20  BtreeLast() */. 
24710 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
24720 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
24730 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  er to limit the 
24740 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68  number of search
24750 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  es */.  Mem *pMe
24760 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
24770 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
24780 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  ng largest rowid
24790 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45   for AUTOINCREME
247a0 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  NT */.  VdbeFram
247b0 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f  e *pFrame;     /
247c0 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20  * Root frame of 
247d0 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30  VDBE */..  v = 0
247e0 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70  ;.  res = 0;.  p
247f0 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
24800 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
24810 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
24820 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24830 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
24840 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
24850 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
24860 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
24870 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
24880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
24890 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
248a0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
248b0 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
248c0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20  sor!=0 );.  {.  
248d0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
248e0 77 69 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75  wid or record nu
248f0 6d 62 65 72 20 28 64 69 66 66 65 72 65 6e 74 20  mber (different 
24900 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61  terms for the sa
24910 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29  me.    ** thing)
24920 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
24930 61 20 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72  a two-step algor
24940 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ithm..    **.   
24950 20 2a 2a 20 46 69 72 73 74 20 77 65 20 61 74 74   ** First we att
24960 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65  empt to find the
24970 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e   largest existin
24980 67 20 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20  g rowid and add 
24990 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  one.    ** to th
249a0 61 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  at.  But if the 
249b0 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67  largest existing
249c0 20 72 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64   rowid is alread
249d0 79 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20  y the maximum.  
249e0 20 20 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e    ** positive in
249f0 74 65 67 65 72 2c 20 77 65 20 68 61 76 65 20 74  teger, we have t
24a00 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  o fall through t
24a10 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  o the second.   
24a20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69   ** probabilisti
24a30 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20  c algorithm.    
24a40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
24a50 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69  cond algorithm i
24a60 73 20 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f  s to select a ro
24a70 77 69 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e  wid at random an
24a80 64 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  d see if.    ** 
24a90 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
24aa0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
24ab0 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   If it does not 
24ac0 65 78 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20  exist, we have. 
24ad0 20 20 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e     ** succeeded.
24ae0 20 20 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20    If the random 
24af0 72 6f 77 69 64 20 64 6f 65 73 20 65 78 69 73 74  rowid does exist
24b00 2c 20 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65  , we select a ne
24b10 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64  w one.    ** and
24b20 20 74 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74   try again, up t
24b30 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20  o 100 times..   
24b40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24b50 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a  pC->isTable );..
24b60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32  #ifdef SQLITE_32
24b70 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65  BIT_ROWID.#   de
24b80 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30  fine MAX_ROWID 0
24b90 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a  x7fffffff.#else.
24ba0 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70      /* Some comp
24bb0 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61  ilers complain a
24bc0 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f  bout constants o
24bd0 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66  f the form 0x7ff
24be0 66 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20  fffffffffffff.. 
24bf0 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d     ** Others com
24c00 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66  plain about 0x7f
24c10 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 4c  fffffffffffffffL
24c20 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  L.  The followin
24c30 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20  g macro seems.  
24c40 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20    ** to provide 
24c50 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  the constant whi
24c60 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f  le making all co
24c70 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20  mpilers happy.. 
24c80 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65     */.#   define
24c90 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34   MAX_ROWID  (i64
24ca0 29 28 20 28 28 28 75 36 34 29 30 78 37 66 66 66  )( (((u64)0x7fff
24cb0 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36  ffff)<<32) | (u6
24cc0 34 29 30 78 66 66 66 66 66 66 66 66 20 29 0a 23  4)0xffffffff ).#
24cd0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21  endif..    if( !
24ce0 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
24cf0 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  id ){.      rc =
24d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
24d10 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
24d20 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
24d30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24d40 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
24d50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
24d60 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
24d70 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
24d80 20 20 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f        v = 1;   /
24d90 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34  * IMP: R-61914-4
24da0 38 30 37 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65  8074 */.      }e
24db0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
24dc0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24dd0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
24de0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  C->uc.pCursor) )
24df0 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 73 71  ;.        v = sq
24e00 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
24e10 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72  rKey(pC->uc.pCur
24e20 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sor);.        if
24e30 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29  ( v>=MAX_ROWID )
24e40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e  {.          pC->
24e50 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d  useRandomRowid =
24e60 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
24e70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 76 2b 2b  e{.          v++
24e80 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39  ;   /* IMP: R-29
24e90 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20  538-34987 */.   
24ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24eb0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
24ec0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
24ed0 43 52 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20  CREMENT.    if( 
24ee0 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20  pOp->p3 ){.     
24ef0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
24f00 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65  P3 is a valid me
24f10 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20  mory cell. */.  
24f20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
24f30 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 69  >p3>0 );.      i
24f40 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
24f50 20 20 20 20 20 20 20 20 66 6f 72 28 70 46 72 61          for(pFra
24f60 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
24f70 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
24f80 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
24f90 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
24fa0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
24fb0 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
24fc0 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
24fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
24fe0 2d 3e 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d  ->p3<=pFrame->nM
24ff0 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  em );.        pM
25000 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d  em = &pFrame->aM
25010 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
25020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25030 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
25040 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d   P3 is a valid m
25050 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20  emory cell. */. 
25060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
25070 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
25080 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
25090 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
250a0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
250b0 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62  ];.        memAb
250c0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
250d0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mem);.      }.  
250e0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
250f0 73 56 61 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a  sValid(pMem) );.
25100 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f  .      REGISTER_
25110 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
25120 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
25130 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
25140 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20  rify(pMem);.    
25150 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
25160 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
25170 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28  )!=0 );  /* mem(
25180 50 33 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74  P3) holds an int
25190 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66  eger */.      if
251a0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58  ( pMem->u.i==MAX
251b0 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73  _ROWID || pC->us
251c0 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a  eRandomRowid ){.
251d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
251e0 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49  ITE_FULL;   /* I
251f0 4d 50 3a 20 52 2d 31 37 38 31 37 2d 30 30 36 33  MP: R-17817-0063
25200 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  0 */.        got
25210 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
25220 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
25230 20 20 20 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e      if( v<pMem->
25240 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20 20 20 20  u.i+1 ){.       
25250 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b   v = pMem->u.i +
25260 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
25270 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b    pMem->u.i = v;
25280 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25290 20 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e    if( pC->useRan
252a0 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
252b0 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    /* IMPLEMENTAT
252c0 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d  ION-OF: R-07677-
252d0 34 31 38 38 31 20 49 66 20 74 68 65 20 6c 61 72  41881 If the lar
252e0 67 65 73 74 20 52 4f 57 49 44 20 69 73 20 65 71  gest ROWID is eq
252f0 75 61 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ual to the.     
25300 20 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73   ** largest poss
25310 69 62 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32  ible integer (92
25320 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
25330 37 29 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  7) then the data
25340 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e  base.      ** en
25350 67 69 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b  gine starts pick
25360 69 6e 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e  ing positive can
25370 64 69 64 61 74 65 20 52 4f 57 49 44 73 20 61 74  didate ROWIDs at
25380 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20   random until.  
25390 20 20 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20      ** it finds 
253a0 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  one that is not 
253b0 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e  previously used.
253c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
253d0 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20  ( pOp->p3==0 ); 
253e0 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65   /* We cannot be
253f0 20 69 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64   in random rowid
25400 20 6d 6f 64 65 20 69 66 20 74 68 69 73 20 69 73   mode if this is
25410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25430 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e   an AUTOINCREMEN
25440 54 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  T table. */.    
25450 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20    cnt = 0;.     
25460 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 73 71 6c   do{.        sql
25470 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
25480 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a  sizeof(v), &v);.
25490 20 20 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41          v &= (MA
254a0 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b  X_ROWID>>1); v++
254b0 3b 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61  ;  /* Ensure tha
254c0 74 20 76 20 69 73 20 67 72 65 61 74 65 72 20 74  t v is greater t
254d0 68 61 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20  han zero */.    
254e0 20 20 7d 77 68 69 6c 65 28 20 20 28 28 72 63 20    }while(  ((rc 
254f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
25500 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
25510 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
25520 28 75 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20  (u64)v,.        
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 30 2c 20 26 72 65 73           0, &res
25560 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20  ))==SQLITE_OK). 
25570 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
25580 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  es==0).         
25590 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30     && (++cnt<100
255a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
255b0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
255c0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
255d0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
255e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
255f0 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49  ITE_FULL;   /* I
25600 4d 50 3a 20 52 2d 33 38 32 31 39 2d 35 33 30 30  MP: R-38219-5300
25610 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  2 */.        got
25620 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
25630 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
25640 20 20 20 20 61 73 73 65 72 74 28 20 76 3e 30 20      assert( v>0 
25650 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38  );  /* EV: R-408
25660 31 32 2d 30 33 35 37 30 20 2a 2f 0a 20 20 20 20  12-03570 */.    
25670 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  }.    pC->deferr
25680 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
25690 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
256a0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
256b0 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
256c0 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = v;.  break;.}
256d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73  ../* Opcode: Ins
256e0 65 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ert P1 P2 P3 P4 
256f0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
25700 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74  intkey=r[P3] dat
25710 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72  a=r[P2].**.** Wr
25720 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
25730 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63  o the table of c
25740 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77  ursor P1.  A new
25750 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65   entry is.** cre
25760 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e  ated if it doesn
25770 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  't already exist
25780 20 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72   or the data for
25790 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
257a0 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69  entry is overwri
257b0 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20  tten.  The data 
257c0 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d  is the value MEM
257d0 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20  _Blob stored in 
257e0 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62  register.** numb
257f0 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69  er P2. The key i
25800 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
25810 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79  ster P3. The key
25820 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45   must.** be a ME
25830 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  M_Int..**.** If 
25840 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
25850 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  GE flag of P5 is
25860 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
25870 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
25880 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
25890 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
258a0 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41  ).  If the OPFLA
258b0 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67  G_LASTROWID flag
258c0 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a   of P5 is set,.*
258d0 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20  * then rowid is 
258e0 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65  stored for subse
258f0 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20  quent return by 
25900 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c  the.** sqlite3_l
25910 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
25920 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68  () function (oth
25930 65 72 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d  erwise it is unm
25940 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  odified)..**.** 
25950 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
25960 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
25970 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74   of P5 is set, t
25980 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
25990 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66  n might.** run f
259a0 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
259b0 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  g an unnecessary
259c0 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20   seek on cursor 
259d0 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  P1.  However,.**
259e0 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
259f0 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d  EEKRESULT flag m
25a00 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  ust only be set 
25a10 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
25a20 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73  en no prior.** s
25a30 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73  eeks on the curs
25a40 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73  or or if the mos
25a50 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73  t recent seek us
25a60 65 64 20 61 20 6b 65 79 20 65 71 75 61 6c 20 74  ed a key equal t
25a70 6f 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o P3..**.** If t
25a80 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41  he OPFLAG_ISUPDA
25a90 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  TE flag is set, 
25aa0 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
25ab0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a   is part of an.*
25ac0 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  * UPDATE operati
25ad0 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28  on.  Otherwise (
25ae0 69 66 20 74 68 65 20 66 6c 61 67 20 69 73 20 63  if the flag is c
25af0 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69 73 20  lear) then this 
25b00 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72  opcode.** is par
25b10 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f  t of an INSERT o
25b20 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64  peration.  The d
25b30 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c  ifference is onl
25b40 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a  y important to.*
25b50 2a 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f  * the update hoo
25b60 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  k..**.** Paramet
25b70 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20  er P4 may point 
25b80 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
25b90 74 75 72 65 2c 20 6f 72 20 6d 61 79 20 62 65 20  ture, or may be 
25ba0 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 0a  NULL. If it is .
25bb0 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  ** not NULL, the
25bc0 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  n the update-hoo
25bd0 6b 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61  k (sqlite3.xUpda
25be0 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69  teCallback) is i
25bf0 6e 76 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f  nvoked .** follo
25c00 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75  wing a successfu
25c10 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20  l insert..**.** 
25c20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49  (WARNING/TODO: I
25c30 66 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f  f P1 is a pseudo
25c40 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69  -cursor and P2 i
25c50 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
25c60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e   allocated, then
25c70 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32   ownership of P2
25c80 20 69 73 20 74 72 61 6e 73 66 65 72 72 65 64 20   is transferred 
25c90 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75  to the pseudo-cu
25ca0 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69  rsor.** and regi
25cb0 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20  ster P2 becomes 
25cc0 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74  ephemeral.  If t
25cd0 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 68 61  he cursor is cha
25ce0 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c  nged, the.** val
25cf0 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
25d00 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e  2 will then chan
25d10 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ge.  Make sure t
25d20 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  his does not.** 
25d30 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
25d40 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ms.).**.** This 
25d50 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79  instruction only
25d60 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73   works on tables
25d70 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e  .  The equivalen
25d80 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  t instruction.**
25d90 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20   for indices is 
25da0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f  OP_IdxInsert..*/
25db0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65  ./* Opcode: Inse
25dc0 72 74 49 6e 74 20 50 31 20 50 32 20 50 33 20 50  rtInt P1 P2 P3 P
25dd0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
25de0 3a 20 69 6e 74 6b 65 79 3d 50 33 20 64 61 74 61  : intkey=P3 data
25df0 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P2].**.** Thi
25e00 73 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20  s works exactly 
25e10 6c 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65  like OP_Insert e
25e20 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6b  xcept that the k
25e30 65 79 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74  ey is the.** int
25e40 65 67 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e  eger value P3, n
25e50 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ot the value of 
25e60 74 68 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72  the integer stor
25e70 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
25e80 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  3..*/.case OP_In
25e90 73 65 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49  sert: .case OP_I
25ea0 6e 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65  nsertInt: {.  Me
25eb0 6d 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  m *pData;       
25ec0 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64  /* MEM cell hold
25ed0 69 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68 65  ing data for the
25ee0 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
25ef0 73 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20  serted */.  Mem 
25f00 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a  *pKey;        /*
25f10 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e   MEM cell holdin
25f20 67 20 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72  g key  for the r
25f30 65 63 6f 72 64 20 2a 2f 0a 20 20 56 64 62 65 43  ecord */.  VdbeC
25f40 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20  ursor *pC;   /* 
25f50 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20  Cursor to table 
25f60 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72  into which inser
25f70 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  t is written */.
25f80 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
25f90 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66  ;   /* Result of
25fa0 20 70 72 69 6f 72 20 73 65 65 6b 20 6f 72 20 30   prior seek or 0
25fb0 20 69 66 20 6e 6f 20 55 53 45 53 45 45 4b 52 45   if no USESEEKRE
25fc0 53 55 4c 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63  SULT flag */.  c
25fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
25fe0 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d   /* database nam
25ff0 65 20 2d 20 75 73 65 64 20 62 79 20 74 68 65 20  e - used by the 
26000 75 70 64 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20  update hook */. 
26010 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
26020 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
26030 63 74 75 72 65 20 2d 20 75 73 65 64 20 62 79 20  cture - used by 
26040 75 70 64 61 74 65 20 61 6e 64 20 70 72 65 2d 75  update and pre-u
26050 70 64 61 74 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20  pdate hooks */. 
26060 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b   BtreePayload x;
26070 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f     /* Payload to
26080 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   be inserted */.
26090 0a 20 20 70 44 61 74 61 20 3d 20 26 61 4d 65 6d  .  pData = &aMem
260a0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73  [pOp->p2];.  ass
260b0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
260c0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
260d0 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
260e0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 44  t( memIsValid(pD
260f0 61 74 61 29 20 29 3b 0a 20 20 70 43 20 3d 20 70  ata) );.  pC = p
26100 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
26110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
26120 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26130 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
26140 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
26150 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
26160 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
26170 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20  ssert( (pOp->p5 
26180 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29  & OPFLAG_ISNOOP)
26190 20 7c 7c 20 70 43 2d 3e 69 73 54 61 62 6c 65 20   || pC->isTable 
261a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
261b0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42  ->p4type==P4_TAB
261c0 4c 45 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70  LE || pOp->p4typ
261d0 65 3e 3d 50 34 5f 53 54 41 54 49 43 20 29 3b 0a  e>=P4_STATIC );.
261e0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
261f0 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29  (pOp->p2, pData)
26200 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49  ;.  sqlite3VdbeI
26210 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28  ncrWriteCounter(
26220 70 2c 20 70 43 29 3b 0a 0a 20 20 69 66 28 20 70  p, pC);..  if( p
26230 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
26240 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b 65  nsert ){.    pKe
26250 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  y = &aMem[pOp->p
26260 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  3];.    assert( 
26270 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pKey->flags & ME
26280 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  M_Int );.    ass
26290 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
262a0 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 52 45 47  pKey) );.    REG
262b0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
262c0 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  >p3, pKey);.    
262d0 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75  x.nKey = pKey->u
262e0 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .i;.  }else{.   
262f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
26300 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49  code==OP_InsertI
26310 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79  nt );.    x.nKey
26320 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a   = pOp->p3;.  }.
26330 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
26340 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20  pe==P4_TABLE && 
26350 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28  HAS_UPDATE_HOOK(
26360 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  db) ){.    asser
26370 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b  t( pC->iDb>=0 );
26380 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  .    zDb = db->a
26390 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53  Db[pC->iDb].zDbS
263a0 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d  Name;.    pTab =
263b0 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20   pOp->p4.pTab;. 
263c0 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d     assert( (pOp-
263d0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e  >p5 & OPFLAG_ISN
263e0 4f 4f 50 29 20 7c 7c 20 48 61 73 52 6f 77 69 64  OOP) || HasRowid
263f0 28 70 54 61 62 29 20 29 3b 0a 20 20 7d 65 6c 73  (pTab) );.  }els
26400 65 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  e{.    pTab = 0;
26410 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 2f  .    zDb = 0;  /
26420 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  * Not needed.  S
26430 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65  ilence a compile
26440 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20  r warning. */.  
26450 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
26460 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
26470 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f  E_HOOK.  /* Invo
26480 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
26490 65 20 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 20 2a  e hook, if any *
264a0 2f 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  /.  if( pTab ){.
264b0 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65      if( db->xPre
264c0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
264d0 26 20 21 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  & !(pOp->p5 & OP
264e0 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 29  FLAG_ISUPDATE) )
264f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
26500 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
26510 28 70 2c 20 70 43 2c 20 53 51 4c 49 54 45 5f 49  (p, pC, SQLITE_I
26520 4e 53 45 52 54 2c 20 7a 44 62 2c 20 70 54 61 62  NSERT, zDb, pTab
26530 2c 20 78 2e 6e 4b 65 79 2c 70 4f 70 2d 3e 70 32  , x.nKey,pOp->p2
26540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
26550 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
26560 62 61 63 6b 3d 3d 30 20 7c 7c 20 70 54 61 62 2d  back==0 || pTab-
26570 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  >aCol==0 ){.    
26580 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 70 6f 73    /* Prevent pos
26590 74 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 66 72  t-update hook fr
265a0 6f 6d 20 72 75 6e 6e 69 6e 67 20 69 6e 20 63 61  om running in ca
265b0 73 65 73 20 77 68 65 6e 20 69 74 20 73 68 6f 75  ses when it shou
265c0 6c 64 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  ld not */.      
265d0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pTab = 0;.    }.
265e0 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
265f0 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f  5 & OPFLAG_ISNOO
26600 50 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  P ) break;.#endi
26610 66 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  f..  if( pOp->p5
26620 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
26630 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b  E ) p->nChange++
26640 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ;.  if( pOp->p5 
26650 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  & OPFLAG_LASTROW
26660 49 44 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77  ID ) db->lastRow
26670 69 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 61  id = x.nKey;.  a
26680 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c  ssert( pData->fl
26690 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
266a0 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 78 2e  MEM_Str) );.  x.
266b0 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a  pData = pData->z
266c0 3b 0a 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44  ;.  x.nData = pD
266d0 61 74 61 2d 3e 6e 3b 0a 20 20 73 65 65 6b 52 65  ata->n;.  seekRe
266e0 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35  sult = ((pOp->p5
266f0 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45   & OPFLAG_USESEE
26700 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73  KRESULT) ? pC->s
26710 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a  eekResult : 0);.
26720 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61    if( pData->fla
26730 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
26740 0a 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 70  .    x.nZero = p
26750 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  Data->u.nZero;. 
26760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 5a   }else{.    x.nZ
26770 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 78  ero = 0;.  }.  x
26780 2e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 72 63 20  .pKey = 0;.  rc 
26790 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
267a0 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  sert(pC->uc.pCur
267b0 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 28  sor, &x,.      (
267c0 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41  pOp->p5 & (OPFLA
267d0 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f  G_APPEND|OPFLAG_
267e0 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20  SAVEPOSITION)), 
267f0 73 65 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a  seekResult.  );.
26800 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
26810 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
26820 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
26830 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a  CHE_STALE;..  /*
26840 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   Invoke the upda
26850 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
26860 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  red. */.  if( rc
26870 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
26880 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
26890 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 61 73  ( pTab ){.    as
268a0 73 65 72 74 28 20 64 62 2d 3e 78 55 70 64 61 74  sert( db->xUpdat
268b0 65 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 3b 0a  eCallback!=0 );.
268c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
268d0 2d 3e 61 43 6f 6c 21 3d 30 20 29 3b 0a 20 20 20  ->aCol!=0 );.   
268e0 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
268f0 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65  back(db->pUpdate
26900 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Arg,.           
26910 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
26920 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53 51  G_ISUPDATE) ? SQ
26930 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51  LITE_UPDATE : SQ
26940 4c 49 54 45 5f 49 4e 53 45 52 54 2c 0a 20 20 20  LITE_INSERT,.   
26950 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61          zDb, pTa
26960 62 2d 3e 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79  b->zName, x.nKey
26970 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
26980 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
26990 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 50 34  lete P1 P2 P3 P4
269a0 20 50 35 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65   P5.**.** Delete
269b0 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77   the record at w
269c0 68 69 63 68 20 74 68 65 20 50 31 20 63 75 72 73  hich the P1 curs
269d0 6f 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  or is currently 
269e0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
269f0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 41  If the OPFLAG_SA
26a00 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f  VEPOSITION bit o
26a10 66 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  f the P5 paramet
26a20 65 72 20 69 73 20 73 65 74 2c 20 74 68 65 6e 0a  er is set, then.
26a30 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  ** the cursor wi
26a40 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
26a50 69 6e 67 20 61 74 20 20 65 69 74 68 65 72 20 74  ing at  either t
26a60 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20 70  he next or the p
26a70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72  revious.** recor
26a80 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  d in the table. 
26a90 49 66 20 69 74 20 69 73 20 6c 65 66 74 20 70 6f  If it is left po
26aa0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65  inting at the ne
26ab0 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a  xt record, then.
26ac0 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78 74  ** the next Next
26ad0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
26ae0 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73  l be a no-op. As
26af0 20 61 20 72 65 73 75 6c 74 2c 20 69 6e 20 74 68   a result, in th
26b00 69 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 69 73  is case.** it is
26b10 20 6f 6b 20 74 6f 20 64 65 6c 65 74 65 20 61 20   ok to delete a 
26b20 72 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68  record from with
26b30 69 6e 20 61 20 4e 65 78 74 20 6c 6f 6f 70 2e 20  in a Next loop. 
26b40 49 66 20 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53 41  If .** OPFLAG_SA
26b50 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f  VEPOSITION bit o
26b60 66 20 50 35 20 69 73 20 63 6c 65 61 72 2c 20 74  f P5 is clear, t
26b70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77  hen the cursor w
26b80 69 6c 6c 20 62 65 0a 2a 2a 20 6c 65 66 74 20 69  ill be.** left i
26b90 6e 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 73  n an undefined s
26ba0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
26bb0 68 65 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c  he OPFLAG_AUXDEL
26bc0 45 54 45 20 62 69 74 20 69 73 20 73 65 74 20 6f  ETE bit is set o
26bd0 6e 20 50 35 2c 20 74 68 61 74 20 69 6e 64 69 63  n P5, that indic
26be0 61 74 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ates that this.*
26bf0 2a 20 64 65 6c 65 74 65 20 6f 6e 65 20 6f 66 20  * delete one of 
26c00 73 65 76 65 72 61 6c 20 61 73 73 6f 63 69 61 74  several associat
26c10 65 64 20 77 69 74 68 20 64 65 6c 65 74 69 6e 67  ed with deleting
26c20 20 61 20 74 61 62 6c 65 20 72 6f 77 20 61 6e 64   a table row and
26c30 20 61 6c 6c 20 69 74 73 0a 2a 2a 20 61 73 73 6f   all its.** asso
26c40 63 69 61 74 65 64 20 69 6e 64 65 78 20 65 6e 74  ciated index ent
26c50 72 69 65 73 2e 20 20 45 78 61 63 74 6c 79 20 6f  ries.  Exactly o
26c60 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
26c70 74 65 73 20 69 73 20 74 68 65 20 22 70 72 69 6d  tes is the "prim
26c80 61 72 79 22 0a 2a 2a 20 64 65 6c 65 74 65 2e 20  ary".** delete. 
26c90 20 54 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   The others are 
26ca0 61 6c 6c 20 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f  all on OPFLAG_FO
26cb0 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72 73 20  RDELETE cursors 
26cc0 6f 72 20 65 6c 73 65 20 61 72 65 0a 2a 2a 20 6d  or else are.** m
26cd0 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 41  arked with the A
26ce0 55 58 44 45 4c 45 54 45 20 66 6c 61 67 2e 0a 2a  UXDELETE flag..*
26cf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
26d00 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20  AG_NCHANGE flag 
26d10 6f 66 20 50 32 20 28 4e 42 3a 20 50 32 20 6e 6f  of P2 (NB: P2 no
26d20 74 20 50 35 29 20 69 73 20 73 65 74 2c 20 74 68  t P5) is set, th
26d30 65 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 63 68  en the row.** ch
26d40 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 20 69 6e  ange count is in
26d50 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72  cremented (other
26d60 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a  wise not)..**.**
26d70 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P1 must not be 
26d80 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49  pseudo-table.  I
26d90 74 20 68 61 73 20 74 6f 20 62 65 20 61 20 72 65  t has to be a re
26da0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a  al table with.**
26db0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a   multiple rows..
26dc0 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  **.** If P4 is n
26dd0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
26de0 70 6f 69 6e 74 73 20 74 6f 20 61 20 54 61 62 6c  points to a Tabl
26df0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 74 68 69  e object. In thi
26e00 73 20 63 61 73 65 20 65 69 74 68 65 72 20 0a 2a  s case either .*
26e10 2a 20 74 68 65 20 75 70 64 61 74 65 20 6f 72 20  * the update or 
26e20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c  pre-update hook,
26e30 20 6f 72 20 62 6f 74 68 2c 20 6d 61 79 20 62 65   or both, may be
26e40 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20 50 31   invoked. The P1
26e50 20 63 75 72 73 6f 72 20 6d 75 73 74 0a 2a 2a 20   cursor must.** 
26e60 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69  have been positi
26e70 6f 6e 65 64 20 75 73 69 6e 67 20 4f 50 5f 4e 6f  oned using OP_No
26e80 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20  tFound prior to 
26e90 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70  invoking this op
26ea0 63 6f 64 65 20 69 6e 20 0a 2a 2a 20 74 68 69 73  code in .** this
26eb0 20 63 61 73 65 2e 20 53 70 65 63 69 66 69 63 61   case. Specifica
26ec0 6c 6c 79 2c 20 69 66 20 6f 6e 65 20 69 73 20 63  lly, if one is c
26ed0 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 70  onfigured, the p
26ee0 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69  re-update hook i
26ef0 73 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 69 66  s .** invoked if
26f00 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P4 is not NULL.
26f10 20 54 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   The update-hook
26f20 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 6f   is invoked if o
26f30 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
26f40 2c 20 0a 2a 2a 20 50 34 20 69 73 20 6e 6f 74 20  , .** P4 is not 
26f50 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 4f 50  NULL, and the OP
26f60 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61  FLAG_NCHANGE fla
26f70 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2e 0a  g is set in P2..
26f80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
26f90 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61  LAG_ISUPDATE fla
26fa0 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2c 20  g is set in P2, 
26fb0 74 68 65 6e 20 50 33 20 63 6f 6e 74 61 69 6e 73  then P3 contains
26fc0 20 74 68 65 20 61 64 64 72 65 73 73 0a 2a 2a 20   the address.** 
26fd0 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
26fe0 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
26ff0 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
27000 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
27010 20 72 6f 77 20 77 69 6c 6c 0a 2a 2a 20 62 65 20   row will.** be 
27020 73 65 74 20 74 6f 20 62 79 20 74 68 65 20 75 70  set to by the up
27030 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  date..*/.case OP
27040 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62  _Delete: {.  Vdb
27050 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 63  eCursor *pC;.  c
27060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
27070 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
27080 20 69 6e 74 20 6f 70 66 6c 61 67 73 3b 0a 0a 20   int opflags;.. 
27090 20 6f 70 66 6c 61 67 73 20 3d 20 70 4f 70 2d 3e   opflags = pOp->
270a0 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p2;.  assert( pO
270b0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
270c0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
270d0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
270e0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
270f0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
27100 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
27110 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
27120 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
27130 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
27140 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27150 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
27160 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  eto==0 );.  sqli
27170 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
27180 43 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a  Counter(p, pC);.
27190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
271a0 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e  EBUG.  if( pOp->
271b0 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45  p4type==P4_TABLE
271c0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f 70   && HasRowid(pOp
271d0 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70 4f  ->p4.pTab) && pO
271e0 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p5==0 ){.    
271f0 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72 6f  /* If p5 is zero
27200 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61  , the seek opera
27210 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74 69  tion that positi
27220 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72 20  oned the cursor 
27230 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
27240 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20 68  OP_Delete will h
27250 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68 65  ave also set the
27260 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
27270 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 72  t field to the r
27280 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74  owid of.    ** t
27290 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 62  he row that is b
272a0 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
272b0 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 73      i64 iKey = s
272c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
272d0 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
272e0 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72  rsor);.    asser
272f0 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72  t( pC->movetoTar
27300 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20 7d  get==iKey );.  }
27310 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
27320 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
27330 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d 68   or pre-update-h
27340 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f  ook will be invo
27350 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f 0a  ked, set zDb to.
27360 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
27370 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73 20   the db to pass 
27380 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20 73  as to it. Also s
27390 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74 6f  et local pTab to
273a0 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66 20   a copy.  ** of 
273b0 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c 79  p4.pTab. Finally
273c0 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65 2c  , if p5 is true,
273d0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
273e0 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73   this cursor was
273f0 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65 64  .  ** last moved
27400 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f 72   with OP_Next or
27410 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53 65   OP_Prev, not Se
27420 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c 20  ek or NotFound, 
27430 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43 75  set .  ** VdbeCu
27440 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67 65  rsor.movetoTarge
27450 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
27460 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69 66   rowid.  */.  if
27470 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
27480 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55  4_TABLE && HAS_U
27490 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29  PDATE_HOOK(db) )
274a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
274b0 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ->iDb>=0 );.    
274c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
274d0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 7a  pTab!=0 );.    z
274e0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d  Db = db->aDb[pC-
274f0 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  >iDb].zDbSName;.
27500 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e      pTab = pOp->
27510 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  p4.pTab;.    if(
27520 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
27530 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29  AG_SAVEPOSITION)
27540 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61 62  !=0 && pC->isTab
27550 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e  le ){.      pC->
27560 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73  movetoTarget = s
27570 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
27580 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
27590 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
275a0 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
275b0 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64  0;   /* Not need
275c0 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63  ed.  Silence a c
275d0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e  ompiler warning.
275e0 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 30   */.    pTab = 0
275f0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
27600 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d  .  Silence a com
27610 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a  piler warning. *
27620 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  /.  }..#ifdef SQ
27630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
27640 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20  PDATE_HOOK.  /* 
27650 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
27660 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65  pdate-hook if re
27670 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
27680 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
27690 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e  allback && pOp->
276a0 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 61  p4.pTab ){.    a
276b0 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67 73  ssert( !(opflags
276c0 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41   & OPFLAG_ISUPDA
276d0 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  TE) .         ||
276e0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d   HasRowid(pTab)=
276f0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
27700 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66  (aMem[pOp->p3].f
27710 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
27720 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
27730 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
27740 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20 20  Hook(p, pC,.    
27750 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20 4f      (opflags & O
27760 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20  PFLAG_ISUPDATE) 
27770 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ? SQLITE_UPDATE 
27780 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  : SQLITE_DELETE,
27790 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70   .        zDb, p
277a0 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54  Tab, pC->movetoT
277b0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 70  arget,.        p
277c0 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20 20  Op->p3.    );.  
277d0 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20  }.  if( opflags 
277e0 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
277f0 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ) break;.#endif.
27800 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67   .  /* Only flag
27810 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
27820 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54 49  t are SAVEPOISTI
27830 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45  ON and AUXDELETE
27840 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 28   */ .  assert( (
27850 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46 4c  pOp->p5 & ~(OPFL
27860 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 7c  AG_SAVEPOSITION|
27870 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
27880 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
27890 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  t( OPFLAG_SAVEPO
278a0 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53 41  SITION==BTREE_SA
278b0 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20 20  VEPOSITION );.  
278c0 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 41  assert( OPFLAG_A
278d0 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f  UXDELETE==BTREE_
278e0 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23 69  AUXDELETE );..#i
278f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27900 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  G.  if( p->pFram
27910 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
27920 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 3d  pC->isEphemeral=
27930 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70  =0.        && (p
27940 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
27950 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20  AUXDELETE)==0.  
27960 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77 72        && (pC->wr
27970 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46 4f  Flag & OPFLAG_FO
27980 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20  RDELETE)==0.    
27990 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72    ){.      nExtr
279a0 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20 7d  aDelete++;.    }
279b0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
279c0 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
279d0 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  E ){.      nExtr
279e0 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20 7d  aDelete--;.    }
279f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
27a00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
27a10 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70 43  Delete(pC->uc.pC
27a20 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29 3b  ursor, pOp->p5);
27a30 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
27a40 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
27a50 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
27a60 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  lt = 0;.  if( rc
27a70 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
27a80 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  e_to_error;..  /
27a90 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64  * Invoke the upd
27aa0 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75  ate-hook if requ
27ab0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  ired. */.  if( o
27ac0 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
27ad0 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 70  NCHANGE ){.    p
27ae0 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20  ->nChange++;.   
27af0 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65   if( db->xUpdate
27b00 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73 52  Callback && HasR
27b10 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
27b20 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43      db->xUpdateC
27b30 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64  allback(db->pUpd
27b40 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44  ateArg, SQLITE_D
27b50 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61 62  ELETE, zDb, pTab
27b60 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
27b70 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
27b80 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  get);.      asse
27b90 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
27ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
27bb0 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  reak;.}./* Opcod
27bc0 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20  e: ResetCount * 
27bd0 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
27be0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
27bf0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
27c00 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
27c10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
27c20 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
27c30 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
27c40 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
27c50 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
27c60 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  s())..** Then th
27c70 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63  e VMs internal c
27c80 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65  hange counter re
27c90 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68  sets to 0..** Th
27ca0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
27cb0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
27cc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
27cd0 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74  Count: {.  sqlit
27ce0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
27cf0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
27d00 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
27d10 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
27d20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
27d30 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50  rCompare P1 P2 P
27d40 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  3 P4.** Synopsis
27d50 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74 72  : if key(P1)!=tr
27d60 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f 74  im(r[P3],P4) got
27d70 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  o P2.**.** P1 is
27d80 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72   a sorter cursor
27d90 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  . This instructi
27da0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70 72  on compares a pr
27db0 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 72  efix of the.** r
27dc0 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72 65  ecord blob in re
27dd0 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e 73  gister P3 agains
27de0 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  t a prefix of th
27df0 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  e entry that .**
27e00 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
27e10 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
27e20 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74 68  nts to.  Only th
27e30 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c 64  e first P4 field
27e40 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61 6e  s.** of r[P3] an
27e50 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  d the sorter rec
27e60 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ord are compared
27e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
27e80 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72 74  r P3 or the sort
27e90 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  er contains a NU
27ea0 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  LL in one of the
27eb0 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a  ir significant.*
27ec0 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63 6f  * fields (not co
27ed0 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66 69  unting the P4 fi
27ee0 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 20  elds at the end 
27ef0 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72 65  which are ignore
27f00 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d) then.** the c
27f10 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73 73  omparison is ass
27f20 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  umed to be equal
27f30 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72  ..**.** Fall thr
27f40 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e 73  ough to next ins
27f50 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65 20  truction if the 
27f60 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d 70  two records comp
27f70 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a 20  are equal to.** 
27f80 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75 6d  each other.  Jum
27f90 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79 20  p to P2 if they 
27fa0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a  are different..*
27fb0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
27fc0 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62  Compare: {.  Vdb
27fd0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
27fe0 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 4b  nt res;.  int nK
27ff0 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20 70  eyCol;..  pC = p
28000 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
28010 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
28020 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61 73  rter(pC) );.  as
28030 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
28040 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
28050 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
28060 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f  p->p3];.  nKeyCo
28070 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  l = pOp->p4.i;. 
28080 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d   res = 0;.  rc =
28090 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
280a0 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49  erCompare(pC, pI
280b0 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72 65  n3, nKeyCol, &re
280c0 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  s);.  VdbeBranch
280d0 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
280e0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
280f0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
28100 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20 29  ror;.  if( res )
28110 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
28120 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f  ;.  break;.};../
28130 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
28140 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20  Data P1 P2 P3 * 
28150 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
28160 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20  [P2]=data.**.** 
28170 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
28180 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65  ter P2 the curre
28190 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66  nt sorter data f
281a0 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  or sorter cursor
281b0 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c 65   P1..** Then cle
281c0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 65  ar the column he
281d0 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63 75  ader cache on cu
281e0 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54  rsor P3..**.** T
281f0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
28200 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d 6f  rmally use to mo
28210 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74 20  ve a record out 
28220 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  of the sorter an
28230 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67 69  d into.** a regi
28240 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68 65  ster that is the
28250 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70 73   source for a ps
28260 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f  eudo-table curso
28270 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  r created using.
28280 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20 20  ** OpenPseudo.  
28290 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62 6c  That pseudo-tabl
282a0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 20  e cursor is the 
282b0 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65 6e  one that is iden
282c0 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 72  tified by.** par
282d0 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65 61  ameter P3.  Clea
282e0 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c 75  ring the P3 colu
282f0 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72 74  mn cache as part
28300 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20   of this opcode 
28310 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f 6d  saves.** us from
28320 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75 65   having to issue
28330 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c 6c   a separate Null
28340 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  Row instruction 
28350 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63 61  to clear that ca
28360 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  che..*/.case OP_
28370 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20  SorterData: {.  
28380 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
28390 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
283a0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d  pOp->p2];.  pC =
283b0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
283c0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  1];.  assert( is
283d0 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20  Sorter(pC) );.  
283e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
283f0 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c  SorterRowkey(pC,
28400 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74   pOut);.  assert
28410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28420 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 20  || (pOut->flags 
28430 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  & MEM_Blob) );. 
28440 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
28450 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
28460 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69  ->nCursor );.  i
28470 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
28480 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
28490 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  .  p->apCsr[pOp-
284a0 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74 75  >p3]->cacheStatu
284b0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
284c0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
284d0 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20  Opcode: RowData 
284e0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
284f0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
28500 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  data.**.** Write
28510 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
28520 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
28530 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  ow content for t
28540 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77 68  he row at .** wh
28550 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69 73  ich cursor P1 is
28560 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
28570 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ing..** There is
28580 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69   no interpretati
28590 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20  on of the data. 
285a0 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20   .** It is just 
285b0 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20  copied onto the 
285c0 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63  P2 register exac
285d0 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73  tly as .** it is
285e0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
285f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
28600 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
28610 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  is an index, the
28620 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  n the content is
28630 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
28640 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73 6f  row..** If curso
28650 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65 2c  r P2 is a table,
28660 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
28670 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20 74  t extracted is t
28680 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49  he data..**.** I
28690 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  f the P1 cursor 
286a0 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
286b0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
286c0 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29  (not a NULL row)
286d0 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61  .** of a real ta
286e0 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
286f0 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  o-table..**.** I
28700 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68 69  f P3!=0 then thi
28710 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c 6f  s opcode is allo
28720 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  wed to make an e
28730 70 68 65 6d 65 72 61 6c 20 70 6f 69 6e 74 65 72  phemeral pointer
28740 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74  .** into the dat
28750 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 61  abase page.  Tha
28760 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
28770 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
28780 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69 73 74  output.** regist
28790 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  er will be inval
287a0 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e 20 61  idated as soon a
287b0 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d 6f 76  s the cursor mov
287c0 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67 0a 2a  es - including.*
287d0 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64 20 62  * moves caused b
287e0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
287f0 74 68 61 74 20 22 73 61 76 65 22 20 74 68 65 20  that "save" the 
28800 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 73 0a  current cursors.
28810 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6f  ** position in o
28820 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20 63  rder that they c
28830 61 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  an write to the 
28840 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 49 66 20  same table.  If 
28850 50 33 3d 3d 30 0a 2a 2a 20 74 68 65 6e 20 61 20  P3==0.** then a 
28860 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74 61  copy of the data
28870 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
28880 6d 6f 72 79 2e 20 20 50 33 21 3d 30 20 69 73 20  mory.  P3!=0 is 
28890 66 61 73 74 65 72 2c 20 62 75 74 0a 2a 2a 20 50  faster, but.** P
288a0 33 3d 3d 30 20 69 73 20 73 61 66 65 72 2e 0a 2a  3==0 is safer..*
288b0 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74 68  *.** If P3!=0 th
288c0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
288d0 66 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65  f the P2 registe
288e0 72 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20  r is unsuitable 
288f0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 4f 50  for use.** in OP
28900 5f 52 65 73 75 6c 74 20 61 6e 64 20 61 6e 79 20  _Result and any 
28910 4f 50 5f 52 65 73 75 6c 74 20 77 69 6c 6c 20 69  OP_Result will i
28920 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 50 32  nvalidate the P2
28930 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
28940 74 2e 0a 2a 2a 20 54 68 65 20 50 32 20 72 65 67  t..** The P2 reg
28950 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 20 69 73  ister content is
28960 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
28970 6f 70 63 6f 64 65 73 20 6c 69 6b 65 20 4f 50 5f  opcodes like OP_
28980 46 75 6e 63 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62  Function or.** b
28990 79 20 61 6e 79 20 75 73 65 20 6f 66 20 61 6e 6f  y any use of ano
289a0 74 68 65 72 20 63 75 72 73 6f 72 20 70 6f 69 6e  ther cursor poin
289b0 74 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ting to the same
289c0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
289d0 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20  OP_RowData: {.  
289e0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
289f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
28a00 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 70  r;.  u32 n;..  p
28a10 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
28a20 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 0a 20  ease(p, pOp);.. 
28a30 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
28a40 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
28a50 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
28a60 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
28a70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
28a80 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
28a90 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
28aa0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
28ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
28ac0 6f 72 74 65 72 28 70 43 29 3d 3d 30 20 29 3b 0a  orter(pC)==0 );.
28ad0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75    assert( pC->nu
28ae0 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  llRow==0 );.  as
28af0 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
28b00 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72  rsor!=0 );.  pCr
28b10 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
28b20 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  sor;..  /* The O
28b30 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65  P_RowData opcode
28b40 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20  s always follow 
28b50 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a  OP_NotExists or.
28b60 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 52 6f 77 69    ** OP_SeekRowi
28b70 64 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2f 4f  d or OP_Rewind/O
28b80 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69  p_Next with no i
28b90 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72  ntervening instr
28ba0 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61  uctions.  ** tha
28bb0 74 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61  t might invalida
28bc0 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20  te the cursor.. 
28bd0 20 2a 2a 20 49 66 20 74 68 69 73 20 77 68 65 72   ** If this wher
28be0 65 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  e not the case, 
28bf0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
28c00 69 6e 67 20 61 73 73 65 72 74 28 29 73 0a 20 20  ing assert()s.  
28c10 2a 2a 20 77 6f 75 6c 64 20 66 61 69 6c 2e 20 20  ** would fail.  
28c20 53 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65 72  Should this ever
28c30 20 63 68 61 6e 67 65 20 28 62 65 63 61 75 73 65   change (because
28c40 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
28c50 68 65 20 63 6f 64 65 0a 20 20 2a 2a 20 67 65 6e  he code.  ** gen
28c60 65 72 61 74 6f 72 29 20 74 68 65 6e 20 74 68 65  erator) then the
28c70 20 66 69 78 20 77 6f 75 6c 64 20 62 65 20 74 6f   fix would be to
28c80 20 69 6e 73 65 72 74 20 61 20 63 61 6c 6c 20 74   insert a call t
28c90 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64  o.  ** sqlite3Vd
28ca0 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  beCursorMoveto()
28cb0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
28cc0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
28cd0 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
28ce0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
28cf0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
28d00 72 73 72 29 20 29 3b 0a 23 69 66 20 30 20 20 2f  rsr) );.#if 0  /
28d10 2a 20 4e 6f 74 20 72 65 71 75 69 72 65 64 20 64  * Not required d
28d20 75 65 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ue to the previo
28d30 75 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 73  us to assert() s
28d40 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 72  tatements */.  r
28d50 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
28d60 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
28d70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28d80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
28d90 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
28da0 23 65 6e 64 69 66 0a 0a 20 20 6e 20 3d 20 73 71  #endif..  n = sq
28db0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28dc0 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20 20  dSize(pCrsr);.  
28dd0 69 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61  if( n>(u32)db->a
28de0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
28df0 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
28e00 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
28e10 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
28e20 6e 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  n==0 );.  rc = s
28e30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
28e40 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c  mBtree(pCrsr, 0,
28e50 20 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66 28   n, pOut);.  if(
28e60 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
28e70 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
28e80 20 69 66 28 20 21 70 4f 70 2d 3e 70 33 20 29 20   if( !pOp->p3 ) 
28e90 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
28ea0 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
28eb0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
28ec0 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
28ed0 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
28ee0 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
28ef0 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69 64  /* Opcode: Rowid
28f00 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
28f10 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
28f20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  rowid.**.** Stor
28f30 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
28f40 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
28f50 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
28f60 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
28f70 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
28f80 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
28f90 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
28fa0 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
28fb0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
28fc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
28fd0 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
28fe0 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
28ff0 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
29000 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
29010 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
29020 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
29030 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
29040 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
29050 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
29060 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
29070 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
29080 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
29090 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  *pC;.  i64 v;.  
290a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
290b0 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
290c0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
290d0 64 75 6c 65 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  dule;..  pOut = 
290e0 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
290f0 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65 72 74  , pOp);.  assert
29100 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
29110 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
29120 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
29130 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
29140 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
29150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
29160 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
29170 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d  PE_PSEUDO || pC-
29180 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 69 66  >nullRow );.  if
29190 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
291a0 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
291b0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
291c0 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20   break;.  }else 
291d0 69 66 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  if( pC->deferred
291e0 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 76 20  Moveto ){.    v 
291f0 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  = pC->movetoTarg
29200 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
29210 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
29220 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69 66 28  ABLE.  }else if(
29230 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
29240 55 52 54 59 50 45 5f 56 54 41 42 20 29 7b 0a 20  URTYPE_VTAB ){. 
29250 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
29260 63 2e 70 56 43 75 72 21 3d 30 20 29 3b 0a 20 20  c.pVCur!=0 );.  
29270 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 75 63    pVtab = pC->uc
29280 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20  .pVCur->pVtab;. 
29290 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74     pModule = pVt
292a0 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
292b0 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
292c0 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->xRowid );.    
292d0 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  rc = pModule->xR
292e0 6f 77 69 64 28 70 43 2d 3e 75 63 2e 70 56 43 75  owid(pC->uc.pVCu
292f0 72 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69  r, &v);.    sqli
29300 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
29310 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
29320 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29330 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
29340 72 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ror;.#endif /* S
29350 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
29360 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c  ALTABLE */.  }el
29370 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
29380 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
29390 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
293a0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
293b0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
293c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
293d0 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
293e0 65 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  e(pC);.    if( r
293f0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
29400 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
29410 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
29420 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
29430 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
29440 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29450 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c     }.    v = sql
29460 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
29470 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  Key(pC->uc.pCurs
29480 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  or);.  }.  pOut-
29490 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
294a0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
294b0 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 20   NullRow P1 * * 
294c0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  * *.**.** Move t
294d0 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  he cursor P1 to 
294e0 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41 6e 79  a null row.  Any
294f0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72 61   OP_Column opera
29500 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6f 63  tions.** that oc
29510 63 75 72 20 77 68 69 6c 65 20 74 68 65 20 63 75  cur while the cu
29520 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65 20 6e  rsor is on the n
29530 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61 6c 77  ull row will alw
29540 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61 20 4e  ays.** write a N
29550 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
29560 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56 64 62  NullRow: {.  Vdb
29570 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
29580 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
29590 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
295a0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
295b0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
295c0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
295d0 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6e  pC!=0 );.  pC->n
295e0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
295f0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
29600 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
29610 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  f( pC->eCurType=
29620 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
29630 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
29640 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
29650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
29660 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
29670 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  C->uc.pCursor);.
29680 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
29690 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 45  /* Opcode: SeekE
296a0 6e 64 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  nd P1 * * * *.**
296b0 0a 2a 2a 20 50 6f 73 69 74 69 6f 6e 20 63 75 72  .** Position cur
296c0 73 6f 72 20 50 31 20 61 74 20 74 68 65 20 65 6e  sor P1 at the en
296d0 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 20 66  d of the btree f
296e0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
296f0 66 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61  f.** appending a
29700 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20   new entry onto 
29710 74 68 65 20 62 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  the btree..**.**
29720 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
29730 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
29740 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
29750 61 70 70 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f  appending and so
29760 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 73 6f  .** if the curso
29770 72 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 6e  r is valid, then
29780 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   the cursor must
29790 20 61 6c 72 65 61 64 79 20 62 65 20 70 6f 69 6e   already be poin
297a0 74 69 6e 67 0a 2a 2a 20 61 74 20 74 68 65 20 65  ting.** at the e
297b0 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 20  nd of the btree 
297c0 61 6e 64 20 73 6f 20 6e 6f 20 63 68 61 6e 67 65  and so no change
297d0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 0a 2a 2a  s are made to.**
297e0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
297f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74 20  /* Opcode: Last 
29800 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
29810 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f  * The next use o
29820 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43  f the Rowid or C
29830 6f 6c 75 6d 6e 20 6f 72 20 50 72 65 76 20 69 6e  olumn or Prev in
29840 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31  struction for P1
29850 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20   .** will refer 
29860 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29870 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
29880 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
29890 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  ..** If the tabl
298a0 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d  e or index is em
298b0 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68  pty and P2>0, th
298c0 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  en jump immediat
298d0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66  ely to P2..** If
298e0 20 50 32 20 69 73 20 30 20 6f 72 20 69 66 20 74   P2 is 0 or if t
298f0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
29900 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  x is not empty, 
29910 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20  fall through.** 
29920 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
29930 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
29940 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
29950 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
29960 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
29970 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20  move in reverse 
29980 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
29990 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68  he end toward th
299a0 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e  e beginning.  In
299b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
299c0 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
299d0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
299e0 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e   Prev, not Next.
299f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
29a00 45 6e 64 3a 0a 63 61 73 65 20 4f 50 5f 4c 61 73  End:.case OP_Las
29a10 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  t: {        /* j
29a20 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
29a30 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
29a40 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
29a50 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
29a60 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
29a70 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
29a80 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
29a90 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
29aa0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
29ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
29ac0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
29ad0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
29ae0 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
29af0 72 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b  rsor;.  res = 0;
29b00 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72  .  assert( pCrsr
29b10 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
29b20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d  LITE_DEBUG.  pC-
29b30 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f  >seekOp = pOp->o
29b40 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  pcode;.#endif.  
29b50 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
29b60 3d 4f 50 5f 53 65 65 6b 45 6e 64 20 29 7b 0a 20  =OP_SeekEnd ){. 
29b70 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
29b80 70 32 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d  p2==0 );.    pC-
29b90 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 2d 31  >seekResult = -1
29ba0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29bb0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
29bc0 6c 69 64 4e 4e 28 70 43 72 73 72 29 20 29 7b 0a  lidNN(pCrsr) ){.
29bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29be0 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71   }.  }.  rc = sq
29bf0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70  lite3BtreeLast(p
29c00 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 70  Crsr, &res);.  p
29c10 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38  C->nullRow = (u8
29c20 29 72 65 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65  )res;.  pC->defe
29c30 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
29c40 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
29c50 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
29c60 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
29c70 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
29c80 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ror;.  if( pOp->
29c90 70 32 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65  p2>0 ){.    Vdbe
29ca0 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
29cb0 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 72  =0,2);.    if( r
29cc0 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  es ) goto jump_t
29cd0 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
29ce0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
29cf0 20 49 66 53 6d 61 6c 6c 65 72 20 50 31 20 50 32   IfSmaller P1 P2
29d00 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 73   P3 * *.**.** Es
29d10 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
29d20 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
29d30 20 74 61 62 6c 65 20 50 31 2e 20 20 4a 75 6d 70   table P1.  Jump
29d40 20 74 6f 20 50 32 20 69 66 20 74 68 61 74 0a 2a   to P2 if that.*
29d50 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 6c 65  * estimate is le
29d60 73 73 20 74 68 61 6e 20 61 70 70 72 6f 78 69 6d  ss than approxim
29d70 61 74 65 6c 79 20 32 2a 2a 28 30 2e 31 2a 50 33  ately 2**(0.1*P3
29d80 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  )..*/.case OP_If
29d90 53 6d 61 6c 6c 65 72 3a 20 7b 20 20 20 20 20 20  Smaller: {      
29da0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
29db0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
29dc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
29dd0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  ;.  int res;.  i
29de0 36 34 20 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74  64 sz;..  assert
29df0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
29e00 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
29e10 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
29e20 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
29e30 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
29e40 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
29e50 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
29e60 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a  ssert( pCrsr );.
29e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29e80 72 65 65 46 69 72 73 74 28 70 43 72 73 72 2c 20  reeFirst(pCrsr, 
29e90 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
29ea0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
29eb0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
29ec0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73   res==0 ){.    s
29ed0 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  z = sqlite3Btree
29ee0 52 6f 77 43 6f 75 6e 74 45 73 74 28 70 43 72 73  RowCountEst(pCrs
29ef0 72 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  r);.    if( ALWA
29f00 59 53 28 73 7a 3e 3d 30 29 20 26 26 20 73 71 6c  YS(sz>=0) && sql
29f10 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
29f20 73 7a 29 3c 70 4f 70 2d 3e 70 33 20 29 20 72 65  sz)<pOp->p3 ) re
29f30 73 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 56 64 62  s = 1;.  }.  Vdb
29f40 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
29f50 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65  !=0,2);.  if( re
29f60 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
29f70 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
29f80 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  ../* Opcode: Sor
29f90 74 65 72 53 6f 72 74 20 50 31 20 50 32 20 2a 20  terSort P1 P2 * 
29fa0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  * *.**.** After 
29fb0 61 6c 6c 20 72 65 63 6f 72 64 73 20 68 61 76 65  all records have
29fc0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
29fd0 6e 74 6f 20 74 68 65 20 53 6f 72 74 65 72 20 6f  nto the Sorter o
29fe0 62 6a 65 63 74 0a 2a 2a 20 69 64 65 6e 74 69 66  bject.** identif
29ff0 69 65 64 20 62 79 20 50 31 2c 20 69 6e 76 6f 6b  ied by P1, invok
2a000 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  e this opcode to
2a010 20 61 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65   actually do the
2a020 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 20 4a 75 6d   sorting..** Jum
2a030 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 72 65  p to P2 if there
2a040 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
2a050 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a  to be sorted..**
2a060 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2a070 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  is an alias for 
2a080 4f 50 5f 53 6f 72 74 20 61 6e 64 20 4f 50 5f 52  OP_Sort and OP_R
2a090 65 77 69 6e 64 20 74 68 61 74 20 69 73 20 75 73  ewind that is us
2a0a0 65 64 0a 2a 2a 20 66 6f 72 20 53 6f 72 74 65 72  ed.** for Sorter
2a0b0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 2f 2a 20   objects..*/./* 
2a0c0 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20  Opcode: Sort P1 
2a0d0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
2a0e0 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
2a0f0 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
2a100 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77   thing as OP_Rew
2a110 69 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 0a  ind except that.
2a120 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73  ** it increments
2a130 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
2a140 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
2a150 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2a160 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67  g..**.** Sorting
2a170 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
2a180 20 62 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f   by writing reco
2a190 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  rds into a sorti
2a1a0 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  ng index,.** the
2a1b0 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74  n rewinding that
2a1c0 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69   index and playi
2a1d0 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20  ng it back from 
2a1e0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
2a1f0 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68 65  end.  We use the
2a200 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20   OP_Sort opcode 
2a210 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65  instead of OP_Re
2a220 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a  wind to do the.*
2a230 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74  * rewinding so t
2a240 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  hat the global v
2a250 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
2a260 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a  incremented and.
2a270 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65  ** regression te
2a280 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e  sts can determin
2a290 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
2a2a0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   the optimizer i
2a2b0 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f  s.** correctly o
2a2c0 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f  ptimizing out so
2a2d0 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rts..*/.case OP_
2a2e0 53 6f 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f  SorterSort:    /
2a2f0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
2a300 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20  P_Sort: {       
2a310 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64   /* jump */.#ifd
2a320 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2a330 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
2a340 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
2a350 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b  _search_count--;
2a360 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f  .#endif.  p->aCo
2a370 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
2a380 54 53 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b  TSTATUS_SORT]++;
2a390 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
2a3a0 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e  gh into OP_Rewin
2a3b0 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65  d */.}./* Opcode
2a3c0 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a  : Rewind P1 P2 *
2a3d0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
2a3e0 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
2a3f0 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
2a400 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
2a410 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
2a420 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
2a430 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2a440 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
2a450 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49  e or index..** I
2a460 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
2a470 6e 64 65 78 20 69 73 20 65 6d 70 74 79 2c 20 6a  ndex is empty, j
2a480 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
2a490 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65  to P2..** If the
2a4a0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2a4b0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61  is not empty, fa
2a4c0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
2a4d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
2a4e0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
2a4f0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
2a500 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
2a510 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d   configured to m
2a520 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f  ove in forward o
2a530 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68  rder,.** from th
2a540 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61  e beginning towa
2a550 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20  rd the end.  In 
2a560 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
2a570 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f   cursor is.** co
2a580 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
2a590 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a  Next, not Prev..
2a5a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e  */.case OP_Rewin
2a5b0 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  d: {        /* j
2a5c0 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
2a5d0 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
2a5e0 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
2a5f0 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
2a600 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2a610 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
2a620 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
2a630 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2a640 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2a650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
2a660 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d  orter(pC)==(pOp-
2a670 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2a680 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73  erSort) );.  res
2a690 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
2a6a0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e  ITE_DEBUG.  pC->
2a6b0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
2a6c0 6e 64 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  nd;.#endif.  if(
2a6d0 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
2a6e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a6f0 33 56 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e  3VdbeSorterRewin
2a700 64 28 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d  d(pC, &res);.  }
2a710 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2a720 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2a730 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2a740 0a 20 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d  .    pCrsr = pC-
2a750 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20  >uc.pCursor;.   
2a760 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29   assert( pCrsr )
2a770 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2a780 65 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72  e3BtreeFirst(pCr
2a790 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70  sr, &res);.    p
2a7a0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2a7b0 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
2a7c0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2a7d0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20  HE_STALE;.  }.  
2a7e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2a7f0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2a800 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
2a810 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73  = (u8)res;.  ass
2a820 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
2a830 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  & pOp->p2<p->nOp
2a840 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
2a850 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
2a860 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74  .  if( res ) got
2a870 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
2a880 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2a890 6f 64 65 3a 20 4e 65 78 74 20 50 31 20 50 32 20  ode: Next P1 P2 
2a8a0 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41  P3 P4 P5.**.** A
2a8b0 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20 50 31  dvance cursor P1
2a8c0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2a8d0 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b  ts to the next k
2a8e0 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20  ey/data pair in 
2a8f0 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  its.** table or 
2a900 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65  index.  If there
2a910 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79   are no more key
2a920 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65  /value pairs the
2a930 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  n fall through.*
2a940 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
2a950 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ng instruction. 
2a960 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73   But if the curs
2a970 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73 20 73  or advance was s
2a980 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75  uccessful,.** ju
2a990 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
2a9a0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o P2..**.** The 
2a9b0 4e 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f  Next opcode is o
2a9c0 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f 77  nly valid follow
2a9d0 69 6e 67 20 61 6e 20 53 65 65 6b 47 54 2c 20 53  ing an SeekGT, S
2a9e0 65 65 6b 47 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f  eekGE, or.** OP_
2a9f0 52 65 77 69 6e 64 20 6f 70 63 6f 64 65 20 75 73  Rewind opcode us
2aa00 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
2aa10 68 65 20 63 75 72 73 6f 72 2e 20 20 4e 65 78 74  he cursor.  Next
2aa20 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a   is not allowed.
2aa30 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65  ** to follow See
2aa40 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 20  kLT, SeekLE, or 
2aa50 4f 50 5f 4c 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  OP_Last..**.** T
2aa60 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
2aa70 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
2aa80 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
2aa90 75 64 6f 2d 74 61 62 6c 65 2e 20 20 50 31 20 6d  udo-table.  P1 m
2aaa0 75 73 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ust have.** been
2aab0 20 6f 70 65 6e 65 64 20 70 72 69 6f 72 20 74 6f   opened prior to
2aac0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 6f 72 20   this opcode or 
2aad0 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 6c 6c  the program will
2aae0 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a   segfault..**.**
2aaf0 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69 73   The P3 value is
2ab00 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62   a hint to the b
2ab10 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2ab20 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74  ion. If P3==1, t
2ab30 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20  hat.** means P1 
2ab40 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  is an SQL index 
2ab50 61 6e 64 20 74 68 61 74 20 74 68 69 73 20 69 6e  and that this in
2ab60 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20  struction could 
2ab70 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69  have been.** omi
2ab80 74 74 65 64 20 69 66 20 74 68 61 74 20 69 6e 64  tted if that ind
2ab90 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71  ex had been uniq
2aba0 75 65 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c  ue.  P3 is usual
2abb0 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20  ly 0.  P3 is.** 
2abc0 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 30 20  always either 0 
2abd0 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  or 1..**.** P4 i
2abe0 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65  s always of type
2abf0 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65   P4_ADVANCE. The
2ac00 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
2ac10 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73  r points to.** s
2ac20 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ac30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  )..**.** If P5 i
2ac40 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
2ac50 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
2ac60 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
2ac70 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
2ac80 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
2ac90 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
2aca0 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
2acb0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72  .** See also: Pr
2acc0 65 76 2c 20 4e 65 78 74 49 66 4f 70 65 6e 0a 2a  ev, NextIfOpen.*
2acd0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78  /./* Opcode: Nex
2ace0 74 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33  tIfOpen P1 P2 P3
2acf0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
2ad00 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a  s opcode works j
2ad10 75 73 74 20 6c 69 6b 65 20 4e 65 78 74 20 65 78  ust like Next ex
2ad20 63 65 70 74 20 74 68 61 74 20 69 66 20 63 75 72  cept that if cur
2ad30 73 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a  sor P1 is not.**
2ad40 20 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 73   open it behaves
2ad50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20   a no-op..*/./* 
2ad60 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20  Opcode: Prev P1 
2ad70 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
2ad80 2a 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72  * Back up cursor
2ad90 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
2ada0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65  oints to the pre
2adb0 76 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70  vious key/data p
2adc0 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61  air in its.** ta
2add0 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49  ble or index.  I
2ade0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  f there is no pr
2adf0 65 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65  evious key/value
2ae00 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
2ae10 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
2ae20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
2ae30 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
2ae40 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63  f the cursor bac
2ae50 6b 75 70 20 77 61 73 20 73 75 63 63 65 73 73 66  kup was successf
2ae60 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65  ul,.** jump imme
2ae70 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
2ae80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 72 65 76  *.**.** The Prev
2ae90 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
2aea0 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  valid following 
2aeb0 61 6e 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c  an SeekLT, SeekL
2aec0 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74  E, or.** OP_Last
2aed0 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20   opcode used to 
2aee0 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
2aef0 73 6f 72 2e 20 20 50 72 65 76 20 69 73 20 6e 6f  sor.  Prev is no
2af00 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  t allowed.** to 
2af10 66 6f 6c 6c 6f 77 20 53 65 65 6b 47 54 2c 20 53  follow SeekGT, S
2af20 65 65 6b 47 45 2c 20 6f 72 20 4f 50 5f 52 65 77  eekGE, or OP_Rew
2af30 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ind..**.** The P
2af40 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
2af50 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c   for a real tabl
2af60 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d  e, not a pseudo-
2af70 74 61 62 6c 65 2e 20 20 49 66 20 50 31 20 69 73  table.  If P1 is
2af80 0a 2a 2a 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  .** not open the
2af90 6e 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69  n the behavior i
2afa0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
2afb0 2a 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20  ** The P3 value 
2afc0 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2afd0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2afe0 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c  ation. If P3==1,
2aff0 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50   that.** means P
2b000 31 20 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65  1 is an SQL inde
2b010 78 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20  x and that this 
2b020 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c  instruction coul
2b030 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f  d have been.** o
2b040 6d 69 74 74 65 64 20 69 66 20 74 68 61 74 20 69  mitted if that i
2b050 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e  ndex had been un
2b060 69 71 75 65 2e 20 20 50 33 20 69 73 20 75 73 75  ique.  P3 is usu
2b070 61 6c 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a  ally 0.  P3 is.*
2b080 2a 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  * always either 
2b090 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  0 or 1..**.** P4
2b0a0 20 69 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79   is always of ty
2b0b0 70 65 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54  pe P4_ADVANCE. T
2b0c0 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
2b0d0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
2b0e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2b0f0 76 69 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  vious()..**.** I
2b100 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
2b110 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
2b120 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
2b130 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
2b140 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
2b150 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
2b160 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
2b170 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ed..*/./* Opcode
2b180 3a 20 50 72 65 76 49 66 4f 70 65 6e 20 50 31 20  : PrevIfOpen P1 
2b190 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
2b1a0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
2b1b0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 50 72  rks just like Pr
2b1c0 65 76 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ev except that i
2b1d0 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e  f cursor P1 is n
2b1e0 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65  ot.** open it be
2b1f0 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  haves a no-op..*
2b200 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
2b210 74 65 72 4e 65 78 74 20 50 31 20 50 32 20 2a 20  terNext P1 P2 * 
2b220 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  * P5.**.** This 
2b230 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73  opcode works jus
2b240 74 20 6c 69 6b 65 20 4f 50 5f 4e 65 78 74 20 65  t like OP_Next e
2b250 78 63 65 70 74 20 74 68 61 74 20 50 31 20 6d 75  xcept that P1 mu
2b260 73 74 20 62 65 20 61 0a 2a 2a 20 73 6f 72 74 65  st be a.** sorte
2b270 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69  r object for whi
2b280 63 68 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  ch the OP_Sorter
2b290 53 6f 72 74 20 6f 70 63 6f 64 65 20 68 61 73 20  Sort opcode has 
2b2a0 62 65 65 6e 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e  been.** invoked.
2b2b0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 61 64    This opcode ad
2b2c0 76 61 6e 63 65 73 20 74 68 65 20 63 75 72 73 6f  vances the curso
2b2d0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 6f  r to the next so
2b2e0 72 74 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2c 20  rted.** record, 
2b2f0 6f 72 20 6a 75 6d 70 73 20 74 6f 20 50 32 20 69  or jumps to P2 i
2b300 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
2b310 6f 72 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  ore sorted recor
2b320 64 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ds..*/.case OP_S
2b330 6f 72 74 65 72 4e 65 78 74 3a 20 7b 20 20 2f 2a  orterNext: {  /*
2b340 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
2b350 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 43  ursor *pC;..  pC
2b360 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2b370 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2b380 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
2b390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2b3a0 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
2b3b0 20 70 43 29 3b 0a 20 20 67 6f 74 6f 20 6e 65 78   pC);.  goto nex
2b3c0 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 4f 50 5f  t_tail;.case OP_
2b3d0 50 72 65 76 49 66 4f 70 65 6e 3a 20 20 20 20 2f  PrevIfOpen:    /
2b3e0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
2b3f0 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 20 20 20  P_NextIfOpen:   
2b400 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66   /* jump */.  if
2b410 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
2b420 70 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  p1]==0 ) break;.
2b430 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
2b440 68 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 65  h */.case OP_Pre
2b450 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  v:          /* j
2b460 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  ump */.case OP_N
2b470 65 78 74 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  ext:          /*
2b480 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
2b490 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
2b4a0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
2b4b0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
2b4c0 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 79 53 69   pOp->p5<ArraySi
2b4d0 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20  ze(p->aCounter) 
2b4e0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2b4f0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2b500 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2b510 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
2b520 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
2b530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2b540 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2b550 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
2b560 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2b570 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f  e!=OP_Next || pO
2b580 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
2b590 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2b5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2b5b0 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
2b5c0 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  ev || pOp->p4.xA
2b5d0 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
2b5e0 74 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b 0a  treePrevious );.
2b5f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2b600 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66  pcode!=OP_NextIf
2b610 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  Open || pOp->p4.
2b620 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65  xAdvance==sqlite
2b630 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20  3BtreeNext );.  
2b640 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2b650 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70  ode!=OP_PrevIfOp
2b660 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  en || pOp->p4.xA
2b670 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
2b680 74 72 65 65 50 72 65 76 69 6f 75 73 29 3b 0a 0a  treePrevious);..
2b690 20 20 2f 2a 20 54 68 65 20 4e 65 78 74 20 6f 70    /* The Next op
2b6a0 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  code is only use
2b6b0 64 20 61 66 74 65 72 20 53 65 65 6b 47 54 2c 20  d after SeekGT, 
2b6c0 53 65 65 6b 47 45 2c 20 61 6e 64 20 52 65 77 69  SeekGE, and Rewi
2b6d0 6e 64 2e 0a 20 20 2a 2a 20 54 68 65 20 50 72 65  nd..  ** The Pre
2b6e0 76 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  v opcode is only
2b6f0 20 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b   used after Seek
2b700 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 61 6e 64 20  LT, SeekLE, and 
2b710 4c 61 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  Last. */.  asser
2b720 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  t( pOp->opcode!=
2b730 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e  OP_Next || pOp->
2b740 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49  opcode!=OP_NextI
2b750 66 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20  fOpen.       || 
2b760 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53  pC->seekOp==OP_S
2b770 65 65 6b 47 54 20 7c 7c 20 70 43 2d 3e 73 65 65  eekGT || pC->see
2b780 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a 20  kOp==OP_SeekGE. 
2b790 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2b7a0 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 7c  kOp==OP_Rewind |
2b7b0 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50  | pC->seekOp==OP
2b7c0 5f 46 6f 75 6e 64 29 3b 0a 20 20 61 73 73 65 72  _Found);.  asser
2b7d0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  t( pOp->opcode!=
2b7e0 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e  OP_Prev || pOp->
2b7f0 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49  opcode!=OP_PrevI
2b800 66 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20  fOpen.       || 
2b810 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53  pC->seekOp==OP_S
2b820 65 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e 73 65 65  eekLT || pC->see
2b830 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20  kOp==OP_SeekLE. 
2b840 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2b850 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a  kOp==OP_Last );.
2b860 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70 34 2e  .  rc = pOp->p4.
2b870 78 41 64 76 61 6e 63 65 28 70 43 2d 3e 75 63 2e  xAdvance(pC->uc.
2b880 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 33  pCursor, pOp->p3
2b890 29 3b 0a 6e 65 78 74 5f 74 61 69 6c 3a 0a 20 20  );.next_tail:.  
2b8a0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
2b8b0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
2b8c0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
2b8d0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c 32  (rc==SQLITE_OK,2
2b8e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2b8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
2b900 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
2b910 20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70     p->aCounter[p
2b920 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64 65  Op->p5]++;.#ifde
2b930 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2b940 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
2b950 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
2b960 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
2b970 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66  o_p2_and_check_f
2b980 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20  or_interrupt;.  
2b990 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
2b9a0 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61  TE_DONE ) goto a
2b9b0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2b9c0 72 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  r;.  rc = SQLITE
2b9d0 5f 4f 4b 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  _OK;.  pC->nullR
2b9e0 6f 77 20 3d 20 31 3b 0a 20 20 67 6f 74 6f 20 63  ow = 1;.  goto c
2b9f0 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
2ba00 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  pt;.}../* Opcode
2ba10 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50  : IdxInsert P1 P
2ba20 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2ba30 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32  nopsis: key=r[P2
2ba40 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ].**.** Register
2ba50 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c   P2 holds an SQL
2ba60 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20   index key made 
2ba70 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b  using the.** Mak
2ba80 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74  eRecord instruct
2ba90 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f  ions.  This opco
2baa0 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b  de writes that k
2bab0 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69  ey.** into the i
2bac0 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66  ndex P1.  Data f
2bad0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  or the entry is 
2bae0 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  nil..**.** If P4
2baf0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
2bb00 65 6e 20 69 74 20 69 73 20 74 68 65 20 6e 75 6d  en it is the num
2bb10 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e  ber of values in
2bb20 20 74 68 65 20 75 6e 70 61 63 6b 65 64 0a 2a 2a   the unpacked.**
2bb30 20 6b 65 79 20 6f 66 20 72 65 67 28 50 32 29 2e   key of reg(P2).
2bb40 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
2bb50 50 33 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P3 is the index 
2bb60 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
2bb70 69 73 74 65 72 0a 2a 2a 20 66 6f 72 20 74 68 65  ister.** for the
2bb80 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 2e 20 20   unpacked key.  
2bb90 54 68 65 20 61 76 61 69 6c 61 62 69 6c 69 74 79  The availability
2bba0 20 6f 66 20 74 68 65 20 75 6e 70 61 63 6b 65 64   of the unpacked
2bbb0 20 6b 65 79 20 63 61 6e 20 73 6f 6d 65 74 69 6d   key can sometim
2bbc0 65 73 0a 2a 2a 20 62 65 20 61 6e 20 6f 70 74 69  es.** be an opti
2bbd0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
2bbe0 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50  If P5 has the OP
2bbf0 46 4c 41 47 5f 41 50 50 45 4e 44 20 62 69 74 20  FLAG_APPEND bit 
2bc00 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
2bc10 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72 65  int to the b-tre
2bc20 65 20 6c 61 79 65 72 0a 2a 2a 20 74 68 61 74 20  e layer.** that 
2bc30 74 68 69 73 20 69 6e 73 65 72 74 20 69 73 20 6c  this insert is l
2bc40 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61  ikely to be an a
2bc50 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ppend..**.** If 
2bc60 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41  P5 has the OPFLA
2bc70 47 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 73 65  G_NCHANGE bit se
2bc80 74 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  t, then the chan
2bc90 67 65 20 63 6f 75 6e 74 65 72 20 69 73 0a 2a 2a  ge counter is.**
2bca0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
2bcb0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
2bcc0 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  .  If the OPFLAG
2bcd0 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 69 73 20  _NCHANGE bit is 
2bce0 63 6c 65 61 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  clear,.** then t
2bcf0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
2bd00 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  r is unchanged..
2bd10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
2bd20 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
2bd30 54 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20  T flag of P5 is 
2bd40 73 65 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  set, the impleme
2bd50 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a  ntation might.**
2bd60 20 72 75 6e 20 66 61 73 74 65 72 20 62 79 20 61   run faster by a
2bd70 76 6f 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63  voiding an unnec
2bd80 65 73 73 61 72 79 20 73 65 65 6b 20 6f 6e 20 63  essary seek on c
2bd90 75 72 73 6f 72 20 50 31 2e 20 20 48 6f 77 65 76  ursor P1.  Howev
2bda0 65 72 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41  er,.** the OPFLA
2bdb0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  G_USESEEKRESULT 
2bdc0 66 6c 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62  flag must only b
2bdd0 65 20 73 65 74 20 69 66 20 74 68 65 72 65 20 68  e set if there h
2bde0 61 76 65 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f  ave been no prio
2bdf0 72 0a 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68  r.** seeks on th
2be00 65 20 63 75 72 73 6f 72 20 6f 72 20 69 66 20 74  e cursor or if t
2be10 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
2be20 65 65 6b 20 75 73 65 64 20 61 20 6b 65 79 20 65  eek used a key e
2be30 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20  quivalent.** to 
2be40 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  P2. .**.** This 
2be50 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79  instruction only
2be60 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63   works for indic
2be70 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
2be80 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
2be90 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73  ** for tables is
2bea0 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f   OP_Insert..*/./
2beb0 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
2bec0 49 6e 73 65 72 74 20 50 31 20 50 32 20 2a 20 2a  Insert P1 P2 * *
2bed0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2bee0 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  key=r[P2].**.** 
2bef0 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64  Register P2 hold
2bf00 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b  s an SQL index k
2bf10 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ey made using th
2bf20 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20  e.** MakeRecord 
2bf30 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54  instructions.  T
2bf40 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65  his opcode write
2bf50 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e  s that key.** in
2bf60 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 50 31  to the sorter P1
2bf70 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  .  Data for the 
2bf80 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f  entry is nil..*/
2bf90 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 49  .case OP_SorterI
2bfa0 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a 20  nsert:       /* 
2bfb0 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  in2 */.case OP_I
2bfc0 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
2bfd0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
2bfe0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
2bff0 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b   BtreePayload x;
2c000 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2c010 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2c020 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2c030 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2c040 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 73 71 6c 69  pOp->p1];.  sqli
2c050 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
2c060 43 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a  Counter(p, pC);.
2c070 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2c080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
2c090 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d  orter(pC)==(pOp-
2c0a0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2c0b0 65 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20 70  erInsert) );.  p
2c0c0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
2c0d0 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
2c0e0 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
2c0f0 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20  M_Blob );.  if( 
2c100 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
2c110 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
2c120 68 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72  hange++;.  asser
2c130 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2c140 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c  =CURTYPE_BTREE |
2c150 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2c160 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29  P_SorterInsert )
2c170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2c180 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
2c190 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
2c1a0 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63 20  pIn2);.  if( rc 
2c1b0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2c1c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
2c1d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2c1e0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 7b  _SorterInsert ){
2c1f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c200 33 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65  3VdbeSorterWrite
2c210 28 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65  (pC, pIn2);.  }e
2c220 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20  lse{.    x.nKey 
2c230 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78  = pIn2->n;.    x
2c240 2e 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b  .pKey = pIn2->z;
2c250 0a 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d  .    x.aMem = aM
2c260 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  em + pOp->p3;.  
2c270 20 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29    x.nMem = (u16)
2c280 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72  pOp->p4.i;.    r
2c290 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2c2a0 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43  Insert(pC->uc.pC
2c2b0 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20  ursor, &x,.     
2c2c0 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28      (pOp->p5 & (
2c2d0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50  OPFLAG_APPEND|OP
2c2e0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
2c2f0 4e 29 29 2c 20 0a 20 20 20 20 20 20 20 20 28 28  N)), .        ((
2c300 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
2c310 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20  _USESEEKRESULT) 
2c320 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  ? pC->seekResult
2c330 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b   : 0).        );
2c340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
2c350 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2c360 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61  =0 );.    pC->ca
2c370 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2c380 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69  E_STALE;.  }.  i
2c390 66 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f 72  f( rc) goto abor
2c3a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2c3b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2c3c0 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65  pcode: IdxDelete
2c3d0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2c3e0 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
2c3f0 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68  [P2@P3].**.** Th
2c400 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20  e content of P3 
2c410 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
2c420 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50  ng at register P
2c430 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70  2 form.** an unp
2c440 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
2c450 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d   This opcode rem
2c460 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20  oves that entry 
2c470 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64  from the .** ind
2c480 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72  ex opened by cur
2c490 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20  sor P1..*/.case 
2c4a0 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a  OP_IdxDelete: {.
2c4b0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2c4c0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
2c4d0 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
2c4e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2c4f0 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   r;..  assert( p
2c500 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73  Op->p3>0 );.  as
2c510 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
2c520 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
2c530 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
2c540 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29   p->nCursor)+1 )
2c550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2c560 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2c570 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2c580 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2c590 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2c5a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2c5b0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2c5c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2c5d0 45 45 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  EE );.  sqlite3V
2c5e0 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
2c5f0 74 65 72 28 70 2c 20 70 43 29 3b 0a 20 20 70 43  ter(p, pC);.  pC
2c600 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
2c610 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
2c620 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20 61 73  pCrsr!=0 );.  as
2c630 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30  sert( pOp->p5==0
2c640 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f   );.  r.pKeyInfo
2c650 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
2c660 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75  .  r.nField = (u
2c670 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e  16)pOp->p3;.  r.
2c680 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
2c690 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
2c6a0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72 63 20  [pOp->p2];.  rc 
2c6b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2c6c0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72  vetoUnpacked(pCr
2c6d0 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72  sr, &r, 0, 0, &r
2c6e0 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
2c6f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2c700 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72  o_error;.  if( r
2c710 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  es==0 ){.    rc 
2c720 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  = sqlite3BtreeDe
2c730 6c 65 74 65 28 70 43 72 73 72 2c 20 42 54 52 45  lete(pCrsr, BTRE
2c740 45 5f 41 55 58 44 45 4c 45 54 45 29 3b 0a 20 20  E_AUXDELETE);.  
2c750 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c760 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2c770 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  or;.  }.  assert
2c780 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
2c790 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 2d  veto==0 );.  pC-
2c7a0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
2c7b0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43  ACHE_STALE;.  pC
2c7c0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30  ->seekResult = 0
2c7d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2c7e0 20 4f 70 63 6f 64 65 3a 20 44 65 66 65 72 72 65   Opcode: Deferre
2c7f0 64 53 65 65 6b 20 50 31 20 2a 20 50 33 20 50 34  dSeek P1 * P3 P4
2c800 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2c810 4d 6f 76 65 20 50 33 20 74 6f 20 50 31 2e 72 6f  Move P3 to P1.ro
2c820 77 69 64 20 69 66 20 6e 65 65 64 65 64 0a 2a 2a  wid if needed.**
2c830 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70 65  .** P1 is an ope
2c840 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 61  n index cursor a
2c850 6e 64 20 50 33 20 69 73 20 61 20 63 75 72 73 6f  nd P3 is a curso
2c860 72 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  r on the corresp
2c870 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e  onding.** table.
2c880 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f    This opcode do
2c890 65 73 20 61 20 64 65 66 65 72 72 65 64 20 73 65  es a deferred se
2c8a0 65 6b 20 6f 66 20 74 68 65 20 50 33 20 74 61 62  ek of the P3 tab
2c8b0 6c 65 20 63 75 72 73 6f 72 0a 2a 2a 20 74 6f 20  le cursor.** to 
2c8c0 74 68 65 20 72 6f 77 20 74 68 61 74 20 63 6f 72  the row that cor
2c8d0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2c8e0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 50  current row of P
2c8f0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  1..**.** This is
2c900 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65 6b   a deferred seek
2c910 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61  .  Nothing actua
2c920 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69  lly happens unti
2c930 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  l.** the cursor 
2c940 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
2c950 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20  a record.  That 
2c960 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73  way, if no reads
2c970 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e  .** occur, no un
2c980 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61  necessary I/O ha
2c990 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ppens..**.** P4 
2c9a0 6d 61 79 20 62 65 20 61 6e 20 61 72 72 61 79 20  may be an array 
2c9b0 6f 66 20 69 6e 74 65 67 65 72 73 20 28 74 79 70  of integers (typ
2c9c0 65 20 50 34 5f 49 4e 54 41 52 52 41 59 29 20 63  e P4_INTARRAY) c
2c9d0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
2c9e0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
2c9f0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 50 33  column in the P3
2ca00 20 74 61 62 6c 65 2e 20 20 49 66 20 61 72 72 61   table.  If arra
2ca10 79 20 65 6e 74 72 79 20 61 28 69 29 0a 2a 2a 20  y entry a(i).** 
2ca20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2ca30 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e  n reading column
2ca40 20 61 28 69 29 2d 31 20 66 72 6f 6d 20 63 75 72   a(i)-1 from cur
2ca50 73 6f 72 20 50 33 20 69 73 20 0a 2a 2a 20 65 71  sor P3 is .** eq
2ca60 75 69 76 61 6c 65 6e 74 20 74 6f 20 70 65 72 66  uivalent to perf
2ca70 6f 72 6d 69 6e 67 20 74 68 65 20 64 65 66 65 72  orming the defer
2ca80 72 65 64 20 73 65 65 6b 20 61 6e 64 20 74 68 65  red seek and the
2ca90 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e  n reading column
2caa0 20 69 20 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e 20   i .** from P1. 
2cab0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2cac0 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  n is stored in P
2cad0 33 20 61 6e 64 20 75 73 65 64 20 74 6f 20 72 65  3 and used to re
2cae0 64 69 72 65 63 74 0a 2a 2a 20 72 65 61 64 73 20  direct.** reads 
2caf0 61 67 61 69 6e 73 74 20 50 33 20 6f 76 65 72 20  against P3 over 
2cb00 74 6f 20 50 31 2c 20 74 68 75 73 20 70 6f 73 73  to P1, thus poss
2cb10 69 62 6c 79 20 61 76 6f 69 64 69 6e 67 20 74 68  ibly avoiding th
2cb20 65 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 73 65 65  e need to.** see
2cb30 6b 20 61 6e 64 20 72 65 61 64 20 63 75 72 73 6f  k and read curso
2cb40 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  r P3..*/./* Opco
2cb50 64 65 3a 20 49 64 78 52 6f 77 69 64 20 50 31 20  de: IdxRowid P1 
2cb60 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
2cb70 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
2cb80 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  d.**.** Write in
2cb90 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61  to register P2 a
2cba0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
2cbb0 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2cbc0 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  y in the record 
2cbd0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  at.** the end of
2cbe0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70   the index key p
2cbf0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72  ointed to by cur
2cc00 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e  sor P1.  This in
2cc10 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a  teger should be.
2cc20 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ** the rowid of 
2cc30 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
2cc40 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e  to which this in
2cc50 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  dex entry points
2cc60 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2cc70 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63  : Rowid, MakeRec
2cc80 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ord..*/.case OP_
2cc90 44 65 66 65 72 72 65 64 53 65 65 6b 3a 0a 63 61  DeferredSeek:.ca
2cca0 73 65 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20  se OP_IdxRowid: 
2ccb0 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  {           /* o
2ccc0 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ut2 */.  VdbeCur
2ccd0 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20 20  sor *pC;        
2cce0 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 69       /* The P1 i
2ccf0 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ndex cursor */. 
2cd00 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 54 61   VdbeCursor *pTa
2cd10 62 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  bCur;        /* 
2cd20 54 68 65 20 50 32 20 74 61 62 6c 65 20 63 75 72  The P2 table cur
2cd30 73 6f 72 20 28 4f 50 5f 44 65 66 65 72 72 65 64  sor (OP_Deferred
2cd40 53 65 65 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20  Seek only) */.  
2cd50 69 36 34 20 72 6f 77 69 64 3b 20 20 20 20 20 20  i64 rowid;      
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2cd70 6f 77 69 64 20 74 68 61 74 20 50 31 20 63 75 72  owid that P1 cur
2cd80 72 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 2a  rent points to *
2cd90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
2cda0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2cdb0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2cdc0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2cdd0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2cde0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
2cdf0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2ce00 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2ce10 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
2ce20 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
2ce30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ce40 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
2ce50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2ce60 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2ce70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
2ce80 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70  pC->nullRow || p
2ce90 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2cea0 64 78 52 6f 77 69 64 20 29 3b 0a 0a 20 20 2f 2a  dxRowid );..  /*
2ceb0 20 54 68 65 20 49 64 78 52 6f 77 69 64 20 61 6e   The IdxRowid an
2cec0 64 20 53 65 65 6b 20 6f 70 63 6f 64 65 73 20 61  d Seek opcodes a
2ced0 72 65 20 63 6f 6d 62 69 6e 65 64 20 62 65 63 61  re combined beca
2cee0 75 73 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  use of the commo
2cef0 6e 61 6c 69 74 79 0a 20 20 2a 2a 20 6f 66 20 73  nality.  ** of s
2cf00 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
2cf10 52 65 73 74 6f 72 65 28 29 20 61 6e 64 20 73 71  Restore() and sq
2cf20 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
2cf30 64 28 29 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d(). */.  rc = s
2cf40 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
2cf50 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 0a 20 20  Restore(pC);..  
2cf60 2f 2a 20 73 71 6c 69 74 65 33 56 62 65 43 75 72  /* sqlite3VbeCur
2cf70 73 6f 72 52 65 73 74 6f 72 65 28 29 20 63 61 6e  sorRestore() can
2cf80 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 74 68   only fail if th
2cf90 65 20 72 65 63 6f 72 64 20 68 61 73 20 62 65 65  e record has bee
2cfa0 6e 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 6f  n deleted.  ** o
2cfb0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
2cfc0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 61 74 20  e cursor.  That 
2cfd0 77 69 6c 6c 20 6e 65 76 65 72 20 68 61 70 70 65  will never happe
2cfe0 6e 73 20 66 6f 72 20 61 6e 20 49 64 78 52 6f 77  ns for an IdxRow
2cff0 69 64 0a 20 20 2a 2a 20 6f 72 20 53 65 65 6b 20  id.  ** or Seek 
2d000 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  opcode */.  if( 
2d010 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
2d020 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  _OK) ) goto abor
2d030 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2d040 0a 20 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c  .  if( !pC->null
2d050 52 6f 77 20 29 7b 0a 20 20 20 20 72 6f 77 69 64  Row ){.    rowid
2d060 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
2d070 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64  eded.  Only used
2d080 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61   to silence a wa
2d090 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  rning. */.    rc
2d0a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
2d0b0 78 52 6f 77 69 64 28 64 62 2c 20 70 43 2d 3e 75  xRowid(db, pC->u
2d0c0 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 6f 77 69  c.pCursor, &rowi
2d0d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
2d0e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d0f0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
2d100 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
2d110 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  }.    if( pOp->o
2d120 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 66 65 72 72  pcode==OP_Deferr
2d130 65 64 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20  edSeek ){.      
2d140 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
2d150 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d  =0 && pOp->p3<p-
2d160 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >nCursor );.    
2d170 20 20 70 54 61 62 43 75 72 20 3d 20 70 2d 3e 61    pTabCur = p->a
2d180 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  pCsr[pOp->p3];. 
2d190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2d1a0 62 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  bCur!=0 );.     
2d1b0 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2d1c0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2d1d0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  YPE_BTREE );.   
2d1e0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43     assert( pTabC
2d1f0 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  ur->uc.pCursor!=
2d200 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2d210 74 28 20 70 54 61 62 43 75 72 2d 3e 69 73 54 61  t( pTabCur->isTa
2d220 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ble );.      pTa
2d230 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  bCur->nullRow = 
2d240 30 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  0;.      pTabCur
2d250 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d  ->movetoTarget =
2d260 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70 54   rowid;.      pT
2d270 61 62 43 75 72 2d 3e 64 65 66 65 72 72 65 64 4d  abCur->deferredM
2d280 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20 20 20 20  oveto = 1;.     
2d290 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
2d2a0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41  type==P4_INTARRA
2d2b0 59 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 61 69 3d  Y || pOp->p4.ai=
2d2c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
2d2d0 43 75 72 2d 3e 61 41 6c 74 4d 61 70 20 3d 20 70  Cur->aAltMap = p
2d2e0 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
2d2f0 20 70 54 61 62 43 75 72 2d 3e 70 41 6c 74 43 75   pTabCur->pAltCu
2d300 72 73 6f 72 20 3d 20 70 43 3b 0a 20 20 20 20 7d  rsor = pC;.    }
2d310 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 75 74  else{.      pOut
2d320 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
2d330 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  e(p, pOp);.     
2d340 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77   pOut->u.i = row
2d350 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  id;.    }.  }els
2d360 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2d370 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2d380 64 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 73  dxRowid );.    s
2d390 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2d3a0 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Null(&aMem[pOp->
2d3b0 70 32 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  p2]);.  }.  brea
2d3c0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2d3d0 20 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20   IdxGE P1 P2 P3 
2d3e0 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
2d3f0 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
2d400 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
2d410 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
2d420 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
2d430 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
2d440 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
2d450 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49  at omits the PRI
2d460 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61  MARY KEY.  Compa
2d470 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2d480 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  e against the in
2d490 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20  dex .** that P1 
2d4a0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2d4b0 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2d4c0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2d4d0 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20  EY or ROWID .** 
2d4e0 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e  fields at the en
2d4f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2d500 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2d510 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
2d520 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
2d530 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e  ey value.** then
2d540 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74   jump to P2.  Ot
2d550 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2d560 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2d570 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2d580 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47  ./* Opcode: IdxG
2d590 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  T P1 P2 P3 P4 P5
2d5a0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2d5b0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2d5c0 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2d5d0 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2d5e0 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2d5f0 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2d600 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2d610 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2d620 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68  KEY.  Compare th
2d630 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61  is key value aga
2d640 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a  inst the index .
2d650 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ** that P1 is cu
2d660 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2d670 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2d680 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2d690 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64   ROWID .** field
2d6a0 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  s at the end..**
2d6b0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2d6c0 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65  dex entry is gre
2d6d0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65  ater than the ke
2d6e0 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20  y value.** then 
2d6f0 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68  jump to P2.  Oth
2d700 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2d710 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2d720 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2d730 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54  /* Opcode: IdxLT
2d740 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2d750 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2d760 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2d770 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2d780 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2d790 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2d7a0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2d7b0 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2d7c0 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2d7d0 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2d7e0 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2d7f0 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2d800 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2d810 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2d820 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2d830 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2d840 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2d850 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2d860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2d870 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2d880 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b   less than the k
2d890 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75  ey value then ju
2d8a0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68  mp to P2..** Oth
2d8b0 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2d8c0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2d8d0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2d8e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 45  /* Opcode: IdxLE
2d8f0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2d900 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2d910 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2d920 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2d930 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2d940 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2d950 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2d960 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2d970 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2d980 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2d990 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2d9a0 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2d9b0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2d9c0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2d9d0 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2d9e0 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2d9f0 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2da00 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2da10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2da20 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2da30 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2da40 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
2da50 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 0a 2a  alue then jump.*
2da60 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69  * to P2. Otherwi
2da70 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2da80 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2da90 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
2daa0 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20 20 20   OP_IdxLE:      
2dab0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2dac0 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20 20 20  ase OP_IdxGT:   
2dad0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2dae0 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a  /.case OP_IdxLT:
2daf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
2db00 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  p */.case OP_Idx
2db10 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f 2a 20  GE:  {       /* 
2db20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
2db30 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
2db40 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  res;.  UnpackedR
2db50 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65  ecord r;..  asse
2db60 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2db70 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2db80 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2db90 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2dba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2dbb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2dbc0 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a  C->isOrdered );.
2dbd0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2dbe0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2dbf0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
2dc00 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
2dc10 72 21 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  r!=0);.  assert(
2dc20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2dc30 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
2dc40 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
2dc50 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
2dc60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2dc70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
2dc80 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  );.  r.pKeyInfo 
2dc90 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
2dca0 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31    r.nField = (u1
2dcb0 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 69  6)pOp->p4.i;.  i
2dcc0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f  f( pOp->opcode<O
2dcd0 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 61  P_IdxLT ){.    a
2dce0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2dcf0 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20  de==OP_IdxLE || 
2dd00 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2dd10 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 2e 64  IdxGT );.    r.d
2dd20 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a  efault_rc = -1;.
2dd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2dd40 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2dd50 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f  ==OP_IdxGE || pO
2dd60 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2dd70 78 4c 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66  xLT );.    r.def
2dd80 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 7d  ault_rc = 0;.  }
2dd90 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65  .  r.aMem = &aMe
2dda0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
2ddb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ddc0 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
2ddd0 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
2dde0 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
2ddf0 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
2de00 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
2de10 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4e    res = 0;  /* N
2de20 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79  ot needed.  Only
2de30 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65   used to silence
2de40 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
2de50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2de60 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 64  eIdxKeyCompare(d
2de70 62 2c 20 70 43 2c 20 26 72 2c 20 26 72 65 73 29  b, pC, &r, &res)
2de80 3b 0a 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f  ;.  assert( (OP_
2de90 49 64 78 4c 45 26 31 29 3d 3d 28 4f 50 5f 49 64  IdxLE&1)==(OP_Id
2dea0 78 4c 54 26 31 29 20 26 26 20 28 4f 50 5f 49 64  xLT&1) && (OP_Id
2deb0 78 47 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 47  xGE&1)==(OP_IdxG
2dec0 54 26 31 29 20 29 3b 0a 20 20 69 66 28 20 28 70  T&1) );.  if( (p
2ded0 4f 70 2d 3e 6f 70 63 6f 64 65 26 31 29 3d 3d 28  Op->opcode&1)==(
2dee0 4f 50 5f 49 64 78 4c 54 26 31 29 20 29 7b 0a 20  OP_IdxLT&1) ){. 
2def0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2df00 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45  opcode==OP_IdxLE
2df10 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2df20 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
2df30 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 7d   res = -res;.  }
2df40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2df50 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2df60 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxGE || pOp->
2df70 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54  opcode==OP_IdxGT
2df80 20 29 3b 0a 20 20 20 20 72 65 73 2b 2b 3b 0a 20   );.    res++;. 
2df90 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54   }.  VdbeBranchT
2dfa0 61 6b 65 6e 28 72 65 73 3e 30 2c 32 29 3b 0a 20  aken(res>0,2);. 
2dfb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2dfc0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2dfd0 72 3b 0a 20 20 69 66 28 20 72 65 73 3e 30 20 29  r;.  if( res>0 )
2dfe0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
2dff0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2e000 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 6f 79   Opcode: Destroy
2e010 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2e020 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
2e030 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61  tire database ta
2e040 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
2e050 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  se root page in 
2e060 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
2e070 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
2e080 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   P1..**.** The t
2e090 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73 74 72  able being destr
2e0a0 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65 20 6d  oyed is in the m
2e0b0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2e0c0 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a  e if P3==0.  If.
2e0d0 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 74 68  ** P3==1 then th
2e0e0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c  e table to be cl
2e0f0 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75  ear is in the au
2e100 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2e110 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73   file.** that is
2e120 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2e130 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69  ables create usi
2e140 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52  ng CREATE TEMPOR
2e150 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  ARY TABLE..**.**
2e160 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2e170 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 69  s enabled then i
2e180 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2e190 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20  at another root 
2e1a0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  page.** might be
2e1b0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
2e1c0 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20 72 6f  newly deleted ro
2e1d0 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  ot page in order
2e1e0 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20   to keep all.** 
2e1f0 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e 74 69  root pages conti
2e200 67 75 6f 75 73 20 61 74 20 74 68 65 20 62 65 67  guous at the beg
2e210 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
2e220 74 61 62 61 73 65 2e 20 20 54 68 65 20 66 6f 72  tabase.  The for
2e230 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  mer.** value of 
2e240 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 74 68  the root page th
2e250 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 20 76  at moved - its v
2e260 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20  alue before the 
2e270 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20 2d 0a  move occurred -.
2e280 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
2e290 72 65 67 69 73 74 65 72 20 50 32 2e 20 49 66 20  register P2. If 
2e2a0 6e 6f 20 70 61 67 65 20 6d 6f 76 65 6d 65 6e 74  no page movement
2e2b0 20 77 61 73 20 72 65 71 75 69 72 65 64 20 28 62   was required (b
2e2c0 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 74 61  ecause the.** ta
2e2d0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2e2e0 64 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68  d was already th
2e2f0 65 20 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74 68  e last one in th
2e300 65 20 64 61 74 61 62 61 73 65 29 20 74 68 65 6e  e database) then
2e310 20 61 20 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 73   a .** zero is s
2e320 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
2e330 72 20 50 32 2e 20 20 49 66 20 41 55 54 4f 56 41  r P2.  If AUTOVA
2e340 43 55 55 4d 20 69 73 20 64 69 73 61 62 6c 65 64  CUUM is disabled
2e350 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 0a 2a 2a   then a zero .**
2e360 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
2e370 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
2e380 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74 68 72   This opcode thr
2e390 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ows an error if 
2e3a0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61 63  there are any ac
2e3b0 74 69 76 65 20 72 65 61 64 65 72 20 56 4d 73 20  tive reader VMs 
2e3c0 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 69 6e  when.** it is in
2e3d0 76 6f 6b 65 64 2e 20 54 68 69 73 20 69 73 20 64  voked. This is d
2e3e0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 74 68 65  one to avoid the
2e3f0 20 64 69 66 66 69 63 75 6c 74 79 20 61 73 73 6f   difficulty asso
2e400 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
2e410 75 70 64 61 74 69 6e 67 20 65 78 69 73 74 69 6e  updating existin
2e420 67 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 61  g cursors when a
2e430 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6d 6f   root page is mo
2e440 76 65 64 20 69 6e 20 61 6e 20 41 55 54 4f 56 41  ved in an AUTOVA
2e450 43 55 55 4d 20 0a 2a 2a 20 64 61 74 61 62 61 73  CUUM .** databas
2e460 65 2e 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  e. This error is
2e470 20 74 68 72 6f 77 6e 20 65 76 65 6e 20 69 66 20   thrown even if 
2e480 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e490 6e 6f 74 20 61 6e 20 41 55 54 4f 56 41 43 55 55  not an AUTOVACUU
2e4a0 4d 20 0a 2a 2a 20 64 62 20 69 6e 20 6f 72 64 65  M .** db in orde
2e4b0 72 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 72 6f  r to avoid intro
2e4c0 64 75 63 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70  ducing an incomp
2e4d0 61 74 69 62 69 6c 69 74 79 20 62 65 74 77 65 65  atibility betwee
2e4e0 6e 20 61 75 74 6f 76 61 63 75 75 6d 20 0a 2a 2a  n autovacuum .**
2e4f0 20 61 6e 64 20 6e 6f 6e 2d 61 75 74 6f 76 61 63   and non-autovac
2e500 75 75 6d 20 6d 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  uum modes..**.**
2e510 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72   See also: Clear
2e520 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73 74  .*/.case OP_Dest
2e530 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75  roy: {     /* ou
2e540 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76  t2 */.  int iMov
2e550 65 64 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  ed;.  int iDb;..
2e560 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63    sqlite3VdbeInc
2e570 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c  rWriteCounter(p,
2e580 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
2e590 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
2e5a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2e5b0 70 31 3e 31 20 29 3b 0a 20 20 70 4f 75 74 20 3d  p1>1 );.  pOut =
2e5c0 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
2e5d0 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
2e5e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
2e5f0 6c 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  l;.  if( db->nVd
2e600 62 65 52 65 61 64 20 3e 20 64 62 2d 3e 6e 56 44  beRead > db->nVD
2e610 65 73 74 72 6f 79 2b 31 20 29 7b 0a 20 20 20 20  estroy+1 ){.    
2e620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
2e630 45 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  ED;.    p->error
2e640 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
2e650 74 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  t;.    goto abor
2e660 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2e670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62    }else{.    iDb
2e680 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
2e690 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
2e6a0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
2e6b0 20 69 44 62 29 20 29 3b 0a 20 20 20 20 69 4d 6f   iDb) );.    iMo
2e6c0 76 65 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  ved = 0;  /* Not
2e6d0 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 74   needed.  Only t
2e6e0 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e  o silence a warn
2e6f0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
2e700 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2e710 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69  pTable(db->aDb[i
2e720 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31  Db].pBt, pOp->p1
2e730 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20  , &iMoved);.    
2e740 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
2e750 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d  M_Int;.    pOut-
2e760 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 20  >u.i = iMoved;. 
2e770 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2e780 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2e790 72 6f 72 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ror;.#ifndef SQL
2e7a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e7b0 55 55 4d 0a 20 20 20 20 69 66 28 20 69 4d 6f 76  UUM.    if( iMov
2e7c0 65 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed!=0 ){.      s
2e7d0 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
2e7e0 76 65 64 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f  ved(db, iDb, iMo
2e7f0 76 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  ved, pOp->p1);. 
2e800 20 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44       /* All OP_D
2e810 65 73 74 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e  estroy operation
2e820 73 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 73  s occur on the s
2e830 61 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20  ame btree */.   
2e840 20 20 20 61 73 73 65 72 74 28 20 72 65 73 65 74     assert( reset
2e850 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30  SchemaOnFault==0
2e860 20 7c 7c 20 72 65 73 65 74 53 63 68 65 6d 61 4f   || resetSchemaO
2e870 6e 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b  nFault==iDb+1 );
2e880 0a 20 20 20 20 20 20 72 65 73 65 74 53 63 68 65  .      resetSche
2e890 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b  maOnFault = iDb+
2e8a0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2e8b0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2e8c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72  /* Opcode: Clear
2e8d0 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20   P1 P2 P3.**.** 
2e8e0 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65  Delete all conte
2e8f0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2e900 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
2e910 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
2e920 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ge.** in the dat
2e930 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69  abase file is gi
2e940 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c  ven by P1.  But,
2e950 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c   unlike Destroy,
2e960 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76   do not.** remov
2e970 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  e the table or i
2e980 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61  ndex from the da
2e990 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2e9a0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  ** The table bei
2e9b0 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  ng clear is in t
2e9c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2e9d0 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20   file if P2==0. 
2e9e0 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65   If.** P2==1 the
2e9f0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
2ea00 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
2ea10 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2ea20 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
2ea30 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
2ea40 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
2ea50 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
2ea60 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
2ea70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 76  *.** If the P3 v
2ea80 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
2ea90 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  , then the table
2eaa0 20 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75 73   referred to mus
2eab0 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65  t be an.** intke
2eac0 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c 20  y table (an SQL 
2ead0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e  table, not an in
2eae0 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63 61  dex). In this ca
2eaf0 73 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  se the row chang
2eb00 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69  e .** count is i
2eb10 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
2eb20 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2eb30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   in the table be
2eb40 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a  ing cleared. .**
2eb50 20 49 66 20 50 33 20 69 73 20 67 72 65 61 74 65   If P3 is greate
2eb60 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
2eb70 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  n the value stor
2eb80 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
2eb90 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63  3 is.** also inc
2eba0 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
2ebb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2ebc0 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  n the table bein
2ebd0 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  g cleared..**.**
2ebe0 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74 72   See also: Destr
2ebf0 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c  oy.*/.case OP_Cl
2ec00 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68  ear: {.  int nCh
2ec10 61 6e 67 65 3b 0a 20 0a 20 20 73 71 6c 69 74 65  ange;. .  sqlite
2ec20 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f  3VdbeIncrWriteCo
2ec30 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 6e  unter(p, 0);.  n
2ec40 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73  Change = 0;.  as
2ec50 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2ec60 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
2ec70 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2ec80 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2ec90 70 32 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  p2) );.  rc = sq
2eca0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2ecb0 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e  able(.      db->
2ecc0 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74  aDb[pOp->p2].pBt
2ecd0 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d  , pOp->p1, (pOp-
2ece0 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a  >p3 ? &nChange :
2ecf0 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   0).  );.  if( p
2ed00 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d  Op->p3 ){.    p-
2ed10 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  >nChange += nCha
2ed20 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  nge;.    if( pOp
2ed30 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p3>0 ){.      
2ed40 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
2ed50 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  id(&aMem[pOp->p3
2ed60 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41  ]) );.      memA
2ed70 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
2ed80 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b  &aMem[pOp->p3]);
2ed90 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d  .      aMem[pOp-
2eda0 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61  >p3].u.i += nCha
2edb0 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nge;.    }.  }. 
2edc0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2edd0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2ede0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
2edf0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 53  * Opcode: ResetS
2ee00 6f 72 74 65 72 20 50 31 20 2a 20 2a 20 2a 20 2a  orter P1 * * * *
2ee10 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  .**.** Delete al
2ee20 6c 20 63 6f 6e 74 65 6e 74 73 20 66 72 6f 6d 20  l contents from 
2ee30 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
2ee40 62 6c 65 20 6f 72 20 73 6f 72 74 65 72 0a 2a 2a  ble or sorter.**
2ee50 20 74 68 61 74 20 69 73 20 6f 70 65 6e 20 6f 6e   that is open on
2ee60 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a   cursor P1..**.*
2ee70 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 6e  * This opcode on
2ee80 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 63 75 72  ly works for cur
2ee90 73 6f 72 73 20 75 73 65 64 20 66 6f 72 20 73 6f  sors used for so
2eea0 72 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 6f 70 65  rting and.** ope
2eeb0 6e 65 64 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  ned with OP_Open
2eec0 45 70 68 65 6d 65 72 61 6c 20 6f 72 20 4f 50 5f  Ephemeral or OP_
2eed0 53 6f 72 74 65 72 4f 70 65 6e 2e 0a 2a 2f 0a 63  SorterOpen..*/.c
2eee0 61 73 65 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  ase OP_ResetSort
2eef0 65 72 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  er: {.  VdbeCurs
2ef00 6f 72 20 2a 70 43 3b 0a 20 0a 20 20 61 73 73 65  or *pC;. .  asse
2ef10 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2ef20 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2ef30 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2ef40 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2ef50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2ef60 30 20 29 3b 0a 20 20 69 66 28 20 69 73 53 6f 72  0 );.  if( isSor
2ef70 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 73  ter(pC) ){.    s
2ef80 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
2ef90 52 65 73 65 74 28 64 62 2c 20 70 43 2d 3e 75 63  Reset(db, pC->uc
2efa0 2e 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 65 6c  .pSorter);.  }el
2efb0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2efc0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2efd0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2efe0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
2eff0 73 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a 20 20  sEphemeral );.  
2f000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f010 72 65 65 43 6c 65 61 72 54 61 62 6c 65 4f 66 43  reeClearTableOfC
2f020 75 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75  ursor(pC->uc.pCu
2f030 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  rsor);.    if( r
2f040 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2f050 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2f060 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2f070 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 42 74  Opcode: CreateBt
2f080 72 65 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ree P1 P2 P3 * *
2f090 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
2f0a0 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 20  P2]=root iDb=P1 
2f0b0 66 6c 61 67 73 3d 50 33 0a 2a 2a 0a 2a 2a 20 41  flags=P3.**.** A
2f0c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 62 2d  llocate a new b-
2f0d0 74 72 65 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  tree in the main
2f0e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f0f0 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68  f P1==0 or in th
2f100 65 0a 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61  e.** TEMP databa
2f110 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
2f120 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
2f130 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
2f140 2a 20 50 31 3e 31 2e 20 20 54 68 65 20 50 33 20  * P1>1.  The P3 
2f150 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
2f160 20 31 20 28 42 54 52 45 45 5f 49 4e 54 4b 45 59   1 (BTREE_INTKEY
2f170 29 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61  ) for a rowid ta
2f180 62 6c 65 0a 2a 2a 20 69 74 20 6d 75 73 74 20 62  ble.** it must b
2f190 65 20 32 20 28 42 54 52 45 45 5f 42 4c 4f 42 4b  e 2 (BTREE_BLOBK
2f1a0 45 59 29 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  EY) for an index
2f1b0 20 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49   or WITHOUT ROWI
2f1c0 44 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  D table..** The 
2f1d0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
2f1e0 20 6f 66 20 74 68 65 20 6e 65 77 20 62 2d 74 72   of the new b-tr
2f1f0 65 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ee is stored in 
2f200 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
2f210 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 42 74  case OP_CreateBt
2f220 72 65 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ree: {          
2f230 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
2f240 20 70 67 6e 6f 3b 0a 20 20 44 62 20 2a 70 44 62   pgno;.  Db *pDb
2f250 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
2f260 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
2f270 28 70 2c 20 30 29 3b 0a 20 20 70 4f 75 74 20 3d  (p, 0);.  pOut =
2f280 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
2f290 70 2c 20 70 4f 70 29 3b 0a 20 20 70 67 6e 6f 20  p, pOp);.  pgno 
2f2a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
2f2b0 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
2f2c0 54 4b 45 59 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d  TKEY || pOp->p3=
2f2d0 3d 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 29  =BTREE_BLOBKEY )
2f2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2f2f0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2f300 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
2f310 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
2f320 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
2f330 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73  pOp->p1) );.  as
2f340 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2f350 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  y==0 );.  pDb = 
2f360 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
2f370 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
2f380 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 72 63  ->pBt!=0 );.  rc
2f390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2f3a0 72 65 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e  reateTable(pDb->
2f3b0 70 42 74 2c 20 26 70 67 6e 6f 2c 20 70 4f 70 2d  pBt, &pgno, pOp-
2f3c0 3e 70 33 29 3b 0a 20 20 69 66 28 20 72 63 20 29  >p3);.  if( rc )
2f3d0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2f3e0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
2f3f0 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20 20  ->u.i = pgno;.  
2f400 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2f410 6f 64 65 3a 20 53 71 6c 45 78 65 63 20 2a 20 2a  ode: SqlExec * *
2f420 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 75   * P4 *.**.** Ru
2f430 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
2f440 65 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74  ent or statement
2f450 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
2f460 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a 2f  he P4 string..*/
2f470 0a 63 61 73 65 20 4f 50 5f 53 71 6c 45 78 65 63  .case OP_SqlExec
2f480 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  : {.  sqlite3Vdb
2f490 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
2f4a0 72 28 70 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e  r(p, 0);.  db->n
2f4b0 53 71 6c 45 78 65 63 2b 2b 3b 0a 20 20 72 63 20  SqlExec++;.  rc 
2f4c0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
2f4d0 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 30 2c  b, pOp->p4.z, 0,
2f4e0 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 53   0, 0);.  db->nS
2f4f0 71 6c 45 78 65 63 2d 2d 3b 0a 20 20 69 66 28 20  qlExec--;.  if( 
2f500 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2f510 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2f520 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2f530 6f 64 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61  ode: ParseSchema
2f540 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2f550 2a 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73  ** Read and pars
2f560 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72  e all entries fr
2f570 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  om the SQLITE_MA
2f580 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61  STER table of da
2f590 74 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61  tabase P1.** tha
2f5a0 74 20 6d 61 74 63 68 20 74 68 65 20 57 48 45 52  t match the WHER
2f5b0 45 20 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a  E clause P4. .**
2f5c0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2f5d0 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73  invokes the pars
2f5e0 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
2f5f0 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ew virtual machi
2f600 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73  ne,.** then runs
2f610 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c   the new virtual
2f620 20 6d 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73   machine.  It is
2f630 20 74 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61   thus a re-entra
2f640 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61  nt opcode..*/.ca
2f650 73 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  se OP_ParseSchem
2f660 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  a: {.  int iDb;.
2f670 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2f680 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  aster;.  char *z
2f690 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20  Sql;.  InitData 
2f6a0 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20  initData;..  /* 
2f6b0 41 6e 79 20 70 72 65 70 61 72 65 64 20 73 74 61  Any prepared sta
2f6c0 74 65 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f  tement that invo
2f6d0 6b 65 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20  kes this opcode 
2f6e0 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65  will hold mutexe
2f6f0 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20  s.  ** on every 
2f700 62 74 72 65 65 2e 20 20 54 68 69 73 20 69 73 20  btree.  This is 
2f710 61 20 70 72 65 72 65 71 75 69 73 69 74 65 20 66  a prerequisite f
2f720 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a  or invoking .  *
2f730 2a 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  * sqlite3InitCal
2f740 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69  lback()..  */.#i
2f750 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2f760 47 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69  G.  for(iDb=0; i
2f770 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
2f780 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2f790 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65  iDb==1 || sqlite
2f7a0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2f7b0 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
2f7c0 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  t) );.  }.#endif
2f7d0 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70  ..  iDb = pOp->p
2f7e0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  1;.  assert( iDb
2f7f0 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
2f800 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
2f810 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
2f820 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
2f830 4c 6f 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20  Loaded) );.  /* 
2f840 55 73 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e  Used to be a con
2f850 64 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20  ditional */ {.  
2f860 20 20 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54    zMaster = MAST
2f870 45 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69  ER_NAME;.    ini
2f880 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20  tData.db = db;. 
2f890 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20     initData.iDb 
2f8a0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69  = pOp->p1;.    i
2f8b0 6e 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67  nitData.pzErrMsg
2f8c0 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a   = &p->zErrMsg;.
2f8d0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2f8e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20  e3MPrintf(db,.  
2f8f0 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2f900 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
2f910 20 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48   FROM '%q'.%s WH
2f920 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20  ERE %s ORDER BY 
2f930 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64  rowid",.       d
2f940 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
2f950 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  Name, zMaster, p
2f960 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69  Op->p4.z);.    i
2f970 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2f980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f990 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2f9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2f9b0 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
2f9c0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64  sy==0 );.      d
2f9d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31  b->init.busy = 1
2f9e0 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74 61  ;.      initData
2f9f0 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  .rc = SQLITE_OK;
2fa00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2fa10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fa20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2fa30 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2fa40 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69  zSql, sqlite3Ini
2fa50 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74  tCallback, &init
2fa60 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20  Data, 0);.      
2fa70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fa80 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74  K ) rc = initDat
2fa90 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  a.rc;.      sqli
2faa0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
2fab0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d  zSql);.      db-
2fac0 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a  >init.busy = 0;.
2fad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2fae0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
2faf0 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
2fb00 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
2fb10 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2fb20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
2fb30 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
2fb40 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
2fb50 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2fb60 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  or;.  }.  break;
2fb70 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e    .}..#if !defin
2fb80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
2fb90 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64  NALYZE)./* Opcod
2fba0 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20  e: LoadAnalysis 
2fbb0 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
2fbc0 20 52 65 61 64 20 74 68 65 20 73 71 6c 69 74 65   Read the sqlite
2fbd0 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72  _stat1 table for
2fbe0 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64   database P1 and
2fbf0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
2fc00 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  t.** of that tab
2fc10 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65  le into the inte
2fc20 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20  rnal index hash 
2fc30 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c  table.  This wil
2fc40 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61  l cause.** the a
2fc50 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73  nalysis to be us
2fc60 65 64 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  ed when preparin
2fc70 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  g all subsequent
2fc80 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73   queries..*/.cas
2fc90 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  e OP_LoadAnalysi
2fca0 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  s: {.  assert( p
2fcb0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2fcc0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
2fcd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e    rc = sqlite3An
2fce0 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70  alysisLoad(db, p
2fcf0 4f 70 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72  Op->p1);.  if( r
2fd00 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2fd10 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
2fd20 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  reak;  .}.#endif
2fd30 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
2fd40 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
2fd50 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ) */../* Opcode:
2fd60 20 44 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20   DropTable P1 * 
2fd70 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d  * P4 *.**.** Rem
2fd80 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ove the internal
2fd90 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74   (in-memory) dat
2fda0 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  a structures tha
2fdb0 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68  t describe.** th
2fdc0 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34  e table named P4
2fdd0 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
2fde0 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64    This is called
2fdf0 20 61 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a   after a table.*
2fe00 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f  * is dropped fro
2fe10 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68  m disk (using th
2fe20 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65  e Destroy opcode
2fe30 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  ) in order to ke
2fe40 65 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72  ep .** the inter
2fe50 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
2fe60 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68  on of the.** sch
2fe70 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  ema consistent w
2fe80 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
2fe90 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  isk..*/.case OP_
2fea0 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73  DropTable: {.  s
2feb0 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
2fec0 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29  iteCounter(p, 0)
2fed0 3b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  ;.  sqlite3Unlin
2fee0 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
2fef0 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
2ff00 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
2ff10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2ff20 44 72 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a  DropIndex P1 * *
2ff30 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f   P4 *.**.** Remo
2ff40 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ve the internal 
2ff50 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61  (in-memory) data
2ff60 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
2ff70 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65   describe.** the
2ff80 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20   index named P4 
2ff90 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
2ffa0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
2ffb0 61 66 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a  after an index.*
2ffc0 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f  * is dropped fro
2ffd0 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68  m disk (using th
2ffe0 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65  e Destroy opcode
2fff0 29 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ).** in order to
30000 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e   keep the intern
30010 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
30020 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
30030 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
30040 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
30050 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
30060 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71  ropIndex: {.  sq
30070 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
30080 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b  teCounter(p, 0);
30090 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
300a0 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
300b0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
300c0 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b  >p4.z);.  break;
300d0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
300e0 72 6f 70 54 72 69 67 67 65 72 20 50 31 20 2a 20  ropTrigger P1 * 
300f0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d  * P4 *.**.** Rem
30100 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ove the internal
30110 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74   (in-memory) dat
30120 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  a structures tha
30130 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68  t describe.** th
30140 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20  e trigger named 
30150 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
30160 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
30170 65 64 20 61 66 74 65 72 20 61 20 74 72 69 67 67  ed after a trigg
30180 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  er.** is dropped
30190 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e   from disk (usin
301a0 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70  g the Destroy op
301b0 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74  code) in order t
301c0 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69  o keep .** the i
301d0 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
301e0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
301f0 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
30200 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
30210 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
30220 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a   OP_DropTrigger:
30230 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   {.  sqlite3Vdbe
30240 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
30250 28 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  (p, 0);.  sqlite
30260 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
30270 54 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d  Trigger(db, pOp-
30280 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
30290 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69  .  break;.}...#i
302a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
302b0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
302c0 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74  K./* Opcode: Int
302d0 65 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50  egrityCk P1 P2 P
302e0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f  3 P4 P5.**.** Do
302f0 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
30300 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
30310 65 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74  en database.  St
30320 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ore in.** regist
30330 65 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f  er P1 the text o
30340 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
30350 67 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e  ge describing an
30360 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49  y problems..** I
30370 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72  f no problems ar
30380 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61  e found, store a
30390 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65   NULL in registe
303a0 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  r P1..**.** The 
303b0 72 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74  register P3 cont
303c0 61 69 6e 73 20 6f 6e 65 20 6c 65 73 73 20 74 68  ains one less th
303d0 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  an the maximum n
303e0 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64  umber of allowed
303f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d   errors..** At m
30400 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72 6f  ost reg(P3) erro
30410 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  rs will be repor
30420 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ted..** In other
30430 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c   words, the anal
30440 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f  ysis stops as so
30450 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65 72  on as reg(P1) er
30460 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65  rors are .** see
30470 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20 75  n.  Reg(P1) is u
30480 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
30490 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
304a0 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a   remaining..**.*
304b0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
304c0 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74  numbers of all t
304d0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74  ables in the dat
304e0 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67 65  abase are intege
304f0 72 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  rs.** stored in 
30500 50 34 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75  P4_INTARRAY argu
30510 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ment..**.** If P
30520 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  5 is not zero, t
30530 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65  he check is done
30540 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   on the auxiliar
30550 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
30560 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e  le, not the main
30570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30580 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
30590 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
305a0 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67  lement the integ
305b0 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d  rity_check pragm
305c0 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  a..*/.case OP_In
305d0 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69  tegrityCk: {.  i
305e0 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f  nt nRoot;      /
305f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
30600 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e  es to check.  (N
30610 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61  umber of root pa
30620 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  ges.) */.  int *
30630 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72  aRoot;     /* Ar
30640 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20  ray of rootpage 
30650 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c  numbers for tabl
30660 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  es to be checked
30670 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20   */.  int nErr; 
30680 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30690 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74  of errors report
306a0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
306b0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
306c0 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72 65 70  of the error rep
306d0 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e  ort */.  Mem *pn
306e0 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  Err;     /* Regi
306f0 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61  ster keeping tra
30700 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d  ck of errors rem
30710 61 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  aining */..  ass
30720 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
30730 72 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70  r );.  nRoot = p
30740 4f 70 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20  Op->p2;.  aRoot 
30750 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
30760 61 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20  assert( nRoot>0 
30770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f  );.  assert( aRo
30780 6f 74 5b 30 5d 3d 3d 6e 52 6f 6f 74 20 29 3b 0a  ot[0]==nRoot );.
30790 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
307a0 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
307b0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
307c0 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e  nCursor) );.  pn
307d0 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Err = &aMem[pOp-
307e0 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
307f0 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
30800 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
30810 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d   assert( (pnErr-
30820 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  >flags & (MEM_St
30830 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
30840 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  );.  pIn1 = &aMe
30850 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
30860 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62  sert( pOp->p5<db
30870 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
30880 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
30890 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d  >btreeMask, pOp-
308a0 3e 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71  >p5) );.  z = sq
308b0 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
308c0 69 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62  ityCheck(db->aDb
308d0 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 26  [pOp->p5].pBt, &
308e0 61 52 6f 6f 74 5b 31 5d 2c 20 6e 52 6f 6f 74 2c  aRoot[1], nRoot,
308f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30910 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e    (int)pnErr->u.
30920 69 2b 31 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73  i+1, &nErr);.  s
30930 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
30940 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66  Null(pIn1);.  if
30950 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ( nErr==0 ){.   
30960 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b   assert( z==0 );
30970 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d  .  }else if( z==
30980 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  0 ){.    goto no
30990 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _mem;.  }else{. 
309a0 20 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d     pnErr->u.i -=
309b0 20 6e 45 72 72 2d 31 3b 0a 20 20 20 20 73 71 6c   nErr-1;.    sql
309c0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
309d0 72 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53  r(pIn1, z, -1, S
309e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
309f0 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20  te3_free);.  }. 
30a00 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
30a10 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71  SIZE(pIn1);.  sq
30a20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
30a30 6e 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e  ncoding(pIn1, en
30a40 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b  coding);.  break
30a50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
30a60 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
30a70 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
30a80 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41   Opcode: RowSetA
30a90 64 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  dd P1 P2 * * *.*
30aa0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 77 73  * Synopsis: rows
30ab0 65 74 28 50 31 29 3d 72 5b 50 32 5d 0a 2a 2a 0a  et(P1)=r[P2].**.
30ac0 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e  ** Insert the in
30ad0 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64  teger value held
30ae0 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20   by register P2 
30af0 69 6e 74 6f 20 61 20 52 6f 77 53 65 74 20 6f 62  into a RowSet ob
30b00 6a 65 63 74 0a 2a 2a 20 68 65 6c 64 20 69 6e 20  ject.** held in 
30b10 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
30b20 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  ** An assertion 
30b30 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e  fails if P2 is n
30b40 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ot an integer..*
30b50 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
30b60 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  Add: {       /* 
30b70 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49  in1, in2 */.  pI
30b80 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
30b90 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
30ba0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
30bb0 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66  assert( (pIn2->f
30bc0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
30bd0 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  =0 );.  if( (pIn
30be0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
30bf0 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
30c00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
30c10 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
30c20 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
30c30 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
30c40 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
30c50 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mem;.  }.  sqlit
30c60 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
30c70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
30c80 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
30c90 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
30ca0 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
30cb0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
30cc0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 6f  nopsis: r[P3]=ro
30cd0 77 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45  wset(P1).**.** E
30ce0 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c  xtract the small
30cf0 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  est value from t
30d00 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  he RowSet object
30d10 20 69 6e 20 50 31 0a 2a 2a 20 61 6e 64 20 70 75   in P1.** and pu
30d20 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74  t that value int
30d30 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
30d40 2a 20 4f 72 2c 20 69 66 20 52 6f 77 53 65 74 20  * Or, if RowSet 
30d50 6f 62 6a 65 63 74 20 50 31 20 69 73 20 69 6e 69  object P1 is ini
30d60 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65  tially empty, le
30d70 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e  ave P3.** unchan
30d80 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  ged and jump to 
30d90 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a  instruction P2..
30da0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
30db0 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20 2f  tRead: {       /
30dc0 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74  * jump, in1, out
30dd0 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a  3 */.  i64 val;.
30de0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
30df0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
30e00 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
30e10 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20  EM_RowSet)==0 . 
30e20 20 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53    || sqlite3RowS
30e30 65 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70  etNext(pIn1->u.p
30e40 52 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30  RowSet, &val)==0
30e50 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  .  ){.    /* The
30e60 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69   boolean index i
30e70 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73  s empty */.    s
30e80 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
30e90 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20  Null(pIn1);.    
30ea0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
30eb0 31 2c 32 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  1,2);.    goto j
30ec0 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68  ump_to_p2_and_ch
30ed0 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
30ee0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
30ef0 2f 2a 20 41 20 76 61 6c 75 65 20 77 61 73 20 70  /* A value was p
30f00 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69  ulled from the i
30f10 6e 64 65 78 20 2a 2f 0a 20 20 20 20 56 64 62 65  ndex */.    Vdbe
30f20 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 32 29  BranchTaken(0,2)
30f30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
30f40 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
30f50 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c  em[pOp->p3], val
30f60 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68  );.  }.  goto ch
30f70 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
30f80 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t;.}../* Opcode:
30f90 20 52 6f 77 53 65 74 54 65 73 74 20 50 31 20 50   RowSetTest P1 P
30fa0 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70  2 P3 P4.** Synop
30fb0 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 20 69 6e  sis: if r[P3] in
30fc0 20 72 6f 77 73 65 74 28 50 31 29 20 67 6f 74 6f   rowset(P1) goto
30fd0 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74   P2.**.** Regist
30fe0 65 72 20 50 33 20 69 73 20 61 73 73 75 6d 65 64  er P3 is assumed
30ff0 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d 62 69   to hold a 64-bi
31000 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  t integer value.
31010 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31 0a   If register P1.
31020 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f  ** contains a Ro
31030 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e 64 20  wSet object and 
31040 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62 6a 65  that RowSet obje
31050 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ct contains.** t
31060 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e  he value held in
31070 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67   P3, jump to reg
31080 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65 72 77  ister P2. Otherw
31090 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68 65 0a  ise, insert the.
310a0 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20 50 33  ** integer in P3
310b0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
310c0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e   and continue on
310d0 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
310e0 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  opcode..**.** Th
310f0 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  e RowSet object 
31100 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
31110 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
31120 73 65 74 73 20 6f 66 20 69 6e 74 65 67 65 72 73  sets of integers
31130 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
31140 20 69 6e 20 64 69 73 74 69 6e 63 74 20 70 68 61   in distinct pha
31150 73 65 73 2c 20 77 68 69 63 68 20 65 61 63 68 20  ses, which each 
31160 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  set contains no 
31170 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 45  duplicates..** E
31180 61 63 68 20 73 65 74 20 69 73 20 69 64 65 6e 74  ach set is ident
31190 69 66 69 65 64 20 62 79 20 61 20 75 6e 69 71 75  ified by a uniqu
311a0 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68 65 20  e P4 value. The 
311b0 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73  first set.** mus
311c0 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20 74 68  t have P4==0, th
311d0 65 20 66 69 6e 61 6c 20 73 65 74 20 6d 75 73 74  e final set must
311e0 20 68 61 76 65 20 50 34 3d 3d 2d 31 2c 20 61 6e   have P4==-1, an
311f0 64 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  d for all other 
31200 73 65 74 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  sets.** must hav
31210 65 20 50 34 3e 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  e P4>0..**.** Th
31220 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69  is allows optimi
31230 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65  zations: (a) whe
31240 6e 20 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73  n P4==0 there is
31250 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
31260 0a 2a 2a 20 74 68 65 20 52 6f 77 53 65 74 20 6f  .** the RowSet o
31270 62 6a 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73  bject for P3, as
31280 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
31290 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e  d not to contain
312a0 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e   it,.** (b) when
312b0 20 50 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73   P4==-1 there is
312c0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   no need to inse
312d0 72 74 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73  rt the value, as
312e0 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65   it will.** neve
312f0 72 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c  r be tested for,
31300 20 61 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20   and (c) when a 
31310 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 70 61  value that is pa
31320 72 74 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a  rt of set X is.*
31330 2a 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72  * inserted, ther
31340 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
31350 73 65 61 72 63 68 20 74 6f 20 73 65 65 20 69 66  search to see if
31360 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
31370 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
31380 79 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  y inserted as pa
31390 72 74 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c  rt of set X (onl
313a0 79 20 69 66 20 69 74 20 77 61 73 20 70 72 65 76  y if it was prev
313b0 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74  iously.** insert
313c0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f  ed as part of so
313d0 6d 65 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a  me other set)..*
313e0 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
313f0 54 65 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Test: {         
31400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
31410 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
31420 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69  .  int iSet;.  i
31430 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49  nt exists;..  pI
31440 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
31450 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  p1];.  pIn3 = &a
31460 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
31470 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  iSet = pOp->p4.i
31480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
31490 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
314a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
314b0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  e is anything ot
314c0 68 65 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65  her than a rowse
314d0 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f  t object in memo
314e0 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a  ry cell P1,.  **
314f0 20 64 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61   delete it now a
31500 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31  nd initialize P1
31510 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72   with an empty r
31520 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  owset.  */.  if(
31530 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
31540 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
31550 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
31560 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49  eMemSetRowSet(pI
31570 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  n1);.    if( (pI
31580 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
31590 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74  RowSet)==0 ) got
315a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20  o no_mem;.  }.. 
315b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
315c0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
315d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65 74  ;.  assert( iSet
315e0 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20  ==-1 || iSet>=0 
315f0 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b  );.  if( iSet ){
31600 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73 71  .    exists = sq
31610 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28  lite3RowSetTest(
31620 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
31630 20 69 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69   iSet, pIn3->u.i
31640 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  );.    VdbeBranc
31650 68 54 61 6b 65 6e 28 65 78 69 73 74 73 21 3d 30  hTaken(exists!=0
31660 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69  ,2);.    if( exi
31670 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
31680 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28  to_p2;.  }.  if(
31690 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20   iSet>=0 ){.    
316a0 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73  sqlite3RowSetIns
316b0 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77  ert(pIn1->u.pRow
316c0 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b  Set, pIn3->u.i);
316d0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
316e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
316f0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f  _OMIT_TRIGGER../
31700 2a 20 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72 61  * Opcode: Progra
31710 6d 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  m P1 P2 P3 P4 P5
31720 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  .**.** Execute t
31730 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
31740 61 6d 20 70 61 73 73 65 64 20 61 73 20 50 34 20  am passed as P4 
31750 28 74 79 70 65 20 50 34 5f 53 55 42 50 52 4f 47  (type P4_SUBPROG
31760 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20  RAM). .**.** P1 
31770 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64  contains the add
31780 72 65 73 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f  ress of the memo
31790 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e  ry cell that con
317a0 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
317b0 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
317c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 76  in an array of v
317d0 61 6c 75 65 73 20 75 73 65 64 20 61 73 20 61 72  alues used as ar
317e0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 73  guments to the s
317f0 75 62 2d 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a  ub-program. P2 .
31800 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
31810 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  address to jump 
31820 74 6f 20 69 66 20 74 68 65 20 73 75 62 2d 70 72  to if the sub-pr
31830 6f 67 72 61 6d 20 74 68 72 6f 77 73 20 61 6e 20  ogram throws an 
31840 49 47 4e 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70  IGNORE .** excep
31850 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 52  tion using the R
31860 41 49 53 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e  AISE() function.
31870 20 52 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e   Register P3 con
31880 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73  tains the addres
31890 73 20 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72  s .** of a memor
318a0 79 20 63 65 6c 6c 20 69 6e 20 74 68 69 73 20 28  y cell in this (
318b0 74 68 65 20 70 61 72 65 6e 74 29 20 56 4d 20 74  the parent) VM t
318c0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 61  hat is used to a
318d0 6c 6c 6f 63 61 74 65 20 74 68 65 20 0a 2a 2a 20  llocate the .** 
318e0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
318f0 62 79 20 74 68 65 20 73 75 62 2d 76 64 62 65 20  by the sub-vdbe 
31900 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a  at runtime..**.*
31910 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
31920 72 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74  r to the VM cont
31930 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67  aining the trigg
31940 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  er program..**.*
31950 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a  * If P5 is non-z
31960 65 72 6f 2c 20 74 68 65 6e 20 72 65 63 75 72 73  ero, then recurs
31970 69 76 65 20 70 72 6f 67 72 61 6d 20 69 6e 76 6f  ive program invo
31980 63 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  cation is enable
31990 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72  d..*/.case OP_Pr
319a0 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20  ogram: {        
319b0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  /* jump */.  int
319c0 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
319d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
319e0 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  f memory registe
319f0 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  rs for sub-progr
31a00 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  am */.  int nByt
31a10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
31a20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75 6e 74  /* Bytes of runt
31a30 69 6d 65 20 73 70 61 63 65 20 72 65 71 75 69 72  ime space requir
31a40 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  ed for sub-progr
31a50 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74  am */.  Mem *pRt
31a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31a70 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 61  /* Register to a
31a80 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d 65 20  llocate runtime 
31a90 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  space */.  Mem *
31aa0 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
31ab0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
31ac0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6d 65  erate through me
31ad0 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  mory cells */.  
31ae0 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20 20  Mem *pEnd;      
31af0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
31b00 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e  memory cell in n
31b10 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20 56 64  ew array */.  Vd
31b20 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
31b30 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 64 62        /* New vdb
31b40 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65 63 75  e frame to execu
31b50 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72  te in */.  SubPr
31b60 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b  ogram *pProgram;
31b70 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61     /* Sub-progra
31b80 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  m to execute */.
31b90 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20 20 20    void *t;      
31ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
31bb0 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  en identifying t
31bc0 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72  rigger */..  pPr
31bd0 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ogram = pOp->p4.
31be0 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20  pProgram;.  pRt 
31bf0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
31c00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 6f  ;.  assert( pPro
31c10 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  gram->nOp>0 );. 
31c20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 35   .  /* If the p5
31c30 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
31c40 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 69  then recursive i
31c50 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
31c60 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a 20 64  ggers is .  ** d
31c70 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61 63 6b  isabled for back
31c80 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
31c90 69 74 79 20 28 70 35 20 69 73 20 73 65 74 20 69  ity (p5 is set i
31ca0 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f 67 72  f this sub-progr
31cb0 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c  am.  ** is reall
31cc0 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e 6f 74  y a trigger, not
31cd0 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61   a foreign key a
31ce0 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66  ction, and the f
31cf0 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64  lag set.  ** and
31d00 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 20   cleared by the 
31d10 22 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76  "PRAGMA recursiv
31d20 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f 6d 6d  e_triggers" comm
31d30 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e 0a 20  and is clear).. 
31d40 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73 20   ** .  ** It is 
31d50 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
31d60 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
31d70 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76  , at the SQL lev
31d80 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20 20 2a  el, that is .  *
31d90 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e 20 73  * disabled. In s
31da0 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69 6e 67  ome cases a sing
31db0 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 67  le trigger may g
31dc0 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74 68 61  enerate more tha
31dd0 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50  n one .  ** SubP
31de0 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65 20 74  rogram (if the t
31df0 72 69 67 67 65 72 20 6d 61 79 20 62 65 20 65 78  rigger may be ex
31e00 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f 72 65  ecuted with more
31e10 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66 65 72   than one differ
31e20 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e  ent .  ** ON CON
31e30 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 29  FLICT algorithm)
31e40 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72  . SubProgram str
31e50 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
31e60 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 73  ed with a.  ** s
31e70 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 61 6c  ingle trigger al
31e80 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
31e90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 53 75  value for the Su
31ea0 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a  bProgram.token .
31eb0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
31ec0 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  */.  if( pOp->p5
31ed0 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50 72 6f   ){.    t = pPro
31ee0 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  gram->token;.   
31ef0 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
31f00 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20 26 26  Frame; pFrame &&
31f10 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d   pFrame->token!=
31f20 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
31f30 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
31f40 69 66 28 20 70 46 72 61 6d 65 20 29 20 62 72 65  if( pFrame ) bre
31f50 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ak;.  }..  if( p
31f60 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c  ->nFrame>=db->aL
31f70 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
31f80 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
31f90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
31fa0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
31fb0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
31fc0 70 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  p, "too many lev
31fd0 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
31fe0 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20  ecursion");.    
31ff0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
32000 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
32010 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52 74 20  /* Register pRt 
32020 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
32030 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
32040 69 72 65 64 20 74 6f 20 73 61 76 65 20 74 68 65  ired to save the
32050 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
32060 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72  he current progr
32070 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  am, and the memo
32080 72 79 20 72 65 71 75 69 72 65 64 20 61 74 20 72  ry required at r
32090 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74  untime to execut
320a0 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67  e.  ** the trigg
320b0 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74  er program. If t
320c0 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20  his trigger has 
320d0 62 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72  been fired befor
320e0 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a  e, then pRt .  *
320f0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  * is already all
32100 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73  ocated. Otherwis
32110 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e  e, it must be in
32120 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
32130 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73   if( (pRt->flags
32140 26 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29  &MEM_Frame)==0 )
32150 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67  {.    /* SubProg
32160 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20  ram.nMem is set 
32170 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
32180 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73   memory cells us
32190 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a  ed by the .    *
321a0 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  * program stored
321b0 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61   in SubProgram.a
321c0 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74  Op. As well as t
321d0 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79  hese, one memory
321e0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20  .    ** cell is 
321f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
32200 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  h cursor used by
32210 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65   the program. Se
32220 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  t local.    ** v
32230 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e  ariable nMem (an
32240 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61  d later, VdbeFra
32250 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f  me.nChildMem) to
32260 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20   this value..   
32270 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70   */.    nMem = p
32280 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20  Program->nMem + 
32290 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a  pProgram->nCsr;.
322a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4d 65 6d      assert( nMem
322b0 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  >0 );.    if( pP
322c0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20  rogram->nCsr==0 
322d0 29 20 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e 42  ) nMem++;.    nB
322e0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
322f0 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29 0a  eof(VdbeFrame)).
32300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
32310 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d 65  nMem * sizeof(Me
32320 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m).             
32330 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73   + pProgram->nCs
32340 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65 43  r * sizeof(VdbeC
32350 75 72 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20  ursor*).        
32360 20 20 20 20 20 20 2b 20 28 70 50 72 6f 67 72 61        + (pProgra
32370 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f 38 3b 0a 20  m->nOp + 7)/8;. 
32380 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69     pFrame = sqli
32390 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
323a0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
323b0 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20  if( !pFrame ){. 
323c0 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
323d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
323e0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
323f0 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d  e(pRt);.    pRt-
32400 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61  >flags = MEM_Fra
32410 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70  me;.    pRt->u.p
32420 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
32430 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d  .    pFrame->v =
32440 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e   p;.    pFrame->
32450 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d  nChildMem = nMem
32460 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
32470 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72  hildCsr = pProgr
32480 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46  am->nCsr;.    pF
32490 72 61 6d 65 2d 3e 70 63 20 3d 20 28 69 6e 74 29  rame->pc = (int)
324a0 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
324b0 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20   pFrame->aMem = 
324c0 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->aMem;.    pFr
324d0 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e  ame->nMem = p->n
324e0 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
324f0 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73  >apCsr = p->apCs
32500 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  r;.    pFrame->n
32510 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72  Cursor = p->nCur
32520 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  sor;.    pFrame-
32530 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  >aOp = p->aOp;. 
32540 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d     pFrame->nOp =
32550 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72   p->nOp;.    pFr
32560 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72  ame->token = pPr
32570 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69  ogram->token;.#i
32580 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
32590 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
325a0 55 53 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  US.    pFrame->a
325b0 6e 45 78 65 63 20 3d 20 70 2d 3e 61 6e 45 78 65  nExec = p->anExe
325c0 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70  c;.#endif..    p
325d0 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65  End = &VdbeFrame
325e0 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61  Mem(pFrame)[pFra
325f0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  me->nChildMem];.
32600 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62      for(pMem=Vdb
32610 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
32620 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70  ); pMem!=pEnd; p
32630 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d  Mem++){.      pM
32640 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
32650 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20  Undefined;.     
32660 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a   pMem->db = db;.
32670 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
32680 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d     pFrame = pRt-
32690 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61  >u.pFrame;.    a
326a0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
326b0 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e  >nMem+pProgram->
326c0 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43  nCsr==pFrame->nC
326d0 68 69 6c 64 4d 65 6d 20 0a 20 20 20 20 20 20 20  hildMem .       
326e0 20 7c 7c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e   || (pProgram->n
326f0 43 73 72 3d 3d 30 20 26 26 20 70 50 72 6f 67 72  Csr==0 && pProgr
32700 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61  am->nMem+1==pFra
32710 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 20 29  me->nChildMem) )
32720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32730 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46  rogram->nCsr==pF
32740 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20  rame->nChildCsr 
32750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
32760 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3d  int)(pOp - aOp)=
32770 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a 20  =pFrame->pc );. 
32780 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 2b   }..  p->nFrame+
32790 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  +;.  pFrame->pPa
327a0 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d 65  rent = p->pFrame
327b0 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  ;.  pFrame->last
327c0 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
327d0 52 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d  Rowid;.  pFrame-
327e0 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43  >nChange = p->nC
327f0 68 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d 65 2d  hange;.  pFrame-
32800 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20 70 2d 3e  >nDbChange = p->
32810 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 61  db->nChange;.  a
32820 73 73 65 72 74 28 20 70 46 72 61 6d 65 2d 3e 70  ssert( pFrame->p
32830 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  AuxData==0 );.  
32840 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
32850 20 3d 20 70 2d 3e 70 41 75 78 44 61 74 61 3b 0a   = p->pAuxData;.
32860 20 20 70 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    p->pAuxData = 
32870 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  0;.  p->nChange 
32880 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d 65  = 0;.  p->pFrame
32890 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d 3e   = pFrame;.  p->
328a0 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 56 64  aMem = aMem = Vd
328b0 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d  beFrameMem(pFram
328c0 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  e);.  p->nMem = 
328d0 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
328e0 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  m;.  p->nCursor 
328f0 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e  = (u16)pFrame->n
32900 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61  ChildCsr;.  p->a
32910 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
32920 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
32930 4d 65 6d 5d 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Mem];.  pFrame->
32940 61 4f 6e 63 65 20 3d 20 28 75 38 2a 29 26 70 2d  aOnce = (u8*)&p-
32950 3e 61 70 43 73 72 5b 70 50 72 6f 67 72 61 6d 2d  >apCsr[pProgram-
32960 3e 6e 43 73 72 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCsr];.  memset
32970 28 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 2c 20  (pFrame->aOnce, 
32980 30 2c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  0, (pProgram->nO
32990 70 20 2b 20 37 29 2f 38 29 3b 0a 20 20 70 2d 3e  p + 7)/8);.  p->
329a0 61 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f  aOp = aOp = pPro
329b0 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e  gram->aOp;.  p->
329c0 6e 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  nOp = pProgram->
329d0 6e 4f 70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  nOp;.#ifdef SQLI
329e0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
329f0 43 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61  CANSTATUS.  p->a
32a00 6e 45 78 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  nExec = 0;.#endi
32a10 66 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 2d  f.  pOp = &aOp[-
32a20 31 5d 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  1];..  break;.}.
32a30 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61  ./* Opcode: Para
32a40 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
32a50 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
32a60 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65  is only ever pre
32a70 73 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67  sent in sub-prog
32a80 72 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20  rams called via 
32a90 74 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72  the .** OP_Progr
32aa0 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  am instruction. 
32ab0 43 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72  Copy a value cur
32ac0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
32ad0 20 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65   a memory .** ce
32ae0 6c 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  ll of the callin
32af0 67 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65  g (parent) frame
32b00 20 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74   to cell P2 in t
32b10 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
32b20 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
32b30 61 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ace. This is use
32b40 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
32b50 67 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20  grams to access 
32b60 74 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e  the new.* .** an
32b70 64 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a  d old.* values..
32b80 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73  **.** The addres
32b90 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e  s of the cell in
32ba0 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d   the parent fram
32bb0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
32bc0 62 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65  by adding.** the
32bd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
32be0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
32bf0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
32c00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
32c10 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  .** calling OP_P
32c20 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
32c30 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
32c40 61 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20  aram: {         
32c50 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56    /* out2 */.  V
32c60 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
32c70 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20  ;.  Mem *pIn;.  
32c80 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
32c90 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
32ca0 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72   pFrame = p->pFr
32cb0 61 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46  ame;.  pIn = &pF
32cc0 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
32cd0 70 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70  p1 + pFrame->aOp
32ce0 5b 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d  [pFrame->pc].p1]
32cf0 3b 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64  ;   .  sqlite3Vd
32d00 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
32d10 28 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f  (pOut, pIn, MEM_
32d20 45 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b  Ephem);.  break;
32d30 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  .}..#endif /* #i
32d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32d50 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69  T_TRIGGER */..#i
32d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32d70 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a  T_FOREIGN_KEY./*
32d80 20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74   Opcode: FkCount
32d90 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
32da0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74  * Synopsis: fkct
32db0 72 5b 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20  r[P1]+=P2.**.** 
32dc0 49 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e  Increment a "con
32dd0 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22  straint counter"
32de0 20 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62   by P2 (P2 may b
32df0 65 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f  e negative or po
32e00 73 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50  sitive)..** If P
32e10 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
32e20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
32e30 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69  traint counter i
32e40 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a  s incremented .*
32e50 2a 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65  * (deferred fore
32e60 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
32e70 6e 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  nts). Otherwise,
32e80 20 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20   if P1 is zero, 
32e90 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
32ea0 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
32eb0 72 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69  remented (immedi
32ec0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
32ed0 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f  constraints)..*/
32ee0 0a 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74  .case OP_FkCount
32ef0 65 72 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e  er: {.  if( db->
32f00 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
32f10 65 66 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64  eferFKs ){.    d
32f20 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
32f30 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ons += pOp->p2;.
32f40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
32f50 3e 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >p1 ){.    db->n
32f60 44 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20  DeferredCons += 
32f70 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65  pOp->p2;.  }else
32f80 7b 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73  {.    p->nFkCons
32f90 74 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70  traint += pOp->p
32fa0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
32fb0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  }../* Opcode: Fk
32fc0 49 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  IfZero P1 P2 * *
32fd0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
32fe0 69 66 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20  if fkctr[P1]==0 
32ff0 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68  goto P2.**.** Th
33000 69 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20  is opcode tests 
33010 69 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  if a foreign key
33020 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
33030 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
33040 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c   zero..** If so,
33050 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
33060 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69  tion P2. Otherwi
33070 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  se, fall through
33080 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a   to the next .**
33090 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
330a0 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  .** If P1 is non
330b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
330c0 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
330d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
330e0 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
330f0 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65  .** is zero (the
33100 20 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73   one that counts
33110 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
33120 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29  aint violations)
33130 2e 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65  . If P1 is.** ze
33140 72 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20  ro, the jump is 
33150 74 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61  taken if the sta
33160 74 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  tement constrain
33170 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72  t-counter is zer
33180 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20  o.** (immediate 
33190 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
331a0 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
331b0 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  s)..*/.case OP_F
331c0 6b 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  kIfZero: {      
331d0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
331e0 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
331f0 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
33200 65 6e 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  en(db->nDeferred
33210 43 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e  Cons==0 && db->n
33220 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d  DeferredImmCons=
33230 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  =0, 2);.    if( 
33240 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
33250 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  s==0 && db->nDef
33260 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20  erredImmCons==0 
33270 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
33280 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
33290 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
332a0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
332b0 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  ==0 && db->nDefe
332c0 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20  rredImmCons==0, 
332d0 32 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  2);.    if( p->n
332e0 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20  FkConstraint==0 
332f0 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
33300 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
33310 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
33320 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
33330 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
33340 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
33350 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64  GN_KEY */..#ifnd
33360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33370 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20  UTOINCREMENT./* 
33380 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50  Opcode: MemMax P
33390 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
333a0 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61  nopsis: r[P1]=ma
333b0 78 28 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a  x(r[P1],r[P2]).*
333c0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67  *.** P1 is a reg
333d0 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f  ister in the roo
333e0 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20  t frame of this 
333f0 56 4d 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61  VM (the root fra
33400 6d 65 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65  me is.** differe
33410 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  nt from the curr
33420 65 6e 74 20 66 72 61 6d 65 20 69 66 20 74 68 69  ent frame if thi
33430 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
33440 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a   being executed.
33450 2a 2a 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ** within a sub-
33460 70 72 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68  program). Set th
33470 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
33480 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61  ter P1 to the ma
33490 78 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73  ximum of .** its
334a0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
334b0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nd the value in 
334c0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
334d0 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
334e0 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72  ion throws an er
334f0 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72  ror if the memor
33500 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e  y cell is not in
33510 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  itially.** an in
33520 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
33530 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20  P_MemMax: {     
33540 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
33550 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
33560 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  ;.  if( p->pFram
33570 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72  e ){.    for(pFr
33580 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
33590 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
335a0 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
335b0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e  Parent);.    pIn
335c0 31 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  1 = &pFrame->aMe
335d0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65  m[pOp->p1];.  }e
335e0 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20  lse{.    pIn1 = 
335f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
33600 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65    }.  assert( me
33610 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
33620 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
33630 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
33640 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
33650 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73  em[pOp->p2];.  s
33660 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
33670 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20  egerify(pIn2);. 
33680 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70   if( pIn1->u.i<p
33690 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70  In2->u.i){.    p
336a0 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d  In1->u.i = pIn2-
336b0 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61  >u.i;.  }.  brea
336c0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
336d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
336e0 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20  NCREMENT */../* 
336f0 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31  Opcode: IfPos P1
33700 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
33710 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
33720 3e 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50  >0 then r[P1]-=P
33730 33 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  3, goto P2.**.**
33740 20 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   Register P1 mus
33750 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
33760 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20  eger..** If the 
33770 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
33780 72 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65  r P1 is 1 or gre
33790 61 74 65 72 2c 20 73 75 62 74 72 61 63 74 20 50  ater, subtract P
337a0 33 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61  3 from the.** va
337b0 6c 75 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75  lue in P1 and ju
337c0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
337d0 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  If the initial v
337e0 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
337f0 20 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P1 is less than
33800 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
33810 76 61 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67  value is unchang
33820 65 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70  ed and control p
33830 61 73 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f  asses through to
33840 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
33850 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
33860 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20  P_IfPos: {      
33870 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
33880 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
33890 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
338a0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
338b0 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64  &MEM_Int );.  Vd
338c0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70  beBranchTaken( p
338d0 49 6e 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a  In1->u.i>0, 2);.
338e0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
338f0 30 20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75  0 ){.    pIn1->u
33900 2e 69 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  .i -= pOp->p3;. 
33910 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
33920 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
33930 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
33940 66 66 73 65 74 4c 69 6d 69 74 20 50 31 20 50 32  ffsetLimit P1 P2
33950 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
33960 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20  sis: if r[P1]>0 
33970 74 68 65 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  then r[P2]=r[P1]
33980 2b 6d 61 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c  +max(0,r[P3]) el
33990 73 65 20 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a  se r[P2]=(-1).**
339a0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
339b0 70 65 72 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f  performs a commo
339c0 6e 6c 79 20 75 73 65 64 20 63 6f 6d 70 75 74 61  nly used computa
339d0 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
339e0 77 69 74 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e  with.** LIMIT an
339f0 64 20 4f 46 46 53 45 54 20 70 72 6f 63 65 73 73  d OFFSET process
33a00 2e 20 20 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74  .  r[P1] holds t
33a10 68 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72  he limit counter
33a20 2e 20 20 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64  .  r[P3].** hold
33a30 73 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  s the offset cou
33a40 6e 74 65 72 2e 20 20 54 68 65 20 6f 70 63 6f 64  nter.  The opcod
33a50 65 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 63  e computes the c
33a60 6f 6d 62 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a  ombined value.**
33a70 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   of the LIMIT an
33a80 64 20 4f 46 46 53 45 54 20 61 6e 64 20 73 74 6f  d OFFSET and sto
33a90 72 65 73 20 74 68 61 74 20 76 61 6c 75 65 20 69  res that value i
33aa0 6e 20 72 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b  n r[P2].  The r[
33ab0 50 32 5d 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d  P2].** value com
33ac0 70 75 74 65 64 20 69 73 20 74 68 65 20 74 6f 74  puted is the tot
33ad0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
33ae0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
33af0 20 74 6f 20 62 65 0a 2a 2a 20 76 69 73 69 74 65   to be.** visite
33b00 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
33b10 6d 70 6c 65 74 65 20 74 68 65 20 71 75 65 72 79  mplete the query
33b20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d  ..**.** If r[P3]
33b30 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
33b40 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  tive, that means
33b50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46   there is no OFF
33b60 53 45 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d  SET.** and r[P2]
33b70 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68   is set to be th
33b80 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4c  e value of the L
33b90 49 4d 49 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a  IMIT, r[P1]..**.
33ba0 2a 2a 20 69 66 20 72 5b 50 31 5d 20 69 73 20 7a  ** if r[P1] is z
33bb0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
33bc0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
33bd0 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a  e is no LIMIT.**
33be0 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65   and r[P2] is se
33bf0 74 20 74 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20  t to -1. .**.** 
33c00 4f 74 68 65 72 77 69 73 65 2c 20 72 5b 50 32 5d  Otherwise, r[P2]
33c10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
33c20 75 6d 20 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20  um of r[P1] and 
33c30 72 5b 50 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  r[P3]..*/.case O
33c40 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b  P_OffsetLimit: {
33c50 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32      /* in1, out2
33c60 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 36 34 20 78  , in3 */.  i64 x
33c70 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
33c80 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
33c90 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
33ca0 33 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  3];.  pOut = out
33cb0 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
33cc0 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
33cd0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
33ce0 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  _Int );.  assert
33cf0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
33d00 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 78 20 3d  MEM_Int );.  x =
33d10 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 69 66   pIn1->u.i;.  if
33d20 28 20 78 3c 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ( x<=0 || sqlite
33d30 33 41 64 64 49 6e 74 36 34 28 26 78 2c 20 70 49  3AddInt64(&x, pI
33d40 6e 33 2d 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e  n3->u.i>0?pIn3->
33d50 75 2e 69 3a 30 29 20 29 7b 0a 20 20 20 20 2f 2a  u.i:0) ){.    /*
33d60 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   If the LIMIT is
33d70 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
33d80 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f  ual to zero, loo
33d90 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73  p forever.  This
33da0 0a 20 20 20 20 2a 2a 20 69 73 20 64 6f 63 75 6d  .    ** is docum
33db0 65 6e 74 65 64 2e 20 20 42 75 74 20 61 6c 73 6f  ented.  But also
33dc0 2c 20 69 66 20 74 68 65 20 4c 49 4d 49 54 2b 4f  , if the LIMIT+O
33dd0 46 46 53 45 54 20 65 78 63 65 65 64 73 20 32 5e  FFSET exceeds 2^
33de0 36 33 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  63 then.    ** a
33df0 6c 73 6f 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72  lso loop forever
33e00 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
33e10 75 6d 65 6e 74 65 64 2e 20 20 49 6e 20 66 61 63  umented.  In fac
33e20 74 2c 20 6f 6e 65 20 63 6f 75 6c 64 20 61 72 67  t, one could arg
33e30 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ue.    ** that t
33e40 68 65 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 74  he loop should t
33e50 65 72 6d 69 6e 61 74 65 2e 20 20 42 75 74 20 61  erminate.  But a
33e60 73 73 75 6d 69 6e 67 20 31 20 62 69 6c 6c 69 6f  ssuming 1 billio
33e70 6e 20 69 74 65 72 61 74 69 6f 6e 73 0a 20 20 20  n iterations.   
33e80 20 2a 2a 20 70 65 72 20 73 65 63 6f 6e 64 20 28   ** per second (
33e90 66 61 72 20 65 78 63 65 65 64 69 6e 67 20 74 68  far exceeding th
33ea0 65 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 6f  e capabilities o
33eb0 66 20 61 6e 79 20 63 75 72 72 65 6e 74 20 68 61  f any current ha
33ec0 72 64 77 61 72 65 29 0a 20 20 20 20 2a 2a 20 69  rdware).    ** i
33ed0 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 6e 65 61  t would take nea
33ee0 72 6c 79 20 33 30 30 20 79 65 61 72 73 20 74 6f  rly 300 years to
33ef0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 20   actually reach 
33f00 74 68 65 20 6c 69 6d 69 74 2e 20 20 53 6f 0a 20  the limit.  So. 
33f10 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f     ** looping fo
33f20 72 65 76 65 72 20 69 73 20 61 20 72 65 61 73 6f  rever is a reaso
33f30 6e 61 62 6c 65 20 61 70 70 72 6f 78 69 6d 61 74  nable approximat
33f40 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 4f 75 74  ion. */.    pOut
33f50 2d 3e 75 2e 69 20 3d 20 2d 31 3b 0a 20 20 7d 65  ->u.i = -1;.  }e
33f60 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  lse{.    pOut->u
33f70 2e 69 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 62 72  .i = x;.  }.  br
33f80 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
33f90 65 3a 20 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20  e: IfNotZero P1 
33fa0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
33fb0 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
33fc0 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20  0 then r[P1]--, 
33fd0 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65  goto P2.**.** Re
33fe0 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63  gister P1 must c
33ff0 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
34000 72 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65  r.  If the conte
34010 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
34020 31 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  1 is.** initiall
34030 79 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  y greater than z
34040 65 72 6f 2c 20 74 68 65 6e 20 64 65 63 72 65 6d  ero, then decrem
34050 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ent the value in
34060 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
34070 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
34080 72 6f 20 28 6e 65 67 61 74 69 76 65 20 6f 72 20  ro (negative or 
34090 70 6f 73 69 74 69 76 65 29 20 61 6e 64 20 74 68  positive) and th
340a0 65 6e 20 61 6c 73 6f 20 6a 75 6d 70 20 74 6f 20  en also jump to 
340b0 50 32 2e 20 20 0a 2a 2a 20 49 66 20 72 65 67 69  P2.  .** If regi
340c0 73 74 65 72 20 50 31 20 69 73 20 69 6e 69 74 69  ster P1 is initi
340d0 61 6c 6c 79 20 7a 65 72 6f 2c 20 6c 65 61 76 65  ally zero, leave
340e0 20 69 74 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   it unchanged an
340f0 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  d fall through..
34100 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74  */.case OP_IfNot
34110 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f  Zero: {        /
34120 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
34130 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
34140 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
34150 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn1->flags&ME
34160 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42  M_Int );.  VdbeB
34170 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d  ranchTaken(pIn1-
34180 3e 75 2e 69 3c 30 2c 20 32 29 3b 0a 20 20 69 66  >u.i<0, 2);.  if
34190 28 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20  ( pIn1->u.i ){. 
341a0 20 20 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e      if( pIn1->u.
341b0 69 3e 30 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d  i>0 ) pIn1->u.i-
341c0 2d 3b 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  -;.     goto jum
341d0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
341e0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
341f0 64 65 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f  de: DecrJumpZero
34200 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
34210 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d  Synopsis: if (--
34220 72 5b 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50  r[P1])==0 goto P
34230 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
34240 20 50 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e   P1 must hold an
34250 20 69 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65   integer.  Decre
34260 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69  ment the value i
34270 6e 20 50 31 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70  n P1.** and jump
34280 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 6e 65   to P2 if the ne
34290 77 20 76 61 6c 75 65 20 69 73 20 65 78 61 63 74  w value is exact
342a0 6c 79 20 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65  ly zero..*/.case
342b0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
342c0 3a 20 7b 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  : {      /* jump
342d0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
342e0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
342f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
34300 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
34310 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
34320 2e 69 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  .i>SMALLEST_INT6
34330 34 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b  4 ) pIn1->u.i--;
34340 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
34350 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c  en(pIn1->u.i==0,
34360 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d   2);.  if( pIn1-
34370 3e 75 2e 69 3d 3d 30 20 29 20 67 6f 74 6f 20 6a  >u.i==0 ) goto j
34380 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
34390 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
343a0 65 3a 20 41 67 67 53 74 65 70 30 20 2a 20 50 32  e: AggStep0 * P2
343b0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
343c0 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50  opsis: accum=r[P
343d0 33 5d 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d  3] step(r[P2@P5]
343e0 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ).**.** Execute 
343f0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
34400 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
34410 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63  te.  The.** func
34420 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75  tion has P5 argu
34430 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61  ments.   P4 is a
34440 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34450 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
34460 74 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66  ture that specif
34470 69 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ies the function
34480 2e 20 20 52 65 67 69 73 74 65 72 20 50 33 20 69  .  Register P3 i
34490 73 20 74 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c  s the.** accumul
344a0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
344b0 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
344c0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
344d0 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
344e0 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
344f0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  /./* Opcode: Agg
34500 53 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20  Step * P2 P3 P4 
34510 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
34520 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70  accum=r[P3] step
34530 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a  (r[P2@P5]).**.**
34540 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74 65   Execute the ste
34550 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  p function for a
34560 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
34570 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61  e.** function ha
34580 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20  s P5 arguments. 
34590 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65    P4 is a pointe
345a0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
345b0 63 6f 6e 74 65 78 74 0a 2a 2a 20 6f 62 6a 65 63  context.** objec
345c0 74 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  t that is used t
345d0 6f 20 72 75 6e 20 74 68 65 20 66 75 6e 63 74 69  o run the functi
345e0 6f 6e 2e 20 20 52 65 67 69 73 74 65 72 20 50 33  on.  Register P3
345f0 20 69 73 0a 2a 2a 20 61 73 20 74 68 65 20 61 63   is.** as the ac
34600 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
34610 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74   The P5 argument
34620 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
34630 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
34640 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f   its.** successo
34650 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  rs..**.** This o
34660 70 63 6f 64 65 20 69 73 20 69 6e 69 74 69 61 6c  pcode is initial
34670 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f 41  ly coded as OP_A
34680 67 67 53 74 65 70 30 2e 20 20 4f 6e 20 66 69 72  ggStep0.  On fir
34690 73 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a  st evaluation,.*
346a0 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  * the FuncDef st
346b0 6f 72 65 64 20 69 6e 20 50 34 20 69 73 20 63 6f  ored in P4 is co
346c0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
346d0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
346e0 61 6e 64 0a 2a 2a 20 74 68 65 20 6f 70 63 6f 64  and.** the opcod
346f0 65 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 49  e is changed.  I
34700 6e 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  n this way, the 
34710 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
34720 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  f the.** sqlite3
34730 5f 63 6f 6e 74 65 78 74 20 6f 6e 6c 79 20 68 61  _context only ha
34740 70 70 65 6e 73 20 6f 6e 63 65 2c 20 69 6e 73 74  ppens once, inst
34750 65 61 64 20 6f 66 20 6f 6e 20 65 61 63 68 20 63  ead of on each c
34760 61 6c 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  all to the.** st
34770 65 70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ep function..*/.
34780 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65 70 30  case OP_AggStep0
34790 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  : {.  int n;.  s
347a0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
347b0 70 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCtx;..  assert(
347c0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
347d0 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20  _FUNCDEF );.  n 
347e0 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73  = pOp->p5;.  ass
347f0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
34800 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
34810 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
34820 6f 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  or) );.  assert(
34830 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70   n==0 || (pOp->p
34840 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
34850 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
34860 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 29 20 29 3b  ->nCursor)+1) );
34870 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
34880 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f  p3<pOp->p2 || pO
34890 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e  p->p3>=pOp->p2+n
348a0 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 73 71 6c   );.  pCtx = sql
348b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
348c0 4e 28 64 62 2c 20 6e 2a 73 69 7a 65 6f 66 28 73  N(db, n*sizeof(s
348d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 20 2b  qlite3_value*) +
348e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
348f0 28 73 69 7a 65 6f 66 28 70 43 74 78 5b 30 5d 29  (sizeof(pCtx[0])
34900 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 20 2d   + sizeof(Mem) -
34910 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
34920 76 61 6c 75 65 2a 29 29 29 3b 0a 20 20 69 66 28  value*)));.  if(
34930 20 70 43 74 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pCtx==0 ) goto 
34940 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 74 78 2d 3e  no_mem;.  pCtx->
34950 70 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 43 74 78  pMem = 0;.  pCtx
34960 2d 3e 70 4f 75 74 20 3d 20 28 4d 65 6d 2a 29 26  ->pOut = (Mem*)&
34970 28 70 43 74 78 2d 3e 61 72 67 76 5b 6e 5d 29 3b  (pCtx->argv[n]);
34980 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
34990 6d 49 6e 69 74 28 70 43 74 78 2d 3e 70 4f 75 74  mInit(pCtx->pOut
349a0 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
349b0 0a 20 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d  .  pCtx->pFunc =
349c0 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
349d0 20 20 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69    pCtx->iOp = (i
349e0 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
349f0 20 20 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20    pCtx->pVdbe = 
34a00 70 3b 0a 20 20 70 43 74 78 2d 3e 73 6b 69 70 46  p;.  pCtx->skipF
34a10 6c 61 67 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d  lag = 0;.  pCtx-
34a20 3e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  >isError = 0;.  
34a30 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e 3b 0a  pCtx->argc = n;.
34a40 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
34a50 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20 70 4f  P4_FUNCCTX;.  pO
34a60 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70 43 74  p->p4.pCtx = pCt
34a70 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  x;.  pOp->opcode
34a80 20 3d 20 4f 50 5f 41 67 67 53 74 65 70 3b 0a 20   = OP_AggStep;. 
34a90 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
34aa0 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74 65 70   into OP_AggStep
34ab0 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f 41 67   */.}.case OP_Ag
34ac0 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 69  gStep: {.  int i
34ad0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ;.  sqlite3_cont
34ae0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 4d 65 6d  ext *pCtx;.  Mem
34af0 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72   *pMem;..  asser
34b00 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
34b10 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20 20  P4_FUNCCTX );.  
34b20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pCtx = pOp->p4.p
34b30 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61  Ctx;.  pMem = &a
34b40 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20  Mem[pOp->p3];.. 
34b50 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63   /* If this func
34b60 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f  tion is inside o
34b70 66 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  f a trigger, the
34b80 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20   register array 
34b90 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d  in aMem[].  ** m
34ba0 69 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d  ight change from
34bb0 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   one evaluation 
34bc0 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68  to the next.  Th
34bd0 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
34be0 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73  code.  ** checks
34bf0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
34c00 65 67 69 73 74 65 72 20 61 72 72 61 79 20 68 61  egister array ha
34c10 73 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69  s changed, and i
34c20 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69  f so it.  ** rei
34c30 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72  nitializes the r
34c40 65 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66  elavant parts of
34c50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e   the sqlite3_con
34c60 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  text object */. 
34c70 20 69 66 28 20 70 43 74 78 2d 3e 70 4d 65 6d 20   if( pCtx->pMem 
34c80 21 3d 20 70 4d 65 6d 20 29 7b 0a 20 20 20 20 70  != pMem ){.    p
34c90 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d  Ctx->pMem = pMem
34ca0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74 78  ;.    for(i=pCtx
34cb0 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20  ->argc-1; i>=0; 
34cc0 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76 5b  i--) pCtx->argv[
34cd0 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  i] = &aMem[pOp->
34ce0 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64  p2+i];.  }..#ifd
34cf0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34d00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74    for(i=0; i<pCt
34d10 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  x->argc; i++){. 
34d20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
34d30 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76  Valid(pCtx->argv
34d40 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  [i]) );.    REGI
34d50 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
34d60 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76  p2+i, pCtx->argv
34d70 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  [i]);.  }.#endif
34d80 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20  ..  pMem->n++;. 
34d90 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 70   assert( pCtx->p
34da0 4f 75 74 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  Out->flags==MEM_
34db0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
34dc0 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3d  ( pCtx->isError=
34dd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34de0 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 3d 3d  pCtx->skipFlag==
34df0 30 20 29 3b 0a 20 20 28 70 43 74 78 2d 3e 70 46  0 );.  (pCtx->pF
34e00 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74  unc->xSFunc)(pCt
34e10 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74  x,pCtx->argc,pCt
34e20 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d 50  x->argv); /* IMP
34e30 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
34e40 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 69  */.  if( pCtx->i
34e50 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 69 66  sError ){.    if
34e60 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3e  ( pCtx->isError>
34e70 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
34e80 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
34e90 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
34ea0 75 65 5f 74 65 78 74 28 70 43 74 78 2d 3e 70 4f  ue_text(pCtx->pO
34eb0 75 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ut));.      rc =
34ec0 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3b 0a   pCtx->isError;.
34ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
34ee0 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 29 7b 0a  tx->skipFlag ){.
34ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
34f00 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
34f10 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20  _CollSeq );.    
34f20 20 20 69 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    i = pOp[-1].p1
34f30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  ;.      if( i ) 
34f40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
34f50 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 69 5d 2c  tInt64(&aMem[i],
34f60 20 31 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d   1);.      pCtx-
34f70 3e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20  >skipFlag = 0;. 
34f80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
34f90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
34fa0 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 20 20 20 20  Ctx->pOut);.    
34fb0 70 43 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67  pCtx->pOut->flag
34fc0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
34fd0 20 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20    pCtx->isError 
34fe0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
34ff0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
35000 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
35010 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 70   assert( pCtx->p
35020 4f 75 74 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  Out->flags==MEM_
35030 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
35040 28 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67  ( pCtx->skipFlag
35050 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ==0 );.  break;.
35060 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  }../* Opcode: Ag
35070 67 46 69 6e 61 6c 20 50 31 20 50 32 20 2a 20 50  gFinal P1 P2 * P
35080 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
35090 20 61 63 63 75 6d 3d 72 5b 50 31 5d 20 4e 3d 50   accum=r[P1] N=P
350a0 32 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  2.**.** Execute 
350b0 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75  the finalizer fu
350c0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
350d0 67 72 65 67 61 74 65 2e 20 20 50 31 20 69 73 0a  gregate.  P1 is.
350e0 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f  ** the memory lo
350f0 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20 74  cation that is t
35100 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 66  he accumulator f
35110 6f 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65  or the aggregate
35120 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68  ..**.** P2 is th
35130 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
35140 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20 73  ments that the s
35150 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  tep function tak
35160 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69 73 20  es and.** P4 is 
35170 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35180 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74 68 69   FuncDef for thi
35190 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  s function.  The
351a0 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20   P2.** argument 
351b0 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
351c0 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49 74 20  his opcode.  It 
351d0 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20 74 6f  is only there to
351e0 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a 2a 2a   disambiguate.**
351f0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
35200 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69 6e 67  can take varying
35210 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72 67 75   numbers of argu
35220 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a 20 50  ments.  The.** P
35230 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e  4 argument is on
35240 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  ly needed for th
35250 65 20 64 65 67 65 6e 65 72 61 74 65 20 63 61 73  e degenerate cas
35260 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 73  e where.** the s
35270 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  tep function was
35280 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
35290 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  called..*/.case 
352a0 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b 0a 20  OP_AggFinal: {. 
352b0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61 73   Mem *pMem;.  as
352c0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20  sert( pOp->p1>0 
352d0 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e  && pOp->p1<=(p->
352e0 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
352f0 73 6f 72 29 20 29 3b 0a 20 20 70 4d 65 6d 20 3d  sor) );.  pMem =
35300 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
35310 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
35320 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f  ->flags & ~(MEM_
35330 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d  Null|MEM_Agg))==
35340 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
35350 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69  te3VdbeMemFinali
35360 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34  ze(pMem, pOp->p4
35370 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20 72  .pFunc);.  if( r
35380 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
35390 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73  VdbeError(p, "%s
353a0 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
353b0 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20  _text(pMem));.  
353c0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
353d0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
353e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
353f0 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d 2c  geEncoding(pMem,
35400 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50   encoding);.  UP
35410 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
35420 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20 73  E(pMem);.  if( s
35430 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
35440 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20  Big(pMem) ){.   
35450 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
35460 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23   }.  break;.}..#
35470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35480 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65  IT_WAL./* Opcode
35490 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50 31 20  : Checkpoint P1 
354a0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
354b0 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
354c0 61 73 65 20 50 31 2e 20 54 68 69 73 20 69 73 20  ase P1. This is 
354d0 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20 69 73  a no-op if P1 is
354e0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69   not currently i
354f0 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 20 50  n.** WAL mode. P
35500 61 72 61 6d 65 74 65 72 20 50 32 20 69 73 20 6f  arameter P2 is o
35510 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
35520 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
35530 20 46 55 4c 4c 2c 0a 2a 2a 20 52 45 53 54 41 52   FULL,.** RESTAR
35540 54 2c 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 20  T, or TRUNCATE. 
35550 20 57 72 69 74 65 20 31 20 6f 72 20 30 20 69 6e   Write 1 or 0 in
35560 74 6f 20 6d 65 6d 5b 50 33 5d 20 69 66 20 74 68  to mem[P3] if th
35570 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 72 65 74  e checkpoint ret
35580 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  urns.** SQLITE_B
35590 55 53 59 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70  USY or not, resp
355a0 65 63 74 69 76 65 6c 79 2e 20 20 57 72 69 74 65  ectively.  Write
355b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
355c0 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 57  ages in the.** W
355d0 41 4c 20 61 66 74 65 72 20 74 68 65 20 63 68 65  AL after the che
355e0 63 6b 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d  ckpoint into mem
355f0 5b 50 33 2b 31 5d 20 61 6e 64 20 74 68 65 20 6e  [P3+1] and the n
35600 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
35610 2a 20 69 6e 20 74 68 65 20 57 41 4c 20 74 68 61  * in the WAL tha
35620 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  t have been chec
35630 6b 70 6f 69 6e 74 65 64 20 61 66 74 65 72 20 74  kpointed after t
35640 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  he checkpoint.**
35650 20 63 6f 6d 70 6c 65 74 65 73 20 69 6e 74 6f 20   completes into 
35660 6d 65 6d 5b 50 33 2b 32 5d 2e 20 20 48 6f 77 65  mem[P3+2].  Howe
35670 76 65 72 20 6f 6e 20 61 6e 20 65 72 72 6f 72 2c  ver on an error,
35680 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 0a 2a   mem[P3+1] and.*
35690 2a 20 6d 65 6d 5b 50 33 2b 32 5d 20 61 72 65 20  * mem[P3+2] are 
356a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 2d  initialized to -
356b0 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 68  1..*/.case OP_Ch
356c0 65 63 6b 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e  eckpoint: {.  in
356d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
356e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
356f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35700 0a 20 20 69 6e 74 20 61 52 65 73 5b 33 5d 3b 20  .  int aRes[3]; 
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f     /* Results */
35730 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20  .  Mem *pMem;   
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35750 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
35760 6c 74 73 20 68 65 72 65 20 2a 2f 0a 0a 20 20 61  lts here */..  a
35770 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
35780 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 52 65 73 5b  ly==0 );.  aRes[
35790 30 5d 20 3d 20 30 3b 0a 20 20 61 52 65 73 5b 31  0] = 0;.  aRes[1
357a0 5d 20 3d 20 61 52 65 73 5b 32 5d 20 3d 20 2d 31  ] = aRes[2] = -1
357b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
357c0 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
357d0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 0a 20  KPOINT_PASSIVE. 
357e0 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32        || pOp->p2
357f0 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
35800 49 4e 54 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20  INT_FULL.       
35810 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  || pOp->p2==SQLI
35820 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
35830 53 54 41 52 54 0a 20 20 20 20 20 20 20 7c 7c 20  START.       || 
35840 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
35850 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
35860 41 54 45 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20  ATE.  );.  rc = 
35870 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
35880 74 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  t(db, pOp->p1, p
35890 4f 70 2d 3e 70 32 2c 20 26 61 52 65 73 5b 31 5d  Op->p2, &aRes[1]
358a0 2c 20 26 61 52 65 73 5b 32 5d 29 3b 0a 20 20 69  , &aRes[2]);.  i
358b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
358c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
358d0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
358e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
358f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35900 20 20 20 20 61 52 65 73 5b 30 5d 20 3d 20 31 3b      aRes[0] = 1;
35910 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
35920 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
35930 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69 2b 2b 2c  ->p3]; i<3; i++,
35940 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71   pMem++){.    sq
35950 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
35960 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69 36 34 29  nt64(pMem, (i64)
35970 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d 20 20 20  aRes[i]);.  }   
35980 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20 20 0a   .  break;.};  .
35990 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
359a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47  SQLITE_OMIT_PRAG
359b0 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 6f  MA./* Opcode: Jo
359c0 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50 32 20  urnalMode P1 P2 
359d0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 61  P3 * *.**.** Cha
359e0 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nge the journal 
359f0 6d 6f 64 65 20 6f 66 20 64 61 74 61 62 61 73 65  mode of database
35a00 20 50 31 20 74 6f 20 50 33 2e 20 50 33 20 6d 75   P1 to P3. P3 mu
35a10 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
35a20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
35a30 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c 75 65 73  LMODE_XXX values
35a40 2e 20 49 66 20 63 68 61 6e 67 69 6e 67 20 62 65  . If changing be
35a50 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75  tween the variou
35a60 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f  s rollback.** mo
35a70 64 65 73 20 28 64 65 6c 65 74 65 2c 20 74 72 75  des (delete, tru
35a80 6e 63 61 74 65 2c 20 70 65 72 73 69 73 74 2c 20  ncate, persist, 
35a90 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72 79 29 2c  off and memory),
35aa0 20 74 68 69 73 20 69 73 20 61 20 73 69 6d 70 6c   this is a simpl
35ab0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  e.** operation. 
35ac0 4e 6f 20 49 4f 20 69 73 20 72 65 71 75 69 72 65  No IO is require
35ad0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68 61 6e  d..**.** If chan
35ae0 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20 6f 75 74  ging into or out
35af0 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20 74 68 65   of WAL mode the
35b00 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 6d 6f   procedure is mo
35b10 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a  re complicated..
35b20 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 73 74  **.** Write a st
35b30 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
35b40 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75 72 6e 61  the final journa
35b50 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67 69 73 74  l-mode to regist
35b60 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
35b70 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
35b80 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
35b90 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20   Btree *pBt;    
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bb0 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68 61   /* Btree to cha
35bc0 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  nge journal mode
35bd0 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a   of */.  Pager *
35be0 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
35bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35c00 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
35c10 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65  h pBt */.  int e
35c20 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
35c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
35c40 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  w journal mode *
35c50 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20  /.  int eOld;   
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c70 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a      /* The old j
35c80 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23  ournal mode */.#
35c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35ca0 49 54 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20 63  IT_WAL.  const c
35cb0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
35cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35cd0 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
35ce0 65 20 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a  e for pPager */.
35cf0 23 65 6e 64 69 66 0a 0a 20 20 70 4f 75 74 20 3d  #endif..  pOut =
35d00 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
35d10 70 2c 20 70 4f 70 29 3b 0a 20 20 65 4e 65 77 20  p, pOp);.  eNew 
35d20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
35d30 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47 45 52  ert( eNew==PAGER
35d40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
35d50 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  ETE .       || e
35d60 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
35d70 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
35d80 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
35d90 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35da0 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20 20 20  DE_PERSIST .    
35db0 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
35dc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
35dd0 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  F.       || eNew
35de0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35df0 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20  ODE_MEMORY.     
35e00 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
35e10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
35e20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
35e30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35e40 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20 20  DE_QUERY.  );.  
35e50 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
35e60 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
35e70 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
35e80 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
35e90 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62  0 );..  pBt = db
35ea0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
35eb0 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  Bt;.  pPager = s
35ec0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
35ed0 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d 20  (pBt);.  eOld = 
35ee0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a  sqlite3PagerGetJ
35ef0 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
35f00 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d  r);.  if( eNew==
35f10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35f20 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77 20 3d  E_QUERY ) eNew =
35f30 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73 71   eOld;.  if( !sq
35f40 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68  lite3PagerOkToCh
35f50 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  angeJournalMode(
35f60 70 50 61 67 65 72 29 20 29 20 65 4e 65 77 20 3d  pPager) ) eNew =
35f70 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66 20   eOld;..#ifndef 
35f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
35f90 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
35fa0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
35fb0 6d 65 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a  me(pPager, 1);..
35fc0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
35fd0 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  w a transition t
35fe0 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57  o journal_mode=W
35ff0 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  AL for a databas
36000 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f 72  e.  ** in tempor
36010 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72 20 69  ary storage or i
36020 66 20 74 68 65 20 56 46 53 20 64 6f 65 73 20 6e  f the VFS does n
36030 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
36040 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20  d memory .  */. 
36050 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52   if( eNew==PAGER
36060 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
36070 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53  .   && (sqlite3S
36080 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
36090 65 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  e)==0           
360a0 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f 0a  /* Temp file */.
360b0 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74         || !sqlit
360c0 65 33 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72  e3PagerWalSuppor
360d0 74 65 64 28 70 50 61 67 65 72 29 29 20 20 20 2f  ted(pPager))   /
360e0 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  * No shared-memo
360f0 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  ry support */.  
36100 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f  ){.    eNew = eO
36110 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28  ld;.  }..  if( (
36120 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20 26  eNew!=eOld).   &
36130 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  & (eOld==PAGER_J
36140 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c  OURNALMODE_WAL |
36150 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
36160 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
36170 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   ){.    if( !db-
36180 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64  >autoCommit || d
36190 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
361a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
361b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
361c0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
361d0 72 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20 22  r(p,.          "
361e0 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 25 73  cannot change %s
361f0 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f 6d 20 77   wal mode from w
36200 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
36210 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
36220 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55  (eNew==PAGER_JOU
36230 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 22  RNALMODE_WAL ? "
36240 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20 6f 66 22  into" : "out of"
36250 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
36260 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
36270 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65  to_error;.    }e
36280 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20 69 66 28  lse{. .      if(
36290 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55   eOld==PAGER_JOU
362a0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
362b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6c 65          /* If le
362c0 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65 2c 20  aving WAL mode, 
362d0 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69  close the log fi
362e0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
362f0 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20 20 20  l, the call.    
36300 20 20 20 20 2a 2a 20 74 6f 20 50 61 67 65 72 43      ** to PagerC
36310 6c 6f 73 65 57 61 6c 28 29 20 63 68 65 63 6b 70  loseWal() checkp
36320 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c 65 74 65  oints and delete
36330 73 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  s the write-ahea
36340 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20 20 2a  d-log .        *
36350 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58 43 4c 55  * file. An EXCLU
36360 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20 73 74  SIVE lock may st
36370 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ill be held on t
36380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36390 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74   .        ** aft
363a0 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
363b0 72 65 74 75 72 6e 2e 20 0a 20 20 20 20 20 20 20  return. .       
363c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
363d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
363e0 73 65 57 61 6c 28 70 50 61 67 65 72 2c 20 64 62  seWal(pPager, db
363f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36410 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36420 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
36430 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65  Mode(pPager, eNe
36440 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  w);.        }.  
36450 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
36460 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
36470 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
36480 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f          /* Canno
36490 74 20 74 72 61 6e 73 69 74 69 6f 6e 20 64 69 72  t transition dir
364a0 65 63 74 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f 52  ectly from MEMOR
364b0 59 20 74 6f 20 57 41 4c 2e 20 20 55 73 65 20 6d  Y to WAL.  Use m
364c0 6f 64 65 20 4f 46 46 0a 20 20 20 20 20 20 20 20  ode OFF.        
364d0 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 72 6d 65  ** as an interme
364e0 64 69 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20  diate */.       
364f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
36500 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
36510 65 72 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  er, PAGER_JOURNA
36520 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20 20 20 20  LMODE_OFF);.    
36530 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
36540 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
36550 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  on on the databa
36560 73 65 20 66 69 6c 65 2e 20 52 65 67 61 72 64 6c  se file. Regardl
36570 65 73 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ess of the journ
36580 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  al.      ** mode
36590 2c 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  , this transacti
365a0 6f 6e 20 61 6c 77 61 79 73 20 75 73 65 73 20 61  on always uses a
365b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
365c0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
365d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
365e0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
365f0 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pBt)==0 );.     
36600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
36620 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
36630 65 74 56 65 72 73 69 6f 6e 28 70 42 74 2c 20 28  etVersion(pBt, (
36640 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
36650 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 32 20  NALMODE_WAL ? 2 
36660 3a 20 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  : 1));.      }. 
36670 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
36680 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
36690 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20  _OMIT_WAL */..  
366a0 69 66 28 20 72 63 20 29 20 65 4e 65 77 20 3d 20  if( rc ) eNew = 
366b0 65 4f 6c 64 3b 0a 20 20 65 4e 65 77 20 3d 20 73  eOld;.  eNew = s
366c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
366d0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
366e0 2c 20 65 4e 65 77 29 3b 0a 0a 20 20 70 4f 75 74  , eNew);..  pOut
366f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
36700 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  r|MEM_Static|MEM
36710 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a  _Term;.  pOut->z
36720 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
36730 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d  e3JournalModenam
36740 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74 2d  e(eNew);.  pOut-
36750 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
36760 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20  en30(pOut->z);. 
36770 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c   pOut->enc = SQL
36780 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69  ITE_UTF8;.  sqli
36790 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
367a0 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f  oding(pOut, enco
367b0 64 69 6e 67 29 3b 0a 20 20 69 66 28 20 72 63 20  ding);.  if( rc 
367c0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
367d0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
367e0 61 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a  ak;.};.#endif /*
367f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
36800 47 4d 41 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  GMA */..#if !def
36810 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
36820 5f 56 41 43 55 55 4d 29 20 26 26 20 21 64 65 66  _VACUUM) && !def
36830 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
36840 5f 41 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f  _ATTACH)./* Opco
36850 64 65 3a 20 56 61 63 75 75 6d 20 50 31 20 2a 20  de: Vacuum P1 * 
36860 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75  * * *.**.** Vacu
36870 75 6d 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  um the entire da
36880 74 61 62 61 73 65 20 50 31 2e 20 20 50 31 20 69  tabase P1.  P1 i
36890 73 20 30 20 66 6f 72 20 22 6d 61 69 6e 22 2c 20  s 0 for "main", 
368a0 61 6e 64 20 32 20 6f 72 20 6d 6f 72 65 0a 2a 2a  and 2 or more.**
368b0 20 66 6f 72 20 61 6e 20 61 74 74 61 63 68 65 64   for an attached
368c0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
368d0 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 20  "temp" database 
368e0 6d 61 79 20 6e 6f 74 20 62 65 20 76 61 63 75 75  may not be vacuu
368f0 6d 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  med..*/.case OP_
36900 56 61 63 75 75 6d 3a 20 7b 0a 20 20 61 73 73 65  Vacuum: {.  asse
36910 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
36920 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
36930 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28 26 70  ite3RunVacuum(&p
36940 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 70  ->zErrMsg, db, p
36950 4f 70 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72  Op->p1);.  if( r
36960 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
36970 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
36980 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
36990 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
369a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
369b0 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  UUM)./* Opcode: 
369c0 49 6e 63 72 56 61 63 75 75 6d 20 50 31 20 50 32  IncrVacuum P1 P2
369d0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 72   * * *.**.** Per
369e0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
369f0 65 70 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d  ep of the increm
36a00 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 70 72 6f  ental vacuum pro
36a10 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20 74 68 65  cedure on.** the
36a20 20 50 31 20 64 61 74 61 62 61 73 65 2e 20 49 66   P1 database. If
36a30 20 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20   the vacuum has 
36a40 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d 70 20 74  finished, jump t
36a50 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  o instruction.**
36a60 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
36a70 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
36a80 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
36a90 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
36aa0 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20 7b 20 20  _IncrVacuum: {  
36ab0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
36ac0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a  .  Btree *pBt;..
36ad0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
36ae0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
36af0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
36b00 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
36b10 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f  p->btreeMask, pO
36b20 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 65  p->p1) );.  asse
36b30 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
36b40 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62  =0 );.  pBt = db
36b50 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
36b60 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  Bt;.  rc = sqlit
36b70 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
36b80 6d 28 70 42 74 29 3b 0a 20 20 56 64 62 65 42 72  m(pBt);.  VdbeBr
36b90 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d 3d 53 51  anchTaken(rc==SQ
36ba0 4c 49 54 45 5f 44 4f 4e 45 2c 32 29 3b 0a 20 20  LITE_DONE,2);.  
36bb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
36bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
36bd0 45 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  E ) goto abort_d
36be0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
36bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36c00 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
36c10 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
36c20 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
36c30 4f 70 63 6f 64 65 3a 20 45 78 70 69 72 65 20 50  Opcode: Expire P
36c40 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
36c50 43 61 75 73 65 20 70 72 65 63 6f 6d 70 69 6c 65  Cause precompile
36c60 64 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  d statements to 
36c70 65 78 70 69 72 65 2e 20 20 57 68 65 6e 20 61 6e  expire.  When an
36c80 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
36c90 6e 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65  nt.** is execute
36ca0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
36cb0 73 74 65 70 28 29 20 69 74 20 77 69 6c 6c 20 65  step() it will e
36cc0 69 74 68 65 72 20 61 75 74 6f 6d 61 74 69 63 61  ither automatica
36cd0 6c 6c 79 0a 2a 2a 20 72 65 70 72 65 70 61 72 65  lly.** reprepare
36ce0 20 69 74 73 65 6c 66 20 28 69 66 20 69 74 20 77   itself (if it w
36cf0 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 72  as originally cr
36d00 65 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eated using sqli
36d10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
36d20 29 0a 2a 2a 20 6f 72 20 69 74 20 77 69 6c 6c 20  ).** or it will 
36d30 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
36d40 5f 53 43 48 45 4d 41 2e 0a 2a 2a 20 0a 2a 2a 20  _SCHEMA..** .** 
36d50 49 66 20 50 31 20 69 73 20 30 2c 20 74 68 65 6e  If P1 is 0, then
36d60 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d 65   all SQL stateme
36d70 6e 74 73 20 62 65 63 6f 6d 65 20 65 78 70 69 72  nts become expir
36d80 65 64 2e 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  ed. If P1 is non
36d90 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f  -zero,.** then o
36da0 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74 6c  nly the currentl
36db0 79 20 65 78 65 63 75 74 69 6e 67 20 73 74 61 74  y executing stat
36dc0 65 6d 65 6e 74 20 69 73 20 65 78 70 69 72 65 64  ement is expired
36dd0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 78 70  ..*/.case OP_Exp
36de0 69 72 65 3a 20 7b 0a 20 20 69 66 28 20 21 70 4f  ire: {.  if( !pO
36df0 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c  p->p1 ){.    sql
36e00 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
36e10 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
36e20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
36e30 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
36e40 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23   }.  break;.}..#
36e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36e60 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
36e70 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61 62 6c 65  /* Opcode: Table
36e80 4c 6f 63 6b 20 50 31 20 50 32 20 50 33 20 50 34  Lock P1 P2 P3 P4
36e90 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
36ea0 69 44 62 3d 50 31 20 72 6f 6f 74 3d 50 32 20 77  iDb=P1 root=P2 w
36eb0 72 69 74 65 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 62  rite=P3.**.** Ob
36ec0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
36ed0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
36ee0 65 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  e. This instruct
36ef0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
36f00 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 73 68 61   when.** the sha
36f10 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
36f20 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  e is enabled. .*
36f30 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
36f40 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
36f50 62 61 73 65 20 69 6e 20 73 71 6c 69 74 65 33 2e  base in sqlite3.
36f60 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
36f70 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63  abase.** on whic
36f80 68 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 63  h the lock is ac
36f90 71 75 69 72 65 64 2e 20 20 41 20 72 65 61 64 6c  quired.  A readl
36fa0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
36fb0 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61  if P3==0 or.** a
36fc0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 50   write lock if P
36fd0 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63  3==1..**.** P2 c
36fe0 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74  ontains the root
36ff0 2d 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62  -page of the tab
37000 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  le to lock..**.*
37010 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73 20 61 20  * P4 contains a 
37020 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
37030 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
37040 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54   being locked. T
37050 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75  his is only.** u
37060 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
37070 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
37080 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   if the lock can
37090 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
370a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c  .*/.case OP_Tabl
370b0 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38 20 69 73  eLock: {.  u8 is
370c0 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 75 38 29  WriteLock = (u8)
370d0 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 69  pOp->p3;.  if( i
370e0 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d  sWriteLock || 0=
370f0 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  =(db->flags&SQLI
37100 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
37110 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d   ){.    int p1 =
37120 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20 61   pOp->p1; .    a
37130 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
37140 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
37150 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
37160 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
37170 6b 2c 20 70 31 29 20 29 3b 0a 20 20 20 20 61 73  k, p1) );.    as
37180 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
37190 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
371a0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63  ock==1 );.    rc
371b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
371c0 6f 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ockTable(db->aDb
371d0 5b 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70  [p1].pBt, pOp->p
371e0 32 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b  2, isWriteLock);
371f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
37200 20 20 20 20 20 69 66 28 20 28 72 63 26 30 78 46       if( (rc&0xF
37210 46 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  F)==SQLITE_LOCKE
37220 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
37230 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70  st char *z = pOp
37240 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 20 20  ->p4.z;.        
37250 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
37260 28 70 2c 20 22 64 61 74 61 62 61 73 65 20 74 61  (p, "database ta
37270 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25  ble is locked: %
37280 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  s", z);.      }.
37290 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
372a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
372b0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
372c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
372d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
372e0 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
372f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
37300 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
37310 70 63 6f 64 65 3a 20 56 42 65 67 69 6e 20 2a 20  pcode: VBegin * 
37320 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
37330 34 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e 74  4 may be a point
37340 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
37350 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
37360 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65   If so, call the
37370 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65 74 68   .** xBegin meth
37380 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  od for that tabl
37390 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77  e..**.** Also, w
373a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 50 34  hether or not P4
373b0 20 69 73 20 73 65 74 2c 20 63 68 65 63 6b 20 74   is set, check t
373c0 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hat this is not 
373d0 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
373e0 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 63 61  m.** within a ca
373f0 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76 69 72 74  llback to a virt
37400 75 61 6c 20 74 61 62 6c 65 20 78 53 79 6e 63 28  ual table xSync(
37410 29 20 6d 65 74 68 6f 64 2e 20 49 66 20 69 74 20  ) method. If it 
37420 69 73 2c 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  is, the error.**
37430 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 65   code will be se
37440 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  t to SQLITE_LOCK
37450 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ED..*/.case OP_V
37460 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54 61 62 6c  Begin: {.  VTabl
37470 65 20 2a 70 56 54 61 62 3b 0a 20 20 70 56 54 61  e *pVTab;.  pVTa
37480 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
37490 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  b;.  rc = sqlite
374a0 33 56 74 61 62 42 65 67 69 6e 28 64 62 2c 20 70  3VtabBegin(db, p
374b0 56 54 61 62 29 3b 0a 20 20 69 66 28 20 70 56 54  VTab);.  if( pVT
374c0 61 62 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  ab ) sqlite3Vtab
374d0 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20  ImportErrmsg(p, 
374e0 70 56 54 61 62 2d 3e 70 56 74 61 62 29 3b 0a 20  pVTab->pVtab);. 
374f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
37500 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
37510 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
37520 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
37530 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37540 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37550 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37560 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
37570 20 56 43 72 65 61 74 65 20 50 31 20 50 32 20 2a   VCreate P1 P2 *
37580 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73   * *.**.** P2 is
37590 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
375a0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
375b0 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
375c0 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 0a  le in database .
375d0 2a 2a 20 50 31 2e 20 43 61 6c 6c 20 74 68 65 20  ** P1. Call the 
375e0 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 66  xCreate method f
375f0 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
37600 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61 74  /.case OP_VCreat
37610 65 3a 20 7b 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b  e: {.  Mem sMem;
37620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
37630 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65 63   storing the rec
37640 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
37650 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
37660 72 20 2a 7a 54 61 62 3b 20 20 2f 2a 20 4e 61 6d  r *zTab;  /* Nam
37670 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  e of the virtual
37680 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 6d 65 6d   table */..  mem
37690 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69  set(&sMem, 0, si
376a0 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 73  zeof(sMem));.  s
376b0 4d 65 6d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 2f  Mem.db = db;.  /
376c0 2a 20 42 65 63 61 75 73 65 20 50 32 20 69 73 20  * Because P2 is 
376d0 61 6c 77 61 79 73 20 61 20 73 74 61 74 69 63 20  always a static 
376e0 73 74 72 69 6e 67 2c 20 69 74 20 69 73 20 69 6d  string, it is im
376f0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
37700 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
37710 65 4d 65 6d 43 6f 70 79 28 29 20 74 6f 20 66 61  eMemCopy() to fa
37720 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
37730 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66  (aMem[pOp->p2].f
37740 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 29 21  lags & MEM_Str)!
37750 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37760 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66  (aMem[pOp->p2].f
37770 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 61 74 69  lags & MEM_Stati
37780 63 29 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  c)!=0 );.  rc = 
37790 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
377a0 70 79 28 26 73 4d 65 6d 2c 20 26 61 4d 65 6d 5b  py(&sMem, &aMem[
377b0 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 61 73 73  pOp->p2]);.  ass
377c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
377d0 4f 4b 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20 28  OK );.  zTab = (
377e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
377f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26  te3_value_text(&
37800 73 4d 65 6d 29 3b 0a 20 20 61 73 73 65 72 74 28  sMem);.  assert(
37810 20 7a 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c   zTab || db->mal
37820 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
37830 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 72  f( zTab ){.    r
37840 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43  c = sqlite3VtabC
37850 61 6c 6c 43 72 65 61 74 65 28 64 62 2c 20 70 4f  allCreate(db, pO
37860 70 2d 3e 70 31 2c 20 7a 54 61 62 2c 20 26 70 2d  p->p1, zTab, &p-
37870 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  >zErrMsg);.  }. 
37880 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
37890 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20  elease(&sMem);. 
378a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
378b0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
378c0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
378d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
378e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
378f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37900 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37910 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
37920 20 56 44 65 73 74 72 6f 79 20 50 31 20 2a 20 2a   VDestroy P1 * *
37930 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
37940 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
37950 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
37960 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 43   database P1.  C
37970 61 6c 6c 20 74 68 65 20 78 44 65 73 74 72 6f 79  all the xDestroy
37980 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
37990 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
379a0 65 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20 7b  e OP_VDestroy: {
379b0 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79  .  db->nVDestroy
379c0 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ++;.  rc = sqlit
379d0 65 33 56 74 61 62 43 61 6c 6c 44 65 73 74 72 6f  e3VtabCallDestro
379e0 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  y(db, pOp->p1, p
379f0 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 64 62 2d  Op->p4.z);.  db-
37a00 3e 6e 56 44 65 73 74 72 6f 79 2d 2d 3b 0a 20 20  >nVDestroy--;.  
37a10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
37a20 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
37a30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
37a40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37a50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
37a60 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
37a70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
37a80 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
37a90 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20 50 34 20  VOpen P1 * * P4 
37aa0 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
37ab0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72  pointer to a vir
37ac0 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
37ad0 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  t, an sqlite3_vt
37ae0 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ab structure..**
37af0 20 50 31 20 69 73 20 61 20 63 75 72 73 6f 72 20   P1 is a cursor 
37b00 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20 6f 70  number.  This op
37b10 63 6f 64 65 20 6f 70 65 6e 73 20 61 20 63 75 72  code opens a cur
37b20 73 6f 72 20 74 6f 20 74 68 65 20 76 69 72 74 75  sor to the virtu
37b30 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  al.** table and 
37b40 73 74 6f 72 65 73 20 74 68 61 74 20 63 75 72 73  stores that curs
37b50 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73  or in P1..*/.cas
37b60 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20  e OP_VOpen: {.  
37b70 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  VdbeCursor *pCur
37b80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
37b90 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a  _cursor *pVCur;.
37ba0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
37bb0 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
37bc0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
37bd0 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65 72  Module;..  asser
37be0 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
37bf0 29 3b 0a 20 20 70 43 75 72 20 3d 20 30 3b 0a 20  );.  pCur = 0;. 
37c00 20 70 56 43 75 72 20 3d 20 30 3b 0a 20 20 70 56   pVCur = 0;.  pV
37c10 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
37c20 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 69 66  tab->pVtab;.  if
37c30 28 20 70 56 74 61 62 3d 3d 30 20 7c 7c 20 4e 45  ( pVtab==0 || NE
37c40 56 45 52 28 70 56 74 61 62 2d 3e 70 4d 6f 64 75  VER(pVtab->pModu
37c50 6c 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  le==0) ){.    rc
37c60 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
37c70 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
37c80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
37c90 20 7d 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70   }.  pModule = p
37ca0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
37cb0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
37cc0 4f 70 65 6e 28 70 56 74 61 62 2c 20 26 70 56 43  Open(pVtab, &pVC
37cd0 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ur);.  sqlite3Vt
37ce0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70  abImportErrmsg(p
37cf0 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
37d00 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
37d10 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
37d20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 73   /* Initialize s
37d30 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
37d40 6f 72 20 62 61 73 65 20 63 6c 61 73 73 20 2a 2f  or base class */
37d50 0a 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 20  .  pVCur->pVtab 
37d60 3d 20 70 56 74 61 62 3b 0a 0a 20 20 2f 2a 20 49  = pVtab;..  /* I
37d70 6e 69 74 69 61 6c 69 7a 65 20 76 64 62 65 20 63  nitialize vdbe c
37d80 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
37d90 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
37da0 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
37db0 70 31 2c 20 30 2c 20 2d 31 2c 20 43 55 52 54 59  p1, 0, -1, CURTY
37dc0 50 45 5f 56 54 41 42 29 3b 0a 20 20 69 66 28 20  PE_VTAB);.  if( 
37dd0 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72  pCur ){.    pCur
37de0 2d 3e 75 63 2e 70 56 43 75 72 20 3d 20 70 56 43  ->uc.pVCur = pVC
37df0 75 72 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 6e  ur;.    pVtab->n
37e00 52 65 66 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Ref++;.  }else{.
37e10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
37e20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
37e30 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
37e40 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20  ose(pVCur);.    
37e50 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
37e60 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
37e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
37e80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
37e90 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
37ea0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
37eb0 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
37ec0 46 69 6c 74 65 72 20 50 31 20 50 32 20 50 33 20  Filter P1 P2 P3 
37ed0 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
37ee0 3a 20 69 70 6c 61 6e 3d 72 5b 50 33 5d 20 7a 70  : iplan=r[P3] zp
37ef0 6c 61 6e 3d 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50  lan='P4'.**.** P
37f00 31 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70  1 is a cursor op
37f10 65 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e  ened using VOpen
37f20 2e 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72  .  P2 is an addr
37f30 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  ess to jump to i
37f40 66 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65  f.** the filtere
37f50 64 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  d result set is 
37f60 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  empty..**.** P4 
37f70 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  is either NULL o
37f80 72 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  r a string that 
37f90 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  was generated by
37fa0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a   the xBestIndex.
37fb0 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
37fc0 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e   module.  The in
37fd0 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20  terpretation of 
37fe0 74 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73  the P4 string is
37ff0 20 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20   left.** to the 
38000 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  module implement
38010 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
38020 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73  s opcode invokes
38030 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74   the xFilter met
38040 68 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75  hod on the virtu
38050 61 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69  al table specifi
38060 65 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68  ed.** by P1.  Th
38070 65 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20  e integer query 
38080 70 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74  plan parameter t
38090 6f 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f  o xFilter is sto
380a0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a  red in register.
380b0 2a 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20  ** P3. Register 
380c0 50 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20  P3+1 stores the 
380d0 61 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74  argc parameter t
380e0 6f 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  o be passed to t
380f0 68 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65  he.** xFilter me
38100 74 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20  thod. Registers 
38110 50 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20  P3+2..P3+1+argc 
38120 61 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20  are the argc.** 
38130 61 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d  additional param
38140 65 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20  eters which are 
38150 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69  passed to.** xFi
38160 6c 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65  lter as argv. Re
38170 67 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f  gister P3+2 beco
38180 6d 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e  mes argv[0] when
38190 20 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74   passed to xFilt
381a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  er..**.** A jump
381b0 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69   is made to P2 i
381c0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
381d0 20 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67   after filtering
381e0 20 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e   would be empty.
381f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c  .*/.case OP_VFil
38200 74 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70  ter: {   /* jump
38210 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a   */.  int nArg;.
38220 20 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20    int iQuery;.  
38230 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
38240 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
38250 20 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20   Mem *pQuery;.  
38260 4d 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71  Mem *pArgc;.  sq
38270 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
38280 72 20 2a 70