/ Hex Artifact Content
Login

Artifact c0e9bd3fc0f1909e76930e88860ec66edc201d62:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3740: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3750: 30 2c 20 7a 43 73 72 2c 20 22 25 63 22 2c 20 63  0, zCsr, "%c", c
3760: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
3770: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3780: 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Csr);.    sqlite
3790: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
37a0: 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65  zCsr, "%d[", pMe
37b0: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20  m->n);.    zCsr 
37c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
37d0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f  30(zCsr);.    fo
37e0: 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69  r(i=0; i<16 && i
37f0: 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pMem->n; i++){.
3800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
3810: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
3820: 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74 29  , "%02X", ((int)
3830: 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46  pMem->z[i] & 0xF
3840: 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  F));.      zCsr 
3850: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3860: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a  30(zCsr);.    }.
3870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
3880: 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20  6 && i<pMem->n; 
3890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
38a0: 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b   z = pMem->z[i];
38b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32 20  .      if( z<32 
38c0: 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72  || z>126 ) *zCsr
38d0: 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  ++ = '.';.      
38e0: 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a  else *zCsr++ = z
38f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3910: 30 2c 20 7a 43 73 72 2c 20 22 5d 25 73 22 2c 20  0, zCsr, "]%s", 
3920: 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65  encnames[pMem->e
3930: 6e 63 5d 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b  nc]);.    zCsr +
3940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
3950: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 69 66 28  0(zCsr);.    if(
3960: 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b   f & MEM_Zero ){
3970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3980: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3990: 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75  r,"+%dz",pMem->u
39a0: 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20 7a  .nZero);.      z
39b0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
39c0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
39d0: 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20    }.    *zCsr = 
39e0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66  '\0';.  }else if
39f0: 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ( f & MEM_Str ){
3a00: 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  .    int j, k;. 
3a10: 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20 27     zBuf[0] = ' '
3a20: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
3a30: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 7a  M_Dyn ){.      z
3a40: 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20 20  Buf[1] = 'z';.  
3a50: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
3a60: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
3a70: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3a80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3a90: 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20   MEM_Static ){. 
3aa0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
3ab0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
3ac0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
3ad0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
3ae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3af0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
3b00: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
3b10: 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'e';.      asse
3b20: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
3b30: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d  atic|MEM_Dyn))==
3b40: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
3b50: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3b60: 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b  's';.    }.    k
3b70: 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 2;.    sqlite
3b80: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3b90: 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c 20  &zBuf[k], "%d", 
3ba0: 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20  pMem->n);.    k 
3bb0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3bc0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3bd0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b    zBuf[k++] = '[
3be0: 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ';.    for(j=0; 
3bf0: 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e  j<15 && j<pMem->
3c00: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 75  n; j++){.      u
3c10: 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d  8 c = pMem->z[j]
3c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30  ;.      if( c>=0
3c30: 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29 7b  x20 && c<0x7f ){
3c40: 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b  .        zBuf[k+
3c50: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 65  +] = c;.      }e
3c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  lse{.        zBu
3c70: 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20  f[k++] = '.';.  
3c80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3c90: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b  zBuf[k++] = ']';
3ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3cb0: 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66 5b  rintf(100,&zBuf[
3cc0: 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65  k], encnames[pMe
3cd0: 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b 20  m->enc]);.    k 
3ce0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3cf0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3d00: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b    zBuf[k++] = 0;
3d10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
3d20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3d30: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
3d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72 65  he value of a re
3d50: 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63 69  gister for traci
3d60: 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a  ng purposes:.*/.
3d70: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 54  static void memT
3d80: 72 61 63 65 50 72 69 6e 74 28 4d 65 6d 20 2a 70  racePrint(Mem *p
3d90: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ){.  if( p->flag
3da0: 73 20 26 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s & MEM_Undefine
3db0: 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  d ){.    printf(
3dc0: 22 20 75 6e 64 65 66 69 6e 65 64 22 29 3b 0a 20  " undefined");. 
3dd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
3de0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
3df0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 4e  {.    printf(" N
3e00: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3e10: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3e20: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3e30: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3e40: 53 74 72 29 20 29 7b 0a 20 20 20 20 70 72 69 6e  Str) ){.    prin
3e50: 74 66 28 22 20 73 69 3a 25 6c 6c 64 22 2c 20 70  tf(" si:%lld", p
3e60: 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 20  ->u.i);.  }else 
3e70: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3e80: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70 72  EM_Int ){.    pr
3e90: 69 6e 74 66 28 22 20 69 3a 25 6c 6c 64 22 2c 20  intf(" i:%lld", 
3ea0: 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64 65 66  p->u.i);.#ifndef
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
3ec0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 7d 65  ATING_POINT.  }e
3ed0: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ee0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
3ef0: 20 20 20 70 72 69 6e 74 66 28 22 20 72 3a 25 67     printf(" r:%g
3f00: 22 2c 20 70 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64  ", p->u.r);.#end
3f10: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3f20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3f30: 77 53 65 74 20 29 7b 0a 20 20 20 20 70 72 69 6e  wSet ){.    prin
3f40: 74 66 28 22 20 28 72 6f 77 73 65 74 29 22 29 3b  tf(" (rowset)");
3f50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
3f60: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
3f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3f80: 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a  PrettyPrint(p, z
3f90: 42 75 66 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  Buf);.    printf
3fa0: 28 22 20 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  (" %s", zBuf);. 
3fb0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
3fc0: 73 20 26 20 4d 45 4d 5f 53 75 62 74 79 70 65 20  s & MEM_Subtype 
3fd0: 29 20 70 72 69 6e 74 66 28 22 20 73 75 62 74 79  ) printf(" subty
3fe0: 70 65 3d 30 78 25 30 32 78 22 2c 20 70 2d 3e 65  pe=0x%02x", p->e
3ff0: 53 75 62 74 79 70 65 29 3b 0a 7d 0a 73 74 61 74  Subtype);.}.stat
4000: 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65 72  ic void register
4010: 54 72 61 63 65 28 69 6e 74 20 69 52 65 67 2c 20  Trace(int iReg, 
4020: 4d 65 6d 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74  Mem *p){.  print
4030: 66 28 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20  f("REG[%d] = ", 
4040: 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63  iReg);.  memTrac
4050: 65 50 72 69 6e 74 28 70 29 3b 0a 20 20 70 72 69  ePrint(p);.  pri
4060: 6e 74 66 28 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e  ntf("\n");.}.#en
4070: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4080: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4090: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
40a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
40b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
40c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
40d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
40e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
40f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4100: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4110: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4120: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4130: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4140: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4150: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4160: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4170: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4180: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4190: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
41a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
41b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
41c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
41d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
41e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
41f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4200: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4210: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4220: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4230: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4250: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4260: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4270: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4280: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4290: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
42a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
42b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
42c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
42d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
42e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
42f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4300: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4310: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4320: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4330: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4340: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4350: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4360: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4370: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4380: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4390: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
43a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
43b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
43c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
43d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
43e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
43f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4400: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4410: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4420: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4430: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4440: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4450: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4470: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4480: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4490: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
44a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
44b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
44c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
44d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
44e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
44f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4500: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4510: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4520: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4530: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4540: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4550: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4560: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4570: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4580: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4590: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
45a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
45b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
45c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
45d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
45e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
45f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4600: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4610: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4620: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4630: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4640: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4650: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4660: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4670: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4680: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
46a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
46b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
46c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
46d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
46e0: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
46f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4700: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4710: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4720: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4730: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4740: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4770: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4780: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
47a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
47b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
47c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
47d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
47e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
47f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4810: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4820: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4830: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4840: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4850: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4860: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4870: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4880: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4890: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
48a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
48b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
48c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
48d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
48e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
48f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4900: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4910: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4920: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4930: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4940: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4950: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4970: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4980: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4990: 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 30  rogressLimit = 0
49a0: 3b 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67  ;/* Invoke xProg
49b0: 72 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53  ress() when nVmS
49c0: 74 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73  tep reaches this
49d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d   */.#endif.  Mem
49e0: 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *aMem = p->aMem
49f0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
4a00: 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20  of p->aMem */.  
4a10: 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20  Mem *pIn1 = 0;  
4a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73             /* 1s
4a30: 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20  t input operand 
4a40: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d  */.  Mem *pIn2 =
4a50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
4a60: 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65  /* 2nd input ope
4a70: 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rand */.  Mem *p
4a80: 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In3 = 0;        
4a90: 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75       /* 3rd inpu
4aa0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
4ab0: 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20  em *pOut = 0;   
4ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
4ad0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23  put operand */.#
4ae0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
4af0: 4c 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20  LE.  u64 start; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75  /* CPU clock cou
4b20: 6e 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f  nt at start of o
4b30: 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  pcode */.#endif.
4b40: 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54    /*** INSERT ST
4b50: 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a  ACK UNION HERE *
4b60: 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70  **/..  assert( p
4b70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4b80: 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73  GIC_RUN );  /* s
4b90: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65  qlite3_step() ve
4ba0: 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20  rifies this */. 
4bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
4bc0: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  r(p);.  if( p->r
4bd0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
4be0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
4bf0: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
4c00: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
4c10: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
4c20: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
4c30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
4c40: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
4c50: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f  iled.  */.    go
4c60: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
4c70: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
4c90: 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
4ca0: 45 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  E_BUSY );.  asse
4cb0: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
4cc0: 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21   || p->readOnly!
4cd0: 3d 30 20 29 3b 0a 2f 2f 20 20 70 2d 3e 72 63 20  =0 );.//  p->rc 
4ce0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
4cf0: 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
4d00: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
4d10: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20  >explain==0 );. 
4d20: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
4d30: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
4d40: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
4d50: 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  .  if( db->u1.is
4d60: 49 6e 74 65 72 72 75 70 74 65 64 20 29 20 67 6f  Interrupted ) go
4d70: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
4d80: 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 73 71 6c  interrupt;.  sql
4d90: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
4da0: 71 6c 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  ql(p);.#ifndef S
4db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
4dc0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 69  ESS_CALLBACK.  i
4dd0: 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73  f( db->xProgress
4de0: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 72 69   ){.    u32 iPri
4df0: 6f 72 20 3d 20 70 2d 3e 61 43 6f 75 6e 74 65 72  or = p->aCounter
4e00: 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  [SQLITE_STMTSTAT
4e10: 55 53 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20 20 20  US_VM_STEP];.   
4e20: 20 61 73 73 65 72 74 28 20 30 20 3c 20 64 62 2d   assert( 0 < db-
4e30: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 29 3b  >nProgressOps );
4e40: 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69  .    nProgressLi
4e50: 6d 69 74 20 3d 20 64 62 2d 3e 6e 50 72 6f 67 72  mit = db->nProgr
4e60: 65 73 73 4f 70 73 20 2d 20 28 69 50 72 69 6f 72  essOps - (iPrior
4e70: 20 25 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73   % db->nProgress
4e80: 4f 70 73 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ops);.  }.#endif
4e90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4ea0: 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65  EBUG.  sqlite3Be
4eb0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
4ec0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d  );.  if( p->pc==
4ed0: 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e  0.   && (p->db->
4ee0: 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
4ef0: 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51 4c 49  VdbeListing|SQLI
4f00: 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c 49 54  TE_VdbeEQP|SQLIT
4f10: 45 5f 56 64 62 65 54 72 61 63 65 29 29 21 3d 30  E_VdbeTrace))!=0
4f20: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
4f30: 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
4f40: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
4f50: 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20  bePrintSql(p);. 
4f60: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
4f70: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
4f80: 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20 20 20  eListing ){.    
4f90: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50    printf("VDBE P
4fa0: 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c  rogram Listing:\
4fb0: 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n");.      for(i
4fc0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
4fd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4fe0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
4ff0: 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69  tdout, i, &aOp[i
5000: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5010: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  }.    if( p->db-
5020: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5030: 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20 20 20  VdbeEQP ){.     
5040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5050: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
5060: 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f 70 63    if( aOp[i].opc
5070: 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode==OP_Explain 
5080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5090: 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66 28 22   once ) printf("
50a0: 56 44 42 45 20 51 75 65 72 79 20 50 6c 61 6e 3a  VDBE Query Plan:
50b0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
50c0: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61  printf("%s\n", a
50d0: 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20 20 20  Op[i].p4.z);.   
50e0: 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
50f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5100: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5110: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
5120: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
5130: 20 29 20 20 70 72 69 6e 74 66 28 22 56 44 42 45   )  printf("VDBE
5140: 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 7d   Trace:\n");.  }
5150: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
5160: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e  ignMalloc();.#en
5170: 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d 26 61  dif.  for(pOp=&a
5180: 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20 70 4f  Op[p->pc]; 1; pO
5190: 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45 72 72  p++){.    /* Err
51a0: 6f 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ors are detected
51b0: 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c 20 6f   by individual o
51c0: 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61 6e 20  pcodes, with an 
51d0: 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a  immediate.    **
51e0: 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72 74 5f   jumps to abort_
51f0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20 2a 2f  due_to_error. */
5200: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
5210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
5220: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 3d     assert( pOp>=
5230: 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f 70 5b  aOp && pOp<&aOp[
5240: 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64 65 66  p->nOp]);.#ifdef
5250: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
5260: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
5270: 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69  3Hwtime();.#endi
5280: 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b 3b  f.    nVmStep++;
5290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
52a0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
52b0: 54 41 54 55 53 0a 20 20 20 20 69 66 28 20 70 2d  TATUS.    if( p-
52c0: 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e 61 6e 45  >anExec ) p->anE
52d0: 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d 61 4f  xec[(int)(pOp-aO
52e0: 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  p)]++;.#endif.. 
52f0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77     /* Only allow
5300: 20 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49   tracing if SQLI
5310: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
5320: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ned..    */.#ifd
5330: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5340: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
5350: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
5360: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71  race ){.      sq
5370: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5380: 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 29 28 70  (stdout, (int)(p
5390: 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70 29 3b  Op - aOp), pOp);
53a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
53b0: 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65      ..    /* Che
53c0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
53d0: 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65  need to simulate
53e0: 20 61 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20   an interrupt.  
53f0: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
5400: 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68  s.    ** if we h
5410: 61 76 65 20 61 20 73 70 65 63 69 61 6c 20 74 65  ave a special te
5420: 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f  st build..    */
5430: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
5440: 45 53 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EST.    if( sqli
5450: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
5460: 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  unt>0 ){.      s
5470: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
5480: 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  _count--;.      
5490: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  if( sqlite3_inte
54a0: 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29  rrupt_count==0 )
54b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
54c0: 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b  3_interrupt(db);
54d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
54e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 61  endif..    /* Sa
54f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
5500: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20   other operands 
5510: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5520: 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20  _DEBUG.    {.   
5530: 20 20 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79     u8 opProperty
5540: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
5550: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5560: 63 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  code];.      if(
5570: 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f   (opProperty & O
5580: 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a  PFLG_IN1)!=0 ){.
5590: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
55a0: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20  pOp->p1>0 );.   
55b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
55c0: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
55d0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
55e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
55f0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
5600: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
5610: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
5630: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61  MemInvariants(&a
5640: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b  Mem[pOp->p1]) );
5650: 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45  .        REGISTE
5660: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
5670: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29   &aMem[pOp->p1])
5680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5690: 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20  if( (opProperty 
56a0: 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20  & OPFLG_IN2)!=0 
56b0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
56c0: 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
56d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
56e0: 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p2<=(p->nMe
56f0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
5700: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
5710: 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
5720: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20  &aMem[pOp->p2]) 
5730: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5740: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
5750: 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
5760: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29  (&aMem[pOp->p2])
5770: 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49   );.        REGI
5780: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
5790: 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  p2, &aMem[pOp->p
57a0: 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
57b0: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
57c0: 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21  ty & OPFLG_IN3)!
57d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
57e0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
57f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5800: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
5810: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
5820: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
5830: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
5840: 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  id(&aMem[pOp->p3
5850: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ]) );.        as
5860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
5870: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
5880: 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  nts(&aMem[pOp->p
5890: 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52  3]) );.        R
58a0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
58b0: 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p3, &aMem[pOp
58c0: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ->p3]);.      }.
58d0: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
58e0: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55  perty & OPFLG_OU
58f0: 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T2)!=0 ){.      
5900: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5910: 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  2>0 );.        a
5920: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
5930: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
5940: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
5950: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
5960: 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f  ange(p, &aMem[pO
5970: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p2]);.      }
5980: 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72  .      if( (opPr
5990: 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f  operty & OPFLG_O
59a0: 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  UT3)!=0 ){.     
59b0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
59c0: 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p3>0 );.        
59d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
59e0: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
59f0: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  >nCursor) );.   
5a00: 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
5a10: 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70  hange(p, &aMem[p
5a20: 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
5a30: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  }.    }.#endif.#
5a40: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5a50: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
5a60: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
5a70: 29 0a 20 20 20 20 70 4f 72 69 67 4f 70 20 3d 20  ).    pOrigOp = 
5a80: 70 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  pOp;.#endif.  . 
5a90: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
5aa0: 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a  opcode ){../****
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61  *********.** Wha
5b00: 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d  t follows is a m
5b10: 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74  assive switch st
5b20: 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61  atement where ea
5b30: 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e  ch case implemen
5b40: 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  ts a.** separate
5b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
5b60: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
5b70: 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c  ine.  If we foll
5b80: 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  ow the usual.** 
5b90: 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76  indentation conv
5ba0: 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61  entions, each ca
5bb0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64  se should be ind
5bc0: 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65  ented by 6 space
5bd0: 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20  s.  But.** that 
5be0: 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74  is a lot of wast
5bf0: 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ed space on the 
5c00: 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f  left margin.  So
5c10: 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   the code within
5c20: 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73  .** the switch s
5c30: 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72  tatement will br
5c40: 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74  eak with convent
5c50: 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68  ion and be flush
5c60: 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a  -left. Another.*
5c70: 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73  * big comment (s
5c80: 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f  imilar to this o
5c90: 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68  ne) will mark th
5ca0: 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  e point in the c
5cb0: 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20  ode where.** we 
5cc0: 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20  transition back 
5cd0: 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74  to normal indent
5ce0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5cf0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65   formatting of e
5d00: 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f  ach case is impo
5d10: 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65  rtant.  The make
5d20: 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a  file for SQLite.
5d30: 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ** generates two
5d40: 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65   C files "opcode
5d50: 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65  s.h" and "opcode
5d60: 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67  s.c" by scanning
5d70: 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f   this.** file lo
5d80: 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20  oking for lines 
5d90: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
5da0: 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65  "case OP_".  The
5db0: 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73   opcodes.h files
5dc0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c  .** will be fill
5dd0: 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73  ed with #defines
5de0: 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75   that give uniqu
5df0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
5e00: 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f   to each.** opco
5e10: 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  de and the opcod
5e20: 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c  es.c file is fil
5e30: 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61  led with an arra
5e40: 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65  y of strings whe
5e50: 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e  re.** each strin
5e60: 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69  g is the symboli
5e70: 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  c name for the c
5e80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63  orresponding opc
5e90: 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ode.  If the.** 
5ea0: 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69  case statement i
5eb0: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  s followed by a 
5ec0: 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  comment of the f
5ed0: 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20  orm "/# same as 
5ee0: 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20  ... #/".** that 
5ef0: 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20  comment is used 
5f00: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
5f10: 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
5f20: 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e  e of the opcode.
5f30: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79  .**.** Other key
5f40: 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d  words in the com
5f50: 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ment that follow
5f60: 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20  s each case are 
5f70: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74  used to.** const
5f80: 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49  ruct the OPFLG_I
5f90: 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65  NITIALIZER value
5fa0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
5fb0: 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  s opcodeProperty
5fc0: 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20  []..** Keywords 
5fd0: 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e  include: in1, in
5fe0: 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20 6f 75  2, in3, out2, ou
5ff0: 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  t3.  See.** the 
6000: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
6010: 72 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f  ript for additio
6020: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
6030: 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61  .**.** Documenta
6040: 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20  tion about VDBE 
6050: 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72  opcodes is gener
6060: 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  ated by scanning
6070: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f   this file.** fo
6080: 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20  r lines of that 
6090: 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a  contain "Opcode:
60a0: 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e  ".  That line an
60b0: 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
60c0: 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65  .** comment line
60d0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
60e0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
60f0: 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20  the opcode.html 
6100: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  documentation.**
6110: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d   file..**.** SUM
6120: 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  MARY:.**.**     
6130: 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d  Formatting is im
6140: 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70  portant to scrip
6150: 74 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69  ts that scan thi
6160: 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44  s file..**     D
6170: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
6180: 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e  om the formattin
6190: 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c  g style currentl
61a0: 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a  y in use..**.***
61b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
6200: 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20  Opcode:  Goto * 
6210: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
6220: 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
6230: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
6240: 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  P2..** The next 
6250: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63  instruction exec
6260: 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  uted will be .**
6270: 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65   the one at inde
6280: 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65  x P2 from the be
6290: 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
62a0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
62b0: 20 54 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   The P1 paramete
62c0: 72 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  r is not actuall
62d0: 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f  y used by this o
62e0: 70 63 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  pcode.  However,
62f0: 20 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 69   it.** is someti
6300: 6d 65 73 20 73 65 74 20 74 6f 20 31 20 69 6e 73  mes set to 1 ins
6310: 74 65 61 64 20 6f 66 20 30 20 61 73 20 61 20 68  tead of 0 as a h
6320: 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61  int to the comma
6330: 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a  nd-line shell.**
6340: 20 74 68 61 74 20 74 68 69 73 20 47 6f 74 6f 20   that this Goto 
6350: 69 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  is the bottom of
6360: 20 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68 61 74   a loop and that
6370: 20 74 68 65 20 6c 69 6e 65 73 20 66 72 6f 6d 20   the lines from 
6380: 50 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68  P2 down.** to th
6390: 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 73  e current line s
63a0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
63b0: 64 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 75  d for EXPLAIN ou
63c0: 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tput..*/.case OP
63d0: 5f 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20  _Goto: {        
63e0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
63f0: 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63  jump_to_p2_and_c
6400: 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
6410: 70 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  pt:.  pOp = &aOp
6420: 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a  [pOp->p2 - 1];..
6430: 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61    /* Opcodes tha
6440: 74 20 61 72 65 20 75 73 65 64 20 61 73 20 74 68  t are used as th
6450: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f  e bottom of a lo
6460: 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  op (OP_Next, OP_
6470: 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e  Prev,.  ** OP_VN
6480: 65 78 74 2c 20 4f 50 5f 52 6f 77 53 65 74 4e 65  ext, OP_RowSetNe
6490: 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72  xt, or OP_Sorter
64a0: 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68  Next) all jump h
64b0: 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f  ere upon.  ** co
64c0: 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b  mpletion.  Check
64d0: 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c 69 74   to see if sqlit
64e0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20 68  e3_interrupt() h
64f0: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20  as been called. 
6500: 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 72   ** or if the pr
6510: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
6520: 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 76 6f  needs to be invo
6530: 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ked. .  **.  ** 
6540: 54 68 69 73 20 63 6f 64 65 20 75 73 65 73 20 75  This code uses u
6550: 6e 73 74 72 75 63 74 75 72 65 64 20 22 67 6f 74  nstructured "got
6560: 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  o" statements an
6570: 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20  d does not look 
6580: 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20  clean..  ** But 
6590: 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75 65 20  that is not due 
65a0: 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67  to sloppy coding
65b0: 20 68 61 62 69 74 73 2e 20 54 68 65 20 63 6f 64   habits. The cod
65c0: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 68 69  e is written thi
65d0: 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72 20 70  s.  ** way for p
65e0: 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61  erformance, to a
65f0: 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 72  void having to r
6600: 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  un the interrupt
6610: 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a 20 20   and progress.  
6620: 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65 76 65  ** checks on eve
6630: 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ry opcode.  This
6640: 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33 5f 73   helps sqlite3_s
6650: 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61 62 6f  tep() to run abo
6660: 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73  ut 1.5%.  ** fas
6670: 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ter according to
6680: 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f   "valgrind --too
6690: 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20 2a 2f  l=cachegrind" */
66a0: 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  .check_for_inter
66b0: 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e  rupt:.  if( db->
66c0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
66d0: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
66e0: 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a  e_to_interrupt;.
66f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6700: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
6710: 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20  LBACK.  /* Call 
6720: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
6730: 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20 63  lback if it is c
6740: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74 68  onfigured and th
6750: 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65  e required numbe
6760: 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f  r.  ** of VDBE o
6770: 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78 65  ps have been exe
6780: 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73 69  cuted (either si
6790: 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74  nce this invocat
67a0: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69  ion of.  ** sqli
67b0: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 6f 72  te3VdbeExec() or
67c0: 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65   since last time
67d0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
67e0: 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65  llback was calle
67f0: 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  d)..  ** If the 
6800: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
6810: 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
6820: 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76 69 72  ro, exit the vir
6830: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77 69 74  tual machine wit
6840: 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20  h.  ** a return 
6850: 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  code SQLITE_ABOR
6860: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
6870: 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 20 26  ->xProgress!=0 &
6880: 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67  & nVmStep>=nProg
6890: 72 65 73 73 4c 69 6d 69 74 20 29 7b 0a 20 20 20  ressLimit ){.   
68a0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 50 72   assert( db->nPr
68b0: 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a  ogressOps!=0 );.
68c0: 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d      nProgressLim
68d0: 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64  it = nVmStep + d
68e0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
68f0: 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e  - (nVmStep%db->n
6900: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
6910: 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72    if( db->xProgr
6920: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
6930: 73 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sArg) ){.      r
6940: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
6950: 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
6960: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
6970: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6980: 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65 61 6b  endif.  .  break
6990: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
69a0: 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20 2a   Gosub P1 P2 * *
69b0: 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
69c0: 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72 65  he current addre
69d0: 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65 72  ss onto register
69e0: 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20   P1.** and then 
69f0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
6a00: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  P2..*/.case OP_G
6a10: 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20 20  osub: {         
6a20: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
6a30: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
6a40: 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70  0 && pOp->p1<=(p
6a50: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
6a60: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31  ursor) );.  pIn1
6a70: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6a80: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64 62  ];.  assert( Vdb
6a90: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31  eMemDynamic(pIn1
6aa0: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f  )==0 );.  memAbo
6ab0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
6ac0: 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  n1);.  pIn1->fla
6ad0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6ae0: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
6af0: 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45  )(pOp-aOp);.  RE
6b00: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
6b10: 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20  ->p1, pIn1);..  
6b20: 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65  /* Most jump ope
6b30: 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74  rations do a got
6b40: 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74 20 69  o to this spot i
6b50: 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74  n order to updat
6b60: 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70 20 70  e.  ** the pOp p
6b70: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f  ointer. */.jump_
6b80: 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26  to_p2:.  pOp = &
6b90: 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d  aOp[pOp->p2 - 1]
6ba0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6bb0: 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e   Opcode:  Return
6bc0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
6bd0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * Jump to the ne
6be0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  xt instruction a
6bf0: 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73  fter the address
6c00: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6c10: 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a    After.** the j
6c20: 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50 31  ump, register P1
6c30: 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e   becomes undefin
6c40: 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ed..*/.case OP_R
6c50: 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20  eturn: {        
6c60: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70     /* in1 */.  p
6c70: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
6c80: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
6c90: 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  pIn1->flags==MEM
6ca0: 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20  _Int );.  pOp = 
6cb0: 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b  &aOp[pIn1->u.i];
6cc0: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6cd0: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
6ce0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6cf0: 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75  pcode: InitCorou
6d00: 74 69 6e 65 20 50 31 20 50 32 20 50 33 20 2a 20  tine P1 P2 P3 * 
6d10: 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72  *.**.** Set up r
6d20: 65 67 69 73 74 65 72 20 50 31 20 73 6f 20 74 68  egister P1 so th
6d30: 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65 6c 64  at it will Yield
6d40: 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   to the coroutin
6d50: 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74 20  e.** located at 
6d60: 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a  address P3..**.*
6d70: 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65 6e 20  * If P2!=0 then 
6d80: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  the coroutine im
6d90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d  plementation imm
6da0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
6db0: 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  .** this opcode.
6dc0: 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74    So jump over t
6dd0: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70  he coroutine imp
6de0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a  lementation to.*
6df0: 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  * address P2..**
6e00: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e  .** See also: En
6e10: 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61  dCoroutine.*/.ca
6e20: 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  se OP_InitCorout
6e30: 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75  ine: {     /* ju
6e40: 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
6e50: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f  pOp->p1>0 &&  pO
6e60: 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
6e70: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
6e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
6e90: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p2>=0 && pOp->
6ea0: 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61  p2<p->nOp );.  a
6eb0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d  ssert( pOp->p3>=
6ec0: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e  0 && pOp->p3<p->
6ed0: 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  nOp );.  pOut = 
6ee0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6ef0: 20 20 61 73 73 65 72 74 28 20 21 56 64 62 65 4d    assert( !VdbeM
6f00: 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20  emDynamic(pOut) 
6f10: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
6f20: 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20   pOp->p3 - 1;.  
6f30: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
6f40: 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70  M_Int;.  if( pOp
6f50: 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ->p2 ) goto jump
6f60: 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
6f70: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
6f80: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50 31 20  EndCoroutine P1 
6f90: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
6fa0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
6fb0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e 20   the address in 
6fc0: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 61  register P1 is a
6fd0: 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20   Yield..** Jump 
6fe0: 74 6f 20 74 68 65 20 50 32 20 70 61 72 61 6d 65  to the P2 parame
6ff0: 74 65 72 20 6f 66 20 74 68 61 74 20 59 69 65 6c  ter of that Yiel
7000: 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  d..** After the 
7010: 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50  jump, register P
7020: 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69  1 becomes undefi
7030: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ned..**.** See a
7040: 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69  lso: InitCorouti
7050: 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e  ne.*/.case OP_En
7060: 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20  dCoroutine: {   
7070: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
7080: 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43 61 6c  /.  VdbeOp *pCal
7090: 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  ler;.  pIn1 = &a
70a0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
70b0: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
70c0: 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
70d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
70e0: 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e  u.i>=0 && pIn1->
70f0: 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  u.i<p->nOp );.  
7100: 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70  pCaller = &aOp[p
7110: 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73  In1->u.i];.  ass
7120: 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70  ert( pCaller->op
7130: 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29  code==OP_Yield )
7140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 6c  ;.  assert( pCal
7150: 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43  ler->p2>=0 && pC
7160: 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  aller->p2<p->nOp
7170: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70   );.  pOp = &aOp
7180: 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31  [pCaller->p2 - 1
7190: 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ];.  pIn1->flags
71a0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
71b0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
71c0: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
71d0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
71e0: 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72  * Swap the progr
71f0: 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20  am counter with 
7200: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
7210: 69 73 74 65 72 20 50 31 2e 20 20 54 68 69 73 0a  ister P1.  This.
7220: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
7230: 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20 74 6f  t of yielding to
7240: 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a   a coroutine..**
7250: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72 6f 75  .** If the corou
7260: 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c 61 75  tine that is lau
7270: 6e 63 68 65 64 20 62 79 20 74 68 69 73 20 69 6e  nched by this in
7280: 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 77  struction ends w
7290: 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20  ith.** Yield or 
72a0: 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74  Return then cont
72b0: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
72c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42   instruction.  B
72d0: 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72  ut if.** the cor
72e0: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 64 20  outine launched 
72f0: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  by this instruct
7300: 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a  ion ends with.**
7310: 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74   EndCoroutine, t
7320: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20 72  hen jump to P2 r
7330: 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  ather than conti
7340: 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a  nuing with the.*
7350: 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  * next instructi
7360: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
7370: 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  so: InitCoroutin
7380: 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65  e.*/.case OP_Yie
7390: 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ld: {           
73a0: 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f   /* in1, jump */
73b0: 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20  .  int pcDest;. 
73c0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
73d0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
73e0: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
73f0: 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70  (pIn1)==0 );.  p
7400: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  In1->flags = MEM
7410: 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d  _Int;.  pcDest =
7420: 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b   (int)pIn1->u.i;
7430: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28  .  pIn1->u.i = (
7440: 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
7450: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
7460: 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29  E(pOp->p1, pIn1)
7470: 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  ;.  pOp = &aOp[p
7480: 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b  cDest];.  break;
7490: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
74a0: 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50  HaltIfNull  P1 P
74b0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
74c0: 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d  nopsis: if r[P3]
74d0: 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a  =null halt.**.**
74e0: 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
74f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
7500: 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c 4c 20    If it is NULL 
7510: 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a  then Halt using.
7520: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c  ** parameter P1,
7530: 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69   P2, and P4 as i
7540: 66 20 74 68 69 73 20 77 65 72 65 20 61 20 48 61  f this were a Ha
7550: 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  lt instruction. 
7560: 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   If the.** value
7570: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
7580: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
7590: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
75a0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  s a no-op..** Th
75b0: 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 73  e P5 parameter s
75c0: 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63  hould be 1..*/.c
75d0: 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  ase OP_HaltIfNul
75e0: 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33  l: {      /* in3
75f0: 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   */.  pIn3 = &aM
7600: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
7610: 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
7620: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
7630: 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c   break;.  /* Fal
7640: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
7650: 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20  P_Halt */.}../* 
7660: 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31  Opcode:  Halt P1
7670: 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a   P2 * P4 P5.**.*
7680: 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65  * Exit immediate
7690: 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75  ly.  All open cu
76a0: 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63  rsors, etc are c
76b0: 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  losed.** automat
76c0: 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31  ically..**.** P1
76d0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
76e0: 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
76f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20  sqlite3_exec(), 
7700: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c  sqlite3_reset(),
7710: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66  .** or sqlite3_f
7720: 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20  inalize().  For 
7730: 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74  a normal halt, t
7740: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51  his should be SQ
7750: 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20  LITE_OK (0)..** 
7760: 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63  For errors, it c
7770: 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72  an be some other
7780: 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d   value.  If P1!=
7790: 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64  0 then P2 will d
77a0: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
77b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f  her or not to ro
77c0: 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  llback the curre
77d0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
77e0: 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b   Do not rollback
77f0: 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61  .** if P2==OE_Fa
7800: 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62  il. Do the rollb
7810: 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f  ack if P2==OE_Ro
7820: 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d  llback.  If P2==
7830: 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65  OE_Abort,.** the
7840: 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63  n back out all c
7850: 68 61 6e 67 65 73 20 74 68 61 74 20 68 61 76 65  hanges that have
7860: 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67   occurred during
7870: 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20   this execution 
7880: 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20  of the.** VDBE, 
7890: 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62  but do not rollb
78a0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
78b0: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ion. .**.** If P
78c0: 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68  4 is not null th
78d0: 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f  en it is an erro
78e0: 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
78f0: 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 61 20  ..**.** P5 is a 
7900: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20  value between 0 
7910: 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69 76 65  and 4, inclusive
7920: 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  , that modifies 
7930: 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a  the P4 string..*
7940: 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e 6f 20  *.**    0:  (no 
7950: 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20 31 3a  change).**    1:
7960: 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74 72    NOT NULL contr
7970: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a  aint failed: P4.
7980: 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51 55 45  **    2:  UNIQUE
7990: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
79a0: 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33 3a 20  ed: P4.**    3: 
79b0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
79c0: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20  t failed: P4.** 
79d0: 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e 20 4b     4:  FOREIGN K
79e0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
79f0: 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20 49  iled: P4.**.** I
7a00: 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P5 is not zero
7a10: 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c 4c 2c   and P4 is NULL,
7a20: 20 74 68 65 6e 20 65 76 65 72 79 74 68 69 6e 67   then everything
7a30: 20 61 66 74 65 72 20 74 68 65 20 22 3a 22 20 69   after the ":" i
7a40: 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a  s.** omitted..**
7a50: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
7a60: 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20  implied "Halt 0 
7a70: 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  0 0" instruction
7a80: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
7a90: 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20   very end of.** 
7aa0: 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20  every program.  
7ab0: 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74  So a jump past t
7ac0: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
7ad0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
7ae0: 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  am.** is the sam
7af0: 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48  e as executing H
7b00: 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
7b10: 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65 46 72  Halt: {.  VdbeFr
7b20: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
7b30: 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78 20 3d  nt pcx;..  pcx =
7b40: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
7b50: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
7b60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
7b70: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
7b80: 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d  /* Halt the sub-
7b90: 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20  program. Return 
7ba0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70  control to the p
7bb0: 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a  arent frame. */.
7bc0: 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e      pFrame = p->
7bd0: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  pFrame;.    p->p
7be0: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e  Frame = pFrame->
7bf0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e  pParent;.    p->
7c00: 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71  nFrame--;.    sq
7c10: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
7c20: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
7c30: 67 65 29 3b 0a 20 20 20 20 70 63 78 20 3d 20 73  ge);.    pcx = s
7c40: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
7c50: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
7c60: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
7c70: 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
7c80: 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
7c90: 6f 6e 20 70 63 78 20 69 73 20 74 68 65 20 4f 50  on pcx is the OP
7ca0: 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e  _Program that in
7cb0: 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72  voked the sub-pr
7cc0: 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ogram .      ** 
7cd0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
7ce0: 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70  halted. If the p
7cf0: 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66  2 instruction of
7d00: 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20   this OP_Halt.  
7d10: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
7d20: 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f  on is set to OE_
7d30: 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65  Ignore, then the
7d40: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
7d50: 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  throwing.      *
7d60: 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65  * an IGNORE exce
7d70: 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ption. In this c
7d80: 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  ase jump to the 
7d90: 61 64 64 72 65 73 73 20 73 70 65 63 69 66 69 65  address specifie
7da0: 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68  d.      ** as th
7db0: 65 20 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c  e p2 of the call
7dc0: 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20  ing OP_Program. 
7dd0: 20 2a 2f 0a 20 20 20 20 20 20 70 63 78 20 3d 20   */.      pcx = 
7de0: 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31  p->aOp[pcx].p2-1
7df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 70 20  ;.    }.    aOp 
7e00: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d  = p->aOp;.    aM
7e10: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20  em = p->aMem;.  
7e20: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78    pOp = &aOp[pcx
7e30: 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
7e40: 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d  }.  p->rc = pOp-
7e50: 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  >p1;.  p->errorA
7e60: 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d  ction = (u8)pOp-
7e70: 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70  >p2;.  p->pc = p
7e80: 63 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  cx;.  assert( pO
7e90: 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20 69 66  p->p5<=4 );.  if
7ea0: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69  ( p->rc ){.    i
7eb0: 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
7ec0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7ed0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
7ee0: 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20  Type[] = { "NOT 
7ef0: 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c  NULL", "UNIQUE",
7f00: 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20 20 20   "CHECK",.      
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 22 46 4f 52 45 49 47 4e 20         "FOREIGN 
7f40: 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20 74 65  KEY" };.      te
7f50: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d  stcase( pOp->p5=
7f60: 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
7f70: 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 32  case( pOp->p5==2
7f80: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f90: 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33 20 29  se( pOp->p5==3 )
7fa0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7fb0: 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b 0a  ( pOp->p5==4 );.
7fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7fd0: 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20 63 6f  eError(p, "%s co
7fe0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7ff0: 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e 70 35  , azType[pOp->p5
8000: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1]);.      if( 
8010: 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
8020: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
8030: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8040: 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c 20 70  (db, "%z: %s", p
8050: 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e  ->zErrMsg, pOp->
8060: 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p4.z);.      }. 
8070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8080: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
8090: 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  (p, "%s", pOp->p
80a0: 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  4.z);.    }.    
80b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d  sqlite3_log(pOp-
80c0: 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25  >p1, "abort at %
80d0: 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20  d in [%s]: %s", 
80e0: 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d  pcx, p->zSql, p-
80f0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  >zErrMsg);.  }. 
8100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
8110: 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65  eHalt(p);.  asse
8120: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  rt( rc==SQLITE_B
8130: 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
8140: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
8150: 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
8160: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
8170: 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  Y ){.    p->rc =
8180: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8190: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
81a0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
81b0: 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
81c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
81d0: 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  INT );.    asser
81e0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
81f0: 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   || db->nDeferre
8200: 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e  dCons>0 || db->n
8210: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e  DeferredImmCons>
8220: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
8230: 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  >rc ? SQLITE_ERR
8240: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
8250: 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62  ;.  }.  goto vdb
8260: 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  e_return;.}../* 
8270: 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20  Opcode: Integer 
8280: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
8290: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50  ynopsis: r[P2]=P
82a0: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62  1.**.** The 32-b
82b0: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
82c0: 20 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69   P1 is written i
82d0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
82e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
82f0: 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ger: {         /
8300: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74  * out2 */.  pOut
8310: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
8320: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
8330: 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  t->u.i = pOp->p1
8340: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
8350: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a   Opcode: Int64 *
8360: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
8370: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34  nopsis: r[P2]=P4
8380: 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
8390: 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62  ointer to a 64-b
83a0: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
83b0: 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20  ..** Write that 
83c0: 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73  value into regis
83d0: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
83e0: 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20 20  OP_Int64: {     
83f0: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
8400: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8410: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
8430: 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20  >p4.pI64!=0 );. 
8440: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f   pOut->u.i = *pO
8450: 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72  p->p4.pI64;.  br
8460: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
8470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
8480: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
8490: 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32 20  code: Real * P2 
84a0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
84b0: 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a  is: r[P2]=P4.**.
84c0: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
84d0: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66  er to a 64-bit f
84e0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
84f0: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
8500: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
8510: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
8520: 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20  se OP_Real: {   
8530: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
8540: 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75   as TK_FLOAT, ou
8550: 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f  t2 */.  pOut = o
8560: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
8570: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66   pOp);.  pOut->f
8580: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
8590: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
85a0: 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70  te3IsNaN(*pOp->p
85b0: 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f  4.pReal) );.  pO
85c0: 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e  ut->u.r = *pOp->
85d0: 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61  p4.pReal;.  brea
85e0: 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
85f0: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20  Opcode: String8 
8600: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  * P2 * P4 *.** S
8610: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27  ynopsis: r[P2]='
8620: 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  P4'.**.** P4 poi
8630: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  nts to a nul ter
8640: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
8650: 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64  ring. This opcod
8660: 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  e is transformed
8670: 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74 72 69   .** into a Stri
8680: 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f 72 65  ng opcode before
8690: 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 20   it is executed 
86a0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
86b0: 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a 20 74  me.  During.** t
86c0: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
86d0: 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  on, the length o
86e0: 66 20 73 74 72 69 6e 67 20 50 34 20 69 73 20 63  f string P4 is c
86f0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74 6f 72  omputed and stor
8700: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50 31 20  ed.** as the P1 
8710: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61  parameter..*/.ca
8720: 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b  se OP_String8: {
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
8740: 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f   as TK_STRING, o
8750: 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ut2 */.  assert(
8760: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
8770: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8780: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8790: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
87a0: 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70  = OP_String;.  p
87b0: 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33  Op->p1 = sqlite3
87c0: 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34  Strlen30(pOp->p4
87d0: 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  .z);..#ifndef SQ
87e0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
87f0: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d    if( encoding!=
8800: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
8810: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
8820: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75  dbeMemSetStr(pOu
8830: 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31  t, pOp->p4.z, -1
8840: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
8850: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
8860: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8870: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
8880: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b  SQLITE_TOOBIG );
8890: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
88a0: 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43  OK!=sqlite3VdbeC
88b0: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f  hangeEncoding(pO
88c0: 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20  ut, encoding) ) 
88d0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
88e0: 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 73   assert( pOut->s
88f0: 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 4f 75  zMalloc>0 && pOu
8900: 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f 75 74  t->zMalloc==pOut
8910: 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ->z );.    asser
8920: 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  t( VdbeMemDynami
8930: 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a 20 20  c(pOut)==0 );.  
8940: 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63    pOut->szMalloc
8950: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
8960: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61  flags |= MEM_Sta
8970: 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  tic;.    if( pOp
8980: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e  ->p4type==P4_DYN
8990: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
89a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
89b0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
89c0: 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  }.    pOp->p4typ
89d0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
89e0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
89f0: 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70  pOut->z;.    pOp
8a00: 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a  ->p1 = pOut->n;.
8a10: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
8a20: 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  rc==SQLITE_TOOBI
8a30: 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  G );.#endif.  if
8a40: 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c  ( pOp->p1>db->aL
8a50: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8a60: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
8a70: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
8a80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d   }.  assert( rc=
8a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8aa0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
8ab0: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
8ac0: 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a 7d  , OP_String */.}
8ad0: 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .  ./* Opcode: S
8ae0: 74 72 69 6e 67 20 50 31 20 50 32 20 50 33 20 50  tring P1 P2 P3 P
8af0: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
8b00: 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28 6c 65  : r[P2]='P4' (le
8b10: 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  n=P1).**.** The 
8b20: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
8b30: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
8b40: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
8b50: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
8b60: 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 6e 6f  *.** If P3 is no
8b70: 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 63  t zero and the c
8b80: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
8b90: 65 72 20 50 33 20 69 73 20 65 71 75 61 6c 20 74  er P3 is equal t
8ba0: 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  o P5, then.** th
8bb0: 65 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68  e datatype of th
8bc0: 65 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  e register P2 is
8bd0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 42 4c   converted to BL
8be0: 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  OB.  The content
8bf0: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
8c00: 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79 74 65  sequence of byte
8c10: 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 20  s, it is merely 
8c20: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
8c30: 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a 2a 2a   BLOB instead.**
8c40: 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20 61 73   of a string, as
8c50: 20 69 66 20 69 74 20 68 61 64 20 62 65 65 6e 20   if it had been 
8c60: 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65 72 20  CAST.  In other 
8c70: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69 66 28  words:.**.** if(
8c80: 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67 5b 50   P3!=0 and reg[P
8c90: 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50 32 5d  3]==P5 ) reg[P2]
8ca0: 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50 32 5d   := CAST(reg[P2]
8cb0: 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63 61 73   as BLOB).*/.cas
8cc0: 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 20 20  e OP_String: {  
8cd0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
8ce0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
8cf0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
8d00: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
8d10: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
8d20: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
8d30: 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63  M_Str|MEM_Static
8d40: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75  |MEM_Term;.  pOu
8d50: 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  t->z = pOp->p4.z
8d60: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f  ;.  pOut->n = pO
8d70: 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65  p->p1;.  pOut->e
8d80: 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20  nc = encoding;. 
8d90: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
8da0: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69 66 6e  SIZE(pOut);.#ifn
8db0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
8dc0: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
8dd0: 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  BS.  if( pOp->p3
8de0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
8df0: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
8e00: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
8e10: 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 33 20  or) );.    pIn3 
8e20: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
8e30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
8e40: 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
8e50: 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Int );.    if( p
8e60: 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d 3e 70  In3->u.i==pOp->p
8e70: 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  5 ) pOut->flags 
8e80: 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53  = MEM_Blob|MEM_S
8e90: 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
8ea0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 72 65    }.#endif.  bre
8eb0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8ec0: 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50 33 20  : Null P1 P2 P3 
8ed0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
8ee0: 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a   r[P2..P3]=NULL.
8ef0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55  **.** Write a NU
8f00: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
8f10: 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72 65  s P2.  If P3 gre
8f20: 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74 68  ater than P2, th
8f30: 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
8f40: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
8f50: 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72 79  ter P3 and every
8f60: 20 72 65 67 69 73 74 65 72 20 69 6e 20 62 65 74   register in bet
8f70: 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20  ween P2 and P3. 
8f80: 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73   If P3.** is les
8f90: 73 20 74 68 61 6e 20 50 32 20 28 74 79 70 69 63  s than P2 (typic
8fa0: 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29  ally P3 is zero)
8fb0: 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73   then only regis
8fc0: 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74  ter P2 is.** set
8fd0: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
8fe0: 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  If the P1 value 
8ff0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
9000: 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 4d  n also set the M
9010: 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61 67 20  EM_Cleared flag 
9020: 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c 20  so that.** NULL 
9030: 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f 74 20  values will not 
9040: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 65 76  compare equal ev
9050: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e 55 4c  en if SQLITE_NUL
9060: 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a 2a 2a  LEQ is set on.**
9070: 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45 71 2e   OP_Ne or OP_Eq.
9080: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
9090: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
90a0: 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 63   out2 */.  int c
90b0: 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c  nt;.  u16 nullFl
90c0: 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  ag;.  pOut = out
90d0: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
90e0: 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70  Op);.  cnt = pOp
90f0: 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20  ->p3-pOp->p2;.  
9100: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
9110: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
9120: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
9130: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c  Out->flags = nul
9140: 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70 31 20  lFlag = pOp->p1 
9150: 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  ? (MEM_Null|MEM_
9160: 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d 5f 4e  Cleared) : MEM_N
9170: 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  ull;.  pOut->n =
9180: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63 6e 74   0;.  while( cnt
9190: 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b  >0 ){.    pOut++
91a0: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
91b0: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
91c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91d0: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
91e0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
91f0: 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20  s = nullFlag;.  
9200: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
9210: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20     cnt--;.  }.  
9220: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
9230: 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20 50 31  ode: SoftNull P1
9240: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f   * * * *.** Syno
9250: 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c 4c  psis: r[P1]=NULL
9260: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67 69 73  .**.** Set regis
9270: 74 65 72 20 50 31 20 74 6f 20 68 61 76 65 20 74  ter P1 to have t
9280: 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 61 73  he value NULL as
9290: 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f 50 5f   seen by the OP_
92a0: 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20 69 6e  MakeRecord.** in
92b0: 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74 20 64  struction, but d
92c0: 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20 73  o not free any s
92d0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d 65  tring or blob me
92e0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
92f0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 67 69  with.** the regi
9300: 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20 69 66  ster, so that if
9310: 20 74 68 65 20 76 61 6c 75 65 20 77 61 73 20 61   the value was a
9320: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9330: 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76  that was.** prev
9340: 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20 75 73  iously copied us
9350: 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20 74 68  ing OP_SCopy, th
9360: 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20 63 6f  e copies will co
9370: 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76 61 6c  ntinue to be val
9380: 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  id..*/.case OP_S
9390: 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73 73  oftNull: {.  ass
93a0: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
93b0: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
93c0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
93d0: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
93e0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
93f0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
9400: 28 70 4f 75 74 2d 3e 66 6c 61 67 73 7c 4d 45 4d  (pOut->flags|MEM
9410: 5f 4e 75 6c 6c 29 26 7e 4d 45 4d 5f 55 6e 64 65  _Null)&~MEM_Unde
9420: 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a  fined;.  break;.
9430: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c  }../* Opcode: Bl
9440: 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ob P1 P2 * P4 *.
9450: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
9460: 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a 2a  2]=P4 (len=P1).*
9470: 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74  *.** P4 points t
9480: 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  o a blob of data
9490: 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20   P1 bytes long. 
94a0: 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62   Store this.** b
94b0: 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72 20  lob in register 
94c0: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  P2..*/.case OP_B
94d0: 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20  lob: {          
94e0: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
94f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
9500: 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  p1 <= SQLITE_MAX
9510: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f 75  _LENGTH );.  pOu
9520: 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
9530: 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71  se(p, pOp);.  sq
9540: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
9550: 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34  tr(pOut, pOp->p4
9560: 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20  .z, pOp->p1, 0, 
9570: 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  0);.  pOut->enc 
9580: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
9590: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
95a0: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
95b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
95c0: 56 61 72 69 61 62 6c 65 20 50 31 20 50 32 20 2a  Variable P1 P2 *
95d0: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
95e0: 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65 74  s: r[P2]=paramet
95f0: 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a 20  er(P1,P4).**.** 
9600: 54 72 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c  Transfer the val
9610: 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72  ues of bound par
9620: 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72  ameter P1 into r
9630: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a  egister P2.**.**
9640: 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
9650: 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e  r is named, then
9660: 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72   its name appear
9670: 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65 20  s in P4..** The 
9680: 50 34 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  P4 value is used
9690: 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   by sqlite3_bind
96a0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
96b0: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61  )..*/.case OP_Va
96c0: 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20  riable: {       
96d0: 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
96e0: 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20    Mem *pVar;    
96f0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e     /* Value bein
9700: 67 20 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f  g transferred */
9710: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
9720: 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
9730: 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61  <=p->nVar );.  a
9740: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a  ssert( pOp->p4.z
9750: 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a  ==0 || pOp->p4.z
9760: 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  ==sqlite3VListNu
9770: 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69 73  mToName(p->pVLis
9780: 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  t,pOp->p1) );.  
9790: 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b  pVar = &p->aVar[
97a0: 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20  pOp->p1 - 1];.  
97b0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
97c0: 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29  emTooBig(pVar) )
97d0: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
97e0: 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d  ig;.  }.  pOut =
97f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
9800: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
9810: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
9820: 74 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61  t, pVar, MEM_Sta
9830: 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  tic);.  UPDATE_M
9840: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
9850: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
9860: 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50  * Opcode: Move P
9870: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
9880: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33  ynopsis: r[P2@P3
9890: 5d 3d 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a 2a  ]=r[P1@P3].**.**
98a0: 20 4d 6f 76 65 20 74 68 65 20 50 33 20 76 61 6c   Move the P3 val
98b0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
98c0: 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72  P1..P1+P3-1 over
98d0: 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
98e0: 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20  rs P2..P2+P3-1. 
98f0: 20 52 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50   Registers P1..P
9900: 31 2b 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c 65  1+P3-1 are.** le
9910: 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c  ft holding a NUL
9920: 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72  L.  It is an err
9930: 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65 72 20  or for register 
9940: 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31  ranges.** P1..P1
9950: 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32  +P3-1 and P2..P2
9960: 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70  +P3-1 to overlap
9970: 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
9980: 72 0a 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20 62  r.** for P3 to b
9990: 65 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a 2a  e less than 1..*
99a0: 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20  /.case OP_Move: 
99b0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
99c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
99d0: 66 20 72 65 67 69 73 74 65 72 73 20 6c 65 66 74  f registers left
99e0: 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
99f0: 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f  t p1;          /
9a00: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f  * Register to co
9a10: 70 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  py from */.  int
9a20: 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   p2;          /*
9a30: 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70   Register to cop
9a40: 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70  y to */..  n = p
9a50: 4f 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70  Op->p3;.  p1 = p
9a60: 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70  Op->p1;.  p2 = p
9a70: 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
9a80: 28 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26  ( n>0 && p1>0 &&
9a90: 20 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72   p2>0 );.  asser
9aa0: 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70  t( p1+n<=p2 || p
9ab0: 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49  2+n<=p1 );..  pI
9ac0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a  n1 = &aMem[p1];.
9ad0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
9ae0: 32 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73  2];.  do{.    as
9af0: 73 65 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65  sert( pOut<=&aMe
9b00: 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  m[(p->nMem+1 - p
9b10: 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20  ->nCursor)] );. 
9b20: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c     assert( pIn1<
9b30: 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b  =&aMem[(p->nMem+
9b40: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d  1 - p->nCursor)]
9b50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9b60: 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29  memIsValid(pIn1)
9b70: 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74   );.    memAbout
9b80: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
9b90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9ba0: 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20  beMemMove(pOut, 
9bb0: 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51  pIn1);.#ifdef SQ
9bc0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
9bd0: 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46  f( pOut->pScopyF
9be0: 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26  rom>=&aMem[p1] &
9bf0: 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72  & pOut->pScopyFr
9c00: 6f 6d 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20 20  om<pOut ){.     
9c10: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
9c20: 6d 20 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 70  m += pOp->p2 - p
9c30: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
9c40: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
9c50: 7a 65 28 70 4f 75 74 29 3b 0a 20 20 20 20 52 45  ze(pOut);.    RE
9c60: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
9c70: 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49  +, pOut);.    pI
9c80: 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b  n1++;.    pOut++
9c90: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e 20  ;.  }while( --n 
9ca0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
9cb0: 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50  * Opcode: Copy P
9cc0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
9cd0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33  ynopsis: r[P2@P3
9ce0: 2b 31 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a 2a  +1]=r[P1@P3+1].*
9cf0: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79  *.** Make a copy
9d00: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 50 31   of registers P1
9d10: 2e 2e 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67  ..P1+P3 into reg
9d20: 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33  isters P2..P2+P3
9d30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
9d40: 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61  truction makes a
9d50: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
9d60: 65 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c  e value.  A dupl
9d70: 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65  icate.** is made
9d80: 20 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f   of any string o
9d90: 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e  r blob constant.
9da0: 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43    See also OP_SC
9db0: 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  opy..*/.case OP_
9dc0: 43 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  Copy: {.  int n;
9dd0: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ..  n = pOp->p3;
9de0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
9df0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74  pOp->p1];.  pOut
9e00: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
9e10: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75  ];.  assert( pOu
9e20: 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69  t!=pIn1 );.  whi
9e30: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 73 71 6c  le( 1 ){.    sql
9e40: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
9e50: 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e  owCopy(pOut, pIn
9e60: 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  1, MEM_Ephem);. 
9e70: 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a     Deephemeraliz
9e80: 65 28 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20  e(pOut);.#ifdef 
9e90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9ea0: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
9eb0: 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  m = 0;.#endif.  
9ec0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
9ed0: 28 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33  (pOp->p2+pOp->p3
9ee0: 2d 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 69  -n, pOut);.    i
9ef0: 66 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (n--)==0 ) br
9f00: 65 61 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b  eak;.    pOut++;
9f10: 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d  .    pIn1++;.  }
9f20: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9f30: 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31  Opcode: SCopy P1
9f40: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
9f50: 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50  opsis: r[P2]=r[P
9f60: 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  1].**.** Make a 
9f70: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
9f80: 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f  register P1 into
9f90: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
9fa0: 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
9fb0: 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61  tion makes a sha
9fc0: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
9fd0: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20   value.  If the 
9fe0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74  value.** is a st
9ff0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68  ring or blob, th
a000: 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f  en the copy is o
a010: 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nly a pointer to
a020: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
a030: 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68   and hence if th
a040: 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67  e original chang
a050: 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63  es so will the c
a060: 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69  opy..** Worse, i
a070: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  f the original i
a080: 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74  s deallocated, t
a090: 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20  he copy becomes 
a0a0: 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73  invalid..** Thus
a0b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73   the program mus
a0c0: 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
a0d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69   the original wi
a0e0: 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a  ll not change.**
a0f0: 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
a100: 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79  time of the copy
a110: 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74  .  Use OP_Copy t
a120: 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74  o make a complet
a130: 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61  e.** copy..*/.ca
a140: 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20  se OP_SCopy: {  
a150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
a160: 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
a170: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
a180: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
a190: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
a1a0: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
a1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
a1c0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
a1d0: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
a1e0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
a1f0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75  _DEBUG.  if( pOu
a200: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30  t->pScopyFrom==0
a210: 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46   ) pOut->pScopyF
a220: 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64  rom = pIn1;.#end
a230: 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  if.  break;.}../
a240: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f 70  * Opcode: IntCop
a250: 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
a260: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
a270: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72 61  =r[P1].**.** Tra
a280: 6e 73 66 65 72 20 74 68 65 20 69 6e 74 65 67 65  nsfer the intege
a290: 72 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20  r value held in 
a2a0: 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f  register P1 into
a2b0: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
a2c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
a2d0: 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
a2e0: 20 6f 66 20 53 43 6f 70 79 20 74 68 61 74 20 77   of SCopy that w
a2f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69 6e  orks only for in
a300: 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73 2e  teger.** values.
a310: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 43  .*/.case OP_IntC
a320: 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  opy: {          
a330: 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70    /* out2 */.  p
a340: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
a350: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
a360: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
a370: 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
a380: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
a390: 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
a3a0: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
a3b0: 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69 29  pOut, pIn1->u.i)
a3c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
a3d0: 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52   Opcode: ResultR
a3e0: 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ow P1 P2 * * *.*
a3f0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74 70  * Synopsis: outp
a400: 75 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a 2a  ut=r[P1@P2].**.*
a410: 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20  * The registers 
a420: 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32  P1 through P1+P2
a430: 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e  -1 contain a sin
a440: 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65  gle row of.** re
a450: 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f  sults. This opco
a460: 64 65 20 63 61 75 73 65 73 20 74 68 65 20 73 71  de causes the sq
a470: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
a480: 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a  l to terminate.*
a490: 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  * with an SQLITE
a4a0: 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65  _ROW return code
a4b0: 20 61 6e 64 20 69 74 20 73 65 74 73 20 75 70 20   and it sets up 
a4c0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  the sqlite3_stmt
a4d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
a4e0: 20 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20   provide access 
a4f0: 74 6f 20 74 68 65 20 72 28 50 31 29 2e 2e 72 28  to the r(P1)..r(
a500: 50 31 2b 50 32 2d 31 29 20 76 61 6c 75 65 73 20  P1+P2-1) values 
a510: 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  as.** the result
a520: 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   row..*/.case OP
a530: 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20  _ResultRow: {.  
a540: 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74  Mem *pMem;.  int
a550: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
a560: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70  >nResColumn==pOp
a570: 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ->p2 );.  assert
a580: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
a590: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
a5a0: 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d  +pOp->p2<=(p->nM
a5b0: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
a5c0: 72 29 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66  r)+1 );..#ifndef
a5d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
a5e0: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
a5f0: 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 67   /* Run the prog
a600: 72 65 73 73 20 63 6f 75 6e 74 65 72 20 6a 75 73  ress counter jus
a610: 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
a620: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ng..  */.  if( d
a630: 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 0a  b->xProgress!=0.
a640: 20 20 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e     && nVmStep>=n
a650: 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 0a 20 20  ProgressLimit.  
a660: 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72 65 73   && db->xProgres
a670: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41  s(db->pProgressA
a680: 72 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  rg)!=0.  ){.    
a690: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
a6a0: 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  RRUPT;.    goto 
a6b0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
a6c0: 6f 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  or;.  }.#endif..
a6d0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61    /* If this sta
a6e0: 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61  tement has viola
a6f0: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  ted immediate fo
a700: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a710: 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e  aints, do.  ** n
a720: 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ot return the nu
a730: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64  mber of rows mod
a740: 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f  ified. And do no
a750: 74 20 52 45 4c 45 41 53 45 20 74 68 65 20 73 74  t RELEASE the st
a760: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
a770: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65  nsaction. It nee
a780: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
a790: 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  back.  */.  if( 
a7a0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
a7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
a7c0: 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20  kFk(p, 0)) ){.  
a7d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c    assert( db->fl
a7e0: 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ags&SQLITE_Count
a7f0: 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65  Rows );.    asse
a800: 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  rt( p->usesStmtJ
a810: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 67 6f  ournal );.    go
a820: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
a830: 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  error;.  }..  /*
a840: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43   If the SQLITE_C
a850: 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73  ountRows flag is
a860: 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e   set in sqlite3.
a870: 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e  flags mask, then
a880: 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65   .  ** DML state
a890: 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69  ments invoke thi
a8a0: 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75  s opcode to retu
a8b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
a8c0: 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69   rows .  ** modi
a8d0: 66 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  fied to the user
a8e0: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  . This is the on
a8f0: 6c 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d  ly way that a VM
a900: 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73   that.  ** opens
a910: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
a920: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76  nsaction may inv
a930: 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  oke this opcode.
a940: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
a950: 73 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20  se this is such 
a960: 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f  a statement, clo
a970: 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  se any statement
a980: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
a990: 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  * opened by this
a9a0: 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72   VM before retur
a9b0: 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  ning control to 
a9c0: 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69  the user. This i
a9d0: 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  s to.  ** ensure
a9e0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d   that statement-
a9f0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
aa00: 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20   always nested, 
aa10: 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e  not overlapping.
aa20: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  .  ** If the ope
aa30: 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  n statement-tran
aa40: 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  saction is not c
aa50: 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e  losed here, then
aa60: 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d   the user.  ** m
aa70: 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20  ay step another 
aa80: 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74  VM that opens it
aa90: 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20  s own statement 
aaa0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
aab0: 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20  s.  ** may lead 
aac0: 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73  to overlapping s
aad0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
aae0: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
aaf0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   The statement t
ab00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
ab10: 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20  ver a top-level 
ab20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65  transaction.  He
ab30: 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c  nce.  ** the REL
ab40: 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20  EASE call below 
ab50: 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a  can never fail..
ab60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ab70: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->iStatement==0 
ab80: 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  || db->flags&SQL
ab90: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
aba0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
abb0: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
abc0: 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  t(p, SAVEPOINT_R
abd0: 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72  ELEASE);.  asser
abe0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
abf0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69   );..  /* Invali
ac00: 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72  date all ephemer
ac10: 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61  al cursor row ca
ac20: 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63  ches */.  p->cac
ac30: 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68  heCtr = (p->cach
ac40: 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20  eCtr + 2)|1;..  
ac50: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
ac60: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
ac70: 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20  current row are 
ac80: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a  \000 terminated.
ac90: 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e    ** and have an
aca0: 20 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20   assigned type. 
acb0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
acc0: 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65   de-ephemeralize
acd0: 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65  d as.  ** a side
ace0: 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   effect..  */.  
acf0: 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c  pMem = p->pResul
ad00: 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  tSet = &aMem[pOp
ad10: 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ->p1];.  for(i=0
ad20: 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b  ; i<pOp->p2; i++
ad30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ){.    assert( m
ad40: 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b  emIsValid(&pMem[
ad50: 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68  i]) );.    Deeph
ad60: 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b  emeralize(&pMem[
ad70: 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
ad80: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
ad90: 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a  & MEM_Ephem)==0.
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
adb0: 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20  pMem[i].flags & 
adc0: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
add0: 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  b))==0 );.    sq
ade0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54  lite3VdbeMemNulT
adf0: 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69  erminate(&pMem[i
ae00: 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  ]);.    REGISTER
ae10: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69  _TRACE(pOp->p1+i
ae20: 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d  , &pMem[i]);.  }
ae30: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ae40: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e  cFailed ) goto n
ae50: 6f 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20 64 62  o_mem;..  if( db
ae60: 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54  ->mTrace & SQLIT
ae70: 45 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b 0a 20  E_TRACE_ROW ){. 
ae80: 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51     db->xTrace(SQ
ae90: 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 2c 20  LITE_TRACE_ROW, 
aea0: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 70  db->pTraceArg, p
aeb0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
aec0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f  Return SQLITE_RO
aed0: 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d  W.  */.  p->pc =
aee0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
aef0: 29 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51  ) + 1;.  rc = SQ
af00: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f  LITE_ROW;.  goto
af10: 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a   vdbe_return;.}.
af20: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63  ./* Opcode: Conc
af30: 61 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  at P1 P2 P3 * *.
af40: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
af50: 33 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a  3]=r[P2]+r[P1].*
af60: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78  *.** Add the tex
af70: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  t in register P1
af80: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
af90: 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20   the text in.** 
afa0: 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20  register P2 and 
afb0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
afc0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
afd0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68  .** If either th
afe0: 65 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20  e P1 or P2 text 
aff0: 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74  are NULL then st
b000: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a  ore NULL in P3..
b010: 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20  **.**   P3 = P2 
b020: 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69  || P1.**.** It i
b030: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31  s illegal for P1
b040: 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68   and P3 to be th
b050: 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e  e same register.
b060: 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69   Sometimes,.** i
b070: 66 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65  f P3 is the same
b080: 20 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c   register as P2,
b090: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
b0a0: 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74  ion is able.** t
b0b0: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79  o avoid a memcpy
b0c0: 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ()..*/.case OP_C
b0d0: 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20  oncat: {        
b0e0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b0f0: 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e  _CONCAT, in1, in
b100: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
b110: 20 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20   nByte;..  pIn1 
b120: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
b130: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
b140: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
b150: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
b160: 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  3];.  assert( pI
b170: 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66  n1!=pOut );.  if
b180: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c  ( (pIn1->flags |
b190: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20   pIn2->flags) & 
b1a0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
b1b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
b1c0: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20  tNull(pOut);.   
b1d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
b1e0: 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  ( ExpandBlob(pIn
b1f0: 31 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62  1) || ExpandBlob
b200: 28 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f  (pIn2) ) goto no
b210: 5f 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66  _mem;.  Stringif
b220: 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67  y(pIn1, encoding
b230: 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70  );.  Stringify(p
b240: 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In2, encoding);.
b250: 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e    nByte = pIn1->
b260: 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69  n + pIn2->n;.  i
b270: 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69  f( nByte>db->aLi
b280: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
b290: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
b2a0: 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
b2b0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  }.  if( sqlite3V
b2c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c  dbeMemGrow(pOut,
b2d0: 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70   (int)nByte+2, p
b2e0: 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20  Out==pIn2) ){.  
b2f0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
b300: 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46   }.  MemSetTypeF
b310: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74  lag(pOut, MEM_St
b320: 72 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d  r);.  if( pOut!=
b330: 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63  pIn2 ){.    memc
b340: 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32  py(pOut->z, pIn2
b350: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20  ->z, pIn2->n);. 
b360: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75   }.  memcpy(&pOu
b370: 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70  t->z[pIn2->n], p
b380: 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29  In1->z, pIn1->n)
b390: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
b3a0: 65 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b  e]=0;.  pOut->z[
b3b0: 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20  nByte+1] = 0;.  
b3c0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
b3d0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d  EM_Term;.  pOut-
b3e0: 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b  >n = (int)nByte;
b3f0: 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65  .  pOut->enc = e
b400: 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54  ncoding;.  UPDAT
b410: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
b420: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
b430: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64  ../* Opcode: Add
b440: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
b450: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
b460: 3d 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a  =r[P1]+r[P2].**.
b470: 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65  ** Add the value
b480: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b490: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
b4a0: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
b4b0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b4c0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b4d0: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
b4e0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
b4f0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b500: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
b510: 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32  : Multiply P1 P2
b520: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b530: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d  sis: r[P3]=r[P1]
b540: 2a 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  *r[P2].**.**.** 
b550: 4d 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c  Multiply the val
b560: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b570: 31 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69  1 by the value i
b580: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b590: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b5a0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b5b0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b5c0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b5d0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b5e0: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b5f0: 64 65 3a 20 53 75 62 74 72 61 63 74 20 50 31 20  de: Subtract P1 
b600: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b610: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b620: 32 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53  2]-r[P1].**.** S
b630: 75 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  ubtract the valu
b640: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
b650: 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20   from the value 
b660: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
b670: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
b680: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
b690: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
b6a0: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
b6b0: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
b6c0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
b6d0: 6f 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50  ode: Divide P1 P
b6e0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
b6f0: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
b700: 5d 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69  ]/r[P1].**.** Di
b710: 76 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69  vide the value i
b720: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79  n register P1 by
b730: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b740: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
b750: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b760: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b770: 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20   (P3=P2/P1). If 
b780: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a  the value in .**
b790: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
b7a0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
b7b0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49  esult is NULL. I
b7c0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
b7d0: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  s .** NULL, the 
b7e0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b7f0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  */./* Opcode: Re
b800: 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33  mainder P1 P2 P3
b810: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
b820: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b  : r[P3]=r[P2]%r[
b830: 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  P1].**.** Comput
b840: 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  e the remainder 
b850: 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 72 65  after integer re
b860: 67 69 73 74 65 72 20 50 32 20 69 73 20 64 69 76  gister P2 is div
b870: 69 64 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69  ided by .** regi
b880: 73 74 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72  ster P1 and stor
b890: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b8a0: 72 65 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a  register P3. .**
b8b0: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   If the value in
b8c0: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
b8d0: 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20  zero the result 
b8e0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65  is NULL..** If e
b8f0: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
b900: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
b910: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  t is NULL..*/.ca
b920: 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20  se OP_Add:      
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b940: 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c  same as TK_PLUS,
b950: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b960: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72  */.case OP_Subtr
b970: 61 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  act:            
b980: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
b990: 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c  MINUS, in1, in2,
b9a0: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
b9b0: 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20  _Multiply:      
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
b9d0: 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c  as TK_STAR, in1,
b9e0: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
b9f0: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20  se OP_Divide:   
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba10: 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48  same as TK_SLASH
ba20: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
ba30: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61   */.case OP_Rema
ba40: 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20  inder: {        
ba50: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
ba60: 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  _REM, in1, in2, 
ba70: 6f 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62  out3 */.  char b
ba80: 49 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61  Intint;   /* Sta
ba90: 72 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20  rted out as two 
baa0: 69 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73  integer operands
bab0: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b   */.  u16 flags;
bac0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
bad0: 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72  d MEM_* flags fr
bae0: 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a  om both inputs *
baf0: 2f 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20 20  /.  u16 type1;  
bb00: 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74      /* Numeric t
bb10: 79 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  ype of left oper
bb20: 61 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70  and */.  u16 typ
bb30: 65 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65  e2;      /* Nume
bb40: 72 69 63 20 74 79 70 65 20 6f 66 20 72 69 67 68  ric type of righ
bb50: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
bb60: 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f  64 iA;         /
bb70: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
bb80: 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  of left operand 
bb90: 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20  */.  i64 iB;    
bba0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
bbb0: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
bbc0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62  perand */.  doub
bbd0: 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52  le rA;      /* R
bbe0: 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  eal value of lef
bbf0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64  t operand */.  d
bc00: 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f  ouble rB;      /
bc10: 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20  * Real value of 
bc20: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
bc30: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
bc40: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70  [pOp->p1];.  typ
bc50: 65 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65  e1 = numericType
bc60: 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d  (pIn1);.  pIn2 =
bc70: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
bc80: 0a 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72  .  type2 = numer
bc90: 69 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20  icType(pIn2);.  
bca0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
bcb0: 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d  ->p3];.  flags =
bcc0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70   pIn1->flags | p
bcd0: 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66  In2->flags;.  if
bce0: 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  ( (flags & MEM_N
bcf0: 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f 20 61  ull)!=0 ) goto a
bd00: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
bd10: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20  _is_null;.  if( 
bd20: 28 74 79 70 65 31 20 26 20 74 79 70 65 32 20 26  (type1 & type2 &
bd30: 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
bd40: 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75      iA = pIn1->u
bd50: 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e  .i;.    iB = pIn
bd60: 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e 74  2->u.i;.    bInt
bd70: 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 77 69  int = 1;.    swi
bd80: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
bd90: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
bda0: 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69 66 28  P_Add:       if(
bdb0: 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34   sqlite3AddInt64
bdc0: 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20  (&iB,iA) ) goto 
bdd0: 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b  fp_math;  break;
bde0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53  .      case OP_S
bdf0: 75 62 74 72 61 63 74 3a 20 20 69 66 28 20 73 71  ubtract:  if( sq
be00: 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 26 69  lite3SubInt64(&i
be10: 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f  B,iA) ) goto fp_
be20: 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20  math;  break;.  
be30: 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74      case OP_Mult
be40: 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74  iply:  if( sqlit
be50: 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69  e3MulInt64(&iB,i
be60: 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  A) ) goto fp_mat
be70: 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  h;  break;.     
be80: 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a   case OP_Divide:
be90: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
bea0: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
beb0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
bec0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
bed0: 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d  f( iA==-1 && iB=
bee0: 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
bef0: 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a  ) goto fp_math;.
bf00: 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41          iB /= iA
bf10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
bf20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
bf30: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
bf40: 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f    if( iA==0 ) go
bf50: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
bf60: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
bf70: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31        if( iA==-1
bf80: 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20   ) iA = 1;.     
bf90: 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20     iB %= iA;.   
bfa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bfb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f    }.    }.    pO
bfc0: 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20  ut->u.i = iB;.  
bfd0: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
bfe0: 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
bff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 49  .  }else{.    bI
c000: 6e 74 69 6e 74 20 3d 20 30 3b 0a 66 70 5f 6d 61  ntint = 0;.fp_ma
c010: 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73 71 6c  th:.    rA = sql
c020: 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
c030: 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72 42 20  e(pIn1);.    rB 
c040: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
c050: 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20  lValue(pIn2);.  
c060: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
c070: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
c080: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
c090: 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20 20 20      rB += rA;   
c0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c0b0: 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63   case OP_Subtrac
c0c0: 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41 3b 20  t:    rB -= rA; 
c0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0e0: 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69     case OP_Multi
c0f0: 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20 72 41  ply:    rB *= rA
c100: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c110: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76       case OP_Div
c120: 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ide: {.        /
c130: 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
c140: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
c150: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
c160: 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  T... */.        
c170: 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29  if( rA==(double)
c180: 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65  0 ) goto arithme
c190: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
c1a0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42 20 2f  ll;.        rB /
c1b0: 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = rA;.        br
c1c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c1d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
c1e0: 20 20 20 20 20 20 69 41 20 3d 20 28 69 36 34 29        iA = (i64)
c1f0: 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42 20 3d  rA;.        iB =
c200: 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20 20 20   (i64)rB;.      
c210: 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f    if( iA==0 ) go
c220: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c230: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c240: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31        if( iA==-1
c250: 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20   ) iA = 1;.     
c260: 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29     rB = (double)
c270: 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20  (iB % iA);.     
c280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c290: 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
c2a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
c2b0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f  ING_POINT.    pO
c2c0: 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20  ut->u.i = rB;.  
c2d0: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
c2e0: 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
c2f0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 73  .#else.    if( s
c300: 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42 29 20  qlite3IsNaN(rB) 
c310: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72  ){.      goto ar
c320: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
c330: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20  is_null;.    }. 
c340: 20 20 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72     pOut->u.r = r
c350: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
c360: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
c370: 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Real);.    if( (
c380: 28 74 79 70 65 31 7c 74 79 70 65 32 29 26 4d 45  (type1|type2)&ME
c390: 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20 21 62  M_Real)==0 && !b
c3a0: 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  Intint ){.      
c3b0: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67  sqlite3VdbeInteg
c3c0: 65 72 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29  erAffinity(pOut)
c3d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c3e0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69   }.  break;..ari
c3f0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
c400: 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65  s_null:.  sqlite
c410: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
c420: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
c430: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
c440: 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a  llSeq P1 * * P4.
c450: 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
c460: 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53  inter to a CollS
c470: 65 71 20 73 74 72 75 63 74 2e 20 49 66 20 74 68  eq struct. If th
c480: 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
c490: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a   user function.*
c4a0: 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65 20 63  * or aggregate c
c4b0: 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46  alls sqlite3GetF
c4c0: 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68  uncCollSeq(), th
c4d0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
c4e0: 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65  uence will.** be
c4f0: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
c500: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  is used by the b
c510: 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d  uilt-in min(), m
c520: 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28  ax() and nullif(
c530: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ).** functions..
c540: 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e  **.** If P1 is n
c550: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  ot zero, then it
c560: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 74   is a register t
c570: 68 61 74 20 61 20 73 75 62 73 65 71 75 65 6e 74  hat a subsequent
c580: 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78   min() or.** max
c590: 28 29 20 61 67 67 72 65 67 61 74 65 20 77 69 6c  () aggregate wil
c5a0: 6c 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  l set to 1 if th
c5b0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
c5c0: 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d   not the minimum
c5d0: 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20   or.** maximum. 
c5e0: 20 54 68 65 20 50 31 20 72 65 67 69 73 74 65 72   The P1 register
c5f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
c600: 74 6f 20 30 20 62 79 20 74 68 69 73 20 69 6e 73  to 0 by this ins
c610: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
c620: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75 73  The interface us
c630: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
c640: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c650: 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66  aforementioned f
c660: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72  unctions.** to r
c670: 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c  etrieve the coll
c680: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
c690: 65 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  et by this opcod
c6a0: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
c6b0: 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20  le.** publicly. 
c6c0: 20 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66   Only built-in f
c6d0: 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 61 63  unctions have ac
c6e0: 63 65 73 73 20 74 6f 20 74 68 69 73 20 66 65 61  cess to this fea
c6f0: 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ture..*/.case OP
c700: 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73  _CollSeq: {.  as
c710: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
c720: 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b  e==P4_COLLSEQ );
c730: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  .  if( pOp->p1 )
c740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
c750: 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
c760: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b  em[pOp->p1], 0);
c770: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
c780: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e 63  ./* Opcode: Func
c790: 74 69 6f 6e 30 20 50 31 20 50 32 20 50 33 20 50  tion0 P1 P2 P3 P
c7a0: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
c7b0: 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b 50  : r[P3]=func(r[P
c7c0: 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e 76  2@P5]).**.** Inv
c7d0: 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  oke a user funct
c7e0: 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69  ion (P4 is a poi
c7f0: 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63 44 65  nter to a FuncDe
c800: 66 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  f object that.**
c810: 20 64 65 66 69 6e 65 73 20 74 68 65 20 66 75 6e   defines the fun
c820: 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35 20 61  ction) with P5 a
c830: 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66  rguments taken f
c840: 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20  rom register P2 
c850: 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72  and.** successor
c860: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
c870: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
c880: 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
c890: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69  ster P3..** Regi
c8a0: 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e 6f 74  ster P3 must not
c8b0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   be one of the f
c8c0: 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a  unction inputs..
c8d0: 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 33 32  **.** P1 is a 32
c8e0: 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64  -bit bitmask ind
c8f0: 69 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20  icating whether 
c900: 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72 67 75  or not each argu
c910: 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ment to the .** 
c920: 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64 65 74  function was det
c930: 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20 63 6f  ermined to be co
c940: 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c  nstant at compil
c950: 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65 20 66  e time. If the f
c960: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
c970: 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20 74 68   was constant th
c980: 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31 20 69  en bit 0 of P1 i
c990: 73 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75  s set. This is u
c9a0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
c9b0: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65 74 61  .** whether meta
c9c0: 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
c9d0: 20 77 69 74 68 20 61 20 75 73 65 72 20 66 75 6e   with a user fun
c9e0: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75  ction argument u
c9f0: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
ca00: 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28  te3_set_auxdata(
ca10: 29 20 41 50 49 20 6d 61 79 20 62 65 20 73 61 66  ) API may be saf
ca20: 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75 6e 74  ely retained unt
ca30: 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69  il the next.** i
ca40: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69  nvocation of thi
ca50: 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  s opcode..**.** 
ca60: 53 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69  See also: Functi
ca70: 6f 6e 2c 20 41 67 67 53 74 65 70 2c 20 41 67 67  on, AggStep, Agg
ca80: 46 69 6e 61 6c 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  Final.*/./* Opco
ca90: 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31 20  de: Function P1 
caa0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
cab0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 66  ynopsis: r[P3]=f
cac0: 75 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a  unc(r[P2@P5]).**
cad0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73 65  .** Invoke a use
cae0: 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34 20 69  r function (P4 i
caf0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
cb00: 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  n sqlite3_contex
cb10: 74 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  t object that.**
cb20: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
cb30: 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ter to the funct
cb40: 69 6f 6e 20 74 6f 20 62 65 20 72 75 6e 29 20 77  ion to be run) w
cb50: 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74 73  ith P5 arguments
cb60: 20 74 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d 20 72   taken.** from r
cb70: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
cb80: 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65 20  uccessors.  The 
cb90: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
cba0: 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  nction is stored
cbb0: 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
cbc0: 50 33 2e 20 20 52 65 67 69 73 74 65 72 20 50 33  P3.  Register P3
cbd0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65   must not be one
cbe0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
cbf0: 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50   inputs..**.** P
cc00: 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69  1 is a 32-bit bi
cc10: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
cc20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
cc30: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  each argument to
cc40: 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   the .** functio
cc50: 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64  n was determined
cc60: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
cc70: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e  at compile time.
cc80: 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   If the first.**
cc90: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f   argument was co
cca0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20  nstant then bit 
ccb0: 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20  0 of P1 is set. 
ccc0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
ccd0: 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
cce0: 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61  ther meta data a
ccf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
cd00: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61   user function a
cd10: 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68  rgument using th
cd20: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74  e.** sqlite3_set
cd30: 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d  _auxdata() API m
cd40: 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74  ay be safely ret
cd50: 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20  ained until the 
cd60: 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  next.** invocati
cd70: 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64  on of this opcod
cd80: 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  e..**.** SQL fun
cd90: 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 69 74 69  ctions are initi
cda0: 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50  ally coded as OP
cdb0: 5f 46 75 6e 63 74 69 6f 6e 30 20 77 69 74 68 20  _Function0 with 
cdc0: 50 34 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  P4 pointing.** t
cdd0: 6f 20 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65  o a FuncDef obje
cde0: 63 74 2e 20 20 42 75 74 20 6f 6e 20 66 69 72 73  ct.  But on firs
cdf0: 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20 74 68  t evaluation, th
ce00: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 0a  e P4 operand is.
ce10: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
ce20: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
ce30: 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  an sqlite3_conte
ce40: 78 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  xt object and th
ce50: 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  e operation.** c
ce60: 68 61 6e 67 65 64 20 74 6f 20 74 68 69 73 20 4f  hanged to this O
ce70: 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
ce80: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
ce90: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
cea0: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 73 71  ion of.** the sq
ceb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62  lite3_context ob
cec0: 6a 65 63 74 20 6f 63 63 75 72 73 20 6f 6e 6c 79  ject occurs only
ced0: 20 6f 6e 63 65 2c 20 72 61 74 68 65 72 20 74 68   once, rather th
cee0: 61 6e 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  an once for each
cef0: 0a 2a 2a 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  .** evaluation o
cf00: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  f the function..
cf10: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
cf20: 46 75 6e 63 74 69 6f 6e 30 2c 20 41 67 67 53 74  Function0, AggSt
cf30: 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a  ep, AggFinal.*/.
cf40: 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  case OP_Function
cf50: 30 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  0: {.  int n;.  
cf60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
cf70: 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74  *pCtx;..  assert
cf80: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
cf90: 34 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e  4_FUNCDEF );.  n
cfa0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73   = pOp->p5;.  as
cfb0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
cfc0: 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  && pOp->p3<=(p->
cfd0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
cfe0: 73 6f 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  sor) );.  assert
cff0: 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e  ( n==0 || (pOp->
d000: 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
d010: 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  n<=(p->nMem+1 - 
d020: 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 29 20 29  p->nCursor)+1) )
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
d040: 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70  >p3<pOp->p2 || p
d050: 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b  Op->p3>=pOp->p2+
d060: 6e 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 73 71  n );.  pCtx = sq
d070: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
d080: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
d090: 43 74 78 29 20 2b 20 28 6e 2d 31 29 2a 73 69 7a  Ctx) + (n-1)*siz
d0a0: 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  eof(sqlite3_valu
d0b0: 65 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  e*));.  if( pCtx
d0c0: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
d0d0: 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20  m;.  pCtx->pOut 
d0e0: 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46 75  = 0;.  pCtx->pFu
d0f0: 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  nc = pOp->p4.pFu
d100: 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 20  nc;.  pCtx->iOp 
d110: 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
d120: 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 62  p);.  pCtx->pVdb
d130: 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e 61  e = p;.  pCtx->a
d140: 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e  rgc = n;.  pOp->
d150: 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55 4e 43  p4type = P4_FUNC
d160: 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  CTX;.  pOp->p4.p
d170: 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 4f  Ctx = pCtx;.  pO
d180: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 46  p->opcode = OP_F
d190: 75 6e 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20 46 61  unction;.  /* Fa
d1a0: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
d1b0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7d  OP_Function */.}
d1c0: 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f  .case OP_Functio
d1d0: 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n: {.  int i;.  
d1e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d1f0: 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74  *pCtx;..  assert
d200: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
d210: 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20 20 70  4_FUNCCTX );.  p
d220: 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  Ctx = pOp->p4.pC
d230: 74 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  tx;..  /* If thi
d240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
d250: 73 69 64 65 20 6f 66 20 61 20 74 72 69 67 67 65  side of a trigge
d260: 72 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  r, the register 
d270: 61 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a  array in aMem[].
d280: 20 20 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67    ** might chang
d290: 65 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61 6c 75  e from one evalu
d2a0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ation to the nex
d2b0: 74 2e 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f  t.  The next blo
d2c0: 63 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a 2a 20  ck of code.  ** 
d2d0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
d2e0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 72   the register ar
d2f0: 72 61 79 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ray has changed,
d300: 20 61 6e 64 20 69 66 20 73 6f 20 69 74 0a 20 20   and if so it.  
d310: 2a 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 73  ** reinitializes
d320: 20 74 68 65 20 72 65 6c 61 76 61 6e 74 20 70 61   the relavant pa
d330: 72 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  rts of the sqlit
d340: 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63  e3_context objec
d350: 74 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 26 61  t */.  pOut = &a
d360: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
d370: 69 66 28 20 70 43 74 78 2d 3e 70 4f 75 74 20 21  if( pCtx->pOut !
d380: 3d 20 70 4f 75 74 20 29 7b 0a 20 20 20 20 70 43  = pOut ){.    pC
d390: 74 78 2d 3e 70 4f 75 74 20 3d 20 70 4f 75 74 3b  tx->pOut = pOut;
d3a0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74 78 2d  .    for(i=pCtx-
d3b0: 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  >argc-1; i>=0; i
d3c0: 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76 5b 69  --) pCtx->argv[i
d3d0: 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ] = &aMem[pOp->p
d3e0: 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  2+i];.  }..  mem
d3f0: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
d400: 20 70 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 23 69   pCtx->pOut);.#i
d410: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d420: 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
d430: 43 74 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b  Ctx->argc; i++){
d440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
d450: 49 73 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72  IsValid(pCtx->ar
d460: 67 76 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45  gv[i]) );.    RE
d470: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
d480: 2d 3e 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72  ->p2+i, pCtx->ar
d490: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  gv[i]);.  }.#end
d4a0: 69 66 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  if.  MemSetTypeF
d4b0: 6c 61 67 28 70 43 74 78 2d 3e 70 4f 75 74 2c 20  lag(pCtx->pOut, 
d4c0: 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74  MEM_Null);.  pCt
d4d0: 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 3d  x->fErrorOrAux =
d4e0: 20 30 3b 0a 20 20 28 2a 70 43 74 78 2d 3e 70 46   0;.  (*pCtx->pF
d4f0: 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74  unc->xSFunc)(pCt
d500: 78 2c 20 70 43 74 78 2d 3e 61 72 67 63 2c 20 70  x, pCtx->argc, p
d510: 43 74 78 2d 3e 61 72 67 76 29 3b 2f 2a 20 49 4d  Ctx->argv);/* IM
d520: 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30  P: R-24505-23230
d530: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
d540: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d550: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 72  ed an error, thr
d560: 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  ow an exception 
d570: 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66  */.  if( pCtx->f
d580: 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20  ErrorOrAux ){.  
d590: 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72    if( pCtx->isEr
d5a0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ror ){.      sql
d5b0: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
d5c0: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
d5d0: 61 6c 75 65 5f 74 65 78 74 28 70 43 74 78 2d 3e  alue_text(pCtx->
d5e0: 70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 63  pOut));.      rc
d5f0: 20 3d 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72   = pCtx->isError
d600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d610: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
d620: 44 61 74 61 28 64 62 2c 20 26 70 2d 3e 70 41 75  Data(db, &p->pAu
d630: 78 44 61 74 61 2c 20 70 43 74 78 2d 3e 69 4f 70  xData, pCtx->iOp
d640: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
d650: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
d660: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
d670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
d680: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d690: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f  he function into
d6a0: 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a   register P3 */.
d6b0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 66 6c 61 67    if( pOut->flag
d6c0: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
d6d0: 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 73 71  _Blob) ){.    sq
d6e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
d6f0: 6e 63 6f 64 69 6e 67 28 70 43 74 78 2d 3e 70 4f  ncoding(pCtx->pO
d700: 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  ut, encoding);. 
d710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
d720: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 43 74 78  beMemTooBig(pCtx
d730: 2d 3e 70 4f 75 74 29 20 29 20 67 6f 74 6f 20 74  ->pOut) ) goto t
d740: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 52  oo_big;.  }..  R
d750: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
d760: 70 2d 3e 70 33 2c 20 70 43 74 78 2d 3e 70 4f 75  p->p3, pCtx->pOu
d770: 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
d780: 5f 42 4c 4f 42 53 49 5a 45 28 70 43 74 78 2d 3e  _BLOBSIZE(pCtx->
d790: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
d7a0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
d7b0: 74 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  tAnd P1 P2 P3 * 
d7c0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d7d0: 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b 50 32 5d  [P3]=r[P1]&r[P2]
d7e0: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
d7f0: 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20  bit-wise AND of 
d800: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
d810: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
d820: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
d830: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
d840: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
d850: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
d860: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
d870: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
d880: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20  pcode: BitOr P1 
d890: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
d8a0: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
d8b0: 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]|r[P2].**.** T
d8c0: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
d8d0: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
d8e0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
d8f0: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
d900: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
d910: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
d920: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
d930: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
d940: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
d950: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
d960: 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33  iftLeft P1 P2 P3
d970: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
d980: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3c 3c 72  : r[P3]=r[P2]<<r
d990: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
d9a0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
d9b0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
d9c0: 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79  2 to the left by
d9d0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
d9e0: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
d9f0: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
da00: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
da10: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
da20: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
da30: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
da40: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
da50: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
da60: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
da70: 3a 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20  : ShiftRight P1 
da80: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
da90: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
daa0: 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]>>r[P1].**.** 
dab0: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
dac0: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
dad0: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69  ter P2 to the ri
dae0: 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75  ght by the.** nu
daf0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65  mber of bits spe
db00: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e  cified by the in
db10: 74 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65  teger in registe
db20: 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  r P1..** Store t
db30: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
db40: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
db50: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
db60: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
db70: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
db80: 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20  e OP_BitAnd:    
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dba0: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e  same as TK_BITAN
dbb0: 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  D, in1, in2, out
dbc0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  3 */.case OP_Bit
dbd0: 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Or:             
dbe0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dbf0: 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69  TK_BITOR, in1, i
dc00: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
dc10: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20   OP_ShiftLeft:  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
dc30: 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54  ame as TK_LSHIFT
dc40: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
dc50: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
dc60: 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20  tRight: {       
dc70: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
dc80: 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_RSHIFT, in1, i
dc90: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36  n2, out3 */.  i6
dca0: 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a  4 iA;.  u64 uA;.
dcb0: 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f    i64 iB;.  u8 o
dcc0: 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  p;..  pIn1 = &aM
dcd0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
dce0: 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
dcf0: 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p2];.  pOut = &
dd00: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
dd10: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
dd20: 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29  s | pIn2->flags)
dd30: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
dd40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
dd50: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
dd60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
dd70: 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iA = sqlite3Vdb
dd80: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
dd90: 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56  .  iB = sqlite3V
dda0: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
ddb0: 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f  );.  op = pOp->o
ddc0: 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d  pcode;.  if( op=
ddd0: 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20  =OP_BitAnd ){.  
dde0: 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65    iA &= iB;.  }e
ddf0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  lse if( op==OP_B
de00: 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c  itOr ){.    iA |
de10: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
de20: 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61  ( iB!=0 ){.    a
de30: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68  ssert( op==OP_Sh
de40: 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d  iftRight || op==
de50: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
de60: 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74  .    /* If shift
de70: 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76  ing by a negativ
de80: 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20  e amount, shift 
de90: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72  in the other dir
dea0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  ection */.    if
deb0: 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( iB<0 ){.      
dec0: 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74  assert( OP_Shift
ded0: 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c  Right==OP_ShiftL
dee0: 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f  eft+1 );.      o
def0: 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65  p = 2*OP_ShiftLe
df00: 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20  ft + 1 - op;.   
df10: 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29     iB = iB>(-64)
df20: 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20   ? -iB : 64;.   
df30: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d   }..    if( iB>=
df40: 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d  64 ){.      iA =
df50: 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f   (iA>=0 || op==O
df60: 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30  P_ShiftLeft) ? 0
df70: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   : -1;.    }else
df80: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
df90: 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28  uA, &iA, sizeof(
dfa0: 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  uA));.      if( 
dfb0: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
dfc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c   ){.        uA <
dfd0: 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c  <= iB;.      }el
dfe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e  se{.        uA >
dff0: 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f  >= iB;.        /
e000: 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e  * Sign-extend on
e010: 20 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f   a right shift o
e020: 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  f a negative num
e030: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ber */.        i
e040: 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20  f( iA<0 ) uA |= 
e050: 28 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66  ((((u64)0xffffff
e060: 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66  ff)<<32)|0xfffff
e070: 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b  fff) << (64-iB);
e080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
e090: 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20  emcpy(&iA, &uA, 
e0a0: 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20  sizeof(iA));.   
e0b0: 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75   }.  }.  pOut->u
e0c0: 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65  .i = iA;.  MemSe
e0d0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
e0e0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61  MEM_Int);.  brea
e0f0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
e100: 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a   AddImm  P1 P2 *
e110: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
e120: 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d 2b 50 32  : r[P1]=r[P1]+P2
e130: 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20  .** .** Add the 
e140: 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74  constant P2 to t
e150: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
e160: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20  ster P1..** The 
e170: 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
e180: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
e190: 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20  ** To force any 
e1a0: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 61  register to be a
e1b0: 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20  n integer, just 
e1c0: 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f  add 0..*/.case O
e1d0: 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20  P_AddImm: {     
e1e0: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
e1f0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
e200: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
e210: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
e220: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
e230: 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
e240: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d  y(pIn1);.  pIn1-
e250: 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  >u.i += pOp->p2;
e260: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e270: 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e  Opcode: MustBeIn
e280: 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
e290: 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76   .** Force the v
e2a0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
e2b0: 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74   P1 to be an int
e2c0: 65 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61  eger.  If the va
e2d0: 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20  lue.** in P1 is 
e2e0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61  not an integer a
e2f0: 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  nd cannot be con
e300: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
e310: 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75  nteger.** withou
e320: 74 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65  t data loss, the
e330: 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
e340: 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20  ly to P2, or if 
e350: 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61  P2==0.** raise a
e360: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  n SQLITE_MISMATC
e370: 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a  H exception..*/.
e380: 63 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e  case OP_MustBeIn
e390: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
e3a0: 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
e3b0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
e3c0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
e3d0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
e3e0: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
e3f0: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
e400: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
e410: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
e420: 67 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  g);.    VdbeBran
e430: 63 68 54 61 6b 65 6e 28 28 70 49 6e 31 2d 3e 66  chTaken((pIn1->f
e440: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 3d 3d 30  lags&MEM_Int)==0
e450: 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 28 70  , 2);.    if( (p
e460: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
e470: 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
e480: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30    if( pOp->p2==0
e490: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e4a0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
e4b0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  ;.        goto a
e4c0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
e4d0: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
e4e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d          goto jum
e4f0: 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 7d  p_to_p2;.      }
e500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 65 6d  .    }.  }.  Mem
e510: 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31  SetTypeFlag(pIn1
e520: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
e530: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
e540: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e550: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
e560: 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69  code: RealAffini
e570: 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ty P1 * * * *.**
e580: 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
e590: 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  P1 holds an inte
e5a0: 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ger convert it t
e5b0: 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  o a real value..
e5c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
e5d0: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65  e is used when e
e5e0: 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d  xtracting inform
e5f0: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c  ation from a col
e600: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
e610: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20  REAL affinity.  
e620: 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  Such column valu
e630: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
e640: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74  stored as.** int
e650: 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65  egers, for space
e660: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74   efficiency, but
e670: 20 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f   after extractio
e680: 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a  n we want them.*
e690: 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61  * to have only a
e6a0: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a   real value..*/.
e6b0: 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69  case OP_RealAffi
e6c0: 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20  nity: {         
e6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
e6e0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
e6f0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
e700: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
e710: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  MEM_Int ){.    s
e720: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61  qlite3VdbeMemRea
e730: 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  lify(pIn1);.  }.
e740: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
e750: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
e760: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f  E_OMIT_CAST./* O
e770: 70 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50  pcode: Cast P1 P
e780: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
e790: 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
e7a0: 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65  P1]).**.** Force
e7b0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e7c0: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
e7d0: 74 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64  the type defined
e7e0: 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c   by P2..** .** <
e7f0: 75 6c 3e 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  ul>.** <li value
e800: 3d 22 39 37 22 3e 20 54 45 58 54 0a 2a 2a 20 3c  ="97"> TEXT.** <
e810: 6c 69 20 76 61 6c 75 65 3d 22 39 38 22 3e 20 42  li value="98"> B
e820: 4c 4f 42 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  LOB.** <li value
e830: 3d 22 39 39 22 3e 20 4e 55 4d 45 52 49 43 0a 2a  ="99"> NUMERIC.*
e840: 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 30 30  * <li value="100
e850: 22 3e 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c  "> INTEGER.** <l
e860: 69 20 76 61 6c 75 65 3d 22 31 30 31 22 3e 20 52  i value="101"> R
e870: 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  EAL.** </ul>.**.
e880: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
e890: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
e8a0: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
e8b0: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
e8c0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 61 73  ..*/.case OP_Cas
e8d0: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
e8e0: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
e8f0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
e900: 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  2>=SQLITE_AFF_BL
e910: 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c 3d 53  OB && pOp->p2<=S
e920: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
e930: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
e940: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
e950: 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65 73 74  F_TEXT );.  test
e960: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e970: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
e980: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
e990: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
e9a0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 74  F_NUMERIC );.  t
e9b0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
e9c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
e9d0: 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74 63 61  EGER );.  testca
e9e0: 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c  se( pOp->p2==SQL
e9f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
ea00: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
ea10: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p1];.  memAb
ea20: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
ea30: 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45 78 70  In1);.  rc = Exp
ea40: 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20  andBlob(pIn1);. 
ea50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
ea60: 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d 3e 70  ast(pIn1, pOp->p
ea70: 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  2, encoding);.  
ea80: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
ea90: 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69 66 28  IZE(pIn1);.  if(
eaa0: 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
eab0: 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
eac0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
ead0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
eae0: 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  CAST */../* Opco
eaf0: 64 65 3a 20 45 71 20 50 31 20 50 32 20 50 33 20  de: Eq P1 P2 P3 
eb00: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
eb10: 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72 5b 50  s: IF r[P3]==r[P
eb20: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  1].**.** Compare
eb30: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
eb40: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
eb50: 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3d 3d  3.  If reg(P3)==
eb60: 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20  reg(P1) then.** 
eb70: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
eb80: 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20 53  P2.  Or if the S
eb90: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66 6c  QLITE_STOREP2 fl
eba0: 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35 2c  ag is set in P5,
ebb0: 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65 20 74   then.** store t
ebc0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
ebd0: 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67 69 73  parison in regis
ebe0: 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
ebf0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
ec00: 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20  K portion of P5 
ec10: 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e  must be an affin
ec20: 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a  ity character -.
ec30: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ** SQLITE_AFF_TE
ec40: 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  XT, SQLITE_AFF_I
ec50: 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66  NTEGER, and so f
ec60: 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74  orth. An attempt
ec70: 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20   is made .** to 
ec80: 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75  coerce both inpu
ec90: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
eca0: 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65  this affinity be
ecb0: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  fore the.** comp
ecc0: 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20  arison is made. 
ecd0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  If the SQLITE_AF
ece0: 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20  F_MASK is 0x00, 
ecf0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20  then numeric.** 
ed00: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
ed10: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  . Note that the 
ed20: 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73  affinity convers
ed30: 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ions are stored.
ed40: 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ** back into the
ed50: 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
ed60: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20   P1 and P3.  So 
ed70: 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20  this opcode can 
ed80: 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74  cause.** persist
ed90: 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72  ent changes to r
eda0: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
edb0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  P3..**.** Once a
edc0: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68  ny conversions h
edd0: 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c  ave taken place,
ede0: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c   and neither val
edf0: 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20  ue is NULL, .** 
ee00: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63  the values are c
ee10: 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68  ompared. If both
ee20: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62   values are blob
ee30: 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20  s then memcmp() 
ee40: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  is.** used to de
ee50: 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75  termine the resu
ee60: 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  lts of the compa
ee70: 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20  rison.  If both 
ee80: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65  values.** are te
ee90: 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70  xt, then the app
eea0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
eeb0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  ng function spec
eec0: 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69  ified in.** P4 i
eed0: 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  s used to do the
eee0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
eef0: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
ef00: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
ef10: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
ef20: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
ef30: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
ef40: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
ef50: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
ef60: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
ef70: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
ef80: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
ef90: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
efa0: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
efb0: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
efc0: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
efd0: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
efe0: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
eff0: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
f000: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
f010: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
f020: 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20   in P5 then the 
f030: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
f040: 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  ison is always e
f050: 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72  ither.** true or
f060: 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65   false and is ne
f070: 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f  ver NULL.  If bo
f080: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
f090: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65  NULL then the re
f0a0: 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61  sult.** of compa
f0b0: 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 20 20  rison is true.  
f0c0: 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
f0d0: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  d is NULL then t
f0e0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
f0f0: 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  se..** If neithe
f100: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f110: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
f120: 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77  the same as it w
f130: 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68  ould be if.** th
f140: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  e SQLITE_NULLEQ 
f150: 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65  flag were omitte
f160: 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a 2a 2a  d from P5..**.**
f170: 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f   If both SQLITE_
f180: 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49  STOREP2 and SQLI
f190: 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  TE_KEEPNULL flag
f1a0: 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74  s are set then t
f1b0: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f1c0: 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63   r[P2] is only c
f1d0: 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65  hanged if the ne
f1e0: 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20  w value is NULL 
f1f0: 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2a  or 0 (false)..**
f200: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f210: 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76   a prior r[P2] v
f220: 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  alue will not be
f230: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
f240: 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f 2a 20  1 (true)..*/./* 
f250: 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20 50 32  Opcode: Ne P1 P2
f260: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
f270: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 21  opsis: IF r[P3]!
f280: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
f290: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
f2a0: 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65 20  e the Eq opcode 
f2b0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
f2c0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
f2d0: 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73  .** the operands
f2e0: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31   in registers P1
f2f0: 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20   and P3 are not 
f300: 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20  equal.  See the 
f310: 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a  Eq opcode for.**
f320: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f330: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
f340: 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f 53 54  f both SQLITE_ST
f350: 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49 54 45  OREP2 and SQLITE
f360: 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 73 20  _KEEPNULL flags 
f370: 61 72 65 20 73 65 74 20 74 68 65 6e 20 74 68 65  are set then the
f380: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  .** content of r
f390: 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63 68 61  [P2] is only cha
f3a0: 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  nged if the new 
f3b0: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 6f 72  value is NULL or
f3c0: 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20 49 6e   1 (true)..** In
f3d0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
f3e0: 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61 6c 75  prior r[P2] valu
f3f0: 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 76  e will not be ov
f400: 65 72 77 72 69 74 74 65 6e 20 62 79 20 30 20 28  erwritten by 0 (
f410: 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70  false)..*/./* Op
f420: 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20 50  code: Lt P1 P2 P
f430: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
f440: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c 72 5b  sis: IF r[P3]<r[
f450: 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72  P1].**.** Compar
f460: 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  e the values in 
f470: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
f480: 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3c  P3.  If reg(P3)<
f490: 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20  reg(P1) then.** 
f4a0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
f4b0: 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20 53  P2.  Or if the S
f4c0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66 6c  QLITE_STOREP2 fl
f4d0: 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35 20  ag is set in P5 
f4e0: 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
f4f0: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
f500: 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e 55 4c  n (0 or 1 or NUL
f510: 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  L) into register
f520: 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
f530: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
f540: 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20 69 73  ULL bit of P5 is
f550: 20 73 65 74 20 61 6e 64 20 65 69 74 68 65 72 20   set and either 
f560: 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65  reg(P1) or.** re
f570: 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20 74 68  g(P3) is NULL th
f580: 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68 65 20  en the take the 
f590: 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51  jump.  If the SQ
f5a0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
f5b0: 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72  .** bit is clear
f5c0: 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
f5d0: 67 68 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  gh if either ope
f5e0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  rand is NULL..**
f5f0: 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41  .** The SQLITE_A
f600: 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20  FF_MASK portion 
f610: 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e  of P5 must be an
f620: 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63   affinity charac
f630: 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f  ter -.** SQLITE_
f640: 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45  AFF_TEXT, SQLITE
f650: 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e  _AFF_INTEGER, an
f660: 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61  d so forth. An a
f670: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a  ttempt is made .
f680: 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74  ** to coerce bot
f690: 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69  h inputs accordi
f6a0: 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e  ng to this affin
f6b0: 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ity before the.*
f6c0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
f6d0: 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c  made. If the SQL
f6e0: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20  ITE_AFF_MASK is 
f6f0: 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72  0x00, then numer
f700: 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69  ic.** affinity i
f710: 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61  s used. Note tha
f720: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  t the affinity c
f730: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73  onversions are s
f740: 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  tored.** back in
f750: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67  to the input reg
f760: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f770: 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64  .  So this opcod
f780: 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70  e can cause.** p
f790: 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65  ersistent change
f7a0: 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50  s to registers P
f7b0: 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  1 and P3..**.** 
f7c0: 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73  Once any convers
f7d0: 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20  ions have taken 
f7e0: 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68  place, and neith
f7f0: 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  er value is NULL
f800: 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  , .** the values
f810: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49   are compared. I
f820: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
f830: 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d  e blobs then mem
f840: 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64  cmp() is.** used
f850: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
f860: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
f870: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
f880: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20   both values.** 
f890: 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74  are text, then t
f8a0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
f8b0: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
f8c0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a  n specified in.*
f8d0: 2a 20 50 34 20 69 73 20 20 75 73 65 64 20 74 6f  * P4 is  used to
f8e0: 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   do the comparis
f8f0: 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f  on.  If P4 is no
f900: 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65 6e  t specified then
f910: 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20  .** memcmp() is 
f920: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
f930: 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66  text string.  If
f940: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
f950: 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65  .** numeric, the
f960: 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70  n a numeric comp
f970: 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20  arison is used. 
f980: 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  If the two value
f990: 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66  s.** are of diff
f9a0: 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65  erent types, the
f9b0: 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f  n numbers are co
f9c0: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
f9d0: 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e  an.** strings an
f9e0: 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f  d strings are co
f9f0: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
fa00: 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f 2a 20  an blobs..*/./* 
fa10: 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20 50 32  Opcode: Le P1 P2
fa20: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
fa30: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c  opsis: IF r[P3]<
fa40: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
fa50: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
fa60: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
fa70: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
fa80: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
fa90: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
faa0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
fab0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
fac0: 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74  qual to the cont
fad0: 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ent of.** regist
fae0: 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20  er P1.  See the 
faf0: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
fb00: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
fb10: 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
fb20: 64 65 3a 20 47 74 20 50 31 20 50 32 20 50 33 20  de: Gt P1 P2 P3 
fb30: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
fb40: 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b 50 31  s: IF r[P3]>r[P1
fb50: 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ].**.** This wor
fb60: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
fb70: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
fb80: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
fb90: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
fba0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
fbb0: 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65  gister P3 is gre
fbc0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 6f  ater than the co
fbd0: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
fbe0: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
fbf0: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
fc00: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fc10: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
fc20: 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32 20 50  code: Ge P1 P2 P
fc30: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
fc40: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 3d 72  sis: IF r[P3]>=r
fc50: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  [P1].**.** This 
fc60: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
fc70: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
fc80: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
fc90: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
fca0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
fcb0: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
fcc0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fcd0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
fce0: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
fcf0: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
fd00: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
fd10: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
fd20: 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
fd30: 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20 20  P_Eq:           
fd40: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fd50: 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_EQ, jump, in1,
fd60: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fd70: 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Ne:             
fd80: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fd90: 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  NE, jump, in1, i
fda0: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74  n3 */.case OP_Lt
fdb0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
fdc0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54  /* same as TK_LT
fdd0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
fde0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20   */.case OP_Le: 
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe00: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20   same as TK_LE, 
fe10: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
fe20: 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20  /.case OP_Gt:   
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fe40: 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75  ame as TK_GT, ju
fe50: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
fe60: 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20  case OP_Ge: {   
fe70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
fe80: 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70  e as TK_GE, jump
fe90: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20  , in1, in3 */.  
fea0: 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b 20 20  int res, res2;  
feb0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
fec0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
fed0: 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74 20  of pIn1 against 
fee0: 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20 61  pIn3 */.  char a
fef0: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a  ffinity;      /*
ff00: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   Affinity to use
ff10: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20   for comparison 
ff20: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31 3b  */.  u16 flags1;
ff30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
ff40: 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75   of initial valu
ff50: 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73  e of pIn1->flags
ff60: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 33   */.  u16 flags3
ff70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
ff80: 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
ff90: 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67  ue of pIn3->flag
ffa0: 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  s */..  pIn1 = &
ffb0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
ffc0: 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
ffd0: 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31  p->p3];.  flags1
ffe0: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a   = pIn1->flags;.
fff0: 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d    flags3 = pIn3-
10000 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
10010 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26  lags1 | flags3)&
10020 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
10030 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  /* One or both o
10040 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
10050 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
10060 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c  >p5 & SQLITE_NUL
10070 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LEQ ){.      /* 
10080 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
10090 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20 77   is set (which w
100a0 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  ill only happen 
100b0 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  if the operator 
100c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45  is.      ** OP_E
100d0 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e  q or OP_Ne) then
100e0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f   take the jump o
100f0 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20  r not depending 
10100 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20 20  on whether.     
10110 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20   ** or not both 
10120 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75 6c  operands are nul
10130 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
10140 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
10150 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20  pcode==OP_Eq || 
10160 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
10170 4e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ne );.      asse
10180 72 74 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45  rt( (flags1 & ME
10190 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b  M_Cleared)==0 );
101a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
101b0 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
101c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3d 3d 30 20  _JUMPIFNULL)==0 
101d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  );.      if( (fl
101e0 61 67 73 31 26 66 6c 61 67 73 33 26 4d 45 4d 5f  ags1&flags3&MEM_
101f0 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20 20  Null)!=0.       
10200 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 43  && (flags3&MEM_C
10210 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20 20 20  leared)==0.     
10220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
10230 3d 20 30 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64  = 0;  /* Operand
10240 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 20  s are equal */. 
10250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10260 20 20 20 20 72 65 73 20 3d 20 31 3b 20 20 2f 2a      res = 1;  /*
10270 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 6f   Operands are no
10280 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20  t equal */.     
10290 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
102a0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
102b0 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e  LLEQ is clear an
102c0 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
102d0 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a  perand is NULL,.
102e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
102f0 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
10300 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  ys NULL..      *
10310 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
10320 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
10330 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
10340 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a   is set..      *
10350 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
10360 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
10370 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20  REP2 ){.        
10380 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
10390 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 69  ->p2];.        i
103a0 43 6f 6d 70 61 72 65 20 3d 20 31 3b 20 20 20 20  Compare = 1;    
103b0 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
103c0 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20  not equal */.   
103d0 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
103e0 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
103f0 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79          MemSetTy
10400 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
10410 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  _Null);.        
10420 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
10430 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
10440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10450 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
10460 6b 65 6e 28 32 2c 33 29 3b 0a 20 20 20 20 20 20  ken(2,3);.      
10470 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
10480 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
10490 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  L ){.          g
104a0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
104b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
104d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
104e0 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f 70 65    /* Neither ope
104f0 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20 20 44  rand is NULL.  D
10500 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  o a comparison. 
10510 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20  */.    affinity 
10520 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  = pOp->p5 & SQLI
10530 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 20  TE_AFF_MASK;.   
10540 20 69 66 28 20 61 66 66 69 6e 69 74 79 3e 3d 53   if( affinity>=S
10550 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
10560 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  C ){.      if( (
10570 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29  flags1 | flags3)
10580 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
10590 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20      if( (flags1 
105a0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
105b0 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d  eal|MEM_Str))==M
105c0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
105d0 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
105e0 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 30 29  Affinity(pIn1,0)
105f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
10600 63 61 73 65 28 20 66 6c 61 67 73 33 21 3d 70 49  case( flags3!=pI
10610 6e 33 2d 3e 66 6c 61 67 73 20 29 3b 20 2f 2a 20  n3->flags ); /* 
10620 50 6f 73 73 69 62 6c 65 20 69 66 20 70 49 6e 31  Possible if pIn1
10630 3d 3d 70 49 6e 33 20 2a 2f 0a 20 20 20 20 20 20  ==pIn3 */.      
10640 20 20 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e      flags3 = pIn
10650 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  3->flags;.      
10660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10670 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49  (flags3 & (MEM_I
10680 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
10690 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
106a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c  {.          appl
106b0 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
106c0 28 70 49 6e 33 2c 30 29 3b 0a 20 20 20 20 20 20  (pIn3,0);.      
106d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
106e0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 65 20    /* Handle the 
106f0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 69  common case of i
10700 6e 74 65 67 65 72 20 63 6f 6d 70 61 72 69 73 6f  nteger compariso
10710 6e 20 68 65 72 65 2c 20 61 73 20 61 6e 0a 20 20  n here, as an.  
10720 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
10730 69 6f 6e 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ion, to avoid a 
10740 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d  call to sqlite3M
10750 65 6d 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20  emCompare() */. 
10760 20 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e       if( (pIn1->
10770 66 6c 61 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c  flags & pIn3->fl
10780 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
10790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
107a0 20 70 49 6e 33 2d 3e 75 2e 69 20 3e 20 70 49 6e   pIn3->u.i > pIn
107b0 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20  1->u.i ){ res = 
107c0 2b 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65  +1; goto compare
107d0 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  _op; }.        i
107e0 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3c 20 70  f( pIn3->u.i < p
107f0 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20  In1->u.i ){ res 
10800 3d 20 2d 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61  = -1; goto compa
10810 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20  re_op; }.       
10820 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
10830 20 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f    goto compare_o
10840 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
10850 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69 74  else if( affinit
10860 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
10870 58 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  XT ){.      if( 
10880 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 53 74  (flags1 & MEM_St
10890 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 31  r)==0 && (flags1
108a0 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
108b0 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20  Real))!=0 ){.   
108c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
108d0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
108e0 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
108f0 74 65 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e  testcase( pIn1->
10900 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
10910 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10920 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
10930 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ify(pIn1, encodi
10940 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ng, 1);.        
10950 74 65 73 74 63 61 73 65 28 20 28 66 6c 61 67 73  testcase( (flags
10960 31 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70  1&MEM_Dyn) != (p
10970 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  In1->flags&MEM_D
10980 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66  yn) );.        f
10990 6c 61 67 73 31 20 3d 20 28 70 49 6e 31 2d 3e 66  lags1 = (pIn1->f
109a0 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65  lags & ~MEM_Type
109b0 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 20  Mask) | (flags1 
109c0 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b  & MEM_TypeMask);
109d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
109e0 20 70 49 6e 31 21 3d 70 49 6e 33 20 29 3b 0a 20   pIn1!=pIn3 );. 
109f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10a00 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 53   (flags3 & MEM_S
10a10 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73  tr)==0 && (flags
10a20 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  3 & (MEM_Int|MEM
10a30 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20  _Real))!=0 ){.  
10a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10a50 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
10a60 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
10a70 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d   testcase( pIn3-
10a80 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
10a90 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
10aa0 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e  ite3VdbeMemStrin
10ab0 67 69 66 79 28 70 49 6e 33 2c 20 65 6e 63 6f 64  gify(pIn3, encod
10ac0 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ing, 1);.       
10ad0 20 74 65 73 74 63 61 73 65 28 20 28 66 6c 61 67   testcase( (flag
10ae0 73 33 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28  s3&MEM_Dyn) != (
10af0 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn3->flags&MEM_
10b00 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Dyn) );.        
10b10 66 6c 61 67 73 33 20 3d 20 28 70 49 6e 33 2d 3e  flags3 = (pIn3->
10b20 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70  flags & ~MEM_Typ
10b30 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 33  eMask) | (flags3
10b40 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29   & MEM_TypeMask)
10b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10b60 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
10b70 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  >p4type==P4_COLL
10b80 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70  SEQ || pOp->p4.p
10b90 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Coll==0 );.    r
10ba0 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
10bb0 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e  ompare(pIn3, pIn
10bc0 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c  1, pOp->p4.pColl
10bd0 29 3b 0a 20 20 7d 0a 63 6f 6d 70 61 72 65 5f 6f  );.  }.compare_o
10be0 70 3a 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  p:.  switch( pOp
10bf0 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
10c00 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 72  case OP_Eq:    r
10c10 65 73 32 20 3d 20 72 65 73 3d 3d 30 3b 20 20 20  es2 = res==0;   
10c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10c30 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65 73 32  e OP_Ne:    res2
10c40 20 3d 20 72 65 73 3b 20 20 20 20 20 20 20 20 62   = res;        b
10c50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
10c60 50 5f 4c 74 3a 20 20 20 20 72 65 73 32 20 3d 20  P_Lt:    res2 = 
10c70 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
10c80 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
10c90 65 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73  e:    res2 = res
10ca0 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  <=0;     break;.
10cb0 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20      case OP_Gt: 
10cc0 20 20 20 72 65 73 32 20 3d 20 72 65 73 3e 30 3b     res2 = res>0;
10cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ce0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
10cf0 72 65 73 32 20 3d 20 72 65 73 3e 3d 30 3b 20 20  res2 = res>=0;  
10d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10d10 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61   /* Undo any cha
10d20 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70  nges made by app
10d30 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20  lyAffinity() to 
10d40 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
10d50 65 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ers. */.  assert
10d60 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
10d70 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c   MEM_Dyn) == (fl
10d80 61 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20  ags1 & MEM_Dyn) 
10d90 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  );.  pIn1->flags
10da0 20 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73 73   = flags1;.  ass
10db0 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
10dc0 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20  s & MEM_Dyn) == 
10dd0 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44 79  (flags3 & MEM_Dy
10de0 6e 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c  n) );.  pIn3->fl
10df0 61 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a 20  ags = flags3;.. 
10e00 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10e10 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
10e20 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  .    pOut = &aMe
10e30 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
10e40 69 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b 0a  iCompare = res;.
10e50 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 32 21      res2 = res2!
10e60 3d 30 3b 20 20 2f 2a 20 46 6f 72 20 74 68 69 73  =0;  /* For this
10e70 20 70 61 74 68 20 72 65 73 32 20 6d 75 73 74 20   path res2 must 
10e80 62 65 20 65 78 61 63 74 6c 79 20 30 20 6f 72 20  be exactly 0 or 
10e90 31 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4f  1 */.    if( (pO
10ea0 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4b  p->p5 & SQLITE_K
10eb0 45 45 50 4e 55 4c 4c 29 21 3d 30 20 29 7b 0a 20  EEPNULL)!=0 ){. 
10ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 4b 45 45 50       /* The KEEP
10ed0 4e 55 4c 4c 20 66 6c 61 67 20 70 72 65 76 65 6e  NULL flag preven
10ee0 74 73 20 4f 50 5f 45 71 20 66 72 6f 6d 20 6f 76  ts OP_Eq from ov
10ef0 65 72 77 72 69 74 69 6e 67 20 61 20 4e 55 4c 4c  erwriting a NULL
10f00 20 77 69 74 68 20 31 0a 20 20 20 20 20 20 2a 2a   with 1.      **
10f10 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 4f 50   and prevents OP
10f20 5f 4e 65 20 66 72 6f 6d 20 6f 76 65 72 77 72 69  _Ne from overwri
10f30 74 69 6e 67 20 4e 55 4c 4c 20 77 69 74 68 20 30  ting NULL with 0
10f40 2e 20 20 54 68 69 73 20 66 6c 61 67 0a 20 20 20  .  This flag.   
10f50 20 20 20 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73     ** is only us
10f60 65 64 20 69 6e 20 63 6f 6e 74 65 78 74 73 20 77  ed in contexts w
10f70 68 65 72 65 20 65 69 74 68 65 72 3a 0a 20 20 20  here either:.   
10f80 20 20 20 2a 2a 20 20 20 28 31 29 20 6f 70 3d 3d     **   (1) op==
10f90 4f 50 5f 45 71 20 26 26 20 28 72 5b 50 32 5d 3d  OP_Eq && (r[P2]=
10fa0 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d  =NULL || r[P2]==
10fb0 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 32  0).      **   (2
10fc0 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 28  ) op==OP_Ne && (
10fd0 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72  r[P2]==NULL || r
10fe0 5b 50 32 5d 3d 3d 31 29 0a 20 20 20 20 20 20 2a  [P2]==1).      *
10ff0 2a 20 54 68 65 72 65 66 6f 72 65 20 69 74 20 69  * Therefore it i
11000 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
11010 74 6f 20 63 68 65 63 6b 20 74 68 65 20 63 6f 6e  to check the con
11020 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 66 6f  tent of r[P2] fo
11030 72 0a 20 20 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e  r.      ** NULL.
11040 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11050 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
11060 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  P_Ne || pOp->opc
11070 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  ode==OP_Eq );.  
11080 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 32      assert( res2
11090 3d 3d 30 20 7c 7c 20 72 65 73 32 3d 3d 31 20 29  ==0 || res2==1 )
110a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
110b0 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70 4f 70  ( res2==0 && pOp
110c0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20  ->opcode==OP_Eq 
110d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
110e0 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20 70 4f  e( res2==1 && pO
110f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71  p->opcode==OP_Eq
11100 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11110 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70  se( res2==0 && p
11120 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
11130 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
11140 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20  ase( res2==1 && 
11150 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
11160 4e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Ne );.      if( 
11170 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
11180 5f 45 71 29 3d 3d 72 65 73 32 20 29 20 62 72 65  _Eq)==res2 ) bre
11190 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ak;.    }.    me
111a0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
111b0 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d  , pOut);.    Mem
111c0 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
111d0 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20  , MEM_Int);.    
111e0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 32  pOut->u.i = res2
111f0 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
11200 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
11210 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
11220 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
11230 6e 28 72 65 73 21 3d 30 2c 20 28 70 4f 70 2d 3e  n(res!=0, (pOp->
11240 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 & SQLITE_NULL
11250 45 51 29 3f 32 3a 33 29 3b 0a 20 20 20 20 69 66  EQ)?2:3);.    if
11260 28 20 72 65 73 32 20 29 7b 0a 20 20 20 20 20 20  ( res2 ){.      
11270 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
11280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
11290 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
112a0 3a 20 45 6c 73 65 4e 6f 74 45 71 20 2a 20 50 32  : ElseNotEq * P2
112b0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
112c0 73 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 69 6d  s opcode must im
112d0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
112e0 20 61 6e 20 4f 50 5f 4c 74 20 6f 72 20 4f 50 5f   an OP_Lt or OP_
112f0 47 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Gt comparison op
11300 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 66 20 72 65  erator..** If re
11310 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71  sult of an OP_Eq
11320 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74   comparison on t
11330 68 65 20 73 61 6d 65 20 74 77 6f 20 6f 70 65 72  he same two oper
11340 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  ands.** would ha
11350 76 65 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61  ve be NULL or fa
11360 6c 73 65 20 28 30 29 2c 20 74 68 65 6e 20 74 68  lse (0), then th
11370 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a  en jump to P2. .
11380 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  ** If the result
11390 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d   of an OP_Eq com
113a0 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 74  parison on the t
113b0 77 6f 20 70 72 65 76 69 6f 75 73 20 6f 70 65 72  wo previous oper
113c0 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  ands.** would ha
113d0 76 65 20 62 65 65 6e 20 74 72 75 65 20 28 31 29  ve been true (1)
113e0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
113f0 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ugh..*/.case OP_
11400 45 6c 73 65 4e 6f 74 45 71 3a 20 7b 20 20 20 20  ElseNotEq: {    
11410 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
11420 5f 45 53 43 41 50 45 2c 20 6a 75 6d 70 20 2a 2f  _ESCAPE, jump */
11430 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 61  .  assert( pOp>a
11440 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Op );.  assert( 
11450 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
11460 4f 50 5f 4c 74 20 7c 7c 20 70 4f 70 5b 2d 31 5d  OP_Lt || pOp[-1]
11470 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 47 74 20 29  .opcode==OP_Gt )
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
11490 2d 31 5d 2e 70 35 20 26 20 53 51 4c 49 54 45 5f  -1].p5 & SQLITE_
114a0 53 54 4f 52 45 50 32 20 29 3b 0a 20 20 56 64 62  STOREP2 );.  Vdb
114b0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 69 43 6f  eBranchTaken(iCo
114c0 6d 70 61 72 65 21 3d 30 2c 20 32 29 3b 0a 20 20  mpare!=0, 2);.  
114d0 69 66 28 20 69 43 6f 6d 70 61 72 65 21 3d 30 20  if( iCompare!=0 
114e0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
114f0 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  2;.  break;.}...
11500 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75  /* Opcode: Permu
11510 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20  tation * * * P4 
11520 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  *.**.** Set the 
11530 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
11540 20 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   by the OP_Compa
11550 72 65 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74  re operator in t
11560 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72  he next.** instr
11570 75 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 65 72  uction.  The per
11580 6d 75 74 61 74 69 6f 6e 20 69 73 20 73 74 6f 72  mutation is stor
11590 65 64 20 69 6e 20 74 68 65 20 50 34 20 6f 70 65  ed in the P4 ope
115a0 72 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rand..**.** The 
115b0 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 6f  permutation is o
115c0 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  nly valid until 
115d0 74 68 65 20 6e 65 78 74 20 4f 50 5f 43 6f 6d 70  the next OP_Comp
115e0 61 72 65 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  are that has.** 
115f0 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  the OPFLAG_PERMU
11600 54 45 20 62 69 74 20 73 65 74 20 69 6e 20 50 35  TE bit set in P5
11610 2e 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 20  . Typically the 
11620 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 73  OP_Permutation s
11630 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63 63 75 72 20  hould .** occur 
11640 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69 6f  immediately prio
11650 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d 70  r to the OP_Comp
11660 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  are..**.** The f
11670 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20  irst integer in 
11680 74 68 65 20 50 34 20 69 6e 74 65 67 65 72 20 61  the P4 integer a
11690 72 72 61 79 20 69 73 20 74 68 65 20 6c 65 6e 67  rray is the leng
116a0 74 68 20 6f 66 20 74 68 65 20 61 72 72 61 79 0a  th of the array.
116b0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
116c0 62 65 63 6f 6d 65 20 70 61 72 74 20 6f 66 20 74  become part of t
116d0 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 2e 0a  he permutation..
116e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75  */.case OP_Permu
116f0 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65  tation: {.  asse
11700 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
11710 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a  =P4_INTARRAY );.
11720 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
11730 34 2e 61 69 20 29 3b 0a 20 20 61 73 73 65 72 74  4.ai );.  assert
11740 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d  ( pOp[1].opcode=
11750 3d 4f 50 5f 43 6f 6d 70 61 72 65 20 29 3b 0a 20  =OP_Compare );. 
11760 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
11770 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d  p5 & OPFLAG_PERM
11780 55 54 45 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  UTE );.  break;.
11790 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
117a0 6d 70 61 72 65 20 50 31 20 50 32 20 50 33 20 50  mpare P1 P2 P3 P
117b0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
117c0 3a 20 72 5b 50 31 40 50 33 5d 20 3c 2d 3e 20 72  : r[P1@P3] <-> r
117d0 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 43 6f  [P2@P3].**.** Co
117e0 6d 70 61 72 65 20 74 77 6f 20 76 65 63 74 6f 72  mpare two vector
117f0 73 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69  s of registers i
11800 6e 20 72 65 67 28 50 31 29 2e 2e 72 65 67 28 50  n reg(P1)..reg(P
11810 31 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20 74 68  1+P3-1) (call th
11820 69 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22 41 22  is.** vector "A"
11830 29 20 61 6e 64 20 69 6e 20 72 65 67 28 50 32 29  ) and in reg(P2)
11840 2e 2e 72 65 67 28 50 32 2b 50 33 2d 31 29 20 28  ..reg(P2+P3-1) (
11850 22 42 22 29 2e 20 20 53 61 76 65 20 74 68 65 20  "B").  Save the 
11860 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74 68 65  result of.** the
11870 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f 72 20   comparison for 
11880 75 73 65 20 62 79 20 74 68 65 20 6e 65 78 74 20  use by the next 
11890 4f 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  OP_Jump instruct
118a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61  ..**.** If P5 ha
118b0 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52  s the OPFLAG_PER
118c0 4d 55 54 45 20 62 69 74 20 73 65 74 2c 20 74 68  MUTE bit set, th
118d0 65 6e 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  en the order of 
118e0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a 2a 2a  comparison is.**
118f0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
11900 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
11910 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 6f 70  P_Permutation op
11920 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68 65 0a  erator.  If the.
11930 2a 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  ** OPFLAG_PERMUT
11940 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 20  E bit is clear, 
11950 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 61 72  then register ar
11960 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20 73 65  e compared in se
11970 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72 64 65  quential.** orde
11980 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  r..**.** P4 is a
11990 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
119a0 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  re that defines 
119b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
119c0 63 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a 2a 20  ces and sort.** 
119d0 6f 72 64 65 72 73 20 66 6f 72 20 74 68 65 20 63  orders for the c
119e0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
119f0 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 70 70 6c  permutation appl
11a00 69 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ies to registers
11a10 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 20 4b  .** only.  The K
11a20 65 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74 73 20  eyInfo elements 
11a30 61 72 65 20 75 73 65 64 20 73 65 71 75 65 6e 74  are used sequent
11a40 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ially..**.** The
11a50 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   comparison is a
11a60 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73 6f 6e   sort comparison
11a70 2c 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d 70 61  , so NULLs compa
11a80 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e 55 4c  re equal,.** NUL
11a90 4c 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  Ls are less than
11aa0 20 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62 65 72   numbers, number
11ab0 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
11ac0 73 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e 64 20  strings,.** and 
11ad0 73 74 72 69 6e 67 73 20 61 72 65 20 6c 65 73 73  strings are less
11ae0 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a   than blobs..*/.
11af0 63 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72 65 3a  case OP_Compare:
11b00 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e   {.  int n;.  in
11b10 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b 0a 20  t i;.  int p1;. 
11b20 20 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e 73 74   int p2;.  const
11b30 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11b40 66 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  fo;.  int idx;. 
11b50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11b60 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
11b70 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 65   sequence to use
11b80 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   on this term */
11b90 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
11ba0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11bb0 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73 6f 72  r DESCENDING sor
11bc0 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74  t order */.  int
11bd0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
11be0 2f 2a 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  /* The permutati
11bf0 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f  on */..  if( (pO
11c00 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50  p->p5 & OPFLAG_P
11c10 45 52 4d 55 54 45 29 3d 3d 30 20 29 7b 0a 20 20  ERMUTE)==0 ){.  
11c20 20 20 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 0a    aPermute = 0;.
11c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
11c40 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a  ert( pOp>aOp );.
11c50 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
11c60 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50  -1].opcode==OP_P
11c70 65 72 6d 75 74 61 74 69 6f 6e 20 29 3b 0a 20 20  ermutation );.  
11c80 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
11c90 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ].p4type==P4_INT
11ca0 41 52 52 41 59 20 29 3b 0a 20 20 20 20 61 50 65  ARRAY );.    aPe
11cb0 72 6d 75 74 65 20 3d 20 70 4f 70 5b 2d 31 5d 2e  rmute = pOp[-1].
11cc0 70 34 2e 61 69 20 2b 20 31 3b 0a 20 20 20 20 61  p4.ai + 1;.    a
11cd0 73 73 65 72 74 28 20 61 50 65 72 6d 75 74 65 21  ssert( aPermute!
11ce0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  =0 );.  }.  n = 
11cf0 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 4b 65 79 49  pOp->p3;.  pKeyI
11d00 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
11d10 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74  eyInfo;.  assert
11d20 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ( n>0 );.  asser
11d30 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
11d40 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ;.  p1 = pOp->p1
11d50 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
11d60 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ;.#if SQLITE_DEB
11d70 55 47 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  UG.  if( aPermut
11d80 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  e ){.    int k, 
11d90 6d 78 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  mx = 0;.    for(
11da0 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69  k=0; k<n; k++) i
11db0 66 28 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d  f( aPermute[k]>m
11dc0 78 20 29 20 6d 78 20 3d 20 61 50 65 72 6d 75 74  x ) mx = aPermut
11dd0 65 5b 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e[k];.    assert
11de0 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c  ( p1>0 && p1+mx<
11df0 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
11e00 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
11e10 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
11e20 26 26 20 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d  && p2+mx<=(p->nM
11e30 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
11e40 72 29 2b 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  r)+1 );.  }else{
11e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
11e60 30 20 26 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e  0 && p1+n<=(p->n
11e70 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
11e80 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  or)+1 );.    ass
11e90 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
11ea0 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  n<=(p->nMem+1 - 
11eb0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
11ec0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
11ed0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20  QLITE_DEBUG */. 
11ee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
11ef0 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d 20 61  ++){.    idx = a
11f00 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72 6d 75  Permute ? aPermu
11f10 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61  te[i] : i;.    a
11f20 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
11f30 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29  d(&aMem[p1+idx])
11f40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11f50 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
11f60 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20  [p2+idx]) );.   
11f70 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
11f80 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31  p1+idx, &aMem[p1
11f90 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45 47 49  +idx]);.    REGI
11fa0 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 69 64  STER_TRACE(p2+id
11fb0 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  x, &aMem[p2+idx]
11fc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
11fd0 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
11fe0 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  d );.    pColl =
11ff0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
12000 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  [i];.    bRev = 
12010 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
12020 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f  rder[i];.    iCo
12030 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  mpare = sqlite3M
12040 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b  emCompare(&aMem[
12050 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70  p1+idx], &aMem[p
12060 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a  2+idx], pColl);.
12070 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65      if( iCompare
12080 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 52   ){.      if( bR
12090 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20 3d 20  ev ) iCompare = 
120a0 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  -iCompare;.     
120b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
120c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
120d0 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31   Opcode: Jump P1
120e0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
120f0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69 6e 73   Jump to the ins
12100 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72  truction at addr
12110 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72 20 50  ess P1, P2, or P
12120 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  3 depending on w
12130 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65  hether.** in the
12140 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f   most recent OP_
12150 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75 63 74  Compare instruct
12160 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63 74 6f  ion the P1 vecto
12170 72 20 77 61 73 20 6c 65 73 73 20 74 68 61 6e 0a  r was less than.
12180 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
12190 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
121a0 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65 73 70   P2 vector, resp
121b0 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73  ectively..*/.cas
121c0 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20  e OP_Jump: {    
121d0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
121e0 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d 70 61   */.  if( iCompa
121f0 72 65 3c 30 20 29 7b 0a 20 20 20 20 56 64 62 65  re<0 ){.    Vdbe
12200 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29  BranchTaken(0,3)
12210 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70  ; pOp = &aOp[pOp
12220 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c  ->p1 - 1];.  }el
12230 73 65 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d  se if( iCompare=
12240 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  =0 ){.    VdbeBr
12250 61 6e 63 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20  anchTaken(1,3); 
12260 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e  pOp = &aOp[pOp->
12270 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65  p2 - 1];.  }else
12280 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
12290 54 61 6b 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20  Taken(2,3); pOp 
122a0 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d  = &aOp[pOp->p3 -
122b0 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   1];.  }.  break
122c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
122d0 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
122e0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
122f0 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b  P3]=(r[P1] && r[
12300 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
12310 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20  the logical AND 
12320 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
12330 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
12340 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74  d P2 and.** writ
12350 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74  e the result int
12360 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
12370 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
12380 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61  1 or P2 is 0 (fa
12390 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65  lse) then the re
123a0 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69  sult is 0 even i
123b0 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69  f.** the other i
123c0 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
123d0 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f   NULL and true o
123e0 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65  r two NULLs give
123f0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75  .** a NULL outpu
12400 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t..*/./* Opcode:
12410 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a   Or P1 P2 P3 * *
12420 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
12430 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b  P3]=(r[P1] || r[
12440 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
12450 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f  the logical OR o
12460 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
12470 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
12480 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
12490 74 68 65 20 61 6e 73 77 65 72 20 69 6e 20 72 65  the answer in re
124a0 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
124b0 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
124c0 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28   P2 is nonzero (
124d0 74 72 75 65 29 20 74 68 65 6e 20 74 68 65 20 72  true) then the r
124e0 65 73 75 6c 74 20 69 73 20 31 20 28 74 72 75 65  esult is 1 (true
124f0 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ).** even if the
12500 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
12510 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
12520 64 20 66 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e  d false or two N
12530 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e  ULLs.** give a N
12540 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63  ULL output..*/.c
12550 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20  ase OP_And:     
12560 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
12570 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c   as TK_AND, in1,
12580 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
12590 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20  se OP_Or: {     
125a0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
125b0 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69  as TK_OR, in1, i
125c0 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e  n2, out3 */.  in
125d0 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74  t v1;    /* Left
125e0 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41   operand:  0==FA
125f0 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
12600 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
12610 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b 20 20 20   */.  int v2;   
12620 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
12630 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  d: 0==FALSE, 1==
12640 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
12650 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 70   or NULL */..  p
12660 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
12670 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31  >p1];.  if( pIn1
12680 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
12690 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 32  ll ){.    v1 = 2
126a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
126b0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  1 = sqlite3VdbeI
126c0 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30  ntValue(pIn1)!=0
126d0 3b 0a 20 20 7d 0a 20 20 70 49 6e 32 20 3d 20 26  ;.  }.  pIn2 = &
126e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
126f0 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73   if( pIn2->flags
12700 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
12710 20 20 20 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c     v2 = 2;.  }el
12720 73 65 7b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  se{.    v2 = sql
12730 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
12740 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a 20  (pIn2)!=0;.  }. 
12750 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
12760 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20  ==OP_And ){.    
12770 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
12780 69 67 6e 65 64 20 63 68 61 72 20 61 6e 64 5f 6c  igned char and_l
12790 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c  ogic[] = { 0, 0,
127a0 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   0, 0, 1, 2, 0, 
127b0 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d  2, 2 };.    v1 =
127c0 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b   and_logic[v1*3+
127d0 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  v2];.  }else{.  
127e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
127f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 72 5f  nsigned char or_
12800 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31  logic[] = { 0, 1
12810 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c  , 2, 1, 1, 1, 2,
12820 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20   1, 2 };.    v1 
12830 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b  = or_logic[v1*3+
12840 76 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20  v2];.  }.  pOut 
12850 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
12860 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32 20 29 7b  ;.  if( v1==2 ){
12870 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
12880 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75  lag(pOut, MEM_Nu
12890 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
128a0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31    pOut->u.i = v1
128b0 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
128c0 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
128d0 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  nt);.  }.  break
128e0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
128f0 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Not P1 P2 * * *.
12900 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
12910 32 5d 3d 20 21 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  2]= !r[P1].**.**
12920 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 76   Interpret the v
12930 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
12940 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e   P1 as a boolean
12950 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20 74   value.  Store t
12960 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f  he.** boolean co
12970 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67 69  mplement in regi
12980 73 74 65 72 20 50 32 2e 20 20 49 66 20 74 68 65  ster P2.  If the
12990 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
129a0 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c  er P1 is .** NUL
129b0 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69  L, then a NULL i
129c0 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a  s stored in P2..
129d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20  */.case OP_Not: 
129e0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
129f0 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e   /* same as TK_N
12a00 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f  OT, in1, out2 */
12a10 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
12a20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74  pOp->p1];.  pOut
12a30 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
12a40 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
12a50 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
12a60 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
12a70 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
12a80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ==0 ){.    pOut-
12a90 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
12aa0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
12ab0 3d 20 21 73 71 6c 69 74 65 33 56 64 62 65 49 6e  = !sqlite3VdbeIn
12ac0 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  tValue(pIn1);.  
12ad0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
12ae0 20 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20   Opcode: BitNot 
12af0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
12b00 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20  ynopsis: r[P1]= 
12b10 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74  ~r[P1].**.** Int
12b20 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65  erpret the conte
12b30 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
12b40 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  1 as an integer.
12b50 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f    Store the.** o
12b60 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f  nes-complement o
12b70 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69  f the P1 value i
12b80 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
12b90 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a    If P1 holds.**
12ba0 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f   a NULL then sto
12bb0 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e  re a NULL in P2.
12bc0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e  .*/.case OP_BitN
12bd0 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ot: {           
12be0 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
12bf0 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74  BITNOT, in1, out
12c00 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
12c10 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
12c20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
12c30 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
12c40 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
12c50 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  Out);.  if( (pIn
12c60 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12c70 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ull)==0 ){.    p
12c80 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
12c90 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
12ca0 75 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33 56 64  u.i = ~sqlite3Vd
12cb0 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
12cc0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
12cd0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63  ../* Opcode: Onc
12ce0 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
12cf0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 76 61  .** If the P1 va
12d00 6c 75 65 20 69 73 20 65 71 75 61 6c 20 74 6f 20  lue is equal to 
12d10 74 68 65 20 50 31 20 76 61 6c 75 65 20 6f 6e 20  the P1 value on 
12d20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f  the OP_Init opco
12d30 64 65 20 61 74 0a 2a 2a 20 69 6e 73 74 72 75 63  de at.** instruc
12d40 74 69 6f 6e 20 30 2c 20 74 68 65 6e 20 6a 75 6d  tion 0, then jum
12d50 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  p to P2.  If the
12d60 20 74 77 6f 20 50 31 20 76 61 6c 75 65 73 20 64   two P1 values d
12d70 69 66 66 65 72 2c 20 74 68 65 6e 0a 2a 2a 20 73  iffer, then.** s
12d80 65 74 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  et the P1 value 
12d90 6f 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  on this opcode t
12da0 6f 20 65 71 75 61 6c 20 74 68 65 20 50 31 20 76  o equal the P1 v
12db0 61 6c 75 65 20 6f 6e 20 74 68 65 20 4f 50 5f 49  alue on the OP_I
12dc0 6e 69 74 0a 2a 2a 20 61 6e 64 20 66 61 6c 6c 20  nit.** and fall 
12dd0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65  through..*/.case
12de0 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
12df0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
12e00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
12e10 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  aOp[0].opcode==O
12e20 50 5f 49 6e 69 74 20 29 3b 0a 20 20 56 64 62 65  P_Init );.  Vdbe
12e30 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 61  BranchTaken(p->a
12e40 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70  Op[0].p1==pOp->p
12e50 31 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 2d 3e  1, 2);.  if( p->
12e60 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e  aOp[0].p1==pOp->
12e70 70 31 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a  p1 ){.    goto j
12e80 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c  ump_to_p2;.  }el
12e90 73 65 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20  se{.    pOp->p1 
12ea0 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b 0a  = p->aOp[0].p1;.
12eb0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12ec0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31  /* Opcode: If P1
12ed0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
12ee0 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
12ef0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
12f00 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e  ster P1 is true.
12f10 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69    The value.** i
12f20 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
12f30 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
12f40 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
12f50 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
12f60 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
12f70 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
12f80 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  mp if and only i
12f90 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P3 is non-zero
12fa0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
12fb0 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a  IfNot P1 P2 P3 *
12fc0 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
12fd0 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
12fe0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
12ff0 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76  is False.  The v
13000 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  alue.** is consi
13010 64 65 72 65 64 20 66 61 6c 73 65 20 69 66 20 69  dered false if i
13020 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20  t has a numeric 
13030 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20  value of zero.  
13040 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
13050 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
13060 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
13070 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
13080 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  P3 is non-zero..
13090 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20  */.case OP_If:  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
130b0 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63  * jump, in1 */.c
130c0 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20  ase OP_IfNot: { 
130d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
130e0 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74  mp, in1 */.  int
130f0 20 63 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   c;.  pIn1 = &aM
13100 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
13110 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
13120 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
13130 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   c = pOp->p3;.  
13140 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
13150 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
13160 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d  NG_POINT.    c =
13170 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
13180 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23  alue(pIn1)!=0;.#
13190 65 6c 73 65 0a 20 20 20 20 63 20 3d 20 73 71 6c  else.    c = sql
131a0 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
131b0 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65  e(pIn1)!=0.0;.#e
131c0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4f 70  ndif.    if( pOp
131d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e  ->opcode==OP_IfN
131e0 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d  ot ) c = !c;.  }
131f0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13200 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69  en(c!=0, 2);.  i
13210 66 28 20 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  f( c ){.    goto
13220 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
13230 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
13240 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
13250 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
13260 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
13270 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a  ==NULL goto P2.*
13280 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
13290 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
132a0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 4e  register P1 is N
132b0 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
132c0 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  IsNull: {       
132d0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
132e0 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  TK_ISNULL, jump,
132f0 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
13300 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
13310 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13320 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  en( (pIn1->flags
13330 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 2c   & MEM_Null)!=0,
13340 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31   2);.  if( (pIn1
13350 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
13360 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ll)!=0 ){.    go
13370 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
13380 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
13390 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
133a0 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
133b0 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
133c0 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50  P1]!=NULL goto P
133d0 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  2.**.** Jump to 
133e0 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
133f0 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
13400 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f  s not NULL.  .*/
13410 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  .case OP_NotNull
13420 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
13430 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54  * same as TK_NOT
13440 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
13450 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13460 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
13470 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
13480 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
13490 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 32 29 3b 0a  M_Null)==0, 2);.
134a0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
134b0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
134c0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
134d0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
134e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
134f0 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
13500 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
13510 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 50 58  nopsis: r[P3]=PX
13520 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
13530 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 63   the data that c
13540 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20  ursor P1 points 
13550 74 6f 20 61 73 20 61 20 73 74 72 75 63 74 75 72  to as a structur
13560 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  e built using.**
13570 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
13580 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53  instruction.  (S
13590 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ee the MakeRecor
135a0 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  d opcode for add
135b0 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
135c0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
135d0 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64   format of the d
135e0 61 74 61 2e 29 20 20 45 78 74 72 61 63 74 20 74  ata.)  Extract t
135f0 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a  he P2-th column.
13600 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63  ** from this rec
13610 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65 20 61  ord.  If there a
13620 72 65 20 6c 65 73 73 20 74 68 61 74 20 28 50 32  re less that (P2
13630 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69  +1) .** values i
13640 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78  n the record, ex
13650 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a  tract a NULL..**
13660 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78  .** The value ex
13670 74 72 61 63 74 65 64 20 69 73 20 73 74 6f 72 65  tracted is store
13680 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
13690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
136a0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 66  olumn contains f
136b0 65 77 65 72 20 74 68 61 6e 20 50 32 20 66 69 65  ewer than P2 fie
136c0 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63  lds, then extrac
136d0 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a  t a NULL.  Or,.*
136e0 2a 20 69 66 20 74 68 65 20 50 34 20 61 72 67 75  * if the P4 argu
136f0 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d  ment is a P4_MEM
13700 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f   use the value o
13710 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
13720 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  t as.** the resu
13730 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
13740 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
13750 48 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e  HE bit is set on
13760 20 50 35 20 61 6e 64 20 50 31 20 69 73 20 61 20   P5 and P1 is a 
13770 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72  pseudo-table cur
13780 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sor,.** then the
13790 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
137a0 72 73 6f 72 20 69 73 20 72 65 73 65 74 20 70 72  rsor is reset pr
137b0 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74 69 6e  ior to extractin
137c0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  g the column..**
137d0 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f 43 6f   The first OP_Co
137e0 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61 20 70  lumn against a p
137f0 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66 74 65  seudo-table afte
13800 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  r the value of t
13810 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65  he content.** re
13820 67 69 73 74 65 72 20 68 61 73 20 63 68 61 6e 67  gister has chang
13830 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  ed should have t
13840 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a 2a 0a  his bit set..**.
13850 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
13860 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64 20 4f  _LENGTHARG and O
13870 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
13880 62 69 74 73 20 61 72 65 20 73 65 74 20 6f 6e 20  bits are set on 
13890 50 35 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 72  P5 when.** the r
138a0 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
138b0 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65 20 75  eed to only be u
138c0 73 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  sed as the argum
138d0 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74 68 28  ent of a length(
138e0 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66 28 29  ).** or typeof()
138f0 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73 70 65   function, respe
13900 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 6c 6f  ctively.  The lo
13910 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65 20 62  ading of large b
13920 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a 20 73  lobs can be.** s
13930 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e 67 74  kipped for lengt
13940 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f 6e 74  h() and all cont
13950 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61 6e 20  ent loading can 
13960 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72 20 74  be skipped for t
13970 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61 73 65  ypeof()..*/.case
13980 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
13990 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
139a0 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
139b0 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
139c0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
139d0 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
139e0 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
139f0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
13a00 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
13a10 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20  cursor */.  u32 
13a20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  *aOffset;      /
13a30 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20  * aOffset[i] is 
13a40 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  offset to start 
13a50 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68  of data for i-th
13a60 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
13a70 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
13a80 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  /* The length of
13a90 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
13aa0 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c  data for the col
13ab0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  umn */.  int i; 
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13ad0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13ae0 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20   Mem *pDest;    
13af0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13b00 77 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63  write the extrac
13b10 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  ted value */.  M
13b20 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20  em sMem;        
13b30 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67    /* For storing
13b40 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
13b50 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63  g decoded */.  c
13b60 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 20  onst u8 *zData; 
13b70 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65    /* Part of the
13b80 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
13b90 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
13ba0 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20 2f 2a   u8 *zHdr;    /*
13bb0 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64 20 62   Next unparsed b
13bc0 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
13bd0 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  r */.  const u8 
13be0 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50 6f 69  *zEndHdr; /* Poi
13bf0 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 62 79  nter to first by
13c00 74 65 20 61 66 74 65 72 20 74 68 65 20 68 65 61  te after the hea
13c10 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66  der */.  u32 off
13c20 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
13c30 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64  ffset into the d
13c40 61 74 61 20 2a 2f 0a 20 20 75 36 34 20 6f 66 66  ata */.  u64 off
13c50 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a 20 36  set64;      /* 6
13c60 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a 2f 0a  4-bit offset */.
13c70 20 20 75 33 32 20 61 76 61 69 6c 3b 20 20 20 20    u32 avail;    
13c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13c90 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
13ca0 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  able data */.  u
13cb0 33 32 20 74 3b 20 20 20 20 20 20 20 20 20 20 20  32 t;           
13cc0 20 20 2f 2a 20 41 20 74 79 70 65 20 63 6f 64 65    /* A type code
13cd0 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
13ce0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d   header */.  Mem
13cf0 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20 20 20   *pReg;         
13d00 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65 20 69  /* PseudoTable i
13d10 6e 70 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f  nput register */
13d20 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ..  pC = p->apCs
13d30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 32  r[pOp->p1];.  p2
13d40 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 0a 20 20 2f   = pOp->p2;..  /
13d50 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
13d60 63 61 63 68 65 20 69 73 20 73 74 61 6c 65 2c 20  cache is stale, 
13d70 62 72 69 6e 67 20 69 74 20 75 70 2d 74 6f 2d 64  bring it up-to-d
13d80 61 74 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ate */.  rc = sq
13d90 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
13da0 6f 76 65 74 6f 28 26 70 43 2c 20 26 70 32 29 3b  oveto(&pC, &p2);
13db0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
13dc0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
13dd0 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ror;..  assert( 
13de0 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
13df0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
13e00 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
13e10 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
13e20 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
13e30 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
13e40 2c 20 70 44 65 73 74 29 3b 0a 20 20 61 73 73 65  , pDest);.  asse
13e50 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
13e60 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
13e70 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
13e80 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
13e90 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65  ert( p2<pC->nFie
13ea0 6c 64 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20  ld );.  aOffset 
13eb0 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20  = pC->aOffset;. 
13ec0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
13ed0 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56  rType!=CURTYPE_V
13ee0 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
13ef0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
13f00 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
13f10 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
13f20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
13f30 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
13f40 53 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69 66 28  SORTER );..  if(
13f50 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
13f60 21 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b  !=p->cacheCtr ){
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
13f90 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66  F-FALSE*/.    if
13fa0 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
13fb0 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65  .      if( pC->e
13fc0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
13fd0 5f 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20  _PSEUDO ){.     
13fe0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
13ff0 63 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  c.pseudoTableReg
14000 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  >0 );.        pR
14010 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 75  eg = &aMem[pC->u
14020 63 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  c.pseudoTableReg
14030 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
14040 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26  t( pReg->flags &
14050 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
14060 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
14070 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b  IsValid(pReg) );
14080 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79  .        pC->pay
14090 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73  loadSize = pC->s
140a0 7a 52 6f 77 20 3d 20 61 76 61 69 6c 20 3d 20 70  zRow = avail = p
140b0 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Reg->n;.        
140c0 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29  pC->aRow = (u8*)
140d0 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pReg->z;.      }
140e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
140f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
14100 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ull(pDest);.    
14110 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
14120 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  mn_out;.      }.
14130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14140 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
14150 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 61  pCursor;.      a
14160 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
14170 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
14180 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EE );.      asse
14190 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20  rt( pCrsr );.   
141a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
141b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
141c0 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
141d0 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64       pC->payload
141e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42 74  Size = sqlite3Bt
141f0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
14200 43 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43 2d  Crsr);.      pC-
14210 3e 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 42  >aRow = sqlite3B
14220 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
14230 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29 3b  (pCrsr, &avail);
14240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
14250 76 61 69 6c 3c 3d 36 35 35 33 36 20 29 3b 20 20  vail<=65536 );  
14260 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65 20  /* Maximum page 
14270 73 69 7a 65 20 69 73 20 36 34 4b 69 42 20 2a 2f  size is 64KiB */
14280 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 70  .      if( pC->p
14290 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28 75  ayloadSize <= (u
142a0 33 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20 20  32)avail ){.    
142b0 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20      pC->szRow = 
142c0 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b  pC->payloadSize;
142d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
142e0 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
142f0 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   > (u32)db->aLim
14300 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14310 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
14320 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
14330 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14340 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20        pC->szRow 
14350 3d 20 61 76 61 69 6c 3b 0a 20 20 20 20 20 20 7d  = avail;.      }
14360 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 63  .    }.    pC->c
14370 61 63 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e  acheStatus = p->
14380 63 61 63 68 65 43 74 72 3b 0a 20 20 20 20 70 43  cacheCtr;.    pC
14390 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 67  ->iHdrOffset = g
143a0 65 74 56 61 72 69 6e 74 33 32 28 70 43 2d 3e 61  etVarint32(pC->a
143b0 52 6f 77 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  Row, offset);.  
143c0 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64    pC->nHdrParsed
143d0 20 3d 20 30 3b 0a 20 20 20 20 61 4f 66 66 73 65   = 0;.    aOffse
143e0 74 5b 30 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 0a  t[0] = offset;..
143f0 0a 20 20 20 20 69 66 28 20 61 76 61 69 6c 3c 6f  .    if( avail<o
14400 66 66 73 65 74 20 29 7b 20 20 20 20 20 20 2f 2a  ffset ){      /*
14410 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
14420 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 2f 2a  FALSE*/.      /*
14430 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e   pC->aRow does n
14440 6f 74 20 68 61 76 65 20 74 6f 20 68 6f 6c 64 20  ot have to hold 
14450 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 2c 20  the entire row, 
14460 62 75 74 20 69 74 20 64 6f 65 73 20 61 74 20 6c  but it does at l
14470 65 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  east.      ** ne
14480 65 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  ed to cover the 
14490 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 72 65  header of the re
144a0 63 6f 72 64 2e 20 20 49 66 20 70 43 2d 3e 61 52  cord.  If pC->aR
144b0 6f 77 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ow does not cont
144c0 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ain.      ** the
144d0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
144e0 2c 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  , then set it to
144f0 20 7a 65 72 6f 2c 20 66 6f 72 63 69 6e 67 20 74   zero, forcing t
14500 68 65 20 68 65 61 64 65 72 20 74 6f 20 62 65 0a  he header to be.
14510 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
14520 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ally allocated. 
14530 2a 2f 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  */.      pC->aRo
14540 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 2d  w = 0;.      pC-
14550 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  >szRow = 0;..   
14560 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
14570 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
14580 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e  se has not given
14590 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20   us an oversize 
145a0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a  header..      **
145b0 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20   Do this now to 
145c0 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a  avoid an oversiz
145d0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
145e0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
145f0 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74 72      ** Type entr
14600 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77 65  ies can be betwe
14610 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65 73  en 1 and 5 bytes
14620 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61 6e   each.  But 4 an
14630 64 20 35 20 62 79 74 65 0a 20 20 20 20 20 20 2a  d 5 byte.      *
14640 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d  * types use so m
14650 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74  uch data space t
14660 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e  hat there can on
14670 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33  ly be 4096 and 3
14680 32 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  2 of.      ** th
14690 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  em, respectively
146a0 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d 75  .  So the maximu
146b0 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  m header length 
146c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20  results from a. 
146d0 20 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20 74       ** 3-byte t
146e0 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ype for each of 
146f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 33  the maximum of 3
14700 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  2768 columns plu
14710 73 20 74 68 72 65 65 0a 20 20 20 20 20 20 2a 2a  s three.      **
14720 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f 72   extra bytes for
14730 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e 67   the header leng
14740 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37 36  th itself.  3276
14750 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37 2e  8*3 + 3 = 98307.
14760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14770 69 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33  if( offset > 983
14780 30 37 20 7c 7c 20 6f 66 66 73 65 74 20 3e 20 70  07 || offset > p
14790 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29  C->payloadSize )
147a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
147b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
147c0 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
147d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
147e0 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
147f0 20 7d 65 6c 73 65 20 69 66 28 20 6f 66 66 73 65   }else if( offse
14800 74 3e 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  t>0 ){ /*OPTIMIZ
14810 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
14820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
14830 6c 6f 77 69 6e 67 20 67 6f 74 6f 20 69 73 20 61  lowing goto is a
14840 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
14850 20 49 74 20 63 61 6e 20 62 65 20 6f 6d 69 74 74   It can be omitt
14860 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
14870 65 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c 20  everything will 
14880 73 74 69 6c 6c 20 77 6f 72 6b 2e 20 20 42 75 74  still work.  But
14890 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 73 20 6d 65   OP_Column is me
148a0 61 73 75 72 61 62 6c 79 20 66 61 73 74 65 72 0a  asurably faster.
148b0 20 20 20 20 20 20 2a 2a 20 62 79 20 73 6b 69 70        ** by skip
148c0 70 69 6e 67 20 74 68 65 20 73 75 62 73 65 71 75  ping the subsequ
148d0 65 6e 74 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 2c  ent conditional,
148e0 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
148f0 20 74 72 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   true..      */.
14900 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43        zData = pC
14910 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ->aRow;.      as
14920 73 65 72 74 28 20 70 43 2d 3e 6e 48 64 72 50 61  sert( pC->nHdrPa
14930 72 73 65 64 3c 3d 70 32 20 29 3b 20 20 20 20 20  rsed<=p2 );     
14940 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
14950 61 6c 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  al skipped */.  
14960 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
14970 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3b 0a  mn_read_header;.
14980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14990 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65 61  Make sure at lea
149a0 73 74 20 74 68 65 20 66 69 72 73 74 20 70 32 2b  st the first p2+
149b0 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  1 entries of the
149c0 20 68 65 61 64 65 72 20 68 61 76 65 20 62 65 65   header have bee
149d0 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 20 61 6e  n.  ** parsed an
149e0 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 6d 61 74  d valid informat
149f0 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 66 73 65  ion is in aOffse
14a00 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 54 79 70  t[] and pC->aTyp
14a10 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e[]..  */.  if( 
14a20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d  pC->nHdrParsed<=
14a30 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  p2 ){.    /* If 
14a40 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 68 65  there is more he
14a50 61 64 65 72 20 61 76 61 69 6c 61 62 6c 65 20 66  ader available f
14a60 6f 72 20 70 61 72 73 69 6e 67 20 69 6e 20 74 68  or parsing in th
14a70 65 20 72 65 63 6f 72 64 2c 20 74 72 79 0a 20 20  e record, try.  
14a80 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 63 74 20    ** to extract 
14a90 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64  additional field
14aa0 73 20 75 70 20 74 68 72 6f 75 67 68 20 74 68 65  s up through the
14ab0 20 70 32 2b 31 2d 74 68 20 66 69 65 6c 64 20 0a   p2+1-th field .
14ac0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14ad0 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3c 61 4f  C->iHdrOffset<aO
14ae0 66 66 73 65 74 5b 30 5d 20 29 7b 0a 20 20 20 20  ffset[0] ){.    
14af0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 7a    /* Make sure z
14b00 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 65  Data points to e
14b10 6e 6f 75 67 68 20 6f 66 20 74 68 65 20 72 65 63  nough of the rec
14b20 6f 72 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ord to cover the
14b30 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
14b40 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d    if( pC->aRow==
14b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
14b60 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69  set(&sMem, 0, si
14b70 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 20  zeof(sMem));.   
14b80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b90 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
14ba0 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  e(pC->uc.pCursor
14bb0 2c 20 30 2c 20 61 4f 66 66 73 65 74 5b 30 5d 2c  , 0, aOffset[0],
14bc0 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20   &sMem);.       
14bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14be0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
14bf0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
14c00 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28 75        zData = (u
14c10 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20  8*)sMem.z;.     
14c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14c30 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77  zData = pC->aRow
14c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
14c50 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 43     /* Fill in pC
14c60 2d 3e 61 54 79 70 65 5b 69 5d 20 61 6e 64 20 61  ->aType[i] and a
14c70 4f 66 66 73 65 74 5b 69 5d 20 76 61 6c 75 65 73  Offset[i] values
14c80 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2d   through the p2-
14c90 74 68 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  th field. */.   
14ca0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f   op_column_read_
14cb0 68 65 61 64 65 72 3a 0a 20 20 20 20 20 20 69 20  header:.      i 
14cc0 3d 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  = pC->nHdrParsed
14cd0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 36 34  ;.      offset64
14ce0 20 3d 20 61 4f 66 66 73 65 74 5b 69 5d 3b 0a 20   = aOffset[i];. 
14cf0 20 20 20 20 20 7a 48 64 72 20 3d 20 7a 44 61 74       zHdr = zDat
14d00 61 20 2b 20 70 43 2d 3e 69 48 64 72 4f 66 66 73  a + pC->iHdrOffs
14d10 65 74 3b 0a 20 20 20 20 20 20 7a 45 6e 64 48 64  et;.      zEndHd
14d20 72 20 3d 20 7a 44 61 74 61 20 2b 20 61 4f 66 66  r = zData + aOff
14d30 73 65 74 5b 30 5d 3b 0a 20 20 20 20 20 20 64 6f  set[0];.      do
14d40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 74  {.        if( (t
14d50 20 3d 20 7a 48 64 72 5b 30 5d 29 3c 30 78 38 30   = zHdr[0])<0x80
14d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 48   ){.          zH
14d70 64 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  dr++;.          
14d80 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c 69  offset64 += sqli
14d90 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
14da0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a  rialTypeLen(t);.
14db0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14dc0 20 20 20 20 20 20 20 20 20 7a 48 64 72 20 2b 3d           zHdr +=
14dd0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
14de0 74 33 32 28 7a 48 64 72 2c 20 26 74 29 3b 0a 20  t32(zHdr, &t);. 
14df0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36           offset6
14e00 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  4 += sqlite3Vdbe
14e10 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
14e20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e30 20 20 20 20 70 43 2d 3e 61 54 79 70 65 5b 69 2b      pC->aType[i+
14e40 2b 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  +] = t;.        
14e50 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 28 75 33  aOffset[i] = (u3
14e60 32 29 28 6f 66 66 73 65 74 36 34 20 26 20 30 78  2)(offset64 & 0x
14e70 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
14e80 20 7d 77 68 69 6c 65 28 20 69 3c 3d 70 32 20 26   }while( i<=p2 &
14e90 26 20 7a 48 64 72 3c 7a 45 6e 64 48 64 72 20 29  & zHdr<zEndHdr )
14ea0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
14eb0 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
14ec0 74 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  t if any of the 
14ed0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
14ee0 75 65 3a 0a 20 20 20 20 20 20 2a 2a 20 28 31 29  ue:.      ** (1)
14ef0 20 74 68 65 20 62 79 74 65 73 20 6f 66 20 74 68   the bytes of th
14f00 65 20 68 65 61 64 65 72 20 65 78 74 65 6e 64 20  e header extend 
14f10 70 61 73 74 20 74 68 65 20 64 65 63 6c 61 72 65  past the declare
14f20 64 20 68 65 61 64 65 72 20 73 69 7a 65 0a 20 20  d header size.  
14f30 20 20 20 20 2a 2a 20 28 32 29 20 74 68 65 20 65      ** (2) the e
14f40 6e 74 69 72 65 20 68 65 61 64 65 72 20 77 61 73  ntire header was
14f50 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 61 6c   used but not al
14f60 6c 20 64 61 74 61 20 77 61 73 20 75 73 65 64 0a  l data was used.
14f70 20 20 20 20 20 20 2a 2a 20 28 33 29 20 74 68 65        ** (3) the
14f80 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
14f90 20 65 78 74 65 6e 64 73 20 62 65 79 6f 6e 64 20   extends beyond 
14fa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
14fb0 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
14fc0 20 20 20 20 20 20 69 66 28 20 28 7a 48 64 72 3e        if( (zHdr>
14fd0 3d 7a 45 6e 64 48 64 72 20 26 26 20 28 7a 48 64  =zEndHdr && (zHd
14fe0 72 3e 7a 45 6e 64 48 64 72 20 7c 7c 20 6f 66 66  r>zEndHdr || off
14ff0 73 65 74 36 34 21 3d 70 43 2d 3e 70 61 79 6c 6f  set64!=pC->paylo
15000 61 64 53 69 7a 65 29 29 0a 20 20 20 20 20 20 20  adSize)).       
15010 7c 7c 20 28 6f 66 66 73 65 74 36 34 20 3e 20 70  || (offset64 > p
15020 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a  C->payloadSize).
15030 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15040 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30   if( pC->aRow==0
15050 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
15060 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b  mRelease(&sMem);
15070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
15080 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15090 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
150a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
150b0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  or;.      }..   
150c0 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65     pC->nHdrParse
150d0 64 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 43 2d  d = i;.      pC-
150e0 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 28 75  >iHdrOffset = (u
150f0 33 32 29 28 7a 48 64 72 20 2d 20 7a 44 61 74 61  32)(zHdr - zData
15100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d  );.      if( pC-
15110 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74  >aRow==0 ) sqlit
15120 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
15130 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  (&sMem);.    }el
15140 73 65 7b 0a 20 20 20 20 20 20 74 20 3d 20 30 3b  se{.      t = 0;
15150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15160 66 20 61 66 74 65 72 20 74 72 79 69 6e 67 20 74  f after trying t
15170 6f 20 65 78 74 72 61 63 74 20 6e 65 77 20 65 6e  o extract new en
15180 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 68  tries from the h
15190 65 61 64 65 72 2c 20 6e 48 64 72 50 61 72 73 65  eader, nHdrParse
151a0 64 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  d is.    ** stil
151b0 6c 20 6e 6f 74 20 75 70 20 74 6f 20 70 32 2c 20  l not up to p2, 
151c0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
151d0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 66  the record has f
151e0 65 77 65 72 20 74 68 61 6e 20 70 32 0a 20 20 20  ewer than p2.   
151f0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f   ** columns.  So
15200 20 74 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c   the result will
15210 20 62 65 20 65 69 74 68 65 72 20 74 68 65 20 64   be either the d
15220 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 72 20  efault value or 
15230 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  a NULL..    */. 
15240 20 20 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50     if( pC->nHdrP
15250 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20  arsed<=p2 ){.   
15260 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
15270 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20  pe==P4_MEM ){.  
15280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15290 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
152a0 70 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70  pDest, pOp->p4.p
152b0 4d 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29  Mem, MEM_Static)
152c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
152d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
152e0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
152f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
15300 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
15310 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  n_out;.    }.  }
15320 65 6c 73 65 7b 0a 20 20 20 20 74 20 3d 20 70 43  else{.    t = pC
15330 2d 3e 61 54 79 70 65 5b 70 32 5d 3b 0a 20 20 7d  ->aType[p2];.  }
15340 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
15350 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  he content for t
15360 68 65 20 70 32 2b 31 2d 74 68 20 63 6f 6c 75 6d  he p2+1-th colum
15370 6e 2e 20 20 43 6f 6e 74 72 6f 6c 20 63 61 6e 20  n.  Control can 
15380 6f 6e 6c 79 0a 20 20 2a 2a 20 72 65 61 63 68 20  only.  ** reach 
15390 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 61 4f  this point if aO
153a0 66 66 73 65 74 5b 70 32 5d 2c 20 61 4f 66 66 73  ffset[p2], aOffs
153b0 65 74 5b 70 32 2b 31 5d 2c 20 61 6e 64 20 70 43  et[p2+1], and pC
153c0 2d 3e 61 54 79 70 65 5b 70 32 5d 20 61 72 65 0a  ->aType[p2] are.
153d0 20 20 2a 2a 20 61 6c 6c 20 76 61 6c 69 64 2e 0a    ** all valid..
153e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
153f0 32 3c 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  2<pC->nHdrParsed
15400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
15410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15430 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
15440 72 69 61 6e 74 73 28 70 44 65 73 74 29 20 29 3b  riants(pDest) );
15450 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79  .  if( VdbeMemDy
15460 6e 61 6d 69 63 28 70 44 65 73 74 29 20 29 7b 0a  namic(pDest) ){.
15470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
15480 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29  emSetNull(pDest)
15490 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
154a0 74 3d 3d 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d  t==pC->aType[p2]
154b0 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 73 7a   );.  if( pC->sz
154c0 52 6f 77 3e 3d 61 4f 66 66 73 65 74 5b 70 32 2b  Row>=aOffset[p2+
154d0 31 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  1] ){.    /* Thi
154e0 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
154f0 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 64  case where the d
15500 65 73 69 72 65 64 20 63 6f 6e 74 65 6e 74 20 66  esired content f
15510 69 74 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69  its on the origi
15520 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  nal.    ** page 
15530 2d 20 77 68 65 72 65 20 74 68 65 20 63 6f 6e 74  - where the cont
15540 65 6e 74 20 69 73 20 6e 6f 74 20 6f 6e 20 61 6e  ent is not on an
15550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   overflow page *
15560 2f 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43  /.    zData = pC
15570 2d 3e 61 52 6f 77 20 2b 20 61 4f 66 66 73 65 74  ->aRow + aOffset
15580 5b 70 32 5d 3b 0a 20 20 20 20 69 66 28 20 74 3c  [p2];.    if( t<
15590 31 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  12 ){.      sqli
155a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
155b0 28 7a 44 61 74 61 2c 20 74 2c 20 70 44 65 73 74  (zData, t, pDest
155c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
155d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
155e0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 61 20  lumn value is a 
155f0 73 74 72 69 6e 67 2c 20 77 65 20 6e 65 65 64 20  string, we need 
15600 61 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c  a persistent val
15610 75 65 2c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ue, not.      **
15620 20 61 20 4d 45 4d 5f 45 70 68 65 6d 20 76 61 6c   a MEM_Ephem val
15630 75 65 2e 20 20 54 68 69 73 20 62 72 61 6e 63 68  ue.  This branch
15640 20 69 73 20 61 20 66 61 73 74 20 73 68 6f 72 74   is a fast short
15650 2d 63 75 74 20 74 68 61 74 20 69 73 20 65 71 75  -cut that is equ
15660 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a  ivalent.      **
15670 20 74 6f 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   to calling sqli
15680 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
15690 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  () and sqlite3Vd
156a0 62 65 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65  beDeephemeralize
156b0 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
156c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
156d0 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
156e0 4d 45 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74  MEM_Blob, MEM_St
156f0 72 7c 4d 45 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20  r|MEM_Term };.  
15700 20 20 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 6c      pDest->n = l
15710 65 6e 20 3d 20 28 74 2d 31 32 29 2f 32 3b 0a 20  en = (t-12)/2;. 
15720 20 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20       pDest->enc 
15730 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  = encoding;.    
15740 20 20 69 66 28 20 70 44 65 73 74 2d 3e 73 7a 4d    if( pDest->szM
15750 61 6c 6c 6f 63 20 3c 20 6c 65 6e 2b 32 20 29 7b  alloc < len+2 ){
15760 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
15770 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
15780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
15790 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
157a0 28 70 44 65 73 74 2c 20 6c 65 6e 2b 32 2c 20 30  (pDest, len+2, 0
157b0 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
157c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
157d0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d        pDest->z =
157e0 20 70 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pDest->zMalloc;
157f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
15800 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 7a 2c 20  emcpy(pDest->z, 
15810 7a 44 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20  zData, len);.   
15820 20 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d     pDest->z[len]
15830 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73   = 0;.      pDes
15840 74 2d 3e 7a 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b  t->z[len+1] = 0;
15850 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  .      pDest->fl
15860 61 67 73 20 3d 20 61 46 6c 61 67 5b 74 26 31 5d  ags = aFlag[t&1]
15870 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15880 0a 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20  .    pDest->enc 
15890 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  = encoding;.    
158a0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 68  /* This branch h
158b0 61 70 70 65 6e 73 20 6f 6e 6c 79 20 77 68 65 6e  appens only when
158c0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 6e 20 6f   content is on o
158d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
158e0 0a 20 20 20 20 69 66 28 20 28 28 70 4f 70 2d 3e  .    if( ((pOp->
158f0 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  p5 & (OPFLAG_LEN
15900 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
15910 50 45 4f 46 41 52 47 29 29 21 3d 30 0a 20 20 20  PEOFARG))!=0.   
15920 20 20 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31         && ((t>=1
15930 32 20 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c  2 && (t&1)==0) |
15940 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  | (pOp->p5 & OPF
15950 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d  LAG_TYPEOFARG)!=
15960 30 29 29 0a 20 20 20 20 20 7c 7c 20 28 6c 65 6e  0)).     || (len
15970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
15980 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 29 3d  rialTypeLen(t))=
15990 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
159a0 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20 69 72  /* Content is ir
159b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 0a 20 20 20  relevant for.   
159c0 20 20 20 2a 2a 20 20 20 20 31 2e 20 74 68 65 20     **    1. the 
159d0 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
159e0 6e 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 32  n,.      **    2
159f0 2e 20 74 68 65 20 6c 65 6e 67 74 68 28 58 29 20  . the length(X) 
15a00 66 75 6e 63 74 69 6f 6e 20 69 66 20 58 20 69 73  function if X is
15a10 20 61 20 62 6c 6f 62 2c 20 61 6e 64 0a 20 20 20   a blob, and.   
15a20 20 20 20 2a 2a 20 20 20 20 33 2e 20 69 66 20 74     **    3. if t
15a30 68 65 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74  he content lengt
15a40 68 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 20  h is zero..     
15a50 20 2a 2a 20 53 6f 20 77 65 20 6d 69 67 68 74 20   ** So we might 
15a60 61 73 20 77 65 6c 6c 20 75 73 65 20 62 6f 67 75  as well use bogu
15a70 73 20 63 6f 6e 74 65 6e 74 20 72 61 74 68 65 72  s content rather
15a80 20 74 68 61 6e 20 72 65 61 64 69 6e 67 0a 20 20   than reading.  
15a90 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
15aa0 72 6f 6d 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20  rom disk. */.   
15ab0 20 20 20 73 74 61 74 69 63 20 75 38 20 61 5a 65     static u8 aZe
15ac0 72 6f 5b 38 5d 3b 20 20 2f 2a 20 54 68 69 73 20  ro[8];  /* This 
15ad0 69 73 20 74 68 65 20 62 6f 67 75 73 20 63 6f 6e  is the bogus con
15ae0 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  tent */.      sq
15af0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15b00 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20 70 44 65  et(aZero, t, pDe
15b10 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
15b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15b30 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
15b40 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ee(pC->uc.pCurso
15b50 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20  r, aOffset[p2], 
15b60 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  len, pDest);.   
15b70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15b80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
15b90 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
15ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15bb0 65 53 65 72 69 61 6c 47 65 74 28 28 63 6f 6e 73  eSerialGet((cons
15bc0 74 20 75 38 2a 29 70 44 65 73 74 2d 3e 7a 2c 20  t u8*)pDest->z, 
15bd0 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20  t, pDest);.     
15be0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d   pDest->flags &=
15bf0 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20   ~MEM_Ephem;.   
15c00 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d   }.  }..op_colum
15c10 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f  n_out:.  UPDATE_
15c20 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65  MAX_BLOBSIZE(pDe
15c30 73 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  st);.  REGISTER_
15c40 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
15c50 44 65 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  Dest);.  break;.
15c60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66  }../* Opcode: Af
15c70 66 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50  finity P1 P2 * P
15c80 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
15c90 20 61 66 66 69 6e 69 74 79 28 72 5b 50 31 40 50   affinity(r[P1@P
15ca0 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20  2]).**.** Apply 
15cb0 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20  affinities to a 
15cc0 72 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69  range of P2 regi
15cd0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
15ce0 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  ith P1..**.** P4
15cf0 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
15d00 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65  t is P2 characte
15d10 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68  rs long. The nth
15d20 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
15d30 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69  e.** string indi
15d40 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  cates the column
15d50 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
15d60 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
15d70 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d  r the nth.** mem
15d80 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ory cell in the 
15d90 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  range..*/.case O
15da0 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20  P_Affinity: {.  
15db0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66  const char *zAff
15dc0 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20  inity;   /* The 
15dd0 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61  affinity to be a
15de0 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72  pplied */.  char
15df0 20 63 41 66 66 3b 20 20 20 20 20 20 20 20 20 20   cAff;          
15e00 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
15e10 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 66   character of af
15e20 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66  finity */..  zAf
15e30 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
15e40 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41  .z;.  assert( zA
15e50 66 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20  ffinity!=0 );.  
15e60 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74  assert( zAffinit
15e70 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b  y[pOp->p2]==0 );
15e80 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
15e90 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c  pOp->p1];.  whil
15ea0 65 28 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66  e( (cAff = *(zAf
15eb0 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b  finity++))!=0 ){
15ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
15ed0 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28 70  1 <= &p->aMem[(p
15ee0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
15ef0 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61  ursor)] );.    a
15f00 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
15f10 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 61  d(pIn1) );.    a
15f20 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
15f30 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f 64 69 6e  1, cAff, encodin
15f40 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a  g);.    pIn1++;.
15f50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
15f60 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52  /* Opcode: MakeR
15f70 65 63 6f 72 64 20 50 31 20 50 32 20 50 33 20 50  ecord P1 P2 P3 P
15f80 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
15f90 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28 72 5b 50   r[P3]=mkrec(r[P
15fa0 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e  1@P2]).**.** Con
15fb0 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65 72  vert P2 register
15fc0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
15fd0 20 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65   P1 into the [re
15fe0 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20  cord format].** 
15ff0 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65  use as a data re
16000 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61  cord in a databa
16010 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61  se table or as a
16020 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e   key.** in an in
16030 64 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  dex.  The OP_Col
16040 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64  umn opcode can d
16050 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64  ecode the record
16060 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   later..**.** P4
16070 20 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e 67   may be a string
16080 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
16090 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
160a0 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
160b0 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
160c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
160d0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
160e0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
160f0 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
16100 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  * field of the i
16110 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  ndex key..**.** 
16120 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  The mapping from
16130 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 66   character to af
16140 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20  finity is given 
16150 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  by the SQLITE_AF
16160 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66  F_.** macros def
16170 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
16180 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  t.h..**.** If P4
16190 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   is NULL then al
161a0 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68  l index fields h
161b0 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
161c0 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20 4f   BLOB..*/.case O
161d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a  P_MakeRecord: {.
161e0 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64    u8 *zNewRecord
161f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75  ;        /* A bu
16200 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
16210 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65   data for the ne
16220 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  w record */.  Me
16230 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20  m *pRec;        
16240 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
16250 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20  record */.  u64 
16260 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
16270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16280 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
16290 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64  ace */.  int nHd
162a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
162b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
162c0 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
162d0 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  ce */.  i64 nByt
162e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
162f0 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65 71  * Data space req
16300 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 72  uired for this r
16310 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e  ecord */.  i64 n
16320 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Zero;           
16330 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
16340 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
16350 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
16360 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  rd */.  int nVar
16370 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  int;           /
16380 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16390 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f  s in a varint */
163a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
163b0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
163c0 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d  e field */.  Mem
163d0 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20 20   *pData0;       
163e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65      /* First fie
163f0 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65  ld to be combine
16400 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72  d into the recor
16410 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73  d */.  Mem *pLas
16420 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
16430 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   Last field of t
16440 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
16450 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
16460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16470 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
16480 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
16490 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
164a0 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
164b0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ity string for t
164c0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
164d0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20  nt file_format; 
164e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f        /* File fo
164f0 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20  rmat to use for 
16500 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
16510 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
16520 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73       /* Space us
16530 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64  ed in zNewRecord
16540 5b 5d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  [] header */.  i
16550 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
16560 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75        /* Space u
16570 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72  sed in zNewRecor
16580 64 5b 5d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  d[] content */. 
16590 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
165a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
165b0 68 20 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a  h of a field */.
165c0 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74  .  /* Assuming t
165d0 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69  he record contai
165e0 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65  ns N fields, the
165f0 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c   record format l
16600 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74  ooks.  ** like t
16610 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d  his:.  **.  ** -
16620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16660 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68  -------.  ** | h
16670 64 72 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30  dr-size | type 0
16680 20 7c 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20   | type 1 | ... 
16690 7c 20 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74  | type N-1 | dat
166a0 61 30 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20  a0 | ... | data 
166b0 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d  N-1 | .  ** ----
166c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16700 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ----.  **.  ** D
16710 61 74 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20  ata(0) is taken 
16720 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31  from register P1
16730 2e 20 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73  .  Data(1) comes
16740 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
16750 31 2b 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  1+1.  ** and so 
16760 66 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  forth..  **.  **
16770 20 45 61 63 68 20 74 79 70 65 20 66 69 65 6c 64   Each type field
16780 20 69 73 20 61 20 76 61 72 69 6e 74 20 72 65 70   is a varint rep
16790 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65  resenting the se
167a0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
167b0 20 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e   .  ** correspon
167c0 64 69 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e  ding data elemen
167d0 74 20 28 73 65 65 20 73 71 6c 69 74 65 33 56 64  t (see sqlite3Vd
167e0 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e  beSerialType()).
167f0 20 54 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69   The.  ** hdr-si
16800 7a 65 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f  ze field is also
16810 20 61 20 76 61 72 69 6e 74 20 77 68 69 63 68 20   a varint which 
16820 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 66 72  is the offset fr
16830 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
16840 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63  .  ** of the rec
16850 6f 72 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20  ord to data0..  
16860 2a 2f 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20  */.  nData = 0; 
16870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16880 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
16890 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48  ta space */.  nH
168a0 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
168b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
168c0 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70  tes of header sp
168d0 61 63 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d  ace */.  nZero =
168e0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
168f0 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79  umber of zero by
16900 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tes at the end o
16910 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
16920 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
16930 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20  p1;.  zAffinity 
16940 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61  = pOp->p4.z;.  a
16950 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20  ssert( nField>0 
16960 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  && pOp->p2>0 && 
16970 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d  pOp->p2+nField<=
16980 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
16990 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
169a0 70 44 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e  pData0 = &aMem[n
169b0 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64  Field];.  nField
169c0 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c   = pOp->p2;.  pL
169d0 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46  ast = &pData0[nF
169e0 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f  ield-1];.  file_
169f0 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57  format = p->minW
16a00 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a  riteFileFormat;.
16a10 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74  .  /* Identify t
16a20 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
16a30 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
16a40 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20  pOp->p3<pOp->p1 
16a50 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d  || pOp->p3>=pOp-
16a60 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20  >p1+pOp->p2 );. 
16a70 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
16a80 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p3];.  memAbo
16a90 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
16aa0 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79  ut);..  /* Apply
16ab0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 61   the requested a
16ac0 66 66 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69  ffinity to all i
16ad0 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  nputs.  */.  ass
16ae0 65 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61  ert( pData0<=pLa
16af0 73 74 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66  st );.  if( zAff
16b00 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65  inity ){.    pRe
16b10 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20  c = pData0;.    
16b20 64 6f 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41  do{.      applyA
16b30 66 66 69 6e 69 74 79 28 70 52 65 63 2b 2b 2c 20  ffinity(pRec++, 
16b40 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20  *(zAffinity++), 
16b50 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20  encoding);.     
16b60 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69   assert( zAffini
16b70 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63  ty[0]==0 || pRec
16b80 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d  <=pLast );.    }
16b90 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79  while( zAffinity
16ba0 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  [0] );.  }..#ifd
16bb0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16bc0 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20 2f 2a 20  _NULL_TRIM.  /* 
16bd0 4e 55 4c 4c 73 20 63 61 6e 20 62 65 20 73 61 66  NULLs can be saf
16be0 65 6c 79 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d  ely trimmed from
16bf0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16c00 72 65 63 6f 72 64 2c 20 61 73 20 6c 6f 6e 67 20  record, as long 
16c10 61 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 73  as.  ** as the s
16c20 63 68 65 6d 61 20 66 6f 72 6d 61 74 20 69 73 20  chema format is 
16c30 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 6e 6f  2 or more and no
16c40 6e 65 20 6f 66 20 74 68 65 20 6f 6d 69 74 74 65  ne of the omitte
16c50 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 68  d columns.  ** h
16c60 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64  ave a non-NULL d
16c70 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 20 41  efault value.  A
16c80 6c 73 6f 2c 20 74 68 65 20 72 65 63 6f 72 64 20  lso, the record 
16c90 6d 75 73 74 20 62 65 20 6c 65 66 74 20 77 69 74  must be left wit
16ca0 68 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  h.  ** at least 
16cb0 6f 6e 65 20 66 69 65 6c 64 2e 20 20 49 66 20 50  one field.  If P
16cc0 35 3e 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  5>0 then it will
16cd0 20 62 65 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   be one more tha
16ce0 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
16cf0 20 6f 66 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   of the right-mo
16d00 73 74 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61  st column with a
16d10 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
16d20 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28  t value */.  if(
16d30 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20   pOp->p5 ){.    
16d40 77 68 69 6c 65 28 20 28 70 4c 61 73 74 2d 3e 66  while( (pLast->f
16d50 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
16d60 21 3d 30 20 26 26 20 6e 46 69 65 6c 64 3e 70 4f  !=0 && nField>pO
16d70 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 70  p->p5 ){.      p
16d80 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 46  Last--;.      nF
16d90 69 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ield--;.    }.  
16da0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c  }.#endif..  /* L
16db0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
16dc0 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69  elements that wi
16dd0 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72  ll make up the r
16de0 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a  ecord to figure.
16df0 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63    ** out how muc
16e00 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
16e10 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  red for the new 
16e20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 70  record..  */.  p
16e30 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20 20 64  Rec = pLast;.  d
16e40 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  o{.    assert( m
16e50 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20  emIsValid(pRec) 
16e60 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e 75 54 65  );.    pRec->uTe
16e70 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  mp = serial_type
16e80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
16e90 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66  rialType(pRec, f
16ea0 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6c 65 6e  ile_format, &len
16eb0 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d  );.    if( pRec-
16ec0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
16ed0 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  o ){.      if( n
16ee0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
16ef0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
16f00 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65  emExpandBlob(pRe
16f10 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  c) ) goto no_mem
16f20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f30 20 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20         nZero += 
16f40 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRec->u.nZero;. 
16f50 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 70 52         len -= pR
16f60 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  ec->u.nZero;.   
16f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
16f80 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20  Data += len;.   
16f90 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
16fa0 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29 3b 0a 20  l_type==127 );. 
16fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
16fc0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38 20 29 3b  ial_type==128 );
16fd0 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 73 65 72  .    nHdr += ser
16fe0 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37 20 3f 20  ial_type<=127 ? 
16ff0 31 20 3a 20 73 71 6c 69 74 65 33 56 61 72 69 6e  1 : sqlite3Varin
17000 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
17010 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 3d  );.    if( pRec=
17020 3d 70 44 61 74 61 30 20 29 20 62 72 65 61 6b 3b  =pData0 ) break;
17030 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a 20 20 7d  .    pRec--;.  }
17040 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20 2f 2a 20  while(1);..  /* 
17050 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
17060 32 35 36 34 2d 31 31 36 34 37 20 54 68 65 20 68  2564-11647 The h
17070 65 61 64 65 72 20 62 65 67 69 6e 73 20 77 69 74  eader begins wit
17080 68 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e  h a single varin
17090 74 0a 20 20 2a 2a 20 77 68 69 63 68 20 64 65 74  t.  ** which det
170a0 65 72 6d 69 6e 65 73 20 74 68 65 20 74 6f 74 61  ermines the tota
170b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
170c0 73 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  s in the header.
170d0 20 54 68 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a   The varint.  **
170e0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 69   value is the si
170f0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
17100 20 69 6e 20 62 79 74 65 73 20 69 6e 63 6c 75 64   in bytes includ
17110 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76 61 72  ing the size var
17120 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65 6c 66 2e  int.  ** itself.
17130 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
17140 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a 20 20 74  nHdr==126 );.  t
17150 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31  estcase( nHdr==1
17160 32 37 20 29 3b 0a 20 20 69 66 28 20 6e 48 64 72  27 );.  if( nHdr
17170 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20 2f 2a 20  <=126 ){.    /* 
17180 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
17190 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 31  */.    nHdr += 1
171a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
171b0 2a 20 52 61 72 65 20 63 61 73 65 20 6f 66 20 61  * Rare case of a
171c0 20 72 65 61 6c 6c 79 20 6c 61 72 67 65 20 68 65   really large he
171d0 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e 56 61 72  ader */.    nVar
171e0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 61 72  int = sqlite3Var
171f0 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20 20  intLen(nHdr);.  
17200 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72 69 6e    nHdr += nVarin
17210 74 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 72 69  t;.    if( nVari
17220 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74  nt<sqlite3Varint
17230 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e 48 64 72  Len(nHdr) ) nHdr
17240 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  ++;.  }.  nByte 
17250 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b 0a 20 20  = nHdr+nData;.  
17260 69 66 28 20 6e 42 79 74 65 2b 6e 5a 65 72 6f 3e  if( nByte+nZero>
17270 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
17280 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
17290 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
172a0 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  big;.  }..  /* M
172b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 75 74  ake sure the out
172c0 70 75 74 20 72 65 67 69 73 74 65 72 20 68 61 73  put register has
172d0 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
172e0 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20  enough to store 
172f0 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65  .  ** the new re
17300 63 6f 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74  cord. The output
17310 20 72 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e   register (pOp->
17320 70 33 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  p3) is not allow
17330 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e  ed to.  ** be on
17340 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72  e of the input r
17350 65 67 69 73 74 65 72 73 20 28 62 65 63 61 75 73  egisters (becaus
17360 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
17370 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
17380 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
17390 41 6e 64 52 65 73 69 7a 65 28 29 20 63 6f 75 6c  AndResize() coul
173a0 64 20 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61  d clobber the va
173b0 6c 75 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  lue before it is
173c0 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69   used)..  */.  i
173d0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
173e0 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
173f0 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65  pOut, (int)nByte
17400 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ) ){.    goto no
17410 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77  _mem;.  }.  zNew
17420 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70  Record = (u8 *)p
17430 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72  Out->z;..  /* Wr
17440 69 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a  ite the record *
17450 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e  /.  i = putVarin
17460 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20  t32(zNewRecord, 
17470 6e 48 64 72 29 3b 0a 20 20 6a 20 3d 20 6e 48 64  nHdr);.  j = nHd
17480 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  r;.  assert( pDa
17490 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20  ta0<=pLast );.  
174a0 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20  pRec = pData0;. 
174b0 20 64 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f   do{.    serial_
174c0 74 79 70 65 20 3d 20 70 52 65 63 2d 3e 75 54 65  type = pRec->uTe
174d0 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  mp;.    /* EVIDE
174e0 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39 2d  NCE-OF: R-06529-
174f0 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67 20  47362 Following 
17500 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74 20  the size varint 
17510 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  are one or more.
17520 20 20 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61      ** additiona
17530 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 70  l varints, one p
17540 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  er column. */.  
17550 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74    i += putVarint
17560 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69  32(&zNewRecord[i
17570 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
17580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
17590 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20  erial type */.  
175a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
175b0 3a 20 52 2d 36 34 35 33 36 2d 35 31 37 32 38 20  : R-64536-51728 
175c0 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65  The values for e
175d0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
175e0 65 20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20  e record.    ** 
175f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
17600 6f 77 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  ow the header. *
17610 2f 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74  /.    j += sqlit
17620 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17630 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20  &zNewRecord[j], 
17640 70 52 65 63 2c 20 73 65 72 69 61 6c 5f 74 79 70  pRec, serial_typ
17650 65 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a  e); /* content *
17660 2f 0a 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70  /.  }while( (++p
17670 52 65 63 29 3c 3d 70 4c 61 73 74 20 29 3b 0a 20  Rec)<=pLast );. 
17680 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 48 64 72   assert( i==nHdr
17690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3d   );.  assert( j=
176a0 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73  =nByte );..  ass
176b0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
176c0 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
176d0 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
176e0 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e  or) );.  pOut->n
176f0 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20   = (int)nByte;. 
17700 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
17710 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66 28 20 6e  EM_Blob;.  if( n
17720 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75 74  Zero ){.    pOut
17730 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72  ->u.nZero = nZer
17740 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  o;.    pOut->fla
17750 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a  gs |= MEM_Zero;.
17760 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20    }.  pOut->enc 
17770 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20  = SQLITE_UTF8;  
17780 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20 62  /* In case the b
17790 6c 6f 62 20 69 73 20 65 76 65 72 20 63 6f 6e 76  lob is ever conv
177a0 65 72 74 65 64 20 74 6f 20 74 65 78 74 20 2a 2f  erted to text */
177b0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
177c0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
177d0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
177e0 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
177f0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
17800 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31 20 50  code: Count P1 P
17810 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
17820 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75 6e 74  sis: r[P2]=count
17830 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74  ().**.** Store t
17840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17850 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72  ries (an integer
17860 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74   value) in the t
17870 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a  able or index .*
17880 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  * opened by curs
17890 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65  or P1 in registe
178a0 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  r P2.*/.#ifndef 
178b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
178c0 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43  ECOUNT.case OP_C
178d0 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ount: {         
178e0 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36 34  /* out2 */.  i64
178f0 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43 75 72   nEntry;.  BtCur
17900 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 61  sor *pCrsr;..  a
17910 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
17920 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79  pOp->p1]->eCurTy
17930 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17940 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
17950 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
17960 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20  ->uc.pCursor;.  
17970 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b  assert( pCrsr );
17980 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20  .  nEntry = 0;  
17990 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
179a0 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
179b0 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
179c0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
179d0 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43 72 73  3BtreeCount(pCrs
179e0 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20 69  r, &nEntry);.  i
179f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
17a00 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
17a10 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
17a20 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
17a30 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
17a40 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61 6b 3b  nEntry;.  break;
17a50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70  .}.#endif../* Op
17a60 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74 20  code: Savepoint 
17a70 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
17a80 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  * Open, release 
17a90 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  or rollback the 
17aa0 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20  savepoint named 
17ab0 62 79 20 70 61 72 61 6d 65 74 65 72 20 50 34 2c  by parameter P4,
17ac0 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e   depending.** on
17ad0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31   the value of P1
17ae0 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  . To open a new 
17af0 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30  savepoint, P1==0
17b00 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f  . To release (co
17b10 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73  mmit) an.** exis
17b20 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c 20  ting savepoint, 
17b30 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c  P1==1, or to rol
17b40 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69 6e  lback an existin
17b50 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d  g savepoint P1==
17b60 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61  2..*/.case OP_Sa
17b70 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74  vepoint: {.  int
17b80 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   p1;            
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ba0 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70 65 72  Value of P1 oper
17bb0 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  and */.  char *z
17bc0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
17bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17be0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f   of savepoint */
17bf0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
17c00 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 77 3b  Savepoint *pNew;
17c10 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  .  Savepoint *pS
17c20 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61 76 65  avepoint;.  Save
17c30 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20 20 69  point *pTmp;.  i
17c40 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20  nt iSavepoint;. 
17c50 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31 20 3d   int ii;..  p1 =
17c60 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d   pOp->p1;.  zNam
17c70 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a  e = pOp->p4.z;..
17c80 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
17c90 20 74 68 65 20 70 31 20 70 61 72 61 6d 65 74 65   the p1 paramete
17ca0 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c 73 6f  r is valid. Also
17cb0 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
17cc0 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 74  s no open.  ** t
17cd0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
17ce0 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65   there cannot be
17cf0 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 2e   any savepoints.
17d00 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
17d10 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3d   db->pSavepoint=
17d20 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  =0 || db->autoCo
17d30 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mmit==0 );.  ass
17d40 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49  ert( p1==SAVEPOI
17d50 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d 53 41  NT_BEGIN||p1==SA
17d60 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c  VEPOINT_RELEASE|
17d70 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  |p1==SAVEPOINT_R
17d80 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73  OLLBACK );.  ass
17d90 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ert( db->pSavepo
17da0 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54 72 61  int || db->isTra
17db0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
17dc0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
17dd0 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74  ( checkSavepoint
17de0 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20 20 61  Count(db) );.  a
17df0 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
17e00 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 70 31  der );..  if( p1
17e10 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  ==SAVEPOINT_BEGI
17e20 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  N ){.    if( db-
17e30 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b  >nVdbeWrite>0 ){
17e40 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20  .      /* A new 
17e50 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74  savepoint cannot
17e60 20 62 65 20 63 72 65 61 74 65 64 20 69 66 20 74   be created if t
17e70 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
17e80 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
17e90 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e  statements (i.e.
17ea0 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74 65   open read/write
17eb0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
17ec0 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20  b handles)..    
17ed0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
17ee0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
17ef0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65  cannot open save
17f00 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61 74  point - SQL stat
17f10 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
17f20 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
17f30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
17f50 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
17f60 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a  rlen30(zName);..
17f70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17f80 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17f90 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
17fa0 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e 20 69  all is Ok even i
17fb0 66 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74  f this savepoint
17fc0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 74   is actually a t
17fd0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
17fe0 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 28 61   ** savepoint (a
17ff0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73 68 6f  nd therefore sho
18000 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74 20 78  uld not prompt x
18010 53 61 76 65 70 6f 69 6e 74 28 29 29 20 63 61 6c  Savepoint()) cal
18020 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20 20 2a 2a  lbacks..      **
18030 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 72   If this is a tr
18040 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
18050 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  int being opened
18060 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
18070 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ed.      ** that
18080 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
18090 5b 5d 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  [] array is empt
180a0 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  y.  */.      ass
180b0 65 72 74 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  ert( db->autoCom
180c0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56  mit==0 || db->nV
180d0 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Trans==0 );.    
180e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
180f0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
18100 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c  SAVEPOINT_BEGIN,
18110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b   db->nStatement+
18140 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
18150 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18160 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18170 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
18180 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  or;.#endif..    
18190 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
181a0 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74 72 75  w savepoint stru
181b0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cture. */.      
181c0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
181d0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
181e0 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e 74  sizeof(Savepoint
181f0 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  )+nName+1);.    
18200 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
18210 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
18220 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65  e = (char *)&pNe
18230 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  w[1];.        me
18240 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65  mcpy(pNew->zName
18250 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
18260 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20  );.    .        
18270 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
18280 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  o open transacti
18290 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  on, then mark th
182a0 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 0a  is as a special.
182b0 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61 6e          ** "tran
182c0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
182d0 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t". */.        i
182e0 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
182f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  t ){.          d
18300 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
18310 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
18320 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
18330 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20  vepoint = 1;.   
18340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18350 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70        db->nSavep
18360 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  oint++;.        
18370 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  }..        /* Li
18380 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76 65 70  nk the new savep
18390 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 64 61  oint into the da
183a0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27 73 20  tabase handle's 
183b0 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  list. */.       
183c0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 64   pNew->pNext = d
183d0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
183e0 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65         db->pSave
183f0 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20  point = pNew;.  
18400 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66        pNew->nDef
18410 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62 2d 3e  erredCons = db->
18420 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20  nDeferredCons;. 
18430 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65         pNew->nDe
18440 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
18450 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
18460 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cons;.      }.  
18470 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18480 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b   iSavepoint = 0;
18490 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
184a0 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e  e named savepoin
184b0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  t. If there is n
184c0 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  o such savepoint
184d0 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a  , then an.    **
184e0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
184f0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
18500 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a  r.  */.    for(.
18510 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
18520 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
18530 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65 70  t; .      pSavep
18540 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53  oint && sqlite3S
18550 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e  trICmp(pSavepoin
18560 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  t->zName, zName)
18570 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69  ;.      pSavepoi
18580 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt = pSavepoint-
18590 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20  >pNext.    ){.  
185a0 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b      iSavepoint++
185b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
185c0 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  !pSavepoint ){. 
185d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
185e0 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73 75 63  Error(p, "no suc
185f0 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22  h savepoint: %s"
18600 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18610 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
18620 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
18630 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
18640 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49  0 && p1==SAVEPOI
18650 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
18660 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18670 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 6c   possible to rel
18680 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20  ease (commit) a 
18690 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68 65  savepoint if the
186a0 72 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a 2a  re are .      **
186b0 20 61 63 74 69 76 65 20 77 72 69 74 65 20 73 74   active write st
186c0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20  atements..      
186d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
186e0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61  VdbeError(p, "ca
186f0 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20 73 61 76  nnot release sav
18700 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20  epoint - ".     
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d       "SQL statem
18730 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
18740 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
18750 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
18760 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f 2a  }else{..      /*
18770 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
18780 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 69  er or not this i
18790 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
187a0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 73 6f  savepoint. If so
187b0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  ,.      ** and t
187c0 68 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45  his is a RELEASE
187d0 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 74   command, then t
187e0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
187f0 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  action .      **
18800 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 0a   is committed. .
18810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18820 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  nt isTransaction
18830 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
18840 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e 69  Next==0 && db->i
18850 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
18860 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69 66 28  point;.      if(
18870 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 26   isTransaction &
18880 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & p1==SAVEPOINT_
18890 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
188a0 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
188b0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
188c0 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
188d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
188e0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
188f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18900 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
18910 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t = 1;.        i
18920 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  f( sqlite3VdbeHa
18930 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55  lt(p)==SQLITE_BU
18940 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
18950 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  p->pc = (int)(pO
18960 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20  p - aOp);.      
18970 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
18980 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
18990 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
189a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
189b0 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
189c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
189d0 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73  }.        db->is
189e0 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
189f0 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  oint = 0;.      
18a00 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20    rc = p->rc;.  
18a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18a20 20 20 20 69 6e 74 20 69 73 53 63 68 65 6d 61 43     int isSchemaC
18a30 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 69  hange;.        i
18a40 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e  Savepoint = db->
18a50 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53 61  nSavepoint - iSa
18a60 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20  vepoint - 1;.   
18a70 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56       if( p1==SAV
18a80 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
18a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53  ){.          isS
18aa0 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64  chemaChange = (d
18ab0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
18ac0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
18ad0 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  !=0;.          f
18ae0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e  or(ii=0; ii<db->
18af0 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
18b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18b10 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
18b20 43 75 72 73 6f 72 73 28 64 62 2d 3e 61 44 62 5b  Cursors(db->aDb[
18b30 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20 20 20 20  ii].pBt,.       
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
18b70 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20 20 20 20  LBACK,.         
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
18ba0 53 63 68 65 6d 61 43 68 61 6e 67 65 3d 3d 30 29  SchemaChange==0)
18bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
18bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18bd0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
18be0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
18bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18c10 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d  isSchemaChange =
18c20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
18c30 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
18c40 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
18c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18c60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
18c70 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  vepoint(db->aDb[
18c80 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61  ii].pBt, p1, iSa
18c90 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
18ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18cc0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
18cd0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
18ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18d00 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 29  isSchemaChange )
18d10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
18d20 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
18d30 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
18d40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18d50 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
18d60 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
18d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
18d80 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
18d90 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
18da0 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
18db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18dc0 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72   .      /* Regar
18dd0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
18de0 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
18df0 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20  SE or ROLLBACK, 
18e00 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20  destroy all .   
18e10 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73     ** savepoints
18e20 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f   nested inside o
18e30 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
18e40 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
18e50 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  n. */.      whil
18e60 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
18e70 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  t!=pSavepoint ){
18e80 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20  .        pTmp = 
18e90 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
18ea0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
18eb0 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
18ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
18ed0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18ee0 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
18ef0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
18f00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18f10 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
18f20 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
18f30 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
18f40 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
18f50 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f   on .      ** to
18f60 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52 4f  o. If it is a RO
18f70 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20  LLBACK TO, then 
18f80 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  set the number o
18f90 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20 20  f deferred .    
18fa0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
18fb0 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73 65  violations prese
18fc0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
18fd0 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  se to the value 
18fe0 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20  stored.      ** 
18ff0 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69  when the savepoi
19000 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 20  nt was created. 
19010 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 31   */.      if( p1
19020 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
19030 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ASE ){.        a
19040 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69 6e  ssert( pSavepoin
19050 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t==db->pSavepoin
19060 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  t );.        db-
19070 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53  >pSavepoint = pS
19080 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b  avepoint->pNext;
19090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
190a0 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76 65  DbFree(db, pSave
190b0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
190c0 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
190d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
190e0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
190f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19110 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
19120 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ns = pSavepoint-
19130 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a  >nDeferredCons;.
19140 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
19150 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70  erredImmCons = p
19160 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65  Savepoint->nDefe
19170 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  rredImmCons;.   
19180 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
19190 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 7c  !isTransaction |
191a0 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | p1==SAVEPOINT_
191b0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
191c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
191d0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
191e0 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74  , p1, iSavepoint
191f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19210 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
19220 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
19230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19240 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
19250 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
19260 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
19270 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69 74  code: AutoCommit
19280 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
19290 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  ** Set the datab
192a0 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  ase auto-commit 
192b0 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f 72  flag to P1 (1 or
192c0 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74 72   0). If P2 is tr
192d0 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b  ue, roll.** back
192e0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 61   any currently a
192f0 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61 6e  ctive btree tran
19300 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 65  sactions. If the
19310 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76  re are any activ
19320 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74 20  e.** VMs (apart 
19330 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c 20  from this one), 
19340 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20  then a ROLLBACK 
19350 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49 54  fails.  A COMMIT
19360 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68 65   fails if.** the
19370 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72  re are active wr
19380 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63 74  iting VMs or act
19390 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73 65  ive VMs that use
193a0 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a 2a   shared cache..*
193b0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
193c0 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68 65  ction causes the
193d0 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a   VM to halt..*/.
193e0 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
193f0 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73 69  it: {.  int desi
19400 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
19410 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a   int iRollback;.
19420 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  .  desiredAutoCo
19430 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  mmit = pOp->p1;.
19440 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f    iRollback = pO
19450 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
19460 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19470 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65 64  it==1 || desired
19480 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b  AutoCommit==0 );
19490 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72  .  assert( desir
194a0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
194b0 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20  || iRollback==0 
194c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
194d0 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 29  >nVdbeActive>0 )
194e0 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 74  ;  /* At least t
194f0 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61 63  his one VM is ac
19500 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
19510 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
19520 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  ;..  if( desired
19530 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e  AutoCommit!=db->
19540 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
19550 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b 20    if( iRollback 
19560 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19570 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19580 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  it==1 );.      s
19590 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
195a0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
195b0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
195c0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
195d0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  it = 1;.    }els
195e0 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74  e if( desiredAut
195f0 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 6e  oCommit && db->n
19600 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a 20  VdbeWrite>0 ){. 
19610 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
19620 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c  instruction impl
19630 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20  ements a COMMIT 
19640 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72  and other VMs ar
19650 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 20 20  e writing.      
19660 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ** return an err
19670 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  or indicating th
19680 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73  at the other VMs
19690 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66   must complete f
196a0 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  irst. .      */.
196b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
196c0 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f  eError(p, "canno
196d0 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63  t commit transac
196e0 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20  tion - ".       
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e     "SQL statemen
19710 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29  ts in progress")
19720 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
19730 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19740 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19750 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
19760 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
19770 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
19780 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
19790 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
197a0 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
197b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
197c0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
197d0 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43 6f  u8)desiredAutoCo
197e0 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  mmit;.    }.    
197f0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48  if( sqlite3VdbeH
19800 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42  alt(p)==SQLITE_B
19810 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  USY ){.      p->
19820 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  pc = (int)(pOp -
19830 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 62 2d   aOp);.      db-
19840 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28 75  >autoCommit = (u
19850 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 74 6f  8)(1-desiredAuto
19860 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  Commit);.      p
19870 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49  ->rc = rc = SQLI
19880 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
19890 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
198a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
198b0 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
198c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
198d0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
198e0 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  ts(db);.    if( 
198f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19900 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19910 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19930 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
19940 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76      }.    goto v
19950 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65  dbe_return;.  }e
19960 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19970 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20  VdbeError(p,.   
19980 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41 75       (!desiredAu
19990 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f  toCommit)?"canno
199a0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
199b0 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74  ction within a t
199c0 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20  ransaction":(.  
199d0 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b        (iRollback
199e0 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  )?"cannot rollba
199f0 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
19a00 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a 0a  ion is active":.
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
19a30 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
19a40 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29 3b  on is active"));
19a50 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 72  .         .    r
19a60 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
19a70 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
19a80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
19a90 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
19aa0 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73 61  * Opcode: Transa
19ab0 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
19ac0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e  4 P5.**.** Begin
19ad0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
19ae0 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 69 66  n database P1 if
19af0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19b00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
19b10 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66 20 50   active..** If P
19b20 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  2 is non-zero, t
19b30 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
19b40 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
19b50 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  ed, or if a .** 
19b60 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19b70 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
19b80 76 65 2c 20 69 74 20 69 73 20 75 70 67 72 61 64  ve, it is upgrad
19b90 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d 74 72  ed to a write-tr
19ba0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66  ansaction..** If
19bb0 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P2 is zero, the
19bc0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
19bd0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e  tion is started.
19be0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
19bf0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
19c00 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 77  tabase file on w
19c10 68 69 63 68 20 74 68 65 20 74 72 61 6e 73 61 63  hich the transac
19c20 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74  tion is.** start
19c30 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73 20  ed.  Index 0 is 
19c40 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19c50 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64 65 78  e file and index
19c60 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c   1 is the.** fil
19c70 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
19c80 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e  rary tables.  In
19c90 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20 6d 6f  dices of 2 or mo
19ca0 72 65 20 61 72 65 20 75 73 65 64 20 66 6f 72 0a  re are used for.
19cb0 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
19cc0 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bases..**.** If 
19cd0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19ce0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 61  ion is started a
19cf0 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73 65 73  nd the Vdbe.uses
19d00 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c 61 67  StmtJournal flag
19d10 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74 68 69   is.** true (thi
19d20 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66  s flag is set if
19d30 20 74 68 65 20 56 64 62 65 20 6d 61 79 20 6d 6f   the Vdbe may mo
19d40 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f  dify more than o
19d50 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79 0a 2a  ne row and may.*
19d60 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
19d70 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61 20 73   exception), a s
19d80 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
19d90 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20 62 65  tion may also be
19da0 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65   opened..** More
19db0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 61   specifically, a
19dc0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
19dd0 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
19de0 20 69 66 66 20 74 68 65 20 64 61 74 61 62 61 73   iff the databas
19df0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
19e00 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
19e10 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
19e20 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ode, or if there
19e30 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20 61 63   are other.** ac
19e40 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  tive statements.
19e50 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   A statement tra
19e60 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20  nsaction allows 
19e70 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
19e80 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44 42 45   by this.** VDBE
19e90 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
19ea0 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ck after an erro
19eb0 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  r without having
19ec0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
19ed0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72 61 6e  e.** entire tran
19ee0 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f 20 65  saction. If no e
19ef0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
19f00 72 65 64 2c 20 74 68 65 20 73 74 61 74 65 6d 65  red, the stateme
19f10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  nt transaction.*
19f20 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  * will automatic
19f30 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68 65 6e  ally commit when
19f40 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73 2e   the VDBE halts.
19f50 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20  .**.** If P5!=0 
19f60 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
19f70 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68 65   also checks the
19f80 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
19f90 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61 6e 64  gainst P3.** and
19fa0 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65   the schema gene
19fb0 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 61  ration counter a
19fc0 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20 54 68  gainst P4..** Th
19fd0 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
19fe0 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
19ff0 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
1a000 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
1a010 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
1a020 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
1a030 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
1a040 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
1a050 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
1a060 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
1a070 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
1a080 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
1a090 2e 20 20 49 66 20 74 68 65 20 73 63 68 65 6d 61  .  If the schema
1a0a0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20 50 33  .** cookie in P3
1a0b0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
1a0c0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1a0d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a0e0 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69 66 20  header or.** if 
1a0f0 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65 72  the schema gener
1a100 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ation counter in
1a110 20 50 34 20 64 69 66 66 65 72 73 20 66 72 6f 6d   P4 differs from
1a120 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1a130 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74  generation count
1a140 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49  er, then an SQLI
1a150 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f 72 20  TE_SCHEMA error 
1a160 69 73 20 72 61 69 73 65 64 20 61 6e 64 20 65 78  is raised and ex
1a170 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74 73  ecution.** halts
1a180 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  .  The sqlite3_s
1a190 74 65 70 28 29 20 77 72 61 70 70 65 72 20 66 75  tep() wrapper fu
1a1a0 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74 68 65  nction might the
1a1b0 6e 20 72 65 70 72 65 70 61 72 65 20 74 68 65 0a  n reprepare the.
1a1c0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  ** statement and
1a1d0 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d 20 74   rerun it from t
1a1e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f  he beginning..*/
1a1f0 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63  .case OP_Transac
1a200 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20  tion: {.  Btree 
1a210 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d 65 74  *pBt;.  int iMet
1a220 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a 0a  a;.  int iGen;..
1a230 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
1a240 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Reader );.  asse
1a250 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
1a260 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 30  =0 || pOp->p2==0
1a270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1a280 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1a290 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
1a2a0 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1a2b0 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1a2c0 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  , pOp->p1) );.  
1a2d0 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 28  if( pOp->p2 && (
1a2e0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a2f0 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21 3d 30  TE_QueryOnly)!=0
1a300 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a310 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1a320 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1a330 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
1a340 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
1a350 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20  Op->p1].pBt;..  
1a360 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72  if( pBt ){.    r
1a370 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a380 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
1a390 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 74 65  pOp->p2);.    te
1a3a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
1a3b0 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1a3c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1a3d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1a3e0 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a 20 20  Y_RECOVERY );.  
1a3f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1a410 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
1a420 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
1a430 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29     p->pc = (int)
1a440 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
1a450 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
1a460 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64  .        goto vd
1a470 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
1a480 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62   }.      goto ab
1a490 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1a4a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1a4b0 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75   pOp->p2 && p->u
1a4c0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a  sesStmtJournal .
1a4d0 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75 74       && (db->aut
1a4e0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
1a4f0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20 0a  ->nVdbeRead>1) .
1a500 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1a510 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1a520 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
1a530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1a540 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b  iStatement==0 ){
1a550 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a560 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
1a570 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70  =0 && db->nSavep
1a580 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20  oint>=0 );.     
1a590 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
1a5a0 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  t++; .        p-
1a5b0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62  >iStatement = db
1a5c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64  ->nSavepoint + d
1a5d0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20  b->nStatement;. 
1a5e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
1a5f0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
1a600 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
1a610 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e  POINT_BEGIN, p->
1a620 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20  iStatement-1);. 
1a630 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a660 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74  reeBeginStmt(pBt
1a670 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29  , p->iStatement)
1a680 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a690 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63 75   /* Store the cu
1a6a0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
1a6b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1a6c0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
1a6d0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a  straint.      **
1a6e0 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68 65   counter. If the
1a6f0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1a700 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
1a710 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a  be rolled back,.
1a720 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
1a730 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e 74  ue of this count
1a740 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  er needs to be r
1a750 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f  estored too.  */
1a760 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44  .      p->nStmtD
1a770 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  efCons = db->nDe
1a780 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20  ferredCons;.    
1a790 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d    p->nStmtDefImm
1a7a0 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65  Cons = db->nDefe
1a7b0 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  rredImmCons;.   
1a7c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65   }..    /* Gathe
1a7d0 72 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72  r the schema ver
1a7e0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20  sion number for 
1a7f0 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20 20 2a 2a  checking:.    **
1a800 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1a810 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35 31 31 33  OF: R-03189-5113
1a820 35 20 41 73 20 65 61 63 68 20 53 51 4c 20 73 74  5 As each SQL st
1a830 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c 20 74 68  atement runs, th
1a840 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20  e schema.    ** 
1a850 76 65 72 73 69 6f 6e 20 69 73 20 63 68 65 63 6b  version is check
1a860 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1a870 74 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  t the schema has
1a880 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e   not changed sin
1a890 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ce the.    ** SQ
1a8a0 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  L statement was 
1a8b0 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  prepared..    */
1a8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a8d0 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54  eGetMeta(pBt, BT
1a8e0 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
1a8f0 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ON, (u32 *)&iMet
1a900 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20 64  a);.    iGen = d
1a910 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
1a920 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1a930 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
1a940 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61 20     iGen = iMeta 
1a950 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1a960 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c  t( pOp->p5==0 ||
1a970 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1a980 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66 28 20  _INT32 );.  if( 
1a990 70 4f 70 2d 3e 70 35 20 26 26 20 28 69 4d 65 74  pOp->p5 && (iMet
1a9a0 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c 20 69 47  a!=pOp->p3 || iG
1a9b0 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29 20 29  en!=pOp->p4.i) )
1a9c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1a9d0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
1a9e0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
1a9f0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
1aa00 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61 62  trDup(db, "datab
1aa10 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
1aa20 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a  hanged");.    /*
1aa30 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63   If the schema-c
1aa40 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64  ookie from the d
1aa50 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74  atabase file mat
1aa60 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ches the cookie 
1aa70 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77  .    ** stored w
1aa80 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ith the in-memor
1aa90 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
1aaa0 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20   of the schema, 
1aab0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65  do.    ** not re
1aac0 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  load the schema 
1aad0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1aae0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1aaf0 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c     ** If virtual
1ab00 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75  -tables are in u
1ab10 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  se, this is not 
1ab20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61  just an optimiza
1ab30 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74  tion..    ** Oft
1ab40 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f  en, v-tables sto
1ab50 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69 6e  re their data in
1ab60 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61   other SQLite ta
1ab70 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20  bles, which.    
1ab80 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20 66  ** are queried f
1ab90 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74  rom within xNext
1aba0 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74  () and other v-t
1abb0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69  able methods usi
1abc0 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72  ng.    ** prepar
1abd0 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20 73  ed queries. If s
1abe0 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20 6f  uch a query is o
1abf0 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64  ut-of-date, we d
1ac00 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20  o not want to.  
1ac10 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
1ac20 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1ac30 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f  , as the user co
1ac40 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  de implementing 
1ac50 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62  the.    ** v-tab
1ac60 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  le would have to
1ac70 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74 68   be ready for th
1ac80 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
1ac90 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a  tructure itself.
1aca0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
1acb0 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76 65  alidated wheneve
1acc0 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  r sqlite3_step()
1acd0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1ace0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61  within .    ** a
1acf0 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e   v-table method.
1ad00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad10 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1ad20 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1ad30 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29  _cookie!=iMeta )
1ad40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1ad50 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62  esetOneSchema(db
1ad60 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
1ad70 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  }.    p->expired
1ad80 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
1ad90 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20  QLITE_SCHEMA;.  
1ada0 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  }.  if( rc ) got
1adb0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1adc0 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
1add0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  ../* Opcode: Rea
1ade0 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  dCookie P1 P2 P3
1adf0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20   * *.**.** Read 
1ae00 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33  cookie number P3
1ae10 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50   from database P
1ae20 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69  1 and write it i
1ae30 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
1ae40 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65  .** P3==1 is the
1ae50 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
1ae60 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64    P3==2 is the d
1ae70 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
1ae80 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20  ** P3==3 is the 
1ae90 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
1aea0 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e  r cache size, an
1aeb0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d  d so forth.  P1=
1aec0 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69  =0 is.** the mai
1aed0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1aee0 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65  and P1==1 is the
1aef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1af00 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
1af10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
1af20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1af30 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63  st be a read-loc
1af40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1af50 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e  e (either a tran
1af60 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
1af70 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68  be started or th
1af80 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1af90 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f  pen cursor) befo
1afa0 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  re.** executing 
1afb0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1afc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
1afd0 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20  dCookie: {      
1afe0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
1aff0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b   */.  int iMeta;
1b000 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
1b010 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73  t iCookie;..  as
1b020 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1b030 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20 70 4f  er );.  iDb = pO
1b040 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65  p->p1;.  iCookie
1b050 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
1b060 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51  sert( pOp->p3<SQ
1b070 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
1b080 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  A );.  assert( i
1b090 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1b0a0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1b0b0 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1b0c0 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
1b0d0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
1b0e0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
1b0f0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   );..  sqlite3Bt
1b100 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e 61  reeGetMeta(db->a
1b110 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43 6f  Db[iDb].pBt, iCo
1b120 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69 4d  okie, (u32 *)&iM
1b130 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  eta);.  pOut = o
1b140 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
1b150 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75   pOp);.  pOut->u
1b160 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20 62 72  .i = iMeta;.  br
1b170 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1b180 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31 20  e: SetCookie P1 
1b190 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
1b1a0 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  Write the intege
1b1b0 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74 6f 20  r value P3 into 
1b1c0 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 32  cookie number P2
1b1d0 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 2e   of database P1.
1b1e0 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74 68 65  .** P2==1 is the
1b1f0 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
1b200 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65 20 64    P2==2 is the d
1b210 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
1b220 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68 65 20  ** P2==3 is the 
1b230 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
1b240 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a 65  r cache .** size
1b250 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
1b260 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d 61   P1==0 is the ma
1b270 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1b280 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
1b290 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
1b2a0 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ile used to stor
1b2b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b2c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  es..**.** A tran
1b2d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1b2e0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 65  started before e
1b2f0 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f 70  xecuting this op
1b300 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  code..*/.case OP
1b310 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20  _SetCookie: {.  
1b320 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72  Db *pDb;.  asser
1b330 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54  t( pOp->p2<SQLIT
1b340 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29  E_N_BTREE_META )
1b350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b360 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1b370 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
1b380 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
1b390 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
1b3a0 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73  pOp->p1) );.  as
1b3b0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
1b3c0 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  y==0 );.  pDb = 
1b3d0 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
1b3e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
1b3f0 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
1b400 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1b410 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1b420 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a   pOp->p1, 0) );.
1b430 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61 62    /* See note ab
1b440 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74 69  out index shifti
1b450 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f  ng on OP_ReadCoo
1b460 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  kie */.  rc = sq
1b470 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1b480 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 70  Meta(pDb->pBt, p
1b490 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29  Op->p2, pOp->p3)
1b4a0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  ;.  if( pOp->p2=
1b4b0 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45  =BTREE_SCHEMA_VE
1b4c0 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  RSION ){.    /* 
1b4d0 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  When the schema 
1b4e0 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20  cookie changes, 
1b4f0 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63  record the new c
1b500 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ookie internally
1b510 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
1b520 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
1b530 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  kie = pOp->p3;. 
1b540 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
1b550 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1b560 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nges;.  }else if
1b570 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45  ( pOp->p2==BTREE
1b580 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a  _FILE_FORMAT ){.
1b590 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68      /* Record ch
1b5a0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  anges in the fil
1b5b0 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e format */.    
1b5c0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1b5d0 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 4f 70 2d  le_format = pOp-
1b5e0 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >p3;.  }.  if( p
1b5f0 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20  Op->p1==1 ){.   
1b600 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
1b610 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ll prepared stat
1b620 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65 72 20  ements whenever 
1b630 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
1b640 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20  e.    ** schema 
1b650 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54 69 63  is changed.  Tic
1b660 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20 20 20  ket #1644 */.   
1b670 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
1b680 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
1b690 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70  (db);.    p->exp
1b6a0 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ired = 0;.  }.  
1b6b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1b6c0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1b6d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1b6e0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61   Opcode: OpenRea
1b6f0 64 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  d P1 P2 P3 P4 P5
1b700 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f  .** Synopsis: ro
1b710 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a  ot=P2 iDb=P3.**.
1b720 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  ** Open a read-o
1b730 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20 74  nly cursor for t
1b740 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
1b750 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  e whose root pag
1b760 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20  e is.** P2 in a 
1b770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1b780 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1b790 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
1b7a0 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30  by P3. .** P3==0
1b7b0 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
1b7c0 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31 20  database, P3==1 
1b7d0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1b7e0 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  se used for .** 
1b7f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
1b800 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73  , and P3>1 means
1b810 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65 73   used the corres
1b820 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65 64  ponding attached
1b830 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 47  .** database.  G
1b840 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72 73  ive the new curs
1b850 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  or an identifier
1b860 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31 0a   of P1.  The P1.
1b870 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20 6e  ** values need n
1b880 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  ot be contiguous
1b890 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c 75   but all P1 valu
1b8a0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d 61  es should be sma
1b8b0 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20  ll integers..** 
1b8c0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66  It is an error f
1b8d0 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67 61  or P1 to be nega
1b8e0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tive..**.** If P
1b8f0 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 74 68  5!=0 then use th
1b900 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1b910 69 73 74 65 72 20 50 32 20 61 73 20 74 68 65 20  ister P2 as the 
1b920 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a  root page, not.*
1b930 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * the value of P
1b940 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  2 itself..**.** 
1b950 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20  There will be a 
1b960 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b970 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 65 76   database whenev
1b980 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  er there is an.*
1b990 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20  * open cursor.  
1b9a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1b9b0 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69  was unlocked pri
1b9c0 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72  or to this instr
1b9d0 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61  uction.** then a
1b9e0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63   read lock is ac
1b9f0 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f  quired as part o
1ba00 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
1ba10 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c  on.  A read.** l
1ba20 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72  ock allows other
1ba30 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65   processes to re
1ba40 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1ba50 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a  but prohibits.**
1ba60 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
1ba70 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e  ss from modifyin
1ba80 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
1ba90 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69   The read lock i
1baa0 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68  s.** released wh
1bab0 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1bac0 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74  re closed.  If t
1bad0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1bae0 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67  attempts.** to g
1baf0 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62  et a read lock b
1bb00 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63  ut fails, the sc
1bb10 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20  ript terminates 
1bb20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
1bb30 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64  E_BUSY error cod
1bb40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
1bb50 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
1bb60 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
1bb70 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
1bb80 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
1bb90 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1bba0 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
1bbb0 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
1bbc0 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
1bbd0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
1bbe0 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
1bbf0 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
1bc00 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1bc10 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1bc20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
1bc30 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
1bc40 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
1bc50 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
1bc60 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
1bc70 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1bc80 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1bc90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  table..**.** See
1bca0 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69 74 65   also: OpenWrite
1bcb0 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a 2f  , ReopenIdx.*/./
1bcc0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70 65 6e  * Opcode: Reopen
1bcd0 49 64 78 20 50 31 20 50 32 20 50 33 20 50 34 20  Idx P1 P2 P3 P4 
1bce0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1bcf0 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1bd00 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e 49  *.** The ReopenI
1bd10 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  dx opcode works 
1bd20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 52 65 61  exactly like Rea
1bd30 64 4f 70 65 6e 20 65 78 63 65 70 74 20 74 68 61  dOpen except tha
1bd40 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20 63 68  t it first.** ch
1bd50 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
1bd60 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50 31 20  he cursor on P1 
1bd70 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
1bd80 77 69 74 68 20 61 20 72 6f 6f 74 20 70 61 67 65  with a root page
1bd90 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 50 32  .** number of P2
1bda0 20 61 6e 64 20 69 66 20 69 74 20 69 73 20 74 68   and if it is th
1bdb0 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f 6d 65  is opcode become
1bdc0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20 6f  s a no-op.  In o
1bdd0 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 69  ther words,.** i
1bde0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bdf0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 64 6f  already open, do
1be00 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74 2e 0a   not reopen it..
1be10 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e  **.** The Reopen
1be20 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79 20 6f  Idx opcode may o
1be30 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
1be40 20 50 35 3d 3d 30 20 61 6e 64 20 77 69 74 68 20   P5==0 and with 
1be50 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61 20 50 34  P4 being.** a P4
1be60 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63 74 2e  _KEYINFO object.
1be70 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74    Furthermore, t
1be80 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74  he P3 value must
1be90 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
1bea0 2a 2a 20 65 76 65 72 79 20 6f 74 68 65 72 20 52  ** every other R
1beb0 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70 65 6e  eopenIdx or Open
1bec0 52 65 61 64 20 66 6f 72 20 74 68 65 20 73 61 6d  Read for the sam
1bed0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  e cursor number.
1bee0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 4f  .**.** See the O
1bef0 70 65 6e 52 65 61 64 20 6f 70 63 6f 64 65 20 64  penRead opcode d
1bf00 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
1bf10 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1bf20 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  rmation..*/./* O
1bf30 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69 74 65  pcode: OpenWrite
1bf40 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
1bf50 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f  ** Synopsis: roo
1bf60 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a  t=P2 iDb=P3.**.*
1bf70 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f 77 72  * Open a read/wr
1bf80 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d 65 64  ite cursor named
1bf90 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   P1 on the table
1bfa0 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
1bfb0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
1bfc0 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21 3d 30  P2.  Or if P5!=0
1bfd0 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   use the content
1bfe0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
1bff0 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 72  to find the.** r
1c000 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  oot page..**.** 
1c010 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1c020 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1c030 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1c040 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1c050 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1c060 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1c070 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1c080 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1c090 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
1c0a0 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73  ure, then said s
1c0b0 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73  tructure defines
1c0c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64   the content and
1c0d0 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73   collating .** s
1c0e0 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69  equence of the i
1c0f0 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65  ndex being opene
1c100 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1c110 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65   P4 is an intege
1c120 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20  r .** value, it 
1c130 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1c140 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1c150 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1c160 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65   to the.** large
1c170 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e 79 20  st index of any 
1c180 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
1c190 62 6c 65 20 74 68 61 74 20 69 73 20 61 63 74 75  ble that is actu
1c1a0 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ally used..**.**
1c1b0 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
1c1c0 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  n works just lik
1c1d0 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63 65 70  e OpenRead excep
1c1e0 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20  t that it opens 
1c1f0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e  the cursor.** in
1c200 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65   read/write mode
1c210 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e 20 74  .  For a given t
1c220 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61 6e 20  able, there can 
1c230 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  be one or more r
1c240 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
1c250 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c 65 20  ors or a single 
1c260 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
1c270 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a  r but not both..
1c280 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f  **.** See also O
1c290 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65  penRead..*/.case
1c2a0 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a 20 7b   OP_ReopenIdx: {
1c2b0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
1c2c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c2d0 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20  fo;.  int p2;.  
1c2e0 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 77  int iDb;.  int w
1c2f0 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20 2a  rFlag;.  Btree *
1c300 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  pX;.  VdbeCursor
1c310 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70 44   *pCur;.  Db *pD
1c320 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
1c330 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
1c340 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b  >p5==OPFLAG_SEEK
1c350 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
1c360 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1c370 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70 43 75  KEYINFO );.  pCu
1c380 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
1c390 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 43 75  ->p1];.  if( pCu
1c3a0 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e 6f 52  r && pCur->pgnoR
1c3b0 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d 3e 70  oot==(u32)pOp->p
1c3c0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
1c3d0 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f 70 2d   pCur->iDb==pOp-
1c3e0 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 47  >p3 );      /* G
1c3f0 75 61 72 61 6e 74 65 65 64 20 62 79 20 74 68 65  uaranteed by the
1c400 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1c410 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  */.    goto open
1c420 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69 6e 74  _cursor_set_hint
1c430 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  s;.  }.  /* If t
1c440 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1c450 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
1c460 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20  or is open on a 
1c470 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 69  different.  ** i
1c480 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c 6c 20  ndex, then fall 
1c490 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
1c4a0 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f 72 63  OpenRead to forc
1c4b0 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a 63 61  e a reopen */.ca
1c4c0 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3a 0a  se OP_OpenRead:.
1c4d0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74  case OP_OpenWrit
1c4e0 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  e:..  assert( pO
1c4f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
1c500 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70 2d 3e  enWrite || pOp->
1c510 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35  p5==0 || pOp->p5
1c520 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20  ==OPFLAG_SEEKEQ 
1c530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1c540 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61  bIsReader );.  a
1c550 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1c560 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20  de==OP_OpenRead 
1c570 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
1c580 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20 20 20  OP_ReopenIdx.   
1c590 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 65 61         || p->rea
1c5a0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69  dOnly==0 );..  i
1c5b0 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  f( p->expired ){
1c5c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c5d0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3b  _ABORT_ROLLBACK;
1c5e0 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
1c5f0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1c600 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b  }..  nField = 0;
1c610 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  .  pKeyInfo = 0;
1c620 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
1c630 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33  .  iDb = pOp->p3
1c640 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
1c650 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
1c660 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
1c670 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1c680 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a  eeMask, iDb) );.
1c690 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1c6a0 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44  [iDb];.  pX = pD
1c6b0 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  b->pBt;.  assert
1c6c0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pX!=0 );.  if(
1c6d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1c6e0 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20  _OpenWrite ){.  
1c6f0 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
1c700 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42 54 52 45  _FORDELETE==BTRE
1c710 45 5f 46 4f 52 44 45 4c 45 54 45 20 29 3b 0a 20  E_FORDELETE );. 
1c720 20 20 20 77 72 46 6c 61 67 20 3d 20 42 54 52 45     wrFlag = BTRE
1c730 45 5f 57 52 43 53 52 20 7c 20 28 70 4f 70 2d 3e  E_WRCSR | (pOp->
1c740 70 35 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44  p5 & OPFLAG_FORD
1c750 45 4c 45 54 45 29 3b 0a 20 20 20 20 61 73 73 65  ELETE);.    asse
1c760 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1c770 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
1c780 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
1c790 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
1c7a0 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20 70 2d  file_format < p-
1c7b0 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
1c7c0 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  mat ){.      p->
1c7d0 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
1c7e0 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68 65 6d  at = pDb->pSchem
1c7f0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a  a->file_format;.
1c800 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c810 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b 0a 20     wrFlag = 0;. 
1c820 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35   }.  if( pOp->p5
1c830 20 26 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45   & OPFLAG_P2ISRE
1c840 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  G ){.    assert(
1c850 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61 73 73   p2>0 );.    ass
1c860 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e 6e 4d 65  ert( p2<=(p->nMe
1c870 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
1c880 29 20 29 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20  ) );.    pIn2 = 
1c890 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20 20 61  &aMem[p2];.    a
1c8a0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
1c8b0 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20 20 61  d(pIn2) );.    a
1c8c0 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c  ssert( (pIn2->fl
1c8d0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
1c8e0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1c8f0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
1c900 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70 32 20  y(pIn2);.    p2 
1c910 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75 2e 69  = (int)pIn2->u.i
1c920 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 32 20  ;.    /* The p2 
1c930 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63 6f 6d  value always com
1c940 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  es from a prior 
1c950 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
1c960 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 2a 2a  pcode and.    **
1c970 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77 69 6c   that opcode wil
1c980 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 65  l always set the
1c990 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32 20 6f   p2 value to 2 o
1c9a0 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65 20 66  r more or else f
1c9b0 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ail..    ** If t
1c9c0 68 65 72 65 20 77 65 72 65 20 61 20 66 61 69 6c  here were a fail
1c9d0 75 72 65 2c 20 74 68 65 20 70 72 65 70 61 72 65  ure, the prepare
1c9e0 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  d statement woul
1c9f0 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a 20 20  d have halted.  
1ca00 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65 61 63    ** before reac
1ca10 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75  hing this instru
1ca20 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73  ction. */.    as
1ca30 73 65 72 74 28 20 70 32 3e 3d 32 20 29 3b 0a 20  sert( p2>=2 );. 
1ca40 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34   }.  if( pOp->p4
1ca50 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1ca60 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   ){.    pKeyInfo
1ca70 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
1ca80 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nfo;.    assert(
1ca90 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d   pKeyInfo->enc==
1caa0 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 61  ENC(db) );.    a
1cab0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1cac0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 6e  >db==db );.    n
1cad0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
1cae0 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1caf0 6f 2d 3e 6e 58 46 69 65 6c 64 3b 0a 20 20 7d 65  o->nXField;.  }e
1cb00 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  lse if( pOp->p4t
1cb10 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ype==P4_INT32 ){
1cb20 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  .    nField = pO
1cb30 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61  p->p4.i;.  }.  a
1cb40 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1cb50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1cb60 46 69 65 6c 64 3e 3d 30 20 29 3b 0a 20 20 74 65  Field>=0 );.  te
1cb70 73 74 63 61 73 65 28 20 6e 46 69 65 6c 64 3d 3d  stcase( nField==
1cb80 30 20 29 3b 20 20 2f 2a 20 54 61 62 6c 65 20 77  0 );  /* Table w
1cb90 69 74 68 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ith INTEGER PRIM
1cba0 41 52 59 20 4b 45 59 20 61 6e 64 20 6e 6f 74 68  ARY KEY and noth
1cbb0 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20 20 70 43  ing else */.  pC
1cbc0 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
1cbd0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
1cbe0 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20 43 55 52  nField, iDb, CUR
1cbf0 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69  TYPE_BTREE);.  i
1cc00 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67 6f 74  f( pCur==0 ) got
1cc10 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75 72  o no_mem;.  pCur
1cc20 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
1cc30 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72 65 64   pCur->isOrdered
1cc40 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 70 67   = 1;.  pCur->pg
1cc50 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b 0a 23 69 66  noRoot = p2;.#if
1cc60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1cc70 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1cc80 3d 20 77 72 46 6c 61 67 3b 0a 23 65 6e 64 69 66  = wrFlag;.#endif
1cc90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1cca0 74 72 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70  treeCursor(pX, p
1ccb0 32 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  2, wrFlag, pKeyI
1ccc0 6e 66 6f 2c 20 70 43 75 72 2d 3e 75 63 2e 70 43  nfo, pCur->uc.pC
1ccd0 75 72 73 6f 72 29 3b 0a 20 20 70 43 75 72 2d 3e  ursor);.  pCur->
1cce0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1ccf0 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74 20 74 68  nfo;.  /* Set th
1cd00 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69 73 54  e VdbeCursor.isT
1cd10 61 62 6c 65 20 76 61 72 69 61 62 6c 65 2e 20 50  able variable. P
1cd20 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
1cd30 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   of.  ** SQLite 
1cd40 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
1cd50 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66   the root-page f
1cd60 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61  lags were sane a
1cd70 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a  t this point.  *
1cd80 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74  * and report dat
1cd90 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1cda0 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f   if they were no
1cdb0 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63  t, but this chec
1cdc0 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65  k has.  ** since
1cdd0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
1cde0 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f  btree layer.  */
1cdf0 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62    .  pCur->isTab
1ce00 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65  le = pOp->p4type
1ce10 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 0a 6f  !=P4_KEYINFO;..o
1ce20 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68  pen_cursor_set_h
1ce30 69 6e 74 73 3a 0a 20 20 61 73 73 65 72 74 28 20  ints:.  assert( 
1ce40 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 3d 3d  OPFLAG_BULKCSR==
1ce50 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 29  BTREE_BULKLOAD )
1ce60 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c  ;.  assert( OPFL
1ce70 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54 52 45 45  AG_SEEKEQ==BTREE
1ce80 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20 20 74 65  _SEEK_EQ );.  te
1ce90 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 20  stcase( pOp->p5 
1cea0 26 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  & OPFLAG_BULKCSR
1ceb0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1cec0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
1ced0 48 49 4e 54 53 0a 20 20 74 65 73 74 63 61 73 65  HINTS.  testcase
1cee0 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c  ( pOp->p2 & OPFL
1cef0 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 23 65 6e  AG_SEEKEQ );.#en
1cf00 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
1cf10 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
1cf20 73 28 70 43 75 72 2d 3e 75 63 2e 70 43 75 72 73  s(pCur->uc.pCurs
1cf30 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
1cf60 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 4f 50  PFLAG_BULKCSR|OP
1cf70 46 4c 41 47 5f 53 45 45 4b 45 51 29 29 29 3b 0a  FLAG_SEEKEQ)));.
1cf80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1cf90 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1cfa0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
1cfb0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45  /* Opcode: OpenE
1cfc0 70 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a  phemeral P1 P2 *
1cfd0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
1cfe0 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a  is: nColumn=P2.*
1cff0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1d000 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 74  cursor P1 to a t
1d010 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a  ransient table..
1d020 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  ** The cursor is
1d030 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72   always opened r
1d040 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69  ead/write even i
1d050 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  f .** the main d
1d060 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1d070 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68 65 6d  only.  The ephem
1d080 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73  eral.** table is
1d090 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d 61 74   deleted automat
1d0a0 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20  ically when the 
1d0b0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1d0c0 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68  ..**.** P2 is th
1d0d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1d0e0 6d 6e 73 20 69 6e 20 74 68 65 20 65 70 68 65 6d  mns in the ephem
1d0f0 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  eral table..** T
1d100 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
1d110 20 74 6f 20 61 20 42 54 72 65 65 20 74 61 62 6c   to a BTree tabl
1d120 65 20 69 66 20 50 34 3d 3d 30 20 61 6e 64 20 74  e if P4==0 and t
1d130 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65 78 0a  o a BTree index.
1d140 2a 2a 20 69 66 20 50 34 20 69 73 20 6e 6f 74 20  ** if P4 is not 
1d150 30 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74  0.  If P4 is not
1d160 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
1d170 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
1d180 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
1d190 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f 72 6d  defines the form
1d1a0 61 74 20 6f 66 20 6b 65 79 73 20 69 6e 20 74 68  at of keys in th
1d1b0 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  e index..**.** T
1d1c0 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
1d1d0 63 61 6e 20 62 65 20 61 20 6d 61 73 6b 20 6f 66  can be a mask of
1d1e0 20 74 68 65 20 42 54 52 45 45 5f 2a 20 66 6c 61   the BTREE_* fla
1d1f0 67 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e  gs defined.** in
1d200 20 62 74 72 65 65 2e 68 2e 20 20 54 68 65 73 65   btree.h.  These
1d210 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61   flags control a
1d220 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70  spects of the op
1d230 65 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  eration of.** th
1d240 65 20 62 74 72 65 65 2e 20 20 54 68 65 20 42 54  e btree.  The BT
1d250 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
1d260 20 61 6e 64 20 42 54 52 45 45 5f 53 49 4e 47 4c   and BTREE_SINGL
1d270 45 20 66 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61  E flags are.** a
1d280 64 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  dded automatical
1d290 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ly..*/./* Opcode
1d2a0 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 20  : OpenAutoindex 
1d2b0 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20  P1 P2 * P4 *.** 
1d2c0 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d  Synopsis: nColum
1d2d0 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n=P2.**.** This 
1d2e0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 74 68 65  opcode works the
1d2f0 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e   same as OP_Open
1d300 45 70 68 65 6d 65 72 61 6c 2e 20 20 49 74 20 68  Ephemeral.  It h
1d310 61 73 20 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e  as a.** differen
1d320 74 20 6e 61 6d 65 20 74 6f 20 64 69 73 74 69 6e  t name to distin
1d330 67 75 69 73 68 20 69 74 73 20 75 73 65 2e 20 20  guish its use.  
1d340 54 61 62 6c 65 73 20 63 72 65 61 74 65 64 20 75  Tables created u
1d350 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68 69 73 20  sing.** by this 
1d360 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75  opcode will be u
1d370 73 65 64 20 66 6f 72 20 61 75 74 6f 6d 61 74 69  sed for automati
1d380 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 72  cally created tr
1d390 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  ansient.** indic
1d3a0 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a  es in joins..*/.
1d3b0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  case OP_OpenAuto
1d3c0 69 6e 64 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f  index: .case OP_
1d3d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b  OpenEphemeral: {
1d3e0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1d3f0 43 78 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  Cx;.  KeyInfo *p
1d400 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74  KeyInfo;..  stat
1d410 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 76 66 73  ic const int vfs
1d420 46 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53  Flags = .      S
1d430 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1d440 52 49 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  RITE |.      SQL
1d450 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1d460 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d470 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1d480 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1d490 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
1d4a0 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d4b0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1d4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1d4d0 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p1>=0 );.  asse
1d4e0 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
1d4f0 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
1d500 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
1d510 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  >p1, pOp->p2, -1
1d520 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29  , CURTYPE_BTREE)
1d530 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  ;.  if( pCx==0 )
1d540 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1d550 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  pCx->nullRow = 1
1d560 3b 0a 20 20 70 43 78 2d 3e 69 73 45 70 68 65 6d  ;.  pCx->isEphem
1d570 65 72 61 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d  eral = 1;.  rc =
1d580 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
1d590 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
1d5a0 62 2c 20 26 70 43 78 2d 3e 70 42 74 78 2c 20 0a  b, &pCx->pBtx, .
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d          BTREE_OM
1d5d0 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52  IT_JOURNAL | BTR
1d5e0 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d  EE_SINGLE | pOp-
1d5f0 3e 70 35 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  >p5, vfsFlags);.
1d600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d610 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d620 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1d630 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74 78  nTrans(pCx->pBtx
1d640 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
1d650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d660 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61  .    /* If a tra
1d670 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20  nsient index is 
1d680 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74 65  required, create
1d690 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20   it by calling. 
1d6a0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
1d6b0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 20  eeCreateTable() 
1d6c0 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f 42  with the BTREE_B
1d6d0 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f  LOBKEY flag befo
1d6e0 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  re.    ** openin
1d6f0 67 20 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73  g it. If a trans
1d700 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65  ient table is re
1d710 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65  quired, just use
1d720 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f   the.    ** auto
1d730 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1d740 64 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  d table with roo
1d750 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f  t-page 1 (an BLO
1d760 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e  B_INTKEY table).
1d770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d780 28 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  (pCx->pKeyInfo =
1d790 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
1d7a0 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30  >p4.pKeyInfo)!=0
1d7b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
1d7c0 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  no;.      assert
1d7d0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1d7e0 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20  4_KEYINFO );.   
1d7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d800 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1d810 70 43 78 2d 3e 70 42 74 78 2c 20 26 70 67 6e 6f  pCx->pBtx, &pgno
1d820 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20  , BTREE_BLOBKEY 
1d830 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20  | pOp->p5); .   
1d840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d860 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41  assert( pgno==MA
1d870 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20  STER_ROOT+1 );. 
1d880 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d890 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20  KeyInfo->db==db 
1d8a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d8b0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  t( pKeyInfo->enc
1d8c0 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20  ==ENC(db) );.   
1d8d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d8e0 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
1d8f0 2d 3e 70 42 74 78 2c 20 70 67 6e 6f 2c 20 42 54  ->pBtx, pgno, BT
1d900 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20  REE_WRCSR,.     
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49             pKeyI
1d930 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75  nfo, pCx->uc.pCu
1d940 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
1d950 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c       pCx->isTabl
1d960 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
1d970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d980 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1d990 70 43 78 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45  pCx->pBtx, MASTE
1d9a0 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52  R_ROOT, BTREE_WR
1d9b0 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CSR,.           
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 20 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43     0, pCx->uc.pC
1d9e0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 43  ursor);.      pC
1d9f0 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a  x->isTable = 1;.
1da00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1da10 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
1da20 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1da30 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pCx->isOrdered =
1da40 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45   (pOp->p5!=BTREE
1da50 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 62  _UNORDERED);.  b
1da60 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1da70 64 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e 20 50  de: SorterOpen P
1da80 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1da90 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
1daa0 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65  orks like OP_Ope
1dab0 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63 65 70  nEphemeral excep
1dac0 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 0a  t that it opens.
1dad0 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  ** a transient i
1dae0 6e 64 65 78 20 74 68 61 74 20 69 73 20 73 70 65  ndex that is spe
1daf0 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e  cifically design
1db00 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 67 65  ed to sort large
1db10 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 6e 67  .** tables using
1db20 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65 72   an external mer
1db30 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  ge-sort algorith
1db40 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
1db50 6d 65 6e 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a  ment P3 is non-z
1db60 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 6e 64  ero, then it ind
1db70 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1db80 73 6f 72 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73  sorter may.** as
1db90 73 75 6d 65 20 74 68 61 74 20 61 20 73 74 61 62  sume that a stab
1dba0 6c 65 20 73 6f 72 74 20 63 6f 6e 73 69 64 65 72  le sort consider
1dbb0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 50 33  ing the first P3
1dbc0 20 66 69 65 6c 64 73 20 6f 66 20 65 61 63 68 0a   fields of each.
1dbd0 2a 2a 20 6b 65 79 20 69 73 20 73 75 66 66 69 63  ** key is suffic
1dbe0 69 65 6e 74 20 74 6f 20 70 72 6f 64 75 63 65 20  ient to produce 
1dbf0 74 68 65 20 72 65 71 75 69 72 65 64 20 72 65 73  the required res
1dc00 75 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ults..*/.case OP
1dc10 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20  _SorterOpen: {. 
1dc20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1dc30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
1dc40 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73  ->p1>=0 );.  ass
1dc50 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
1dc60 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63  );.  pCx = alloc
1dc70 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
1dc80 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d  ->p1, pOp->p2, -
1dc90 31 2c 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45  1, CURTYPE_SORTE
1dca0 52 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  R);.  if( pCx==0
1dcb0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
1dcc0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
1dcd0 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
1dce0 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
1dcf0 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d  x->pKeyInfo->db=
1dd00 3d 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =db );.  assert(
1dd10 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   pCx->pKeyInfo->
1dd20 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
1dd30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
1dd40 62 65 53 6f 72 74 65 72 49 6e 69 74 28 64 62 2c  beSorterInit(db,
1dd50 20 70 4f 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a   pOp->p3, pCx);.
1dd60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1dd70 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1dd80 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
1dd90 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65  /* Opcode: Seque
1dda0 6e 63 65 54 65 73 74 20 50 31 20 50 32 20 2a 20  nceTest P1 P2 * 
1ddb0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
1ddc0 20 69 66 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e   if( cursor[P1].
1ddd0 63 74 72 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a  ctr++ ) pc = P2.
1dde0 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f  **.** P1 is a so
1ddf0 72 74 65 72 20 63 75 72 73 6f 72 2e 20 49 66 20  rter cursor. If 
1de00 74 68 65 20 73 65 71 75 65 6e 63 65 20 63 6f 75  the sequence cou
1de10 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  nter is currentl
1de20 79 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20  y zero, jump.** 
1de30 74 6f 20 50 32 2e 20 52 65 67 61 72 64 6c 65 73  to P2. Regardles
1de40 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
1de50 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  not the jump is 
1de60 74 61 6b 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74  taken, increment
1de70 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 65 71 75   the.** the sequ
1de80 65 6e 63 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63  ence value..*/.c
1de90 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  ase OP_SequenceT
1dea0 65 73 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  est: {.  VdbeCur
1deb0 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72  sor *pC;.  asser
1dec0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1ded0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1dee0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1def0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1df00 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72  .  assert( isSor
1df10 74 65 72 28 70 43 29 20 29 3b 0a 20 20 69 66 28  ter(pC) );.  if(
1df20 20 28 70 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b   (pC->seqCount++
1df30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )==0 ){.    goto
1df40 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
1df50 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1df60 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75  Opcode: OpenPseu
1df70 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  do P1 P2 P3 * *.
1df80 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 50 33 20  ** Synopsis: P3 
1df90 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d  columns in r[P2]
1dfa0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
1dfb0 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f  w cursor that po
1dfc0 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74  ints to a fake t
1dfd0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
1dfe0 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  ns a single.** r
1dff0 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ow of data.  The
1e000 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74   content of that
1e010 20 6f 6e 65 20 72 6f 77 20 69 73 20 74 68 65 20   one row is the 
1e020 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72  content of memor
1e030 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32  y.** register P2
1e040 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1e050 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63  s, cursor P1 bec
1e060 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f  omes an alias fo
1e070 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c  r the .** MEM_Bl
1e080 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61  ob content conta
1e090 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ined in register
1e0a0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65   P2..**.** A pse
1e0b0 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65  udo-table create
1e0c0 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
1e0d0 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   is used to hold
1e0e0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77   a single.** row
1e0f0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65   output from the
1e100 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20   sorter so that 
1e110 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64  the row can be d
1e120 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a  ecomposed into.*
1e130 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c  * individual col
1e140 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f  umns using the O
1e150 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e  P_Column opcode.
1e160 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20    The OP_Column 
1e170 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65  opcode.** is the
1e180 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63   only cursor opc
1e190 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77  ode that works w
1e1a0 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62  ith a pseudo-tab
1e1b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20  le..**.** P3 is 
1e1c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1e1d0 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f  elds in the reco
1e1e0 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  rds that will be
1e1f0 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68   stored by.** th
1e200 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  e pseudo-table..
1e210 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50  */.case OP_OpenP
1e220 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43  seudo: {.  VdbeC
1e230 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61  ursor *pCx;..  a
1e240 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1e250 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1e260 4f 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70  Op->p3>=0 );.  p
1e270 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  Cx = allocateCur
1e280 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
1e290 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52  pOp->p3, -1, CUR
1e2a0 54 59 50 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20  TYPE_PSEUDO);.  
1e2b0 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74  if( pCx==0 ) got
1e2c0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d  o no_mem;.  pCx-
1e2d0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
1e2e0 70 43 78 2d 3e 75 63 2e 70 73 65 75 64 6f 54 61  pCx->uc.pseudoTa
1e2f0 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32  bleReg = pOp->p2
1e300 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65  ;.  pCx->isTable
1e310 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
1e320 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  pOp->p5==0 );.  
1e330 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1e340 6f 64 65 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20  ode: Close P1 * 
1e350 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73  * * *.**.** Clos
1e360 65 20 61 20 63 75 72 73 6f 72 20 70 72 65 76 69  e a cursor previ
1e370 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 61 73 20  ously opened as 
1e380 50 31 2e 20 20 49 66 20 50 31 20 69 73 20 6e 6f  P1.  If P1 is no
1e390 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f  t.** currently o
1e3a0 70 65 6e 2c 20 74 68 69 73 20 69 6e 73 74 72 75  pen, this instru
1e3b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1e3c0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f  ..*/.case OP_Clo
1e3d0 73 65 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  se: {.  assert( 
1e3e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1e3f0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1e400 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
1e410 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
1e420 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1e430 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f  );.  p->apCsr[pO
1e440 70 2d 3e 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72  p->p1] = 0;.  br
1e450 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  eak;.}..#ifdef S
1e460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
1e470 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a  UMN_USED_MASK./*
1e480 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73   Opcode: Columns
1e490 55 73 65 64 20 50 31 20 2a 20 2a 20 50 34 20 2a  Used P1 * * P4 *
1e4a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
1e4b0 64 65 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 65  de (which only e
1e4c0 78 69 73 74 73 20 69 66 20 53 51 4c 69 74 65 20  xists if SQLite 
1e4d0 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
1e4e0 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  h.** SQLITE_ENAB
1e4f0 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
1e500 41 53 4b 29 20 69 64 65 6e 74 69 66 69 65 73 20  ASK) identifies 
1e510 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66  which columns of
1e520 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   the.** table or
1e530 20 69 6e 64 65 78 20 66 6f 72 20 63 75 72 73 6f   index for curso
1e540 72 20 50 31 20 61 72 65 20 75 73 65 64 2e 20 20  r P1 are used.  
1e550 50 34 20 69 73 20 61 20 36 34 2d 62 69 74 20 69  P4 is a 64-bit i
1e560 6e 74 65 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e  nteger.** (P4_IN
1e570 54 36 34 29 20 69 6e 20 77 68 69 63 68 20 74 68  T64) in which th
1e580 65 20 66 69 72 73 74 20 36 33 20 62 69 74 73 20  e first 63 bits 
1e590 61 72 65 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  are one for each
1e5a0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1e5b0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74   63 columns of t
1e5c0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1e5d0 78 20 74 68 61 74 20 61 72 65 20 61 63 74 75 61  x that are actua
1e5e0 6c 6c 79 20 75 73 65 64 0a 2a 2a 20 62 79 20 74  lly used.** by t
1e5f0 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
1e600 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 69  high-order bit i
1e610 73 20 73 65 74 20 69 66 20 61 6e 79 20 63 6f 6c  s set if any col
1e620 75 6d 6e 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  umn after.** the
1e630 20 36 34 74 68 20 69 73 20 75 73 65 64 2e 0a 2a   64th is used..*
1e640 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  /.case OP_Column
1e650 73 55 73 65 64 3a 20 7b 0a 20 20 56 64 62 65 43  sUsed: {.  VdbeC
1e660 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20  ursor *pC;.  pC 
1e670 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1e680 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1e690 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
1e6a0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
1e6b0 70 43 2d 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a  pC->maskUsed = *
1e6c0 28 75 36 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49  (u64*)pOp->p4.pI
1e6d0 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  64;.  break;.}.#
1e6e0 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65  endif../* Opcode
1e6f0 3a 20 53 65 65 6b 47 45 20 50 31 20 50 32 20 50  : SeekGE P1 P2 P
1e700 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
1e710 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
1e720 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1e730 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1e740 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1e750 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1e760 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1e770 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1e780 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1e790 74 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72  the key.  If cur
1e7a0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1e7b0 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1e7c0 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1e7d0 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1e7e0 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1e7f0 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1e800 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1e810 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1e820 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1e830 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1e840 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1e850 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65  o the smallest e
1e860 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
1e870 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1e880 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1e890 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1e8a0 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1e8b0 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1e8c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1e8d0 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1e8e0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1e8f0 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1e900 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50   If the cursor P
1e910 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  1 was opened usi
1e920 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45  ng the OPFLAG_SE
1e930 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20  EKEQ flag, then 
1e940 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77  this.** opcode w
1e950 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20  ill always land 
1e960 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74  on a record that
1e970 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20   equally equals 
1e980 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65  the key, or.** e
1e990 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  lse jump immedia
1e9a0 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65  tely to P2.  Whe
1e9b0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1e9c0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74  OPFLAG_SEEKEQ, t
1e9d0 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75  his.** opcode mu
1e9e0 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62  st be followed b
1e9f0 79 20 61 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64  y an IdxLE opcod
1ea00 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
1ea10 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68  arguments..** Th
1ea20 65 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77  e IdxLE opcode w
1ea30 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69  ill be skipped i
1ea40 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75  f this opcode su
1ea50 63 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a  cceeds, but the.
1ea60 2a 2a 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20  ** IdxLE opcode 
1ea70 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20  will be used on 
1ea80 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20  subsequent loop 
1ea90 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  iterations..**.*
1eaa0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65  * This opcode le
1eab0 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
1eac0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f  configured to mo
1ead0 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72  ve in forward or
1eae0 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  der,.** from the
1eaf0 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72   beginning towar
1eb00 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f  d the end.  In o
1eb10 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1eb20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e  cursor is.** con
1eb30 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e  figured to use N
1eb40 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a  ext, not Prev..*
1eb50 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1eb60 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1eb70 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20  SeekLt, SeekGt, 
1eb80 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63  SeekLe.*/./* Opc
1eb90 6f 64 65 3a 20 53 65 65 6b 47 54 20 50 31 20 50  ode: SeekGT P1 P
1eba0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
1ebb0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
1ebc0 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  P4].**.** If cur
1ebd0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1ebe0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1ebf0 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1ec00 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1ec10 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1ec20 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1ec30 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1ec40 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1ec50 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1ec60 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1ec70 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1ec80 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1ec90 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1eca0 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1ecb0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1ecc0 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1ecd0 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1ece0 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1ecf0 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65  o the smallest e
1ed00 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
1ed10 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ed20 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1ed30 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1ed40 6f 72 64 73 20 67 72 65 61 74 65 72 20 74 68 61  ords greater tha
1ed50 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e  n .** the key an
1ed60 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
1ed70 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
1ed80 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  2..**.** This op
1ed90 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
1eda0 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
1edb0 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72  d to move in for
1edc0 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  ward order,.** f
1edd0 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1ede0 67 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64  g toward the end
1edf0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1ee00 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
1ee10 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
1ee20 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20  o use Next, not 
1ee30 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  Prev..**.** See 
1ee40 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1ee50 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53  Found, SeekLt, S
1ee60 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
1ee70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1ee80 4c 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  LT P1 P2 P3 P4 *
1ee90 20 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b   .** Synopsis: k
1eea0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
1eeb0 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1eec0 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1eed0 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1eee0 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1eef0 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1ef00 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1ef10 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
1ef20 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
1ef30 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
1ef40 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
1ef50 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
1ef60 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
1ef70 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
1ef80 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
1ef90 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
1efa0 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
1efb0 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
1efc0 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20   P1 so that  it 
1efd0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
1efe0 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  rgest entry that
1eff0 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61   .** is less tha
1f000 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  n the key value.
1f010 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1f020 20 72 65 63 6f 72 64 73 20 6c 65 73 73 20 74 68   records less th
1f030 61 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61  an .** the key a
1f040 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72  nd P2 is not zer
1f050 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  o, then jump to 
1f060 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  P2..**.** This o
1f070 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
1f080 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72   cursor configur
1f090 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65  ed to move in re
1f0a0 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20  verse order,.** 
1f0b0 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77  from the end tow
1f0c0 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ard the beginnin
1f0d0 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  g.  In other wor
1f0e0 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  ds, the cursor i
1f0f0 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  s.** configured 
1f100 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74  to use Prev, not
1f110 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   Next..**.** See
1f120 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1f130 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20  tFound, SeekGt, 
1f140 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a  SeekGe, SeekLe.*
1f150 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  /./* Opcode: See
1f160 6b 4c 45 20 50 31 20 50 32 20 50 33 20 50 34 20  kLE P1 P2 P3 P4 
1f170 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
1f180 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
1f190 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1f1a0 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1f1b0 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1f1c0 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1f1d0 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1f1e0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1f1f0 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
1f200 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
1f210 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
1f220 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
1f230 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
1f240 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
1f250 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
1f260 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
1f270 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
1f280 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
1f290 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
1f2a0 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
1f2b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72  oints to the lar
1f2c0 67 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20  gest entry that 
1f2d0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1f2e0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1f2f0 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1f300 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1f310 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61  rds .** less tha
1f320 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1f330 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1f340 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1f350 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1f360 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
1f370 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
1f380 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
1f390 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
1f3a0 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
1f3b0 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62  end toward the b
1f3c0 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74  eginning.  In ot
1f3d0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1f3e0 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
1f3f0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72  igured to use Pr
1f400 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a  ev, not Next..**
1f410 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
1f420 72 20 50 31 20 77 61 73 20 6f 70 65 6e 65 64 20  r P1 was opened 
1f430 75 73 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47  using the OPFLAG
1f440 5f 53 45 45 4b 45 51 20 66 6c 61 67 2c 20 74 68  _SEEKEQ flag, th
1f450 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64  en this.** opcod
1f460 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61  e will always la
1f470 6e 64 20 6f 6e 20 61 20 72 65 63 6f 72 64 20 74  nd on a record t
1f480 68 61 74 20 65 71 75 61 6c 6c 79 20 65 71 75 61  hat equally equa
1f490 6c 73 20 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a  ls the key, or.*
1f4a0 2a 20 65 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65  * else jump imme
1f4b0 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20  diately to P2.  
1f4c0 57 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  When the cursor 
1f4d0 69 73 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  is OPFLAG_SEEKEQ
1f4e0 2c 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65  , this.** opcode
1f4f0 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
1f500 64 20 62 79 20 61 6e 20 49 64 78 47 45 20 6f 70  d by an IdxGE op
1f510 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 73 61  code with the sa
1f520 6d 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a  me arguments..**
1f530 20 54 68 65 20 49 64 78 47 45 20 6f 70 63 6f 64   The IdxGE opcod
1f540 65 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  e will be skippe
1f550 64 20 69 66 20 74 68 69 73 20 6f 70 63 6f 64 65  d if this opcode
1f560 20 73 75 63 63 65 65 64 73 2c 20 62 75 74 20 74   succeeds, but t
1f570 68 65 0a 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f  he.** IdxGE opco
1f580 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  de will be used 
1f590 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f  on subsequent lo
1f5a0 6f 70 20 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a  op iterations..*
1f5b0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1f5c0 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1f5d0 53 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20  SeekGt, SeekGe, 
1f5e0 53 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f  SeekLt.*/.case O
1f5f0 50 5f 53 65 65 6b 4c 54 3a 20 20 20 20 20 20 20  P_SeekLT:       
1f600 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1f610 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 45  /.case OP_SeekLE
1f620 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1f630 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1f640 50 5f 53 65 65 6b 47 45 3a 20 20 20 20 20 20 20  P_SeekGE:       
1f650 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1f660 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 54  /.case OP_SeekGT
1f670 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
1f680 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
1f690 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  res;           /
1f6a0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  * Comparison res
1f6b0 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 63 3b  ult */.  int oc;
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f6d0 70 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 43  pcode */.  VdbeC
1f6e0 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a  ursor *pC;    /*
1f6f0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 73   The cursor to s
1f700 65 65 6b 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  eek */.  Unpacke
1f710 64 52 65 63 6f 72 64 20 72 3b 20 20 2f 2a 20 54  dRecord r;  /* T
1f720 68 65 20 6b 65 79 20 74 6f 20 73 65 65 6b 20 66  he key to seek f
1f730 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  or */.  int nFie
1f740 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ld;        /* Nu
1f750 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1f760 6f 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  or fields in the
1f770 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 4b   key */.  i64 iK
1f780 65 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey;          /* 
1f790 54 68 65 20 72 6f 77 69 64 20 77 65 20 61 72 65  The rowid we are
1f7a0 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
1f7b0 20 69 6e 74 20 65 71 4f 6e 6c 79 3b 20 20 20 20   int eqOnly;    
1f7c0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 69 6e 74 65      /* Only inte
1f7d0 72 65 73 74 65 64 20 69 6e 20 3d 3d 20 72 65 73  rested in == res
1f7e0 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
1f7f0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1f800 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1f810 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
1f820 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20   pOp->p2!=0 );. 
1f830 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
1f840 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1f850 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
1f860 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
1f870 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
1f880 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  E );.  assert( O
1f890 50 5f 53 65 65 6b 4c 45 20 3d 3d 20 4f 50 5f 53  P_SeekLE == OP_S
1f8a0 65 65 6b 4c 54 2b 31 20 29 3b 0a 20 20 61 73 73  eekLT+1 );.  ass
1f8b0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45 20 3d  ert( OP_SeekGE =
1f8c0 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 32 20 29 3b  = OP_SeekLT+2 );
1f8d0 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1f8e0 65 6b 47 54 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGT == OP_SeekL
1f8f0 54 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T+3 );.  assert(
1f900 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
1f910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1f920 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
1f930 0a 20 20 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70 63  .  oc = pOp->opc
1f940 6f 64 65 3b 0a 20 20 65 71 4f 6e 6c 79 20 3d 20  ode;.  eqOnly = 
1f950 30 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  0;.  pC->nullRow
1f960 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1f970 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e  ITE_DEBUG.  pC->
1f980 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70  seekOp = pOp->op
1f990 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  code;.#endif..  
1f9a0 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  if( pC->isTable 
1f9b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 42 54  ){.    /* The BT
1f9c0 52 45 45 5f 53 45 45 4b 5f 45 51 20 66 6c 61 67  REE_SEEK_EQ flag
1f9d0 20 69 73 20 6f 6e 6c 79 20 73 65 74 20 6f 6e 20   is only set on 
1f9e0 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20 2a 2f  index cursors */
1f9f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1fa00 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
1fa10 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43  asHint(pC->uc.pC
1fa20 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53 45 45  ursor, BTREE_SEE
1fa30 4b 5f 45 51 29 3d 3d 30 0a 20 20 20 20 20 20 20  K_EQ)==0.       
1fa40 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1fa50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  T_DB );..    /* 
1fa60 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  The input value 
1fa70 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65 20 6f  in P3 might be o
1fa80 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e 74 65  f any type: inte
1fa90 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e  ger, real, strin
1faa0 67 2c 0a 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20  g,.    ** blob, 
1fab0 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74  or NULL.  But it
1fac0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 20   needs to be an 
1fad0 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20 77  integer before w
1fae0 65 20 63 61 6e 20 64 6f 0a 20 20 20 20 2a 2a 20  e can do.    ** 
1faf0 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63 6f 6e  the seek, so con
1fb00 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20  vert it. */.    
1fb10 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
1fb20 2d 3e 70 33 5d 3b 0a 20 20 20 20 69 66 28 20 28  ->p3];.    if( (
1fb30 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pIn3->flags & (M
1fb40 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c  EM_Int|MEM_Real|
1fb50 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53  MEM_Str))==MEM_S
1fb60 74 72 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c  tr ){.      appl
1fb70 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
1fb80 28 70 49 6e 33 2c 20 30 29 3b 0a 20 20 20 20 7d  (pIn3, 0);.    }
1fb90 0a 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69  .    iKey = sqli
1fba0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
1fbb0 70 49 6e 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pIn3);..    /* I
1fbc0 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63  f the P3 value c
1fbd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76  ould not be conv
1fbe0 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e  erted into an in
1fbf0 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20 20  teger without.  
1fc00 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66    ** loss of inf
1fc10 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73  ormation, then s
1fc20 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
1fc30 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e 2e  g is required...
1fc40 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e   */.    if( (pIn
1fc50 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
1fc60 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)==0 ){.      
1fc70 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
1fc80 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
1fc90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1fca0 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63 61   the P3 value ca
1fcb0 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
1fcc0 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20  d into any kind 
1fcd0 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20  of a number,.   
1fce0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
1fcf0 20 73 65 65 6b 20 69 73 20 6e 6f 74 20 70 6f 73   seek is not pos
1fd00 73 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70 20 74  sible, so jump t
1fd10 6f 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  o P2 */.        
1fd20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
1fd30 31 2c 32 29 3b 20 67 6f 74 6f 20 6a 75 6d 70 5f  1,2); goto jump_
1fd40 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 62  to_p2;.        b
1fd50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1fd60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61       /* If the a
1fd70 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65  pproximation iKe
1fd80 79 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  y is larger than
1fd90 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61 6c   the actual real
1fda0 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   search.      **
1fdb0 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75 74   term, substitut
1fdc0 65 20 3e 3d 20 66 6f 72 20 3e 20 61 6e 64 20 3c  e >= for > and <
1fdd0 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 2e 20 69 66   for <=. e.g. if
1fde0 20 74 68 65 20 73 65 61 72 63 68 20 74 65 72 6d   the search term
1fdf0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 34 2e 39  .      ** is 4.9
1fe00 20 61 6e 64 20 74 68 65 20 69 6e 74 65 67 65 72   and the integer
1fe10 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 35   approximation 5
1fe20 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
1fe30 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3e 20   **        (x > 
1fe40 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20 20   4.9)    ->     
1fe50 28 78 20 3e 3d 20 35 29 0a 20 20 20 20 20 20 2a  (x >= 5).      *
1fe60 2a 20 20 20 20 20 20 20 20 28 78 20 3c 3d 20 34  *        (x <= 4
1fe70 2e 39 29 20 20 20 20 2d 3e 20 20 20 20 20 28 78  .9)    ->     (x
1fe80 20 3c 20 20 35 29 0a 20 20 20 20 20 20 2a 2f 0a   <  5).      */.
1fe90 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e        if( pIn3->
1fea0 75 2e 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79  u.r<(double)iKey
1feb0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1fec0 72 74 28 20 4f 50 5f 53 65 65 6b 47 45 3d 3d 28  rt( OP_SeekGE==(
1fed0 4f 50 5f 53 65 65 6b 47 54 2d 31 29 20 29 3b 0a  OP_SeekGT-1) );.
1fee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fef0 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 4f 50 5f 53  OP_SeekLT==(OP_S
1ff00 65 65 6b 4c 45 2d 31 29 20 29 3b 0a 20 20 20 20  eekLE-1) );.    
1ff10 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f      assert( (OP_
1ff20 53 65 65 6b 4c 45 20 26 20 30 78 30 30 30 31 29  SeekLE & 0x0001)
1ff30 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30  ==(OP_SeekGT & 0
1ff40 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20 20  x0001) );.      
1ff50 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30 30    if( (oc & 0x00
1ff60 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20  01)==(OP_SeekGT 
1ff70 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2d 2d  & 0x0001) ) oc--
1ff80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1ff90 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72 6f   /* If the appro
1ffa0 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69 73  ximation iKey is
1ffb0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1ffc0 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65  e actual real se
1ffd0 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65  arch.      ** te
1ffe0 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20 3c  rm, substitute <
1fff0 3d 20 66 6f 72 20 3c 20 61 6e 64 20 3e 20 66 6f  = for < and > fo
20000 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  r >=.  */.      
20010 65 6c 73 65 20 69 66 28 20 70 49 6e 33 2d 3e 75  else if( pIn3->u
20020 2e 72 3e 28 64 6f 75 62 6c 65 29 69 4b 65 79 20  .r>(double)iKey 
20030 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
20040 74 28 20 4f 50 5f 53 65 65 6b 4c 45 3d 3d 28 4f  t( OP_SeekLE==(O
20050 50 5f 53 65 65 6b 4c 54 2b 31 29 20 29 3b 0a 20  P_SeekLT+1) );. 
20060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f         assert( O
20070 50 5f 53 65 65 6b 47 54 3d 3d 28 4f 50 5f 53 65  P_SeekGT==(OP_Se
20080 65 6b 47 45 2b 31 29 20 29 3b 0a 20 20 20 20 20  ekGE+1) );.     
20090 20 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f 53     assert( (OP_S
200a0 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 3d  eekLT & 0x0001)=
200b0 3d 28 4f 50 5f 53 65 65 6b 47 45 20 26 20 30 78  =(OP_SeekGE & 0x
200c0 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20 20 20  0001) );.       
200d0 20 69 66 28 20 28 6f 63 20 26 20 30 78 30 30 30   if( (oc & 0x000
200e0 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 20 26  1)==(OP_SeekLT &
200f0 20 30 78 30 30 30 31 29 20 29 20 6f 63 2b 2b 3b   0x0001) ) oc++;
20100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a  .      }.    } .
20110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20120 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
20130 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ked(pC->uc.pCurs
20140 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 79  or, 0, (u64)iKey
20150 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
20160 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
20170 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65   = iKey;  /* Use
20180 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a  d by OP_Delete *
20190 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
201a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
201b0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
201c0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
201d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
201e0 46 6f 72 20 61 20 63 75 72 73 6f 72 20 77 69 74  For a cursor wit
201f0 68 20 74 68 65 20 42 54 52 45 45 5f 53 45 45 4b  h the BTREE_SEEK
20200 5f 45 51 20 68 69 6e 74 2c 20 6f 6e 6c 79 20 74  _EQ hint, only t
20210 68 65 20 4f 50 5f 53 65 65 6b 47 45 20 61 6e 64  he OP_SeekGE and
20220 0a 20 20 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 4c  .    ** OP_SeekL
20230 45 20 6f 70 63 6f 64 65 73 20 61 72 65 20 61 6c  E opcodes are al
20240 6c 6f 77 65 64 2c 20 61 6e 64 20 74 68 65 73 65  lowed, and these
20250 20 6d 75 73 74 20 62 65 20 69 6d 6d 65 64 69 61   must be immedia
20260 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 0a 20 20  tely followed.  
20270 20 20 2a 2a 20 62 79 20 61 6e 20 4f 50 5f 49 64    ** by an OP_Id
20280 78 47 54 20 6f 72 20 4f 50 5f 49 64 78 4c 54 20  xGT or OP_IdxLT 
20290 6f 70 63 6f 64 65 2c 20 72 65 73 70 65 63 74 69  opcode, respecti
202a0 76 65 6c 79 2c 20 77 69 74 68 20 74 68 65 20 73  vely, with the s
202b0 61 6d 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  ame key..    */.
202c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
202d0 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e  treeCursorHasHin
202e0 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
202f0 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29  , BTREE_SEEK_EQ)
20300 20 29 7b 0a 20 20 20 20 20 20 65 71 4f 6e 6c 79   ){.      eqOnly
20310 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
20320 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
20330 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 70 4f  =OP_SeekGE || pO
20340 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65  p->opcode==OP_Se
20350 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  ekLE );.      as
20360 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63  sert( pOp[1].opc
20370 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c  ode==OP_IdxLT ||
20380 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
20390 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20  OP_IdxGT );.    
203a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
203b0 2e 70 31 3d 3d 70 4f 70 5b 30 5d 2e 70 31 20 29  .p1==pOp[0].p1 )
203c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
203d0 70 4f 70 5b 31 5d 2e 70 32 3d 3d 70 4f 70 5b 30  pOp[1].p2==pOp[0
203e0 5d 2e 70 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ].p2 );.      as
203f0 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 33 3d  sert( pOp[1].p3=
20400 3d 70 4f 70 5b 30 5d 2e 70 33 20 29 3b 0a 20 20  =pOp[0].p3 );.  
20410 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
20420 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b 30 5d 2e  1].p4.i==pOp[0].
20430 70 34 2e 69 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  p4.i );.    }.. 
20440 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d     nField = pOp-
20450 3e 70 34 2e 69 3b 0a 20 20 20 20 61 73 73 65 72  >p4.i;.    asser
20460 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
20470 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20  P4_INT32 );.    
20480 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30  assert( nField>0
20490 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   );.    r.pKeyIn
204a0 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
204b0 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  o;.    r.nField 
204c0 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a  = (u16)nField;..
204d0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
204e0 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d  line of code com
204f0 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73  putes as follows
20500 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20  , only faster:. 
20510 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63 3d 3d     **   if( oc==
20520 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 6f 63 3d  OP_SeekGT || oc=
20530 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 7b 0a 20 20  =OP_SeekLE ){.  
20540 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75    **     r.defau
20550 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20  lt_rc = -1;.    
20560 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  **   }else{.    
20570 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75 6c 74  **     r.default
20580 5f 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 2a 2a  _rc = +1;.    **
20590 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
205a0 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 28  r.default_rc = (
205b0 28 31 20 26 20 28 6f 63 20 2d 20 4f 50 5f 53 65  (1 & (oc - OP_Se
205c0 65 6b 4c 54 29 29 20 3f 20 2d 31 20 3a 20 2b 31  ekLT)) ? -1 : +1
205d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
205e0 63 21 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20  c!=OP_SeekGT || 
205f0 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  r.default_rc==-1
20600 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20610 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 45 20 7c 7c  oc!=OP_SeekLE ||
20620 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d   r.default_rc==-
20630 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
20640 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 45 20 7c   oc!=OP_SeekGE |
20650 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  | r.default_rc==
20660 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
20670 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 54 20  ( oc!=OP_SeekLT 
20680 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d  || r.default_rc=
20690 3d 2b 31 20 29 3b 0a 0a 20 20 20 20 72 2e 61 4d  =+1 );..    r.aM
206a0 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
206b0 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
206c0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
206d0 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
206e0 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
206f0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
20700 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
20710 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
20720 2e 65 71 53 65 65 6e 20 3d 20 30 3b 0a 20 20 20  .eqSeen = 0;.   
20730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20740 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
20750 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
20760 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29   &r, 0, 0, &res)
20770 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20790 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
207a0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
207b0 20 20 20 20 69 66 28 20 65 71 4f 6e 6c 79 20 26      if( eqOnly &
207c0 26 20 72 2e 65 71 53 65 65 6e 3d 3d 30 20 29 7b  & r.eqSeen==0 ){
207d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
207e0 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 67  es!=0 );.      g
207f0 6f 74 6f 20 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75  oto seek_not_fou
20800 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
20810 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
20820 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  to = 0;.  pC->ca
20830 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
20840 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64 65 66 20  E_STALE;.#ifdef 
20850 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
20860 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
20870 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69  nt++;.#endif.  i
20880 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 45  f( oc>=OP_SeekGE
20890 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d   ){  assert( oc=
208a0 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 6f 63  =OP_SeekGE || oc
208b0 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20  ==OP_SeekGT );. 
208c0 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20     if( res<0 || 
208d0 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f  (res==0 && oc==O
208e0 50 5f 53 65 65 6b 47 54 29 20 29 7b 0a 20 20 20  P_SeekGT) ){.   
208f0 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
20900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20910 72 65 65 4e 65 78 74 28 70 43 2d 3e 75 63 2e 70  reeNext(pC->uc.p
20920 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
20930 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20940 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
20950 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
20960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20970 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
20980 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
20990 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
209a0 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekLT || oc==OP_S
209b0 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  eekLE );.    if(
209c0 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d   res>0 || (res==
209d0 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
209e0 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LT) ){.      res
209f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
20a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
20a10 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70 43 75  vious(pC->uc.pCu
20a20 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
20a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20a40 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
20a50 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
20a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a70 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65   /* res might be
20a80 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73   negative becaus
20a90 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  e the table is e
20aa0 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a  mpty.  Check to.
20ab0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
20ac0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
20ad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20ae0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
20af0 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70 43  reeEof(pC->uc.pC
20b00 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
20b10 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64  }.seek_not_found
20b20 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  :.  assert( pOp-
20b30 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65 42  >p2>0 );.  VdbeB
20b40 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
20b50 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
20b60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
20b70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 20  _to_p2;.  }else 
20b80 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20 20  if( eqOnly ){.  
20b90 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
20ba0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  .opcode==OP_IdxL
20bb0 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f  T || pOp[1].opco
20bc0 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
20bd0 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53 6b      pOp++; /* Sk
20be0 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74 20  ip the OP_IdxLt 
20bf0 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61 74  or OP_IdxGT that
20c00 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d 0a   follows */.  }.
20c10 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
20c20 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20  pcode: Found P1 
20c30 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
20c40 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
20c50 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
20c60 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
20c70 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
20c80 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
20c90 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
20ca0 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
20cb0 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
20cc0 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
20cd0 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
20ce0 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
20cf0 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75  record..**.** Cu
20d00 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
20d10 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
20d20 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
20d30 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
20d40 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65  d P4.** is a pre
20d50 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79  fix of any entry
20d60 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75   in P1 then a ju
20d70 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32  mp is made to P2
20d80 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65   and.** P1 is le
20d90 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
20da0 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
20db0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  y..**.** This op
20dc0 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74  eration leaves t
20dd0 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
20de0 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
20df0 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  n be.** advanced
20e00 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
20e10 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  direction.  The 
20e20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
20e30 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20 62   will work,.** b
20e40 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76 20  ut not the Prev 
20e50 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
20e60 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74  ** See also: Not
20e70 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63  Found, NoConflic
20e80 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53 65  t, NotExists. Se
20e90 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekGe.*/./* Opcod
20ea0 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50  e: NotFound P1 P
20eb0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
20ec0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
20ed0 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
20ee0 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
20ef0 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
20f00 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
20f10 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
20f20 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
20f30 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
20f40 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
20f50 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
20f60 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
20f70 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
20f80 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
20f90 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
20fa0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
20fb0 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
20fc0 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  d P4.** is not t
20fd0 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79  he prefix of any
20fe0 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
20ff0 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
21000 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a   to P2.  If P1 .
21010 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  ** does contain 
21020 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70  an entry whose p
21030 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68  refix matches th
21040 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74  e P3/P4 record t
21050 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  hen control.** f
21060 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
21070 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
21080 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c  tion and P1 is l
21090 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
210a0 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  the.** matching 
210b0 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
210c0 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76  s operation leav
210d0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
210e0 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
210f0 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61  t cannot be.** a
21100 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65  dvanced in eithe
21110 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
21120 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
21130 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a  e Next and Prev.
21140 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f  ** opcodes do no
21150 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69  t work after thi
21160 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
21170 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
21180 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 4e  nd, NotExists, N
21190 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a 2f 2a 20  oConflict.*/./* 
211a0 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66 6c 69  Opcode: NoConfli
211b0 63 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  ct P1 P2 P3 P4 *
211c0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
211d0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
211e0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
211f0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
21200 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
21210 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
21220 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
21230 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21240 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
21250 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
21260 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
21270 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
21280 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
21290 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
212a0 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
212b0 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
212c0 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 63  y P3 and P4.** c
212d0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
212e0 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d   value, jump imm
212f0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
21300 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   If all terms of
21310 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
21320 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68 65 6e  re not-NULL then
21330 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65   a check is done
21340 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
21350 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68 65 0a   any row in the.
21360 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74 72 65  ** P1 index btre
21370 65 20 68 61 73 20 61 20 6d 61 74 63 68 69 6e 67  e has a matching
21380 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20 49 66   key prefix.  If
21390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
213a0 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a 20 69  tches, jump.** i
213b0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
213c0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
213d0 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74 68 72   match, fall thr
213e0 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65 20 74  ough and leave t
213f0 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f 72 20  he P1.** cursor 
21400 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
21410 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a 2a 2a  matching row..**
21420 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
21430 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 4f 50  is similar to OP
21440 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68 20 74  _NotFound with t
21450 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20 74 68  he exceptions th
21460 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e 63 68  at the.** branch
21470 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65 6e   is always taken
21480 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
21490 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20 69  the search key i
214a0 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  nput is NULL..**
214b0 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
214c0 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  on leaves the cu
214d0 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
214e0 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
214f0 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69  be.** advanced i
21500 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
21510 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
21520 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
21530 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65  d Prev.** opcode
21540 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66  s do not work af
21550 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  ter this operati
21560 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21570 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 46 6f  so: NotFound, Fo
21580 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 0a 2a  und, NotExists.*
21590 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f 6e 66  /.case OP_NoConf
215a0 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a 75 6d  lict:     /* jum
215b0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
215c0 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20  P_NotFound:     
215d0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
215e0 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a  /.case OP_Found:
215f0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
21600 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
21610 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20  alreadyExists;. 
21620 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b 0a 20   int takeJump;. 
21630 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62 65 43   int ii;.  VdbeC
21640 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74  ursor *pC;.  int
21650 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64   res;.  Unpacked
21660 52 65 63 6f 72 64 20 2a 70 46 72 65 65 3b 0a 20  Record *pFree;. 
21670 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
21680 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61  *pIdxKey;.  Unpa
21690 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 23  ckedRecord r;..#
216a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
216b0 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  T.  if( pOp->opc
216c0 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  ode!=OP_NoConfli
216d0 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66 6f 75  ct ) sqlite3_fou
216e0 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nd_count++;.#end
216f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  if..  assert( pO
21700 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
21710 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
21720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
21730 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
21740 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  2 );.  pC = p->a
21750 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
21760 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21770 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21780 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b  DEBUG.  pC->seek
21790 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  Op = pOp->opcode
217a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 33 20  ;.#endif.  pIn3 
217b0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
217c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
217d0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
217e0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
217f0 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
21800 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
21810 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
21820 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
21830 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20 72  >p4.i>0 ){.    r
21840 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
21850 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
21860 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
21870 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 2e 61  p->p4.i;.    r.a
21880 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66 64  Mem = pIn3;.#ifd
21890 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
218a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
218b0 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  <r.nField; ii++)
218c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
218d0 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
218e0 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20 20 20 20  em[ii]) );.     
218f0 20 61 73 73 65 72 74 28 20 28 72 2e 61 4d 65 6d   assert( (r.aMem
21900 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  [ii].flags & MEM
21910 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 72 2e 61  _Zero)==0 || r.a
21920 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20 29 3b 0a  Mem[ii].n==0 );.
21930 20 20 20 20 20 20 69 66 28 20 69 69 20 29 20 52        if( ii ) R
21940 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
21950 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e 61 4d 65  p->p3+ii, &r.aMe
21960 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  m[ii]);.    }.#e
21970 6e 64 69 66 0a 20 20 20 20 70 49 64 78 4b 65 79  ndif.    pIdxKey
21980 20 3d 20 26 72 3b 0a 20 20 20 20 70 46 72 65 65   = &r;.    pFree
21990 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
219a0 20 20 20 70 46 72 65 65 20 3d 20 70 49 64 78 4b     pFree = pIdxK
219b0 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
219c0 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
219d0 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  ord(pC->pKeyInfo
219e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
219f0 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  ey==0 ) goto no_
21a00 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  mem;.    assert(
21a10 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn3->flags & M
21a20 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 28  EM_Blob );.    (
21a30 76 6f 69 64 29 45 78 70 61 6e 64 42 6c 6f 62 28  void)ExpandBlob(
21a40 70 49 6e 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  pIn3);.    sqlit
21a50 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
21a60 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
21a70 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e   pIn3->n, pIn3->
21a80 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  z, pIdxKey);.  }
21a90 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  .  pIdxKey->defa
21aa0 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74 61  ult_rc = 0;.  ta
21ab0 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69 66  keJump = 0;.  if
21ac0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
21ad0 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b 0a  P_NoConflict ){.
21ae0 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 4f      /* For the O
21af0 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70 63  P_NoConflict opc
21b00 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a 75  ode, take the ju
21b10 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  mp if any of the
21b20 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66 69  .    ** input fi
21b30 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20 73  elds are NULL, s
21b40 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69 74  ince any key wit
21b50 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e 6f  h a NULL will no
21b60 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69 63  t.    ** conflic
21b70 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  t */.    for(ii=
21b80 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e 6e  0; ii<pIdxKey->n
21b90 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  Field; ii++){.  
21ba0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
21bb0 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20  >aMem[ii].flags 
21bc0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
21bd0 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20 3d        takeJump =
21be0 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
21bf0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
21c00 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
21c10 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
21c20 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
21c30 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20  ursor, pIdxKey, 
21c40 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  0, 0, &res);.  i
21c50 66 28 20 70 46 72 65 65 20 29 20 73 71 6c 69 74  f( pFree ) sqlit
21c60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 72  e3DbFree(db, pFr
21c70 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ee);.  if( rc!=S
21c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21c90 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
21ca0 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  o_error;.  }.  p
21cb0 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
21cc0 72 65 73 3b 0a 20 20 61 6c 72 65 61 64 79 45 78  res;.  alreadyEx
21cd0 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b  ists = (res==0);
21ce0 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
21cf0 20 31 2d 61 6c 72 65 61 64 79 45 78 69 73 74 73   1-alreadyExists
21d00 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
21d10 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
21d20 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
21d30 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
21d40 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
21d50 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  OP_Found ){.    
21d60 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
21d70 61 6c 72 65 61 64 79 45 78 69 73 74 73 21 3d 30  alreadyExists!=0
21d80 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 72  ,2);.    if( alr
21d90 65 61 64 79 45 78 69 73 74 73 20 29 20 67 6f 74  eadyExists ) got
21da0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
21db0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
21dc0 72 61 6e 63 68 54 61 6b 65 6e 28 74 61 6b 65 4a  ranchTaken(takeJ
21dd0 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45 78 69 73  ump||alreadyExis
21de0 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66  ts==0,2);.    if
21df0 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c 20 21 61  ( takeJump || !a
21e00 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 67  lreadyExists ) g
21e10 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
21e20 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
21e30 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 52  /* Opcode: SeekR
21e40 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a 20  owid P1 P2 P3 * 
21e50 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
21e60 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a  ntkey=r[P3].**.*
21e70 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65  * P1 is the inde
21e80 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70  x of a cursor op
21e90 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62  en on an SQL tab
21ea0 6c 65 20 62 74 72 65 65 20 28 77 69 74 68 20 69  le btree (with i
21eb0 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e  nteger.** keys).
21ec0 20 20 49 66 20 72 65 67 69 73 74 65 72 20 50 33    If register P3
21ed0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
21ee0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  n an integer or 
21ef0 69 66 20 50 31 20 64 6f 65 73 20 6e 6f 74 0a 2a  if P1 does not.*
21f00 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f  * contain a reco
21f10 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50 33  rd with rowid P3
21f20 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64   then jump immed
21f30 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 0a  iately to P2.  .
21f40 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20  ** Or, if P2 is 
21f50 30 2c 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  0, raise an SQLI
21f60 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
21f70 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63 6f 6e  . If P1 does con
21f80 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63 6f 72 64  tain.** a record
21f90 20 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74   with rowid P3 t
21fa0 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68  hen .** leave th
21fb0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
21fc0 67 20 61 74 20 74 68 61 74 20 72 65 63 6f 72 64  g at that record
21fd0 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67   and fall throug
21fe0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a  h to the next.**
21ff0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
22000 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 45 78  .** The OP_NotEx
22010 69 73 74 73 20 6f 70 63 6f 64 65 20 70 65 72 66  ists opcode perf
22020 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70  orms the same op
22030 65 72 61 74 69 6f 6e 2c 20 62 75 74 20 77 69 74  eration, but wit
22040 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 0a 2a  h OP_NotExists.*
22050 2a 20 74 68 65 20 50 33 20 72 65 67 69 73 74 65  * the P3 registe
22060 72 20 6d 75 73 74 20 62 65 20 67 75 61 72 61 6e  r must be guaran
22070 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  teed to contain 
22080 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
22090 2e 20 20 57 69 74 68 20 74 68 69 73 0a 2a 2a 20  .  With this.** 
220a0 6f 70 63 6f 64 65 2c 20 72 65 67 69 73 74 65 72  opcode, register
220b0 20 50 33 20 6d 69 67 68 74 20 6e 6f 74 20 63 6f   P3 might not co
220c0 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
220d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e  ..**.** The OP_N
220e0 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65 20 70  otFound opcode p
220f0 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65  erforms the same
22100 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69 6e   operation on in
22110 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20 28 77  dex btrees.** (w
22120 69 74 68 20 61 72 62 69 74 72 61 72 79 20 6d 75  ith arbitrary mu
22130 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73 29 2e  lti-value keys).
22140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
22150 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
22160 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
22170 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
22180 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a 20 69  be advanced.** i
22190 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
221a0 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
221b0 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
221c0 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73 20 77  d Prev opcodes w
221d0 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
221e0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
221f0 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  pcode..**.** See
22200 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
22210 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69  tFound, NoConfli
22220 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a 2a 2f  ct, SeekRowid.*/
22230 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45  ./* Opcode: NotE
22240 78 69 73 74 73 20 50 31 20 50 32 20 50 33 20 2a  xists P1 P2 P3 *
22250 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
22260 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a  intkey=r[P3].**.
22270 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
22280 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f  ex of a cursor o
22290 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74 61  pen on an SQL ta
222a0 62 6c 65 20 62 74 72 65 65 20 28 77 69 74 68 20  ble btree (with 
222b0 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73 29  integer.** keys)
222c0 2e 20 20 50 33 20 69 73 20 61 6e 20 69 6e 74 65  .  P3 is an inte
222d0 67 65 72 20 72 6f 77 69 64 2e 20 20 49 66 20 50  ger rowid.  If P
222e0 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  1 does not conta
222f0 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  in a record with
22300 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20 74 68 65  .** rowid P3 the
22310 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
22320 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72 2c 20 69  ly to P2.  Or, i
22330 66 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65  f P2 is 0, raise
22340 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
22350 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49 66 20  RRUPT error. If 
22360 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  P1 does contain 
22370 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f  a record with ro
22380 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20  wid P3 then .** 
22390 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72  leave the cursor
223a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61   pointing at tha
223b0 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c  t record and fal
223c0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
223d0 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63   next.** instruc
223e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
223f0 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f 70 63  OP_SeekRowid opc
22400 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ode performs the
22410 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20   same operation 
22420 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20  but also allows 
22430 74 68 65 0a 2a 2a 20 50 33 20 72 65 67 69 73 74  the.** P3 regist
22440 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  er to contain a 
22450 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76 61 6c 75  non-integer valu
22460 65 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  e, in which case
22470 20 74 68 65 20 6a 75 6d 70 20 69 73 0a 2a 2a 20   the jump is.** 
22480 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 20 20 54  always taken.  T
22490 68 69 73 20 6f 70 63 6f 64 65 20 72 65 71 75 69  his opcode requi
224a0 72 65 73 20 74 68 61 74 20 50 33 20 61 6c 77 61  res that P3 alwa
224b0 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ys contain an in
224c0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  teger..**.** The
224d0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63   OP_NotFound opc
224e0 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ode performs the
224f0 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20   same operation 
22500 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65 73 0a  on index btrees.
22510 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74 72 61  ** (with arbitra
22520 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b  ry multi-value k
22530 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eys)..**.** This
22540 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
22550 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
22560 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
22570 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63 65 64  nnot be advanced
22580 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20 64 69  .** in either di
22590 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  rection.  In oth
225a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65  er words, the Ne
225b0 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70 63 6f  xt and Prev opco
225c0 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  des will.** not 
225d0 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  work following t
225e0 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
225f0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
22600 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43  d, NotFound, NoC
22610 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77  onflict, SeekRow
22620 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  id.*/.case OP_Se
22630 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  ekRowid: {      
22640 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
22650 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
22660 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
22670 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
22680 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b 0a 0a 20  ;.  u64 iKey;.. 
22690 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
226a0 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70  p->p3];.  if( (p
226b0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
226c0 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
226d0 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
226e0 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  n3, SQLITE_AFF_N
226f0 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67  UMERIC, encoding
22700 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33  );.    if( (pIn3
22710 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
22720 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  t)==0 ) goto jum
22730 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f  p_to_p2;.  }.  /
22740 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
22750 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  nto OP_NotExists
22760 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45   */.case OP_NotE
22770 78 69 73 74 73 3a 20 20 20 20 20 20 20 20 20 20  xists:          
22780 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
22790 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
227a0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72  Op->p3];.  asser
227b0 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  t( pIn3->flags &
227c0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73   MEM_Int );.  as
227d0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
227e0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
227f0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
22800 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22810 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
22820 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
22830 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d  LITE_DEBUG.  pC-
22840 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a 23 65 6e  >seekOp = 0;.#en
22850 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 43  dif.  assert( pC
22860 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
22870 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
22880 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
22890 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  EE );.  pCrsr = 
228a0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
228b0 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21    assert( pCrsr!
228c0 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d 20 30 3b  =0 );.  res = 0;
228d0 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e 33 2d 3e  .  iKey = pIn3->
228e0 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  u.i;.  rc = sqli
228f0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
22900 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 30 2c  packed(pCrsr, 0,
22910 20 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b   iKey, 0, &res);
22920 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
22930 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d  QLITE_OK || res=
22940 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d 6f 76 65  =0 );.  pC->move
22950 74 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b  toTarget = iKey;
22960 20 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f    /* Used by OP_
22970 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70 43 2d 3e  Delete */.  pC->
22980 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 70  nullRow = 0;.  p
22990 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
229a0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
229b0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
229c0 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62 65 42 72  to = 0;.  VdbeBr
229d0 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
229e0 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52  ,2);.  pC->seekR
229f0 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 69  esult = res;.  i
22a00 66 28 20 72 65 73 21 3d 30 20 29 7b 0a 20 20 20  f( res!=0 ){.   
22a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22a20 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
22a30 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a  ( pOp->p2==0 ){.
22a40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22a50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22a70 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
22a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
22a90 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
22aa0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
22ab0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22ac0 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 20  pcode: Sequence 
22ad0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
22ae0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63  ynopsis: r[P2]=c
22af0 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 0a  ursor[P1].ctr++.
22b00 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  **.** Find the n
22b10 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 65  ext available se
22b20 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 66 6f  quence number fo
22b30 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20  r cursor P1..** 
22b40 57 72 69 74 65 20 74 68 65 20 73 65 71 75 65 6e  Write the sequen
22b50 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 72  ce number into r
22b60 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 54  egister P2..** T
22b70 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  he sequence numb
22b80 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  er on the cursor
22b90 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
22ba0 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20 69 6e  after this.** in
22bb0 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
22bc0 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65  case OP_Sequence
22bd0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
22be0 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72   out2 */.  asser
22bf0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
22c00 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
22c10 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
22c20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22c30 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  1]!=0 );.  asser
22c40 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  t( p->apCsr[pOp-
22c50 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70 65 21 3d  >p1]->eCurType!=
22c60 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a  CURTYPE_VTAB );.
22c70 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
22c80 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
22c90 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70  .  pOut->u.i = p
22ca0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
22cb0 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20  ->seqCount++;.  
22cc0 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70  break;.}.../* Op
22cd0 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64 20 50  code: NewRowid P
22ce0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
22cf0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
22d00 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61  owid.**.** Get a
22d10 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65 63   new integer rec
22d20 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e  ord number (a.k.
22d30 61 20 22 72 6f 77 69 64 22 29 20 75 73 65 64 20  a "rowid") used 
22d40 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20  as the key to a 
22d50 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65  table..** The re
22d60 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e  cord number is n
22d70 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73  ot previously us
22d80 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74  ed as a key in t
22d90 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  he database.** t
22da0 61 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72  able that cursor
22db0 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20   P1 points to.  
22dc0 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e  The new record n
22dd0 75 6d 62 65 72 20 69 73 20 77 72 69 74 74 65 6e  umber is written
22de0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72  .** written to r
22df0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
22e00 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50  * If P3>0 then P
22e10 33 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  3 is a register 
22e20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d  in the root fram
22e30 65 20 6f 66 20 74 68 69 73 20 56 44 42 45 20 74  e of this VDBE t
22e40 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68  hat holds .** th
22e50 65 20 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f  e largest previo
22e60 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72  usly generated r
22e70 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f  ecord number. No
22e80 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
22e90 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77  ers are.** allow
22ea0 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
22eb0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  an this value. W
22ec0 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72  hen this value r
22ed0 65 61 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d  eaches its maxim
22ee0 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54  um, .** an SQLIT
22ef0 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20  E_FULL error is 
22f00 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50  generated. The P
22f10 33 20 72 65 67 69 73 74 65 72 20 69 73 20 75 70  3 register is up
22f20 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 27  dated with the '
22f30 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65  .** generated re
22f40 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69  cord number. Thi
22f50 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69  s P3 mechanism i
22f60 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69  s used to help i
22f70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
22f80 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65  AUTOINCREMENT fe
22f90 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ature..*/.case O
22fa0 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20  P_NewRowid: {   
22fb0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
22fc0 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20 20 20 20  */.  i64 v;     
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22fe0 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a  he new rowid */.
22ff0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23000 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
23010 6f 72 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 67  or of table to g
23020 65 74 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64  et the new rowid
23030 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23050 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c  Result of an sql
23060 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20  ite3BtreeLast() 
23070 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
23080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23090 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74 20  ounter to limit 
230a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
230b0 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  arches */.  Mem 
230c0 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pMem;          
230d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
230e0 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73 74 20 72  olding largest r
230f0 6f 77 69 64 20 66 6f 72 20 41 55 54 4f 49 4e 43  owid for AUTOINC
23100 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65  REMENT */.  Vdbe
23110 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20  Frame *pFrame;  
23120 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65     /* Root frame
23130 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76   of VDBE */..  v
23140 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b   = 0;.  res = 0;
23150 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
23160 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
23170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23180 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
23190 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
231a0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
231b0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
231c0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
231d0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
231e0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
231f0 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
23200 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
23210 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f 2a 20  0 );.  {.    /* 
23220 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20 6f  The next rowid o
23230 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  r record number 
23240 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d 73  (different terms
23250 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20 20   for the same.  
23260 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20 6f    ** thing) is o
23270 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77 6f  btained in a two
23280 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e  -step algorithm.
23290 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
232a0 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74 20  irst we attempt 
232b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  to find the larg
232c0 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
232d0 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20  id and add one. 
232e0 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20     ** to that.  
232f0 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67 65  But if the large
23300 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69  st existing rowi
23310 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68 65  d is already the
23320 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   maximum.    ** 
23330 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
23340 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6c  , we have to fal
23350 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
23360 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
23370 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c 67  robabilistic alg
23380 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20  orithm.    **.  
23390 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
233a0 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f 20  algorithm is to 
233b0 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20 61  select a rowid a
233c0 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65  t random and see
233d0 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c   if.    ** it al
233e0 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
233f0 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 69  the table.  If i
23400 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
23410 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
23420 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66 20   succeeded.  If 
23430 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64  the random rowid
23440 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65 20   does exist, we 
23450 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e 65  select a new one
23460 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20  .    ** and try 
23470 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30 30  again, up to 100
23480 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   times..    */. 
23490 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
234a0 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64 65  sTable );..#ifde
234b0 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f 52  f SQLITE_32BIT_R
234c0 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65 20  OWID.#   define 
234d0 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66 66  MAX_ROWID 0x7fff
234e0 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20 2f  ffff.#else.    /
234f0 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  * Some compilers
23500 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20   complain about 
23510 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68 65  constants of the
23520 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66 66   form 0x7fffffff
23530 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a 2a  ffffffff..    **
23540 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69 6e   Others complain
23550 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66 66   about 0x7ffffff
23560 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20 54  ffffffffffLL.  T
23570 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
23580 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a 20  ro seems.    ** 
23590 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
235a0 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d 61  onstant while ma
235b0 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  king all compile
235c0 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a 2f  rs happy..    */
235d0 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
235e0 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28 28  ROWID  (i64)( ((
235f0 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66 29  (u64)0x7fffffff)
23600 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78 66  <<32) | (u64)0xf
23610 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69 66  fffffff ).#endif
23620 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e 75  ..    if( !pC->u
23630 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b  seRandomRowid ){
23640 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23650 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d  te3BtreeLast(pC-
23660 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 65  >uc.pCursor, &re
23670 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
23680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23690 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
236a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
236b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
236c0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
236d0 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50   v = 1;   /* IMP
236e0 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20  : R-61914-48074 
236f0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
23700 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23710 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23720 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e 75 63  orIsValid(pC->uc
23730 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  .pCursor) );.   
23740 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33       v = sqlite3
23750 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
23760 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
23770 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d  .        if( v>=
23780 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  MAX_ROWID ){.   
23790 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65 52 61         pC->useRa
237a0 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b 0a 20  ndomRowid = 1;. 
237b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
237c0 20 20 20 20 20 20 20 20 76 2b 2b 3b 20 20 20 2f          v++;   /
237d0 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33 38 2d 33  * IMP: R-29538-3
237e0 34 39 38 37 20 2a 2f 0a 20 20 20 20 20 20 20 20  4987 */.        
237f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23810 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
23820 4e 54 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  NT.    if( pOp->
23830 70 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p3 ){.      /* A
23840 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
23850 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
23860 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  cell. */.      a
23870 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
23880 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
23890 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  >pFrame ){.     
238a0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
238b0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
238c0 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
238d0 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
238e0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 73  );.        /* As
238f0 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73 20  sert that P3 is 
23900 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63  a valid memory c
23910 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ell. */.        
23920 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
23930 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b  =pFrame->nMem );
23940 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
23950 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f  &pFrame->aMem[pO
23960 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 7d 65  p->p3];.      }e
23970 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
23980 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
23990 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
239a0 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
239b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
239c0 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
239d0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
239e0 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 61         pMem = &a
239f0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
23a00 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
23a10 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d 29 3b  Change(p, pMem);
23a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23a30 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
23a40 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20 20  d(pMem) );..    
23a50 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
23a60 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b  (pOp->p3, pMem);
23a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23a80 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
23a90 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61 73 73  pMem);.      ass
23aa0 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
23ab0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  s & MEM_Int)!=0 
23ac0 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68  );  /* mem(P3) h
23ad0 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20  olds an integer 
23ae0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  */.      if( pMe
23af0 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49  m->u.i==MAX_ROWI
23b00 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64  D || pC->useRand
23b10 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
23b20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
23b30 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ULL;   /* IMP: R
23b40 2d 31 37 38 31 37 2d 30 30 36 33 30 20 2a 2f 0a  -17817-00630 */.
23b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
23b60 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23b80 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31  f( v<pMem->u.i+1
23b90 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20   ){.        v = 
23ba0 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20  pMem->u.i + 1;. 
23bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
23bc0 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20  m->u.i = v;.    
23bd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
23be0 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f   pC->useRandomRo
23bf0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  wid ){.      /* 
23c00 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
23c10 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38 31  F: R-07677-41881
23c20 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   If the largest 
23c30 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20 74  ROWID is equal t
23c40 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o the.      ** l
23c50 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
23c60 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 37 32  integer (9223372
23c70 30 33 36 38 35 34 37 37 35 38 30 37 29 20 74 68  036854775807) th
23c80 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  en the database.
23c90 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20        ** engine 
23ca0 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20 70  starts picking p
23cb0 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 61 74  ositive candidat
23cc0 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e 64  e ROWIDs at rand
23cd0 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a  om until.      *
23ce0 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20 74  * it finds one t
23cf0 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76 69  hat is not previ
23d00 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20  ously used. */. 
23d10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
23d20 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57  ->p3==0 );  /* W
23d30 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72  e cannot be in r
23d40 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65  andom rowid mode
23d50 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 20 20   if this is.    
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 41           ** an A
23d80 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62  UTOINCREMENT tab
23d90 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6e 74  le. */.      cnt
23da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   = 0;.      do{.
23db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23dc0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
23dd0 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20 20  f(v), &v);.     
23de0 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f 57     v &= (MAX_ROW
23df0 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20 2f 2a  ID>>1); v++;  /*
23e00 20 45 6e 73 75 72 65 20 74 68 61 74 20 76 20 69   Ensure that v i
23e10 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
23e20 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d 77 68  ero */.      }wh
23e30 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73 71 6c  ile(  ((rc = sql
23e40 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
23e50 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70  npacked(pC->uc.p
23e60 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29  Cursor, 0, (u64)
23e70 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v,.             
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53      0, &res))==S
23eb0 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20  QLITE_OK).      
23ec0 20 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30        && (res==0
23ed0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
23ee0 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b 0a 20   (++cnt<100));. 
23ef0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
23f00 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
23f10 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
23f20 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
23f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
23f40 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ULL;   /* IMP: R
23f50 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a  -38219-53002 */.
23f60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
23f70 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23f90 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20 2f  ssert( v>0 );  /
23fa0 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30 33  * EV: R-40812-03
23fb0 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  570 */.    }.   
23fc0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
23fd0 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  eto = 0;.    pC-
23fe0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
23ff0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a  ACHE_STALE;.  }.
24000 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b    pOut->u.i = v;
24010 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
24020 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 20 50  Opcode: Insert P
24030 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
24040 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65   Synopsis: intke
24050 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d 72 5b 50  y=r[P3] data=r[P
24060 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  2].**.** Write a
24070 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
24080 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f 72   table of cursor
24090 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   P1.  A new entr
240a0 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20  y is.** created 
240b0 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61 6c  if it doesn't al
240c0 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20 74  ready exist or t
240d0 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20 65  he data for an e
240e0 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79  xisting.** entry
240f0 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
24100 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74 68    The data is th
24110 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62  e value MEM_Blob
24120 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
24130 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32  ter.** number P2
24140 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f  . The key is sto
24150 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
24160 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74  P3. The key must
24170 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e 74  .** be a MEM_Int
24180 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
24190 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c  PFLAG_NCHANGE fl
241a0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
241b0 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68   then the row ch
241c0 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a  ange count is.**
241d0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74   incremented (ot
241e0 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20 49  herwise not).  I
241f0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53  f the OPFLAG_LAS
24200 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20 50  TROWID flag of P
24210 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  5 is set,.** the
24220 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72 65  n rowid is store
24230 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  d for subsequent
24240 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a 2a   return by the.*
24250 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  * sqlite3_last_i
24260 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75  nsert_rowid() fu
24270 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73  nction (otherwis
24280 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66 69  e it is unmodifi
24290 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ed)..**.** If th
242a0 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
242b0 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50  RESULT flag of P
242c0 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69 6d  5 is set, the im
242d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
242e0 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65 72  ht.** run faster
242f0 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e 20   by avoiding an 
24300 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65 6b  unnecessary seek
24310 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20 20   on cursor P1.  
24320 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20  However,.** the 
24330 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
24340 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20 6f  SULT flag must o
24350 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74 68  nly be set if th
24360 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
24370 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73 20   prior.** seeks 
24380 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f 72  on the cursor or
24390 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   if the most rec
243a0 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61 20  ent seek used a 
243b0 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 50 33 2e  key equal to P3.
243c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
243d0 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c  FLAG_ISUPDATE fl
243e0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
243f0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 70  this opcode is p
24400 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50 44  art of an.** UPD
24410 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ATE operation.  
24420 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  Otherwise (if th
24430 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 29  e flag is clear)
24440 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
24450 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20  e.** is part of 
24460 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
24470 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65 72  ion.  The differ
24480 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d 70  ence is only imp
24490 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ortant to.** the
244a0 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a   update hook..**
244b0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50 34  .** Parameter P4
244c0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 20   may point to a 
244d0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
244e0 20 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e   or may be NULL.
244f0 20 49 66 20 69 74 20 69 73 20 0a 2a 2a 20 6e 6f   If it is .** no
24500 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
24510 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28 73 71   update-hook (sq
24520 6c 69 74 65 33 2e 78 55 70 64 61 74 65 43 61 6c  lite3.xUpdateCal
24530 6c 62 61 63 6b 29 20 69 73 20 69 6e 76 6f 6b 65  lback) is invoke
24540 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  d .** following 
24550 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e 73  a successful ins
24560 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e  ert..**.** (WARN
24570 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31 20  ING/TODO: If P1 
24580 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  is a pseudo-curs
24590 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79 6e  or and P2 is dyn
245a0 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
245b0 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e 65  cated, then owne
245c0 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20 74  rship of P2 is t
245d0 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74 68  ransferred to th
245e0 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 0a  e pseudo-cursor.
245f0 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72 20  ** and register 
24600 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65 6d  P2 becomes ephem
24610 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63 75  eral.  If the cu
24620 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64 2c  rsor is changed,
24630 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
24640 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69 6c   register P2 wil
24650 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20 20  l then change.  
24660 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 64  Make sure this d
24670 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73 65  oes not.** cause
24680 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29 0a   any problems.).
24690 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
246a0 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b  uction only work
246b0 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54 68  s on tables.  Th
246c0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73  e equivalent ins
246d0 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  truction.** for 
246e0 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49 64  indices is OP_Id
246f0 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f  xInsert..*/./* O
24700 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e 74  pcode: InsertInt
24710 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
24720 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74  ** Synopsis: int
24730 6b 65 79 3d 50 33 20 64 61 74 61 3d 72 5b 50 32  key=P3 data=r[P2
24740 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ].**.** This wor
24750 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20  ks exactly like 
24760 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74  OP_Insert except
24770 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69 73   that the key is
24780 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
24790 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68  value P3, not th
247a0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
247b0 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e  nteger stored in
247c0 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f   register P3..*/
247d0 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a  .case OP_Insert:
247e0 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74   .case OP_Insert
247f0 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44  Int: {.  Mem *pD
24800 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45  ata;       /* ME
24810 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64  M cell holding d
24820 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ata for the reco
24830 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  rd to be inserte
24840 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79  d */.  Mem *pKey
24850 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20  ;        /* MEM 
24860 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79  cell holding key
24870 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64    for the record
24880 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
24890 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f   *pC;   /* Curso
248a0 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20  r to table into 
248b0 77 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20  which insert is 
248c0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
248d0 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f   seekResult;   /
248e0 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f  * Result of prio
248f0 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e  r seek or 0 if n
24900 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  o USESEEKRESULT 
24910 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  flag */.  const 
24920 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64  char *zDb;  /* d
24930 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75  atabase name - u
24940 73 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74  sed by the updat
24950 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c  e hook */.  Tabl
24960 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f 2a  e *pTab;      /*
24970 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
24980 20 2d 20 75 73 65 64 20 62 79 20 75 70 64 61 74   - used by updat
24990 65 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74 65  e and pre-update
249a0 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   hooks */.  int 
249b0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
249c0 20 4f 70 63 6f 64 65 20 66 6f 72 20 75 70 64 61   Opcode for upda
249d0 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f  te hook: SQLITE_
249e0 55 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45  UPDATE or SQLITE
249f0 5f 49 4e 53 45 52 54 20 2a 2f 0a 20 20 42 74 72  _INSERT */.  Btr
24a00 65 65 50 61 79 6c 6f 61 64 20 78 3b 20 20 20 2f  eePayload x;   /
24a10 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20 62 65 20  * Payload to be 
24a20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 6f  inserted */..  o
24a30 70 20 3d 20 30 3b 0a 20 20 70 44 61 74 61 20 3d  p = 0;.  pData =
24a40 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
24a50 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
24a60 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
24a70 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
24a80 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
24a90 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20  lid(pData) );.  
24aa0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
24ab0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
24ac0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
24ad0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
24ae0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
24af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24b00 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
24b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
24b20 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73  >isTable );.  as
24b30 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
24b40 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70  e==P4_TABLE || p
24b50 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53  Op->p4type>=P4_S
24b60 54 41 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53  TATIC );.  REGIS
24b70 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
24b80 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66  2, pData);..  if
24b90 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
24ba0 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  P_Insert ){.    
24bb0 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pKey = &aMem[pOp
24bc0 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72  ->p3];.    asser
24bd0 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26  t( pKey->flags &
24be0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
24bf0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
24c00 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  id(pKey) );.    
24c10 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
24c20 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20  Op->p3, pKey);. 
24c30 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79     x.nKey = pKey
24c40 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->u.i;.  }else{.
24c50 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
24c60 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
24c70 72 74 49 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e  rtInt );.    x.n
24c80 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  Key = pOp->p3;. 
24c90 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   }..  if( pOp->p
24ca0 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
24cb0 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f  && HAS_UPDATE_HO
24cc0 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73  OK(db) ){.    as
24cd0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
24ce0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
24cf0 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20   pC->iDb>=0 );. 
24d00 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
24d10 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61  [pC->iDb].zDbSNa
24d20 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  me;.    pTab = p
24d30 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20  Op->p4.pTab;.   
24d40 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69   assert( HasRowi
24d50 64 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 6f  d(pTab) );.    o
24d60 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  p = ((pOp->p5 & 
24d70 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
24d80 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
24d90 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   : SQLITE_INSERT
24da0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24db0 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e 6f 74  pTab = 0; /* Not
24dc0 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63   needed.  Silenc
24dd0 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
24de0 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a 44 62  ning. */.    zDb
24df0 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
24e00 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61  eded.  Silence a
24e10 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
24e20 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65  g. */.  }..#ifde
24e30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24e40 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
24e50 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70   /* Invoke the p
24e60 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20  re-update hook, 
24e70 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20  if any */.  if( 
24e80 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
24e90 6c 6c 62 61 63 6b 20 0a 20 20 20 26 26 20 70 4f  llback .   && pO
24ea0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
24eb0 42 4c 45 0a 20 20 20 26 26 20 21 28 70 4f 70 2d  BLE.   && !(pOp-
24ec0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  >p5 & OPFLAG_ISU
24ed0 50 44 41 54 45 29 0a 20 20 29 7b 0a 20 20 20 20  PDATE).  ){.    
24ee0 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
24ef0 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20  dateHook(p, pC, 
24f00 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a  SQLITE_INSERT, z
24f10 44 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79  Db, pTab, x.nKey
24f20 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 7d 0a  , pOp->p2);.  }.
24f30 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f  #endif..  if( pO
24f40 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e  p->p5 & OPFLAG_N
24f50 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61  CHANGE ) p->nCha
24f60 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70  nge++;.  if( pOp
24f70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41  ->p5 & OPFLAG_LA
24f80 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61  STROWID ) db->la
24f90 73 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b 65 79  stRowid = x.nKey
24fa0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66  ;.  if( pData->f
24fb0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24fc0 29 7b 0a 20 20 20 20 78 2e 70 44 61 74 61 20 3d  ){.    x.pData =
24fd0 20 30 3b 0a 20 20 20 20 78 2e 6e 44 61 74 61 20   0;.    x.nData 
24fe0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24ff0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d    assert( pData-
25000 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c  >flags & (MEM_Bl
25010 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20  ob|MEM_Str) );. 
25020 20 20 20 78 2e 70 44 61 74 61 20 3d 20 70 44 61     x.pData = pDa
25030 74 61 2d 3e 7a 3b 0a 20 20 20 20 78 2e 6e 44 61  ta->z;.    x.nDa
25040 74 61 20 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20  ta = pData->n;. 
25050 20 7d 0a 20 20 73 65 65 6b 52 65 73 75 6c 74 20   }.  seekResult 
25060 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  = ((pOp->p5 & OP
25070 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
25080 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
25090 73 75 6c 74 20 3a 20 30 29 3b 0a 20 20 69 66 28  sult : 0);.  if(
250a0 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
250b0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
250c0 78 2e 6e 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d  x.nZero = pData-
250d0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73  >u.nZero;.  }els
250e0 65 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d  e{.    x.nZero =
250f0 20 30 3b 0a 20 20 7d 0a 20 20 78 2e 70 4b 65 79   0;.  }.  x.pKey
25100 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
25110 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
25120 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
25130 26 78 2c 0a 20 20 20 20 20 20 28 70 4f 70 2d 3e  &x,.      (pOp->
25140 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 41 50 50  p5 & (OPFLAG_APP
25150 45 4e 44 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50  END|OPFLAG_SAVEP
25160 4f 53 49 54 49 4f 4e 29 29 2c 20 73 65 65 6b 52  OSITION)), seekR
25170 65 73 75 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d  esult.  );.  pC-
25180 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
25190 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
251a0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
251b0 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  TALE;..  /* Invo
251c0 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  ke the update-ho
251d0 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  ok if required. 
251e0 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  */.  if( rc ) go
251f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
25200 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 64 62 2d  error;.  if( db-
25210 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
25220 20 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 64 62   && op ){.    db
25230 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
25240 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  k(db->pUpdateArg
25250 2c 20 6f 70 2c 20 7a 44 62 2c 20 70 54 61 62 2d  , op, zDb, pTab-
25260 3e 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79 29 3b  >zName, x.nKey);
25270 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
25280 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65  ./* Opcode: Dele
25290 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
252a0 35 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  5.**.** Delete t
252b0 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69  he record at whi
252c0 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  ch the P1 cursor
252d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
252e0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  inting..**.** If
252f0 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 41 56 45   the OPFLAG_SAVE
25300 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20  POSITION bit of 
25310 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
25320 20 69 73 20 73 65 74 2c 20 74 68 65 6e 0a 2a 2a   is set, then.**
25330 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
25340 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
25350 67 20 61 74 20 20 65 69 74 68 65 72 20 74 68 65  g at  either the
25360 20 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72 65   next or the pre
25370 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20  vious.** record 
25380 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  in the table. If
25390 20 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69 6e   it is left poin
253a0 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74  ting at the next
253b0 20 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a   record, then.**
253c0 20 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20 69   the next Next i
253d0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
253e0 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 20 61  be a no-op. As a
253f0 20 72 65 73 75 6c 74 2c 20 69 6e 20 74 68 69 73   result, in this
25400 20 63 61 73 65 0a 2a 2a 20 69 74 20 69 73 20 6f   case.** it is o
25410 6b 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72 65  k to delete a re
25420 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  cord from within
25430 20 61 20 4e 65 78 74 20 6c 6f 6f 70 2e 20 49 66   a Next loop. If
25440 20 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53 41 56 45   .** OPFLAG_SAVE
25450 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20  POSITION bit of 
25460 50 35 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  P5 is clear, the
25470 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  n the cursor wil
25480 6c 20 62 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 20  l be.** left in 
25490 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 73 74 61  an undefined sta
254a0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
254b0 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54   OPFLAG_AUXDELET
254c0 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e 20  E bit is set on 
254d0 50 35 2c 20 74 68 61 74 20 69 6e 64 69 63 61 74  P5, that indicat
254e0 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  es that this.** 
254f0 64 65 6c 65 74 65 20 6f 6e 65 20 6f 66 20 73 65  delete one of se
25500 76 65 72 61 6c 20 61 73 73 6f 63 69 61 74 65 64  veral associated
25510 20 77 69 74 68 20 64 65 6c 65 74 69 6e 67 20 61   with deleting a
25520 20 74 61 62 6c 65 20 72 6f 77 20 61 6e 64 20 61   table row and a
25530 6c 6c 20 69 74 73 0a 2a 2a 20 61 73 73 6f 63 69  ll its.** associ
25540 61 74 65 64 20 69 6e 64 65 78 20 65 6e 74 72 69  ated index entri
25550 65 73 2e 20 20 45 78 61 63 74 6c 79 20 6f 6e 65  es.  Exactly one
25560 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
25570 73 20 69 73 20 74 68 65 20 22 70 72 69 6d 61 72  s is the "primar
25580 79 22 0a 2a 2a 20 64 65 6c 65 74 65 2e 20 20 54  y".** delete.  T
25590 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 61 6c  he others are al
255a0 6c 20 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f 52 44  l on OPFLAG_FORD
255b0 45 4c 45 54 45 20 63 75 72 73 6f 72 73 20 6f 72  ELETE cursors or
255c0 20 65 6c 73 65 20 61 72 65 0a 2a 2a 20 6d 61 72   else are.** mar
255d0 6b 65 64 20 77 69 74 68 20 74 68 65 20 41 55 58  ked with the AUX
255e0 44 45 4c 45 54 45 20 66 6c 61 67 2e 0a 2a 2a 0a  DELETE flag..**.
255f0 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
25600 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66  _NCHANGE flag of
25610 20 50 32 20 28 4e 42 3a 20 50 32 20 6e 6f 74 20   P2 (NB: P2 not 
25620 50 35 29 20 69 73 20 73 65 74 2c 20 74 68 65 6e  P5) is set, then
25630 20 74 68 65 20 72 6f 77 0a 2a 2a 20 63 68 61 6e   the row.** chan
25640 67 65 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ge count is incr
25650 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69  emented (otherwi
25660 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50  se not)..**.** P
25670 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73  1 must not be ps
25680 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20  eudo-table.  It 
25690 68 61 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  has to be a real
256a0 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d   table with.** m
256b0 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a  ultiple rows..**
256c0 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
256d0 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 70 6f   NULL then it po
256e0 69 6e 74 73 20 74 6f 20 61 20 54 61 62 6c 65 20  ints to a Table 
256f0 6f 62 6a 65 63 74 2e 20 49 6e 20 74 68 69 73 20  object. In this 
25700 63 61 73 65 20 65 69 74 68 65 72 20 0a 2a 2a 20  case either .** 
25710 74 68 65 20 75 70 64 61 74 65 20 6f 72 20 70 72  the update or pr
25720 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 6f  e-update hook, o
25730 72 20 62 6f 74 68 2c 20 6d 61 79 20 62 65 20 69  r both, may be i
25740 6e 76 6f 6b 65 64 2e 20 54 68 65 20 50 31 20 63  nvoked. The P1 c
25750 75 72 73 6f 72 20 6d 75 73 74 0a 2a 2a 20 68 61  ursor must.** ha
25760 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e  ve been position
25770 65 64 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46  ed using OP_NotF
25780 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e  ound prior to in
25790 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  voking this opco
257a0 64 65 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20 63  de in .** this c
257b0 61 73 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ase. Specificall
257c0 79 2c 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e  y, if one is con
257d0 66 69 67 75 72 65 64 2c 20 74 68 65 20 70 72 65  figured, the pre
257e0 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20  -update hook is 
257f0 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 69 66 20 50  .** invoked if P
25800 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 54  4 is not NULL. T
25810 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  he update-hook i
25820 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 6f 6e 65  s invoked if one
25830 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20   is configured, 
25840 0a 2a 2a 20 50 34 20 69 73 20 6e 6f 74 20 4e 55  .** P4 is not NU
25850 4c 4c 2c 20 61 6e 64 20 74 68 65 20 4f 50 46 4c  LL, and the OPFL
25860 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20  AG_NCHANGE flag 
25870 69 73 20 73 65 74 20 69 6e 20 50 32 2e 0a 2a 2a  is set in P2..**
25880 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
25890 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61 67 20  G_ISUPDATE flag 
258a0 69 73 20 73 65 74 20 69 6e 20 50 32 2c 20 74 68  is set in P2, th
258b0 65 6e 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  en P3 contains t
258c0 68 65 20 61 64 64 72 65 73 73 0a 2a 2a 20 6f 66  he address.** of
258d0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
258e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
258f0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 74 68  he value that th
25900 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72  e rowid of the r
25910 6f 77 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 65  ow will.** be se
25920 74 20 74 6f 20 62 79 20 74 68 65 20 75 70 64 61  t to by the upda
25930 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  te..*/.case OP_D
25940 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65 43  elete: {.  VdbeC
25950 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 63 6f 6e  ursor *pC;.  con
25960 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
25970 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
25980 6e 74 20 6f 70 66 6c 61 67 73 3b 0a 0a 20 20 6f  nt opflags;..  o
25990 70 66 6c 61 67 73 20 3d 20 70 4f 70 2d 3e 70 32  pflags = pOp->p2
259a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
259b0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
259c0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
259d0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
259e0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
259f0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
25a00 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
25a10 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
25a20 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
25a30 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
25a40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25a50 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
25a60 6f 3d 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  o==0 );..#ifdef 
25a70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
25a80 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
25a90 50 34 5f 54 41 42 4c 45 20 26 26 20 48 61 73 52  P4_TABLE && HasR
25aa0 6f 77 69 64 28 70 4f 70 2d 3e 70 34 2e 70 54 61  owid(pOp->p4.pTa
25ab0 62 29 20 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30  b) && pOp->p5==0
25ac0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 35   ){.    /* If p5
25ad0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 65   is zero, the se
25ae0 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
25af0 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65  t positioned the
25b00 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
25b10 0a 20 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74  .    ** OP_Delet
25b20 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 73 6f  e will have also
25b30 20 73 65 74 20 74 68 65 20 70 43 2d 3e 6d 6f 76   set the pC->mov
25b40 65 74 6f 54 61 72 67 65 74 20 66 69 65 6c 64 20  etoTarget field 
25b50 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a  to the rowid of.
25b60 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 74      ** the row t
25b70 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
25b80 65 74 65 64 20 2a 2f 0a 20 20 20 20 69 36 34 20  eted */.    i64 
25b90 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  iKey = sqlite3Bt
25ba0 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43  reeIntegerKey(pC
25bb0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
25bc0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6d     assert( pC->m
25bd0 6f 76 65 74 6f 54 61 72 67 65 74 3d 3d 69 4b 65  ovetoTarget==iKe
25be0 79 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  y );.  }.#endif.
25bf0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64  .  /* If the upd
25c00 61 74 65 2d 68 6f 6f 6b 20 6f 72 20 70 72 65 2d  ate-hook or pre-
25c10 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c  update-hook will
25c20 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74   be invoked, set
25c30 20 7a 44 62 20 74 6f 0a 20 20 2a 2a 20 74 68 65   zDb to.  ** the
25c40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 62 20   name of the db 
25c50 74 6f 20 70 61 73 73 20 61 73 20 74 6f 20 69 74  to pass as to it
25c60 2e 20 41 6c 73 6f 20 73 65 74 20 6c 6f 63 61 6c  . Also set local
25c70 20 70 54 61 62 20 74 6f 20 61 20 63 6f 70 79 0a   pTab to a copy.
25c80 20 20 2a 2a 20 6f 66 20 70 34 2e 70 54 61 62 2e    ** of p4.pTab.
25c90 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70 35 20   Finally, if p5 
25ca0 69 73 20 74 72 75 65 2c 20 69 6e 64 69 63 61 74  is true, indicat
25cb0 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 63 75  ing that this cu
25cc0 72 73 6f 72 20 77 61 73 0a 20 20 2a 2a 20 6c 61  rsor was.  ** la
25cd0 73 74 20 6d 6f 76 65 64 20 77 69 74 68 20 4f 50  st moved with OP
25ce0 5f 4e 65 78 74 20 6f 72 20 4f 50 5f 50 72 65 76  _Next or OP_Prev
25cf0 2c 20 6e 6f 74 20 53 65 65 6b 20 6f 72 20 4e 6f  , not Seek or No
25d00 74 46 6f 75 6e 64 2c 20 73 65 74 20 0a 20 20 2a  tFound, set .  *
25d10 2a 20 56 64 62 65 43 75 72 73 6f 72 2e 6d 6f 76  * VdbeCursor.mov
25d20 65 74 6f 54 61 72 67 65 74 20 74 6f 20 74 68 65  etoTarget to the
25d30 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20   current rowid. 
25d40 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   */.  if( pOp->p
25d50 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
25d60 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f  && HAS_UPDATE_HO
25d70 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73  OK(db) ){.    as
25d80 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30  sert( pC->iDb>=0
25d90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25da0 70 4f 70 2d 3e 70 34 2e 70 54 61 62 21 3d 30 20  pOp->p4.pTab!=0 
25db0 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d  );.    zDb = db-
25dc0 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44  >aDb[pC->iDb].zD
25dd0 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62  bSName;.    pTab
25de0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b   = pOp->p4.pTab;
25df0 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70  .    if( (pOp->p
25e00 35 20 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  5 & OPFLAG_SAVEP
25e10 4f 53 49 54 49 4f 4e 29 21 3d 30 20 26 26 20 70  OSITION)!=0 && p
25e20 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20  C->isTable ){.  
25e30 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61      pC->movetoTa
25e40 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 42 74  rget = sqlite3Bt
25e50 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43  reeIntegerKey(pC
25e60 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
25e70 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
25e80 20 20 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20    zDb = 0;   /* 
25e90 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c  Not needed.  Sil
25ea0 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20  ence a compiler 
25eb0 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  warning. */.    
25ec0 70 54 61 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f  pTab = 0;  /* No
25ed0 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e  t needed.  Silen
25ee0 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61  ce a compiler wa
25ef0 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23  rning. */.  }..#
25f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
25f10 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
25f20 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  OK.  /* Invoke t
25f30 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f  he pre-update-ho
25f40 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  ok if required. 
25f50 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72  */.  if( db->xPr
25f60 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  eUpdateCallback 
25f70 26 26 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 20  && pOp->p4.pTab 
25f80 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
25f90 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
25fa0 20 21 28 6f 70 66 6c 61 67 73 20 26 20 4f 50 46   !(opflags & OPF
25fb0 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 7c 7c  LAG_ISUPDATE) ||
25fc0 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e   (aMem[pOp->p3].
25fd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
25fe0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
25ff0 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
26000 28 70 2c 20 70 43 2c 0a 20 20 20 20 20 20 20 20  (p, pC,.        
26010 28 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41  (opflags & OPFLA
26020 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53 51  G_ISUPDATE) ? SQ
26030 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51  LITE_UPDATE : SQ
26040 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 0a 20 20  LITE_DELETE, .  
26050 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61 62 2c        zDb, pTab,
26060 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
26070 74 2c 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t,.        pOp->
26080 70 33 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  p3.    );.  }.  
26090 69 66 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50  if( opflags & OP
260a0 46 4c 41 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72  FLAG_ISNOOP ) br
260b0 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 0a 20 20  eak;.#endif. .  
260c0 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67 73 20 74 68  /* Only flags th
260d0 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 61 72  at can be set ar
260e0 65 20 53 41 56 45 50 4f 49 53 54 49 4f 4e 20 61  e SAVEPOISTION a
260f0 6e 64 20 41 55 58 44 45 4c 45 54 45 20 2a 2f 20  nd AUXDELETE */ 
26100 0a 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d  .  assert( (pOp-
26110 3e 70 35 20 26 20 7e 28 4f 50 46 4c 41 47 5f 53  >p5 & ~(OPFLAG_S
26120 41 56 45 50 4f 53 49 54 49 4f 4e 7c 4f 50 46 4c  AVEPOSITION|OPFL
26130 41 47 5f 41 55 58 44 45 4c 45 54 45 29 29 3d 3d  AG_AUXDELETE))==
26140 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  0 );.  assert( O
26150 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
26160 4f 4e 3d 3d 42 54 52 45 45 5f 53 41 56 45 50 4f  ON==BTREE_SAVEPO
26170 53 49 54 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65  SITION );.  asse
26180 72 74 28 20 4f 50 46 4c 41 47 5f 41 55 58 44 45  rt( OPFLAG_AUXDE
26190 4c 45 54 45 3d 3d 42 54 52 45 45 5f 41 55 58 44  LETE==BTREE_AUXD
261a0 45 4c 45 54 45 20 29 3b 0a 0a 23 69 66 64 65 66  ELETE );..#ifdef
261b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
261c0 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 3d 3d 30  if( p->pFrame==0
261d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e   ){.    if( pC->
261e0 69 73 45 70 68 65 6d 65 72 61 6c 3d 3d 30 0a 20  isEphemeral==0. 
261f0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e         && (pOp->
26200 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 55 58 44  p5 & OPFLAG_AUXD
26210 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20 20 20  ELETE)==0.      
26220 20 20 26 26 20 28 70 43 2d 3e 77 72 46 6c 61 67    && (pC->wrFlag
26230 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c   & OPFLAG_FORDEL
26240 45 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ETE)==0.      ){
26250 0a 20 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c  .      nExtraDel
26260 65 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ete++;.    }.   
26270 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f   if( pOp->p2 & O
26280 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b  PFLAG_NCHANGE ){
26290 0a 20 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c  .      nExtraDel
262a0 65 74 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ete--;.    }.  }
262b0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20  .#endif..  rc = 
262c0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
262d0 74 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  te(pC->uc.pCurso
262e0 72 2c 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 70  r, pOp->p5);.  p
262f0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
26300 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
26310 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
26320 20 30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   0;.  if( rc ) g
26330 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
26340 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e  _error;..  /* In
26350 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d  voke the update-
26360 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64  hook if required
26370 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 70 66 6c 61  . */.  if( opfla
26380 67 73 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41  gs & OPFLAG_NCHA
26390 4e 47 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43  NGE ){.    p->nC
263a0 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  hange++;.    if(
263b0 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
263c0 62 61 63 6b 20 26 26 20 48 61 73 52 6f 77 69 64  back && HasRowid
263d0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
263e0 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
263f0 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
26400 72 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  rg, SQLITE_DELET
26410 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e  E, zDb, pTab->zN
26420 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ame,.          p
26430 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29  C->movetoTarget)
26440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26450 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20  pC->iDb>=0 );.  
26460 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b    }.  }..  break
26470 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  ;.}./* Opcode: R
26480 65 73 65 74 43 6f 75 6e 74 20 2a 20 2a 20 2a 20  esetCount * * * 
26490 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  * *.**.** The va
264a0 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
264b0 65 20 63 6f 75 6e 74 65 72 20 69 73 20 63 6f 70  e counter is cop
264c0 69 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ied to the datab
264d0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 63 68  ase handle.** ch
264e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 28 72 65  ange counter (re
264f0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
26500 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
26510 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 29  lite3_changes())
26520 2e 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 56 4d  ..** Then the VM
26530 73 20 69 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67  s internal chang
26540 65 20 63 6f 75 6e 74 65 72 20 72 65 73 65 74 73  e counter resets
26550 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 69 73 20 69   to 0..** This i
26560 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65  s used by trigge
26570 72 20 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63  r programs..*/.c
26580 61 73 65 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  ase OP_ResetCoun
26590 74 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  t: {.  sqlite3Vd
265a0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
265b0 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
265c0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
265d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
265e0 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 43 6f 6d  pcode: SorterCom
265f0 70 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34  pare P1 P2 P3 P4
26600 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
26610 20 6b 65 79 28 50 31 29 21 3d 74 72 69 6d 28 72   key(P1)!=trim(r
26620 5b 50 33 5d 2c 50 34 29 20 67 6f 74 6f 20 50 32  [P3],P4) goto P2
26630 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73  .**.** P1 is a s
26640 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 54 68  orter cursor. Th
26650 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
26660 6f 6d 70 61 72 65 73 20 61 20 70 72 65 66 69 78  ompares a prefix
26670 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72   of the.** recor
26680 64 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74  d blob in regist
26690 65 72 20 50 33 20 61 67 61 69 6e 73 74 20 61 20  er P3 against a 
266a0 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 65 6e  prefix of the en
266b0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 74 68 65  try that .** the
266c0 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 63   sorter cursor c
266d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
266e0 74 6f 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  to.  Only the fi
266f0 72 73 74 20 50 34 20 66 69 65 6c 64 73 0a 2a 2a  rst P4 fields.**
26700 20 6f 66 20 72 5b 50 33 5d 20 61 6e 64 20 74 68   of r[P3] and th
26710 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  e sorter record 
26720 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 0a 2a 2a  are compared..**
26730 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 33  .** If either P3
26740 20 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20 63   or the sorter c
26750 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 69  ontains a NULL i
26760 6e 20 6f 6e 65 20 6f 66 20 74 68 65 69 72 20 73  n one of their s
26770 69 67 6e 69 66 69 63 61 6e 74 0a 2a 2a 20 66 69  ignificant.** fi
26780 65 6c 64 73 20 28 6e 6f 74 20 63 6f 75 6e 74 69  elds (not counti
26790 6e 67 20 74 68 65 20 50 34 20 66 69 65 6c 64 73  ng the P4 fields
267a0 20 61 74 20 74 68 65 20 65 6e 64 20 77 68 69 63   at the end whic
267b0 68 20 61 72 65 20 69 67 6e 6f 72 65 64 29 20 74  h are ignored) t
267c0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  hen.** the compa
267d0 72 69 73 6f 6e 20 69 73 20 61 73 73 75 6d 65 64  rison is assumed
267e0 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 0a 2a 2a   to be equal..**
267f0 0a 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68  .** Fall through
26800 20 74 6f 20 6e 65 78 74 20 69 6e 73 74 72 75 63   to next instruc
26810 74 69 6f 6e 20 69 66 20 74 68 65 20 74 77 6f 20  tion if the two 
26820 72 65 63 6f 72 64 73 20 63 6f 6d 70 61 72 65 20  records compare 
26830 65 71 75 61 6c 20 74 6f 0a 2a 2a 20 65 61 63 68  equal to.** each
26840 20 6f 74 68 65 72 2e 20 20 4a 75 6d 70 20 74 6f   other.  Jump to
26850 20 50 32 20 69 66 20 74 68 65 79 20 61 72 65 20   P2 if they are 
26860 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 63 61  different..*/.ca
26870 73 65 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  se OP_SorterComp
26880 61 72 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  are: {.  VdbeCur
26890 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72  sor *pC;.  int r
268a0 65 73 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  es;.  int nKeyCo
268b0 6c 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70  l;..  pC = p->ap
268c0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
268d0 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
268e0 28 70 43 29 20 29 3b 0a 20 20 61 73 73 65 72 74  (pC) );.  assert
268f0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
26900 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 49 6e  4_INT32 );.  pIn
26910 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
26920 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20  3];.  nKeyCol = 
26930 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 73  pOp->p4.i;.  res
26940 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
26950 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f  ite3VdbeSorterCo
26960 6d 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20  mpare(pC, pIn3, 
26970 6e 4b 65 79 43 6f 6c 2c 20 26 72 65 73 29 3b 0a  nKeyCol, &res);.
26980 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
26990 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
269a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
269b0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
269c0 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74  .  if( res ) got
269d0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
269e0 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70  break;.};../* Op
269f0 63 6f 64 65 3a 20 53 6f 72 74 65 72 44 61 74 61  code: SorterData
26a00 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
26a10 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
26a20 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74  =data.**.** Writ
26a30 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
26a40 50 32 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  P2 the current s
26a50 6f 72 74 65 72 20 64 61 74 61 20 66 6f 72 20 73  orter data for s
26a60 6f 72 74 65 72 20 63 75 72 73 6f 72 20 50 31 2e  orter cursor P1.
26a70 0a 2a 2a 20 54 68 65 6e 20 63 6c 65 61 72 20 74  .** Then clear t
26a80 68 65 20 63 6f 6c 75 6d 6e 20 68 65 61 64 65 72  he column header
26a90 20 63 61 63 68 65 20 6f 6e 20 63 75 72 73 6f 72   cache on cursor
26aa0 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   P3..**.** This 
26ab0 6f 70 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  opcode is normal
26ac0 6c 79 20 75 73 65 20 74 6f 20 6d 6f 76 65 20 61  ly use to move a
26ad0 20 72 65 63 6f 72 64 20 6f 75 74 20 6f 66 20 74   record out of t
26ae0 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 69 6e  he sorter and in
26af0 74 6f 0a 2a 2a 20 61 20 72 65 67 69 73 74 65 72  to.** a register
26b00 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6f 75   that is the sou
26b10 72 63 65 20 66 6f 72 20 61 20 70 73 65 75 64 6f  rce for a pseudo
26b20 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 20 63 72  -table cursor cr
26b30 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 4f  eated using.** O
26b40 70 65 6e 50 73 65 75 64 6f 2e 20 20 54 68 61 74  penPseudo.  That
26b50 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75   pseudo-table cu
26b60 72 73 6f 72 20 69 73 20 74 68 65 20 6f 6e 65 20  rsor is the one 
26b70 74 68 61 74 20 69 73 20 69 64 65 6e 74 69 66 69  that is identifi
26b80 65 64 20 62 79 0a 2a 2a 20 70 61 72 61 6d 65 74  ed by.** paramet
26b90 65 72 20 50 33 2e 20 20 43 6c 65 61 72 69 6e 67  er P3.  Clearing
26ba0 20 74 68 65 20 50 33 20 63 6f 6c 75 6d 6e 20 63   the P3 column c
26bb0 61 63 68 65 20 61 73 20 70 61 72 74 20 6f 66 20  ache as part of 
26bc0 74 68 69 73 20 6f 70 63 6f 64 65 20 73 61 76 65  this opcode save
26bd0 73 0a 2a 2a 20 75 73 20 66 72 6f 6d 20 68 61 76  s.** us from hav
26be0 69 6e 67 20 74 6f 20 69 73 73 75 65 20 61 20 73  ing to issue a s
26bf0 65 70 61 72 61 74 65 20 4e 75 6c 6c 52 6f 77 20  eparate NullRow 
26c00 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 63  instruction to c
26c10 6c 65 61 72 20 74 68 61 74 20 63 61 63 68 65 2e  lear that cache.
26c20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
26c30 65 72 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65  erData: {.  Vdbe
26c40 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70  Cursor *pC;..  p
26c50 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
26c60 3e 70 32 5d 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  >p2];.  pC = p->
26c70 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
26c80 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
26c90 65 72 28 70 43 29 20 29 3b 0a 20 20 72 63 20 3d  er(pC) );.  rc =
26ca0 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
26cb0 65 72 52 6f 77 6b 65 79 28 70 43 2c 20 70 4f 75  erRowkey(pC, pOu
26cc0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  t);.  assert( rc
26cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
26ce0 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pOut->flags & ME
26cf0 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73  M_Blob) );.  ass
26d00 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
26d10 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
26d20 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 72  ursor );.  if( r
26d30 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
26d40 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70  ue_to_error;.  p
26d50 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d  ->apCsr[pOp->p3]
26d60 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
26d70 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 62  CACHE_STALE;.  b
26d80 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
26d90 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50  de: RowData P1 P
26da0 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
26db0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61  psis: r[P2]=data
26dc0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
26dd0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
26de0 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 63  e complete row c
26df0 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 72  ontent for the r
26e00 6f 77 20 61 74 20 0a 2a 2a 20 77 68 69 63 68 20  ow at .** which 
26e10 63 75 72 73 6f 72 20 50 31 20 69 73 20 63 75 72  cursor P1 is cur
26e20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
26e30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
26e40 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f  interpretation o
26e50 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a  f the data.  .**
26e60 20 49 74 20 69 73 20 6a 75 73 74 20 63 6f 70 69   It is just copi
26e70 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 32 20 72  ed onto the P2 r
26e80 65 67 69 73 74 65 72 20 65 78 61 63 74 6c 79 20  egister exactly 
26e90 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75  as .** it is fou
26ea0 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
26eb0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
26ec0 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 61  f cursor P1 is a
26ed0 6e 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68  n index, then th
26ee0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 74 68 65  e content is the
26ef0 20 6b 65 79 20 6f 66 20 74 68 65 20 72 6f 77 2e   key of the row.
26f00 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 32  .** If cursor P2
26f10 20 69 73 20 61 20 74 61 62 6c 65 2c 20 74 68 65   is a table, the
26f20 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 65 78  n the content ex
26f30 74 72 61 63 74 65 64 20 69 73 20 74 68 65 20 64  tracted is the d
26f40 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ata..**.** If th
26f50 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
26f60 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
26f70 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74  a valid row (not
26f80 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20   a NULL row).** 
26f90 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  of a real table,
26fa0 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
26fb0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33  ble..**.** If P3
26fc0 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f 70  !=0 then this op
26fd0 63 6f 64 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  code is allowed 
26fe0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 70 68 65 72  to make an epher
26ff0 6d 65 72 61 6c 20 70 6f 69 6e 74 65 72 0a 2a 2a  meral pointer.**
27000 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
27010 73 65 20 70 61 67 65 2e 20 20 54 68 61 74 20 6d  se page.  That m
27020 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
27030 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6f 75 74  ntent of the out
27040 70 75 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  put.** register 
27050 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
27060 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
27070 68 65 20 63 75 72 73 6f 72 20 6d 6f 76 65 73 20  he cursor moves 
27080 2d 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 6d  - including.** m
27090 6f 76 65 73 20 63 61 75 73 65 64 20 62 79 20 6f  oves caused by o
270a0 74 68 65 72 20 63 75 72 73 6f 72 73 20 74 68 61  ther cursors tha
270b0 74 20 22 73 61 76 65 22 20 74 68 65 20 74 68 65  t "save" the the
270c0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 73   current cursors
270d0 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  .** position in 
270e0 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20  order that they 
270f0 63 61 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65  can write to the
27100 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 49 66   same table.  If
27110 20 50 33 3d 3d 30 0a 2a 2a 20 74 68 65 6e 20 61   P3==0.** then a
27120 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74   copy of the dat
27130 61 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  a is made into m
27140 65 6d 6f 72 79 2e 20 20 50 33 21 3d 30 20 69 73  emory.  P3!=0 is
27150 20 66 61 73 74 65 72 2c 20 62 75 74 0a 2a 2a 20   faster, but.** 
27160 50 33 3d 3d 30 20 69 73 20 73 61 66 65 72 2e 0a  P3==0 is safer..
27170 2a 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74  **.** If P3!=0 t
27180 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
27190 6f 66 20 74 68 65 20 50 32 20 72 65 67 69 73 74  of the P2 regist
271a0 65 72 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65  er is unsuitable
271b0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 4f   for use.** in O
271c0 50 5f 52 65 73 75 6c 74 20 61 6e 64 20 61 6e 79  P_Result and any
271d0 20 4f 50 5f 52 65 73 75 6c 74 20 77 69 6c 6c 20   OP_Result will 
271e0 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 50  invalidate the P
271f0 32 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65  2 register conte
27200 6e 74 2e 0a 2a 2a 20 54 68 65 20 50 32 20 72 65  nt..** The P2 re
27210 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 20 69  gister content i
27220 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
27230 20 6f 70 63 6f 64 65 73 20 6c 69 6b 65 20 4f 50   opcodes like OP
27240 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 0a 2a 2a 20  _Function or.** 
27250 62 79 20 61 6e 79 20 75 73 65 20 6f 66 20 61 6e  by any use of an
27260 6f 74 68 65 72 20 63 75 72 73 6f 72 20 70 6f 69  other cursor poi
27270 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nting to the sam
27280 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  e table..*/.case
27290 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20   OP_RowData: {. 
272a0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
272b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
272c0 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  sr;.  u32 n;..  
272d0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
272e0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 0a  lease(p, pOp);..
272f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
27300 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
27310 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
27320 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
27330 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
27340 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
27350 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
27360 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
27370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
27380 53 6f 72 74 65 72 28 70 43 29 3d 3d 30 20 29 3b  Sorter(pC)==0 );
27390 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e  .  assert( pC->n
273a0 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  ullRow==0 );.  a
273b0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
273c0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43  ursor!=0 );.  pC
273d0 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
273e0 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  rsor;..  /* The 
273f0 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64  OP_RowData opcod
27400 65 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77  es always follow
27410 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72   OP_NotExists or
27420 0a 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 52 6f 77  .  ** OP_SeekRow
27430 69 64 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2f  id or OP_Rewind/
27440 4f 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20  Op_Next with no 
27450 69 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74  intervening inst
27460 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68  ructions.  ** th
27470 61 74 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64  at might invalid
27480 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ate the cursor..
27490 20 20 2a 2a 20 49 66 20 74 68 69 73 20 77 68 65    ** If this whe
274a0 72 65 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  re not the case,
274b0 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
274c0 77 69 6e 67 20 61 73 73 65 72 74 28 29 73 0a 20  wing assert()s. 
274d0 20 2a 2a 20 77 6f 75 6c 64 20 66 61 69 6c 2e 20   ** would fail. 
274e0 20 53 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65   Should this eve
274f0 72 20 63 68 61 6e 67 65 20 28 62 65 63 61 75 73  r change (becaus
27500 65 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  e of changes in 
27510 74 68 65 20 63 6f 64 65 0a 20 20 2a 2a 20 67 65  the code.  ** ge
27520 6e 65 72 61 74 6f 72 29 20 74 68 65 6e 20 74 68  nerator) then th
27530 65 20 66 69 78 20 77 6f 75 6c 64 20 62 65 20 74  e fix would be t
27540 6f 20 69 6e 73 65 72 74 20 61 20 63 61 6c 6c 20  o insert a call 
27550 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  to.  ** sqlite3V
27560 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
27570 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
27580 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
27590 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  veto==0 );.  ass
275a0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
275b0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
275c0 43 72 73 72 29 20 29 3b 0a 23 69 66 20 30 20 20  Crsr) );.#if 0  
275d0 2f 2a 20 4e 6f 74 20 72 65 71 75 69 72 65 64 20  /* Not required 
275e0 64 75 65 20 74 6f 20 74 68 65 20 70 72 65 76 69  due to the previ
275f0 6f 75 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ous to assert() 
27600 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
27610 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
27620 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
27630 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27640 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
27650 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
27660 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 20 3d 20 73  .#endif..  n = s
27670 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
27680 61 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20  adSize(pCrsr);. 
27690 20 69 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e   if( n>(u32)db->
276a0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
276b0 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
276c0 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
276d0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
276e0 20 6e 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20   n==0 );.  rc = 
276f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
27700 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 30  omBtree(pCrsr, 0
27710 2c 20 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66  , n, pOut);.  if
27720 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
27730 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
27740 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 33 20 29    if( !pOp->p3 )
27750 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
27760 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f  pOut);.  UPDATE_
27770 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
27780 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  t);.  REGISTER_T
27790 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
277a0 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
277b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69  ./* Opcode: Rowi
277c0 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
277d0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
277e0 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 53 74 6f  =rowid.**.** Sto
277f0 72 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  re in register P
27800 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  2 an integer whi
27810 63 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66  ch is the key of
27820 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
27830 20 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63   that.** P1 is c
27840 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74  urrently point t
27850 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20  o..**.** P1 can 
27860 62 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64  be either an ord
27870 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61  inary table or a
27880 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
27890 20 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a   There used to.*
278a0 2a 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20  * be a separate 
278b0 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65  OP_VRowid opcode
278c0 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69   for use with vi
278d0 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75  rtual tables, bu
278e0 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70  t this.** one op
278f0 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66  code now works f
27900 6f 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79  or both table ty
27910 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  pes..*/.case OP_
27920 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20  Rowid: {        
27930 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
27940 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
27950 20 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20   *pC;.  i64 v;. 
27960 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
27970 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
27980 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
27990 6f 64 75 6c 65 3b 0a 0a 20 20 70 4f 75 74 20 3d  odule;..  pOut =
279a0 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
279b0 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65 72  p, pOp);.  asser
279c0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
279d0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
279e0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
279f0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
27a00 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
27a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27a20 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
27a30 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43  YPE_PSEUDO || pC
27a40 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 69  ->nullRow );.  i
27a50 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  f( pC->nullRow )
27a60 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
27a70 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
27a80 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65    break;.  }else
27a90 20 69 66 28 20 70 43 2d 3e 64 65 66 65 72 72 65   if( pC->deferre
27aa0 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 76  dMoveto ){.    v
27ab0 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72   = pC->movetoTar
27ac0 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
27ad0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
27ae0 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69 66  TABLE.  }else if
27af0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
27b00 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 7b 0a  CURTYPE_VTAB ){.
27b10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
27b20 75 63 2e 70 56 43 75 72 21 3d 30 20 29 3b 0a 20  uc.pVCur!=0 );. 
27b30 20 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 75     pVtab = pC->u
27b40 63 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a  c.pVCur->pVtab;.
27b50 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56      pModule = pV
27b60 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
27b70 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c    assert( pModul
27b80 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20  e->xRowid );.   
27b90 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
27ba0 52 6f 77 69 64 28 70 43 2d 3e 75 63 2e 70 56 43  Rowid(pC->uc.pVC
27bb0 75 72 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c  ur, &v);.    sql
27bc0 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
27bd0 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rmsg(p, pVtab);.
27be0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27bf0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
27c00 72 72 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  rror;.#endif /* 
27c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
27c20 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65  UALTABLE */.  }e
27c30 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
27c40 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
27c50 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
27c60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
27c70 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
27c80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27c90 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
27ca0 72 65 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20  re(pC);.    if( 
27cb0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
27cc0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
27cd0 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
27ce0 77 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d  w ){.      pOut-
27cf0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
27d00 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
27d10 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71      }.    v = sq
27d20 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
27d30 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72  rKey(pC->uc.pCur
27d40 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  sor);.  }.  pOut
27d50 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65  ->u.i = v;.  bre
27d60 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
27d70 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a  : NullRow P1 * *
27d80 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20   * *.**.** Move 
27d90 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f  the cursor P1 to
27da0 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41 6e   a null row.  An
27db0 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72  y OP_Column oper
27dc0 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6f  ations.** that o
27dd0 63 63 75 72 20 77 68 69 6c 65 20 74 68 65 20 63  ccur while the c
27de0 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65 20  ursor is on the 
27df0 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61 6c  null row will al
27e00 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61 20  ways.** write a 
27e10 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
27e20 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56 64  _NullRow: {.  Vd
27e30 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20  beCursor *pC;.. 
27e40 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
27e50 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
27e60 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
27e70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
27e80 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
27e90 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e   pC!=0 );.  pC->
27ea0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
27eb0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
27ec0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
27ed0 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  if( pC->eCurType
27ee0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
27ef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27f00 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
27f10 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
27f20 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
27f30 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
27f40 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
27f50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74  ./* Opcode: Last
27f60 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
27f70 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65  .** The next use
27f80 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72   of the Rowid or
27f90 20 43 6f 6c 75 6d 6e 20 6f 72 20 50 72 65 76 20   Column or Prev 
27fa0 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
27fb0 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65  P1 .** will refe
27fc0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
27fd0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
27fe0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
27ff0 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  ex..** If the ta
28000 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
28010 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20  empty and P2>0, 
28020 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
28030 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20  ately to P2..** 
28040 49 66 20 50 32 20 69 73 20 30 20 6f 72 20 69 66  If P2 is 0 or if
28050 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
28060 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  dex is not empty
28070 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  , fall through.*
28080 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
28090 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ng instruction..
280a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
280b0 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  e leaves the cur
280c0 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74  sor configured t
280d0 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73  o move in revers
280e0 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d  e order,.** from
280f0 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20   the end toward 
28100 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20  the beginning.  
28110 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
28120 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  the cursor is.**
28130 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
28140 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78  se Prev, not Nex
28150 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69  t..**.** If P3 i
28160 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  s -1, then the c
28170 75 72 73 6f 72 20 69 73 20 70 6f 73 69 74 69 6f  ursor is positio
28180 6e 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ned at the end o
28190 66 20 74 68 65 20 62 74 72 65 65 0a 2a 2a 20 66  f the btree.** f
281a0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
281b0 66 20 61 70 70 65 6e 64 69 6e 67 20 61 20 6e 65  f appending a ne
281c0 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20 74 68 65  w entry onto the
281d0 20 62 74 72 65 65 2e 20 20 49 6e 20 74 68 61 74   btree.  In that
281e0 0a 2a 2a 20 63 61 73 65 20 50 32 20 6d 75 73 74  .** case P2 must
281f0 20 62 65 20 30 2e 20 20 49 74 20 69 73 20 61 73   be 0.  It is as
28200 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
28210 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
28220 6c 79 20 66 6f 72 0a 2a 2a 20 61 70 70 65 6e 64  ly for.** append
28230 69 6e 67 20 61 6e 64 20 73 6f 20 69 66 20 74 68  ing and so if th
28240 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
28250 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
28260 6f 72 20 6d 75 73 74 20 61 6c 72 65 61 64 79 0a  or must already.
28270 2a 2a 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 61  ** be pointing a
28280 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
28290 20 62 74 72 65 65 20 61 6e 64 20 73 6f 20 6e 6f   btree and so no
282a0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
282b0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 73  e to.** the curs
282c0 6f 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  or..*/.case OP_L
282d0 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ast: {        /*
282e0 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
282f0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
28300 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
28310 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
28320 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
28330 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
28340 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
28350 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
28360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
28370 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28380 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
28390 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
283a0 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
283b0 43 75 72 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20  Cursor;.  res = 
283c0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  0;.  assert( pCr
283d0 73 72 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 73  sr!=0 );.  pC->s
283e0 65 65 6b 52 65 73 75 6c 74 20 3d 20 70 4f 70 2d  eekResult = pOp-
283f0 3e 70 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  >p3;.#ifdef SQLI
28400 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73  TE_DEBUG.  pC->s
28410 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
28420 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f  .#endif.  if( pO
28430 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 21 73 71 6c  p->p3==0 || !sql
28440 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
28450 73 56 61 6c 69 64 4e 4e 28 70 43 72 73 72 29 20  sValidNN(pCrsr) 
28460 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
28470 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 72  te3BtreeLast(pCr
28480 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70  sr, &res);.    p
28490 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38  C->nullRow = (u8
284a0 29 72 65 73 3b 0a 20 20 20 20 70 43 2d 3e 64 65  )res;.    pC->de
284b0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
284c0 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
284d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
284e0 41 4c 45 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ALE;.    if( rc 
284f0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
28500 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  _to_error;.    i
28510 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  f( pOp->p2>0 ){.
28520 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
28530 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
28540 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29  .      if( res )
28550 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
28560 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
28580 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  ->p2==0 );.  }. 
28590 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
285a0 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 53 6f 72  pcode: SorterSor
285b0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
285c0 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 72 65  .** After all re
285d0 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20  cords have been 
285e0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
285f0 65 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a  e Sorter object.
28600 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
28610 20 50 31 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73   P1, invoke this
28620 20 6f 70 63 6f 64 65 20 74 6f 20 61 63 74 75 61   opcode to actua
28630 6c 6c 79 20 64 6f 20 74 68 65 20 73 6f 72 74 69  lly do the sorti
28640 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  ng..** Jump to P
28650 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  2 if there are n
28660 6f 20 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20  o records to be 
28670 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  sorted..**.** Th
28680 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6e 20  is opcode is an 
28690 61 6c 69 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72  alias for OP_Sor
286a0 74 20 61 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20  t and OP_Rewind 
286b0 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  that is used.** 
286c0 66 6f 72 20 53 6f 72 74 65 72 20 6f 62 6a 65 63  for Sorter objec
286d0 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ts..*/./* Opcode
286e0 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a  : Sort P1 P2 * *
286f0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
28700 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c  code does exactl
28710 79 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  y the same thing
28720 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78   as OP_Rewind ex
28730 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20  cept that.** it 
28740 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e  increments an un
28750 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61  documented globa
28760 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  l variable used 
28770 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a  for testing..**.
28780 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63  ** Sorting is ac
28790 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72  complished by wr
287a0 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  iting records in
287b0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
287c0 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69  ex,.** then rewi
287d0 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  nding that index
287e0 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20   and playing it 
287f0 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e  back from beginn
28800 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20  ing to.** end.  
28810 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f  We use the OP_So
28820 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61  rt opcode instea
28830 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74  d of OP_Rewind t
28840 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69  o do the.** rewi
28850 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68  nding so that th
28860 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
28870 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d  e will be increm
28880 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67  ented and.** reg
28890 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61  ression tests ca
288a0 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  n determine whet
288b0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f  her or not the o
288c0 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63  ptimizer is.** c
288d0 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a  orrectly optimiz
288e0 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a  ing out sorts..*
288f0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
28900 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Sort:    /* jump
28910 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74   */.case OP_Sort
28920 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
28930 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
28940 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
28950 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
28960 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
28970 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
28980 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
28990 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
289a0 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20  S_SORT]++;.  /* 
289b0 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
289c0 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d  o OP_Rewind */.}
289d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69  ./* Opcode: Rewi
289e0 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nd P1 P2 * * *.*
289f0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
28a00 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f  e of the Rowid o
28a10 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
28a20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
28a30 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
28a40 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
28a50 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
28a60 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
28a70 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
28a80 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
28a90 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d  s empty, jump im
28aa0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
28ab0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
28ac0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
28ad0 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
28ae0 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ough to the foll
28af0 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75  owing .** instru
28b00 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ction..**.** Thi
28b10 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
28b20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
28b30 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
28b40 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
28b50 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
28b60 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
28b70 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
28b80 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
28b90 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
28ba0 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
28bb0 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73  not Prev..*/.cas
28bc0 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
28bd0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
28be0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
28bf0 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
28c00 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
28c10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
28c20 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
28c30 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
28c40 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
28c50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
28c60 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
28c70 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
28c80 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
28c90 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  e==OP_SorterSort
28ca0 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a  ) );.  res = 1;.
28cb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28cc0 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
28cd0 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 23 65   = OP_Rewind;.#e
28ce0 6e 64 69 66 0a 20 20 69 66 28 20 69 73 53 6f 72  ndif.  if( isSor
28cf0 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 72  ter(pC) ){.    r
28d00 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
28d10 6f 72 74 65 72 52 65 77 69 6e 64 28 70 43 2c 20  orterRewind(pC, 
28d20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  &res);.  }else{.
28d30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
28d40 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
28d50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 70  E_BTREE );.    p
28d60 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
28d70 75 72 73 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  ursor;.    asser
28d80 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20  t( pCrsr );.    
28d90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
28da0 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72  eFirst(pCrsr, &r
28db0 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  es);.    pC->def
28dc0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
28dd0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
28de0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
28df0 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  LE;.  }.  if( rc
28e00 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
28e10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43  e_to_error;.  pC
28e20 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
28e30 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  res;.  assert( p
28e40 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
28e50 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
28e60 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
28e70 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
28e80 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70   res ) goto jump
28e90 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
28ea0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
28eb0 65 78 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ext P1 P2 P3 P4 
28ec0 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  P5.**.** Advance
28ed0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
28ee0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
28ef0 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74  the next key/dat
28f00 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a  a pair in its.**
28f10 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
28f20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
28f30 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65  o more key/value
28f40 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
28f50 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
28f60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
28f70 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
28f80 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76  f the cursor adv
28f90 61 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73  ance was success
28fa0 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d  ful,.** jump imm
28fb0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
28fc0 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65 78 74 20 6f  **.** The Next o
28fd0 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61  pcode is only va
28fe0 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  lid following an
28ff0 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
29000 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65 77 69 6e 64   or.** OP_Rewind
29010 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20   opcode used to 
29020 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
29030 73 6f 72 2e 20 20 4e 65 78 74 20 69 73 20 6e 6f  sor.  Next is no
29040 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  t allowed.** to 
29050 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c 20 53  follow SeekLT, S
29060 65 65 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c 61 73  eekLE, or OP_Las
29070 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20  t..**.** The P1 
29080 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66  cursor must be f
29090 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  or a real table,
290a0 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
290b0 62 6c 65 2e 20 20 50 31 20 6d 75 73 74 20 68 61  ble.  P1 must ha
290c0 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 70 65 6e 65  ve.** been opene
290d0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
290e0 6f 70 63 6f 64 65 20 6f 72 20 74 68 65 20 70 72  opcode or the pr
290f0 6f 67 72 61 6d 20 77 69 6c 6c 20 73 65 67 66 61  ogram will segfa
29100 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ult..**.** The P
29110 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e  3 value is a hin
29120 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  t to the btree i
29130 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49  mplementation. I
29140 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a  f P3==1, that.**
29150 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20   means P1 is an 
29160 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
29170 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  at this instruct
29180 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
29190 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69  een.** omitted i
291a0 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 61 64  f that index had
291b0 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50   been unique.  P
291c0 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20  3 is usually 0. 
291d0 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73   P3 is.** always
291e0 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
291f0 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
29200 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
29210 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
29220 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
29230 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
29240 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a  BtreeNext()..**.
29250 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73 69  ** If P5 is posi
29260 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d  tive and the jum
29270 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e  p is taken, then
29280 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a   event counter.*
29290 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e  * number P5-1 in
292a0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
292b0 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65  atement is incre
292c0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  mented..**.** Se
292d0 65 20 61 6c 73 6f 3a 20 50 72 65 76 2c 20 4e 65  e also: Prev, Ne
292e0 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f  xtIfOpen.*/./* O
292f0 70 63 6f 64 65 3a 20 4e 65 78 74 49 66 4f 70 65  pcode: NextIfOpe
29300 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
29310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
29320 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
29330 6b 65 20 4e 65 78 74 20 65 78 63 65 70 74 20 74  ke Next except t
29340 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
29350 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
29360 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
29370 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
29380 3a 20 50 72 65 76 20 50 31 20 50 32 20 50 33 20  : Prev P1 P2 P3 
29390 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b  P4 P5.**.** Back
293a0 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f   up cursor P1 so
293b0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
293c0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
293d0 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e  key/data pair in
293e0 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   its.** table or
293f0 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72   index.  If ther
29400 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73  e is no previous
29410 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
29420 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
29430 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
29440 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
29450 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  on.  But if the 
29460 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61  cursor backup wa
29470 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
29480 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
29490 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a  y to P2..**.**.*
294a0 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64  * The Prev opcod
294b0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
294c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
294d0 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 0a  kLT, SeekLE, or.
294e0 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f 64  ** OP_Last opcod
294f0 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
29500 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  on the cursor.  
29510 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  Prev is not allo
29520 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77  wed.** to follow
29530 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
29540 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a   or OP_Rewind..*
29550 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
29560 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
29570 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
29580 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
29590 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e 6f    If P1 is.** no
295a0 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68 65 20  t open then the 
295b0 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65  behavior is unde
295c0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fined..**.** The
295d0 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20 68   P3 value is a h
295e0 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65 65  int to the btree
295f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
29600 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a   If P3==1, that.
29610 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61  ** means P1 is a
29620 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
29630 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72 75  that this instru
29640 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ction could have
29650 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64   been.** omitted
29660 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20 68   if that index h
29670 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20  ad been unique. 
29680 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30   P3 is usually 0
29690 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61  .  P3 is.** alwa
296a0 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 31  ys either 0 or 1
296b0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c  ..**.** P4 is al
296c0 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f  ways of type P4_
296d0 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e  ADVANCE. The fun
296e0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f  ction pointer po
296f0 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  ints to.** sqlit
29700 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
29710 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  )..**.** If P5 i
29720 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
29730 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
29740 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
29750 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
29760 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
29770 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
29780 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
29790 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76  ./* Opcode: Prev
297a0 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20  IfOpen P1 P2 P3 
297b0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
297c0 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75   opcode works ju
297d0 73 74 20 6c 69 6b 65 20 50 72 65 76 20 65 78 63  st like Prev exc
297e0 65 70 74 20 74 68 61 74 20 69 66 20 63 75 72 73  ept that if curs
297f0 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  or P1 is not.** 
29800 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 73 20  open it behaves 
29810 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f  a no-op..*/./* O
29820 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4e 65 78  pcode: SorterNex
29830 74 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a  t P1 P2 * * P5.*
29840 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
29850 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
29860 20 4f 50 5f 4e 65 78 74 20 65 78 63 65 70 74 20   OP_Next except 
29870 74 68 61 74 20 50 31 20 6d 75 73 74 20 62 65 20  that P1 must be 
29880 61 0a 2a 2a 20 73 6f 72 74 65 72 20 6f 62 6a 65  a.** sorter obje
29890 63 74 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ct for which the
298a0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 20 6f   OP_SorterSort o
298b0 70 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a  pcode has been.*
298c0 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 69 73  * invoked.  This
298d0 20 6f 70 63 6f 64 65 20 61 64 76 61 6e 63 65 73   opcode advances
298e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
298f0 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a  he next sorted.*
29900 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 6a 75 6d  * record, or jum
29910 70 73 20 74 6f 20 50 32 20 69 66 20 74 68 65 72  ps to P2 if ther
29920 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 73 6f  e are no more so
29930 72 74 65 64 20 72 65 63 6f 72 64 73 2e 0a 2a 2f  rted records..*/
29940 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e  .case OP_SorterN
29950 65 78 74 3a 20 7b 20 20 2f 2a 20 6a 75 6d 70 20  ext: {  /* jump 
29960 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
29970 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
29980 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
29990 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
299a0 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
299b0 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  ) );.  res = 0;.
299c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
299d0 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
299e0 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 67 6f   pC, &res);.  go
299f0 74 6f 20 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61  to next_tail;.ca
29a00 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
29a10 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a  :    /* jump */.
29a20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
29a30 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  en:    /* jump *
29a40 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  /.  if( p->apCsr
29a50 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30 20 29 20 62  [pOp->p1]==0 ) b
29a60 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  reak;.  /* Fall 
29a70 74 68 72 6f 75 67 68 20 2a 2f 0a 63 61 73 65 20  through */.case 
29a80 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20 20  OP_Prev:        
29a90 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
29aa0 65 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20 20 20  e OP_Next:      
29ab0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
29ac0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
29ad0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
29ae0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
29af0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41  ssert( pOp->p5<A
29b00 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75  rraySize(p->aCou
29b10 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20  nter) );.  pC = 
29b20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
29b30 5d 3b 0a 20 20 72 65 73 20 3d 20 70 4f 70 2d 3e  ];.  res = pOp->
29b40 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  p3;.  assert( pC
29b50 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
29b60 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
29b70 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
29b80 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
29b90 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
29ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 65 73  );.  assert( res
29bb0 3d 3d 30 20 7c 7c 20 28 72 65 73 3d 3d 31 20 26  ==0 || (res==1 &
29bc0 26 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  & pC->isTable==0
29bd0 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
29be0 20 72 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73   res==1 );.  ass
29bf0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
29c00 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70  !=OP_Next || pOp
29c10 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
29c20 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 20  qlite3BtreeNext 
29c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
29c40 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
29c50 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64  v || pOp->p4.xAd
29c60 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74  vance==sqlite3Bt
29c70 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b 0a 20  reePrevious );. 
29c80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
29c90 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f  code!=OP_NextIfO
29ca0 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78  pen || pOp->p4.x
29cb0 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33  Advance==sqlite3
29cc0 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20 61  BtreeNext );.  a
29cd0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
29ce0 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65  de!=OP_PrevIfOpe
29cf0 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64  n || pOp->p4.xAd
29d00 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74  vance==sqlite3Bt
29d10 72 65 65 50 72 65 76 69 6f 75 73 29 3b 0a 0a 20  reePrevious);.. 
29d20 20 2f 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63   /* The Next opc
29d30 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ode is only used
29d40 20 61 66 74 65 72 20 53 65 65 6b 47 54 2c 20 53   after SeekGT, S
29d50 65 65 6b 47 45 2c 20 61 6e 64 20 52 65 77 69 6e  eekGE, and Rewin
29d60 64 2e 0a 20 20 2a 2a 20 54 68 65 20 50 72 65 76  d..  ** The Prev
29d70 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
29d80 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b 4c  used after SeekL
29d90 54 2c 20 53 65 65 6b 4c 45 2c 20 61 6e 64 20 4c  T, SeekLE, and L
29da0 61 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ast. */.  assert
29db0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
29dc0 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 6f  P_Next || pOp->o
29dd0 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66  pcode!=OP_NextIf
29de0 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70  Open.       || p
29df0 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
29e00 65 6b 47 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  ekGT || pC->seek
29e10 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a 20 20  Op==OP_SeekGE.  
29e20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
29e30 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 7c 7c  Op==OP_Rewind ||
29e40 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
29e50 46 6f 75 6e 64 29 3b 0a 20 20 61 73 73 65 72 74  Found);.  assert
29e60 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
29e70 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 6f  P_Prev || pOp->o
29e80 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49 66  pcode!=OP_PrevIf
29e90 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70  Open.       || p
29ea0 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
29eb0 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  ekLT || pC->seek
29ec0 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20 20  Op==OP_SeekLE.  
29ed0 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
29ee0 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 0a  Op==OP_Last );..
29ef0 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 78    rc = pOp->p4.x
29f00 41 64 76 61 6e 63 65 28 70 43 2d 3e 75 63 2e 70  Advance(pC->uc.p
29f10 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 6e  Cursor, &res);.n
29f20 65 78 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d 3e  ext_tail:.  pC->
29f30 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
29f40 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64 62  CHE_STALE;.  Vdb
29f50 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
29f60 3d 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  ==0,2);.  if( rc
29f70 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
29f80 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
29f90 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
29fa0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
29fb0 0a 20 20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72  .    p->aCounter
29fc0 5b 70 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a 23 69 66  [pOp->p5]++;.#if
29fd0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
29fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
29ff0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
2a000 69 66 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  if.    goto jump
2a010 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b  _to_p2_and_check
2a020 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a  _for_interrupt;.
2a030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 2d    }else{.    pC-
2a040 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
2a050 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  }.  goto check_f
2a060 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
2a070 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49  ./* Opcode: IdxI
2a080 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50  nsert P1 P2 P3 P
2a090 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2a0a0 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a  : key=r[P2].**.*
2a0b0 2a 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f  * Register P2 ho
2a0c0 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  lds an SQL index
2a0d0 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20   key made using 
2a0e0 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72  the.** MakeRecor
2a0f0 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  d instructions. 
2a100 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69   This opcode wri
2a110 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20  tes that key.** 
2a120 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50  into the index P
2a130 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65  1.  Data for the
2a140 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a   entry is nil..*
2a150 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
2a160 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  t zero, then it 
2a170 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a180 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 75   values in the u
2a190 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f  npacked.** key o
2a1a0 66 20 72 65 67 28 50 32 29 2e 20 20 49 6e 20 74  f reg(P2).  In t
2a1b0 68 61 74 20 63 61 73 65 2c 20 50 33 20 69 73 20  hat case, P3 is 
2a1c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2a1d0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 0a   first register.
2a1e0 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e 70 61 63  ** for the unpac
2a1f0 6b 65 64 20 6b 65 79 2e 20 20 54 68 65 20 61 76  ked key.  The av
2a200 61 69 6c 61 62 69 6c 69 74 79 20 6f 66 20 74 68  ailability of th
2a210 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 63  e unpacked key c
2a220 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  an sometimes.** 
2a230 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  be an optimizati
2a240 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  on..**.** If P5 
2a250 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 41  has the OPFLAG_A
2a260 50 50 45 4e 44 20 62 69 74 20 73 65 74 2c 20 74  PPEND bit set, t
2a270 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
2a280 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
2a290 72 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  r.** that this i
2a2a0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
2a2b0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
2a2c0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73  .**.** If P5 has
2a2d0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
2a2e0 4e 47 45 20 62 69 74 20 73 65 74 2c 20 74 68 65  NGE bit set, the
2a2f0 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  n the change cou
2a300 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65  nter is.** incre
2a310 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 69  mented by this i
2a320 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
2a330 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
2a340 47 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c  GE bit is clear,
2a350 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61  .** then the cha
2a360 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75  nge counter is u
2a370 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
2a380 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
2a390 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
2a3a0 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74   of P5 is set, t
2a3b0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2a3c0 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66  n might.** run f
2a3d0 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
2a3e0 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  g an unnecessary
2a3f0 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20   seek on cursor 
2a400 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  P1.  However,.**
2a410 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
2a420 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d  EEKRESULT flag m
2a430 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  ust only be set 
2a440 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
2a450 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73  en no prior.** s
2a460 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73  eeks on the curs
2a470 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73  or or if the mos
2a480 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73  t recent seek us
2a490 65 64 20 61 20 6b 65 79 20 65 71 75 69 76 61 6c  ed a key equival
2a4a0 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a  ent.** to P2. .*
2a4b0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
2a4c0 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
2a4d0 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54   for indices.  T
2a4e0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
2a4f0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
2a500 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e   tables is OP_In
2a510 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sert..*/./* Opco
2a520 64 65 3a 20 53 6f 72 74 65 72 49 6e 73 65 72 74  de: SorterInsert
2a530 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2a540 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2a550 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  P2].**.** Regist
2a560 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53  er P2 holds an S
2a570 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64  QL index key mad
2a580 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d  e using the.** M
2a590 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
2a5a0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70  ctions.  This op
2a5b0 63 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74  code writes that
2a5c0 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65   key.** into the
2a5d0 20 73 6f 72 74 65 72 20 50 31 2e 20 20 44 61 74   sorter P1.  Dat
2a5e0 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  a for the entry 
2a5f0 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20  is nil..*/.case 
2a600 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
2a610 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
2a620 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65  .case OP_IdxInse
2a630 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
2a640 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in2 */.  VdbeCur
2a650 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 72 65 65  sor *pC;.  Btree
2a660 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20 20 61 73  Payload x;..  as
2a670 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2a680 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2a690 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2a6a0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2a6b0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2a6c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2a6d0 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 28   isSorter(pC)==(
2a6e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2a6f0 53 6f 72 74 65 72 49 6e 73 65 72 74 29 20 29 3b  SorterInsert) );
2a700 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
2a710 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
2a720 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20  rt( pIn2->flags 
2a730 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
2a740 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
2a750 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
2a760 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 61  ->nChange++;.  a
2a770 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2a780 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2a790 45 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  EE || pOp->opcod
2a7a0 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2a7b0 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rt );.  assert( 
2a7c0 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
2a7d0 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42  ;.  rc = ExpandB
2a7e0 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 69 66 28  lob(pIn2);.  if(
2a7f0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2a800 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2a810 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2a820 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  ==OP_SorterInser
2a830 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
2a840 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57  lite3VdbeSorterW
2a850 72 69 74 65 28 70 43 2c 20 70 49 6e 32 29 3b 0a  rite(pC, pIn2);.
2a860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e    }else{.    x.n
2a870 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20  Key = pIn2->n;. 
2a880 20 20 20 78 2e 70 4b 65 79 20 3d 20 70 49 6e 32     x.pKey = pIn2
2a890 2d 3e 7a 3b 0a 20 20 20 20 78 2e 61 4d 65 6d 20  ->z;.    x.aMem 
2a8a0 3d 20 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33  = aMem + pOp->p3
2a8b0 3b 0a 20 20 20 20 78 2e 6e 4d 65 6d 20 3d 20 28  ;.    x.nMem = (
2a8c0 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
2a8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2a8e0 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75  treeInsert(pC->u
2a8f0 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20  c.pCursor, &x,. 
2a900 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35          (pOp->p5
2a910 20 26 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e   & (OPFLAG_APPEN
2a920 44 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  D|OPFLAG_SAVEPOS
2a930 49 54 49 4f 4e 29 29 2c 20 0a 20 20 20 20 20 20  ITION)), .      
2a940 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
2a950 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
2a960 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
2a970 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
2a980 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
2a990 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2a9a0 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43  eto==0 );.    pC
2a9b0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
2a9c0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
2a9d0 0a 20 20 69 66 28 20 72 63 29 20 67 6f 74 6f 20  .  if( rc) goto 
2a9e0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2a9f0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
2aa00 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65  /* Opcode: IdxDe
2aa10 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 2a 20  lete P1 P2 P3 * 
2aa20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
2aa30 65 79 3d 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a  ey=r[P2@P3].**.*
2aa40 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2aa50 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
2aa60 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
2aa70 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
2aa80 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2aa90 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
2aaa0 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
2aab0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
2aac0 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
2aad0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
2aae0 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
2aaf0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
2ab00 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
2ab10 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
2ab20 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
2ab30 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
2ab40 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
2ab50 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ab60 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
2ab70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
2ab80 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
2ab90 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
2aba0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2abb0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2abc0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2abd0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2abe0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2abf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2ac00 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2ac10 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73  _BTREE );.  pCrs
2ac20 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
2ac30 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  or;.  assert( pC
2ac40 72 73 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rsr!=0 );.  asse
2ac50 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29  rt( pOp->p5==0 )
2ac60 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d  ;.  r.pKeyInfo =
2ac70 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
2ac80 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
2ac90 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65  )pOp->p3;.  r.de
2aca0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
2acb0 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  r.aMem = &aMem[p
2acc0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20  Op->p2];.  rc = 
2acd0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2ace0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72  toUnpacked(pCrsr
2acf0 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73  , &r, 0, 0, &res
2ad00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2ad10 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2ad20 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2ad30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2ad40 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2ad50 74 65 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f  te(pCrsr, BTREE_
2ad60 41 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20  AUXDELETE);.    
2ad70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2ad80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2ad90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ada0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
2adb0 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63  to==0 );.  pC->c
2adc0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2add0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e  HE_STALE;.  pC->
2ade0 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a  seekResult = 0;.
2adf0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2ae00 70 63 6f 64 65 3a 20 53 65 65 6b 20 50 31 20 2a  pcode: Seek P1 *
2ae10 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
2ae20 70 73 69 73 3a 20 4d 6f 76 65 20 50 33 20 74 6f  psis: Move P3 to
2ae30 20 50 31 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20   P1.rowid.**.** 
2ae40 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e  P1 is an open in
2ae50 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50  dex cursor and P
2ae60 33 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e  3 is a cursor on
2ae70 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2ae80 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ng.** table.  Th
2ae90 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61  is opcode does a
2aea0 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
2aeb0 66 20 74 68 65 20 50 33 20 74 61 62 6c 65 20 63  f the P3 table c
2aec0 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20  ursor.** to the 
2aed0 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65 73 70  row that corresp
2aee0 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75 72 72  onds to the curr
2aef0 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a  ent row of P1..*
2af00 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
2af10 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e  eferred seek.  N
2af20 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20  othing actually 
2af30 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a  happens until.**
2af40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   the cursor is u
2af50 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72 65  sed to read a re
2af60 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c  cord.  That way,
2af70 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20   if no reads.** 
2af80 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65  occur, no unnece
2af90 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e  ssary I/O happen
2afa0 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20  s..**.** P4 may 
2afb0 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  be an array of i
2afc0 6e 74 65 67 65 72 73 20 28 74 79 70 65 20 50 34  ntegers (type P4
2afd0 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61  _INTARRAY) conta
2afe0 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74  ining.** one ent
2aff0 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ry for each colu
2b000 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74 61 62  mn in the P3 tab
2b010 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e  le.  If array en
2b020 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e  try a(i).** is n
2b030 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65  on-zero, then re
2b040 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69  ading column a(i
2b050 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20  )-1 from cursor 
2b060 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61  P3 is .** equiva
2b070 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69  lent to performi
2b080 6e 67 20 74 68 65 20 64 65 66 65 72 72 65 64 20  ng the deferred 
2b090 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65  seek and then re
2b0a0 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a  ading column i .
2b0b0 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69  ** from P1.  Thi
2b0c0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2b0d0 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e   stored in P3 an
2b0e0 64 20 75 73 65 64 20 74 6f 20 72 65 64 69 72 65  d used to redire
2b0f0 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69  ct.** reads agai
2b100 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50  nst P3 over to P
2b110 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79  1, thus possibly
2b120 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65   avoiding the ne
2b130 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e  ed to.** seek an
2b140 64 20 72 65 61 64 20 63 75 72 73 6f 72 20 50 33  d read cursor P3
2b150 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2b160 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a  IdxRowid P1 P2 *
2b170 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
2b180 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a  : r[P2]=rowid.**
2b190 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
2b1a0 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
2b1b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
2b1c0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2b1d0 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
2b1e0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
2b1f0 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
2b200 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
2b210 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
2b220 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
2b230 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2b240 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
2b250 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
2b260 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
2b270 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
2b280 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
2b290 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
2b2a0 3a 0a 63 61 73 65 20 4f 50 5f 49 64 78 52 6f 77  :.case OP_IdxRow
2b2b0 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  id: {           
2b2c0 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
2b2d0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b2f0 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78 20 63  * The P1 index c
2b300 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 43  ursor */.  VdbeC
2b310 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72 3b 20  ursor *pTabCur; 
2b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b330 20 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f 72   P2 table cursor
2b340 20 28 4f 50 5f 53 65 65 6b 20 6f 6e 6c 79 29 20   (OP_Seek only) 
2b350 2a 2f 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 20  */.  i64 rowid; 
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 68 61      /* Rowid tha
2b380 74 20 50 31 20 63 75 72 72 65 6e 74 20 70 6f 69  t P1 current poi
2b390 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  nts to */..  ass
2b3a0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2b3b0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
2b3c0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
2b3d0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2b3e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2b3f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b400 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2b410 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2b420 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
2b430 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
2b440 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
2b450 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ble==0 );.  asse
2b460 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
2b470 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61  Moveto==0 );.  a
2b480 73 73 65 72 74 28 20 21 70 43 2d 3e 6e 75 6c 6c  ssert( !pC->null
2b490 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  Row || pOp->opco
2b4a0 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69 64 20  de==OP_IdxRowid 
2b4b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 49 64 78  );..  /* The Idx
2b4c0 52 6f 77 69 64 20 61 6e 64 20 53 65 65 6b 20 6f  Rowid and Seek o
2b4d0 70 63 6f 64 65 73 20 61 72 65 20 63 6f 6d 62 69  pcodes are combi
2b4e0 6e 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 74  ned because of t
2b4f0 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 79 0a 20  he commonality. 
2b500 20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33 56 64   ** of sqlite3Vd
2b510 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
2b520 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  ) and sqlite3Vdb
2b530 65 49 64 78 52 6f 77 69 64 28 29 2e 20 2a 2f 0a  eIdxRowid(). */.
2b540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2b550 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
2b560 70 43 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  pC);..  /* sqlit
2b570 65 33 56 62 65 43 75 72 73 6f 72 52 65 73 74 6f  e3VbeCursorResto
2b580 72 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61  re() can only fa
2b590 69 6c 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  il if the record
2b5a0 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
2b5b0 64 0a 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20  d.  ** out from 
2b5c0 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
2b5d0 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 6e 65 76  .  That will nev
2b5e0 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61  er happens for a
2b5f0 6e 20 49 64 78 52 6f 77 69 64 0a 20 20 2a 2a 20  n IdxRowid.  ** 
2b600 6f 72 20 53 65 65 6b 20 6f 70 63 6f 64 65 20 2a  or Seek opcode *
2b610 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63  /.  if( NEVER(rc
2b620 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67  !=SQLITE_OK) ) g
2b630 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b640 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 21  _error;..  if( !
2b650 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  pC->nullRow ){. 
2b660 20 20 20 72 6f 77 69 64 20 3d 20 30 3b 20 20 2f     rowid = 0;  /
2b670 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f  * Not needed.  O
2b680 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c 65  nly used to sile
2b690 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a  nce a warning. *
2b6a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b6b0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 64  e3VdbeIdxRowid(d
2b6c0 62 2c 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  b, pC->uc.pCurso
2b6d0 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20  r, &rowid);.    
2b6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b6f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2b700 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2b710 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
2b720 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2b730 50 5f 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20  P_Seek ){.      
2b740 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
2b750 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d  =0 && pOp->p3<p-
2b760 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >nCursor );.    
2b770 20 20 70 54 61 62 43 75 72 20 3d 20 70 2d 3e 61    pTabCur = p->a
2b780 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  pCsr[pOp->p3];. 
2b790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2b7a0 62 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  bCur!=0 );.     
2b7b0 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2b7c0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2b7d0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  YPE_BTREE );.   
2b7e0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43     assert( pTabC
2b7f0 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  ur->uc.pCursor!=
2b800 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2b810 74 28 20 70 54 61 62 43 75 72 2d 3e 69 73 54 61  t( pTabCur->isTa
2b820 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ble );.      pTa
2b830 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  bCur->nullRow = 
2b840 30 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  0;.      pTabCur
2b850 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d  ->movetoTarget =
2b860 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70 54   rowid;.      pT
2b870 61 62 43 75 72 2d 3e 64 65 66 65 72 72 65 64 4d  abCur->deferredM
2b880 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20 20 20 20  oveto = 1;.     
2b890 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
2b8a0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41  type==P4_INTARRA
2b8b0 59 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 61 69 3d  Y || pOp->p4.ai=
2b8c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
2b8d0 43 75 72 2d 3e 61 41 6c 74 4d 61 70 20 3d 20 70  Cur->aAltMap = p
2b8e0 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
2b8f0 20 70 54 61 62 43 75 72 2d 3e 70 41 6c 74 43 75   pTabCur->pAltCu
2b900 72 73 6f 72 20 3d 20 70 43 3b 0a 20 20 20 20 7d  rsor = pC;.    }
2b910 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 75 74  else{.      pOut
2b920 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
2b930 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  e(p, pOp);.     
2b940 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77   pOut->u.i = row
2b950 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  id;.    }.  }els
2b960 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2b970 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2b980 64 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 73  dxRowid );.    s
2b990 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2b9a0 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Null(&aMem[pOp->
2b9b0 70 32 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  p2]);.  }.  brea
2b9c0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2b9d0 20 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20   IdxGE P1 P2 P3 
2b9e0 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
2b9f0 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
2ba00 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
2ba10 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
2ba20 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
2ba30 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
2ba40 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
2ba50 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49  at omits the PRI
2ba60 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61  MARY KEY.  Compa
2ba70 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2ba80 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  e against the in
2ba90 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20  dex .** that P1 
2baa0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2bab0 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2bac0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2bad0 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20  EY or ROWID .** 
2bae0 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e  fields at the en
2baf0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2bb00 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2bb10 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
2bb20 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
2bb30 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e  ey value.** then
2bb40 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74   jump to P2.  Ot
2bb50 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2bb60 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2bb70 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2bb80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47  ./* Opcode: IdxG
2bb90 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  T P1 P2 P3 P4 P5
2bba0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2bbb0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2bbc0 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2bbd0 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2bbe0 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2bbf0 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2bc00 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2bc10 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2bc20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68  KEY.  Compare th
2bc30 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61  is key value aga
2bc40 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a  inst the index .
2bc50 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ** that P1 is cu
2bc60 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2bc70 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2bc80 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2bc90 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64   ROWID .** field
2bca0 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  s at the end..**
2bcb0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2bcc0 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65  dex entry is gre
2bcd0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65  ater than the ke
2bce0 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20  y value.** then 
2bcf0 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68  jump to P2.  Oth
2bd00 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2bd10 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2bd20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2bd30 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54  /* Opcode: IdxLT
2bd40 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2bd50 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2bd60 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2bd70 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2bd80 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2bd90 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2bda0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2bdb0 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2bdc0 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2bdd0 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2bde0 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2bdf0 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2be00 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2be10 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2be20 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2be30 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2be40 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2be50 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2be60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2be70 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2be80 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b   less than the k
2be90 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75  ey value then ju
2bea0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68  mp to P2..** Oth
2beb0 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2bec0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2bed0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2bee0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 45  /* Opcode: IdxLE
2bef0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2bf00 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2bf10 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2bf20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2bf30 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2bf40 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2bf50 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2bf60 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2bf70 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2bf80 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2bf90 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2bfa0 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2bfb0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2bfc0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2bfd0 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2bfe0 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2bff0 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2c000 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2c010 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2c020 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2c030 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2c040 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
2c050 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 0a 2a  alue then jump.*
2c060 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69  * to P2. Otherwi
2c070 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2c080 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2c090 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
2c0a0 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20 20 20   OP_IdxLE:      
2c0b0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2c0c0 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20 20 20  ase OP_IdxGT:   
2c0d0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2c0e0 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a  /.case OP_IdxLT:
2c0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
2c100 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  p */.case OP_Idx
2c110 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f 2a 20  GE:  {       /* 
2c120 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
2c130 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
2c140 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  res;.  UnpackedR
2c150 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65  ecord r;..  asse
2c160 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2c170 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2c180 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2c190 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2c1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2c1b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c1c0 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a  C->isOrdered );.
2c1d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2c1e0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2c1f0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
2c200 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
2c210 72 21 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  r!=0);.  assert(
2c220 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2c230 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
2c240 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
2c250 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
2c260 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2c270 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
2c280 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  );.  r.pKeyInfo 
2c290 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
2c2a0 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31    r.nField = (u1
2c2b0 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 69  6)pOp->p4.i;.  i
2c2c0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f  f( pOp->opcode<O
2c2d0 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 61  P_IdxLT ){.    a
2c2e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2c2f0 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20  de==OP_IdxLE || 
2c300 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c310 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 2e 64  IdxGT );.    r.d
2c320 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a  efault_rc = -1;.
2c330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2c340 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2c350 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f  ==OP_IdxGE || pO
2c360 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2c370 78 4c 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66  xLT );.    r.def
2c380 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 7d  ault_rc = 0;.  }
2c390 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65  .  r.aMem = &aMe
2c3a0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
2c3b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2c3c0 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
2c3d0 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
2c3e0 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
2c3f0 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
2c400 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
2c410 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4e    res = 0;  /* N
2c420 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79  ot needed.  Only
2c430 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65   used to silence
2c440 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
2c450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2c460 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 64  eIdxKeyCompare(d
2c470 62 2c 20 70 43 2c 20 26 72 2c 20 26 72 65 73 29  b, pC, &r, &res)
2c480 3b 0a 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f  ;.  assert( (OP_
2c490 49 64 78 4c 45 26 31 29 3d 3d 28 4f 50 5f 49 64  IdxLE&1)==(OP_Id
2c4a0 78 4c 54 26 31 29 20 26 26 20 28 4f 50 5f 49 64  xLT&1) && (OP_Id
2c4b0 78 47 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 47  xGE&1)==(OP_IdxG
2c4c0 54 26 31 29 20 29 3b 0a 20 20 69 66 28 20 28 70  T&1) );.  if( (p
2c4d0 4f 70 2d 3e 6f 70 63 6f 64 65 26 31 29 3d 3d 28  Op->opcode&1)==(
2c4e0 4f 50 5f 49 64 78 4c 54 26 31 29 20 29 7b 0a 20  OP_IdxLT&1) ){. 
2c4f0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2c500 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45  opcode==OP_IdxLE
2c510 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2c520 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
2c530 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 7d   res = -res;.  }
2c540 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2c550 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2c560 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxGE || pOp->
2c570 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54  opcode==OP_IdxGT
2c580 20 29 3b 0a 20 20 20 20 72 65 73 2b 2b 3b 0a 20   );.    res++;. 
2c590 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54   }.  VdbeBranchT
2c5a0 61 6b 65 6e 28 72 65 73 3e 30 2c 32 29 3b 0a 20  aken(res>0,2);. 
2c5b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2c5c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2c5d0 72 3b 0a 20 20 69 66 28 20 72 65 73 3e 30 20 29  r;.  if( res>0 )
2c5e0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
2c5f0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2c600 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 6f 79   Opcode: Destroy
2c610 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2c620 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
2c630 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61  tire database ta
2c640 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
2c650 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  se root page in 
2c660 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
2c670 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
2c680 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   P1..**.** The t
2c690 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73 74 72  able being destr
2c6a0 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65 20 6d  oyed is in the m
2c6b0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2c6c0 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a  e if P3==0.  If.
2c6d0 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 74 68  ** P3==1 then th
2c6e0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c  e table to be cl
2c6f0 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75  ear is in the au
2c700 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2c710 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73   file.** that is
2c720 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2c730 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69  ables create usi
2c740 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52  ng CREATE TEMPOR
2c750 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  ARY TABLE..**.**
2c760 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2c770 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 69  s enabled then i
2c780 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2c790 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20  at another root 
2c7a0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  page.** might be
2c7b0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
2c7c0 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20 72 6f  newly deleted ro
2c7d0 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  ot page in order
2c7e0 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20   to keep all.** 
2c7f0 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e 74 69  root pages conti
2c800 67 75 6f 75 73 20 61 74 20 74 68 65 20 62 65 67  guous at the beg
2c810 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
2c820 74 61 62 61 73 65 2e 20 20 54 68 65 20 66 6f 72  tabase.  The for
2c830 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  mer.** value of 
2c840 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 74 68  the root page th
2c850 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 20 76  at moved - its v
2c860 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20  alue before the 
2c870 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20 2d 0a  move occurred -.
2c880 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
2c890 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66  register P2.  If
2c8a0 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d 6f 76   no page .** mov
2c8b0 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69 72  ement was requir
2c8c0 65 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20  ed (because the 
2c8d0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2c8e0 70 65 64 20 77 61 73 20 61 6c 72 65 61 64 79 20  ped was already 
2c8f0 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f 6e 65  .** the last one
2c900 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c910 29 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73  ) then a zero is
2c920 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2c930 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20 41 55  ter P2..** If AU
2c940 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73 61  TOVACUUM is disa
2c950 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72 6f  bled then a zero
2c960 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
2c970 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
2c980 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72   See also: Clear
2c990 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73 74  .*/.case OP_Dest
2c9a0 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75  roy: {     /* ou
2c9b0 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76  t2 */.  int iMov
2c9c0 65 64 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  ed;.  int iDb;..
2c9d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2c9e0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
2c9f0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 31 20  sert( pOp->p1>1 
2ca00 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
2ca10 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2ca20 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  p);.  pOut->flag
2ca30 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2ca40 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  if( db->nVdbeRea
2ca50 64 20 3e 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f  d > db->nVDestro
2ca60 79 2b 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  y+1 ){.    rc = 
2ca70 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2ca80 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
2ca90 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
2caa0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
2cab0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c  _to_error;.  }el
2cac0 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f  se{.    iDb = pO
2cad0 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72  p->p3;.    asser
2cae0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2caf0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
2cb00 20 29 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20 3d   );.    iMoved =
2cb10 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
2cb20 65 64 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c  ed.  Only to sil
2cb30 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2cb40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2cb50 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2cb60 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  e(db->aDb[iDb].p
2cb70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d  Bt, pOp->p1, &iM
2cb80 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d  oved);.    pOut-
2cb90 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
2cba0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
2cbb0 3d 20 69 4d 6f 76 65 64 3b 0a 20 20 20 20 69 66  = iMoved;.    if
2cbc0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2cbd0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2cbe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cbf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2cc00 20 20 20 69 66 28 20 69 4d 6f 76 65 64 21 3d 30     if( iMoved!=0
2cc10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cc20 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64  3RootPageMoved(d
2cc30 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20  b, iDb, iMoved, 
2cc40 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20  pOp->p1);.      
2cc50 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  /* All OP_Destro
2cc60 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  y operations occ
2cc70 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  ur on the same b
2cc80 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  tree */.      as
2cc90 73 65 72 74 28 20 72 65 73 65 74 53 63 68 65 6d  sert( resetSchem
2cca0 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72  aOnFault==0 || r
2ccb0 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
2ccc0 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20  t==iDb+1 );.    
2ccd0 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46    resetSchemaOnF
2cce0 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20  ault = iDb+1;.  
2ccf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
2cd00 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2cd10 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50  code: Clear P1 P
2cd20 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  2 P3.**.** Delet
2cd30 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  e all contents o
2cd40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2cd50 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
2cd60 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ose root page.**
2cd70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cd80 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
2cd90 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69  y P1.  But, unli
2cda0 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e  ke Destroy, do n
2cdb0 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  ot.** remove the
2cdc0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2cdd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2cde0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2cdf0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
2ce00 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ear is in the ma
2ce10 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2ce20 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a   if P2==0.  If.*
2ce30 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65  * P2==1 then the
2ce40 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65   table to be cle
2ce50 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78  ar is in the aux
2ce60 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2ce70 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  file.** that is 
2ce80 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61  used to store ta
2ce90 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e  bles create usin
2cea0 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
2ceb0 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  RY TABLE..**.** 
2cec0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
2ced0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2cee0 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  n the table refe
2cef0 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20  rred to must be 
2cf00 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  an.** intkey tab
2cf10 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65  le (an SQL table
2cf20 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e  , not an index).
2cf30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2cf40 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a  e row change .**
2cf50 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d   count is increm
2cf60 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
2cf70 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2cf80 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2cf90 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50  leared. .** If P
2cfa0 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
2cfb0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
2cfc0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2cfd0 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a   register P3 is.
2cfe0 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e  ** also incremen
2cff0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2d000 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2d010 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
2d020 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ared..**.** See 
2d030 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f  also: Destroy.*/
2d040 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20  .case OP_Clear: 
2d050 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b  {.  int nChange;
2d060 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30  . .  nChange = 0
2d070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
2d080 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
2d090 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
2d0a0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
2d0b0 20 70 4f 70 2d 3e 70 32 29 20 29 3b 0a 20 20 72   pOp->p2) );.  r
2d0c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d0d0 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20  ClearTable(.    
2d0e0 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70    db->aDb[pOp->p
2d0f0 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  2].pBt, pOp->p1,
2d100 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68   (pOp->p3 ? &nCh
2d110 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20  ange : 0).  );. 
2d120 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a   if( pOp->p3 ){.
2d130 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b      p->nChange +
2d140 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69  = nChange;.    i
2d150 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a  f( pOp->p3>0 ){.
2d160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
2d170 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
2d180 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20  Op->p3]) );.    
2d190 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
2d1a0 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
2d1b0 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65  >p3]);.      aMe
2d1c0 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b  m[pOp->p3].u.i +
2d1d0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  = nChange;.    }
2d1e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
2d1f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2d200 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
2d210 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2d220 52 65 73 65 74 53 6f 72 74 65 72 20 50 31 20 2a  ResetSorter P1 *
2d230 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c   * * *.**.** Del
2d240 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
2d250 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65   from the epheme
2d260 72 61 6c 20 74 61 62 6c 65 20 6f 72 20 73 6f 72  ral table or sor
2d270 74 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6f  ter.** that is o
2d280 70 65 6e 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  pen on cursor P1
2d290 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
2d2a0 6f 64 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  ode only works f
2d2b0 6f 72 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  or cursors used 
2d2c0 66 6f 72 20 73 6f 72 74 69 6e 67 20 61 6e 64 0a  for sorting and.
2d2d0 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20 4f  ** opened with O
2d2e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2d2f0 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  or OP_SorterOpen
2d300 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73  ..*/.case OP_Res
2d310 65 74 53 6f 72 74 65 72 3a 20 7b 0a 20 20 56 64  etSorter: {.  Vd
2d320 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 0a  beCursor *pC;. .
2d330 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2d340 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2d350 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2d360 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
2d370 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2d380 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pC!=0 );.  if(
2d390 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
2d3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d3b0 53 6f 72 74 65 72 52 65 73 65 74 28 64 62 2c 20  SorterReset(db, 
2d3c0 70 43 2d 3e 75 63 2e 70 53 6f 72 74 65 72 29 3b  pC->uc.pSorter);
2d3d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2d3e0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2d3f0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2d400 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
2d410 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c   pC->isEphemeral
2d420 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2d430 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2d440 62 6c 65 4f 66 43 75 72 73 6f 72 28 70 43 2d 3e  bleOfCursor(pC->
2d450 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
2d460 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2d470 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2d480 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  r;.  }.  break;.
2d490 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72  }../* Opcode: Cr
2d4a0 65 61 74 65 54 61 62 6c 65 20 50 31 20 50 32 20  eateTable P1 P2 
2d4b0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
2d4c0 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20 69 44  s: r[P2]=root iD
2d4d0 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63  b=P1.**.** Alloc
2d4e0 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ate a new table 
2d4f0 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2d500 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
2d510 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
2d520 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2d530 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
2d540 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
2d550 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
2d560 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74  * P1>1.  Write t
2d570 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
2d580 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
2d590 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  able into.** reg
2d5a0 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54  ister P2.**.** T
2d5b0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2d5c0 74 77 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e  tween a table an
2d5d0 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68  d an index is th
2d5e0 69 73 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73  is:  A table mus
2d5f0 74 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79  t.** have a 4-by
2d600 74 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61  te integer key a
2d610 6e 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69  nd can have arbi
2d620 74 72 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20  trary data.  An 
2d630 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20  index.** has an 
2d640 61 72 62 69 74 72 61 72 79 20 6b 65 79 20 62 75  arbitrary key bu
2d650 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  t no data..**.**
2d660 20 53 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74   See also: Creat
2d670 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63  eIndex.*/./* Opc
2d680 6f 64 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78  ode: CreateIndex
2d690 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2d6a0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2d6b0 72 6f 6f 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a  root iDb=P1.**.*
2d6c0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2d6d0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61   index in the ma
2d6e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2d6f0 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
2d700 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
2d710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d720 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
2d730 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
2d740 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
2d750 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
2d760 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2d770 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
2d780 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e  .** register P2.
2d790 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d  .**.** See docum
2d7a0 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43  entation on OP_C
2d7b0 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61  reateTable for a
2d7c0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2d7d0 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
2d7e0 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20  P_CreateIndex:  
2d7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
2d800 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65  2 */.case OP_Cre
2d810 61 74 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20  ateTable: {     
2d820 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2d830 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e    int pgno;.  in
2d840 74 20 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70  t flags;.  Db *p
2d850 44 62 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75  Db;..  pOut = ou
2d860 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
2d870 70 4f 70 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30  pOp);.  pgno = 0
2d880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2d890 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2d8a0 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
2d8b0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
2d8c0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
2d8d0 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73  pOp->p1) );.  as
2d8e0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2d8f0 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  y==0 );.  pDb = 
2d900 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
2d910 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
2d920 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->pBt!=0 );.  if
2d930 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2d940 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 7b  P_CreateTable ){
2d950 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20  .    /* flags = 
2d960 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f  BTREE_INTKEY; */
2d970 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52  .    flags = BTR
2d980 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c  EE_INTKEY;.  }el
2d990 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  se{.    flags = 
2d9a0 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20  BTREE_BLOBKEY;. 
2d9b0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2d9c0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
2d9d0 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pDb->pBt, &pgn
2d9e0 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  o, flags);.  if(
2d9f0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2da00 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2da10 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e   pOut->u.i = pgn
2da20 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  o;.  break;.}../
2da30 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53  * Opcode: ParseS
2da40 63 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20  chema P1 * * P4 
2da50 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  *.**.** Read and
2da60 20 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69   parse all entri
2da70 65 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49  es from the SQLI
2da80 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
2da90 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a  of database P1.*
2daa0 2a 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  * that match the
2dab0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34   WHERE clause P4
2dac0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  . .**.** This op
2dad0 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2dae0 20 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74   parser to creat
2daf0 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
2db00 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e  machine,.** then
2db10 20 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69   runs the new vi
2db20 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
2db30 49 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d  It is thus a re-
2db40 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a  entrant opcode..
2db50 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65  */.case OP_Parse
2db60 53 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20  Schema: {.  int 
2db70 69 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  iDb;.  const cha
2db80 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68  r *zMaster;.  ch
2db90 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74  ar *zSql;.  Init
2dba0 44 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a  Data initData;..
2dbb0 20 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65    /* Any prepare
2dbc0 64 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  d statement that
2dbd0 20 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70   invokes this op
2dbe0 63 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d  code will hold m
2dbf0 75 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65  utexes.  ** on e
2dc00 76 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69  very btree.  Thi
2dc10 73 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73  s is a prerequis
2dc20 69 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  ite for invoking
2dc30 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e   .  ** sqlite3In
2dc40 69 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  itCallback()..  
2dc50 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2dc60 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62  _DEBUG.  for(iDb
2dc70 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
2dc80 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   iDb++){.    ass
2dc90 65 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73  ert( iDb==1 || s
2dca0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2dcb0 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44  Mutex(db->aDb[iD
2dcc0 62 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23  b].pBt) );.  }.#
2dcd0 65 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70  endif..  iDb = p
2dce0 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74  Op->p1;.  assert
2dcf0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
2dd00 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
2dd10 65 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72  ert( DbHasProper
2dd20 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53  ty(db, iDb, DB_S
2dd30 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a  chemaLoaded) );.
2dd40 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2dd50 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f  a conditional */
2dd60 20 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d   {.    zMaster =
2dd70 20 4d 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20   MASTER_NAME;.  
2dd80 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20    initData.db = 
2dd90 64 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61  db;.    initData
2dda0 2e 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  .iDb = pOp->p1;.
2ddb0 20 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45      initData.pzE
2ddc0 72 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72  rrMsg = &p->zErr
2ddd0 4d 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  Msg;.    zSql = 
2dde0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2ddf0 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  b,.       "SELEC
2de00 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
2de10 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e  , sql FROM '%q'.
2de20 25 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45  %s WHERE %s ORDE
2de30 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20  R BY rowid",.   
2de40 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
2de50 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74  .zDbSName, zMast
2de60 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  er, pOp->p4.z);.
2de70 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2de80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2de90 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2dea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2deb0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
2dec0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
2ded0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
2dee0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69  y = 1;.      ini
2def0 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
2df00 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73 65  E_OK;.      asse
2df10 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
2df20 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
2df30 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2df40 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74  (db, zSql, sqlit
2df50 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20  e3InitCallback, 
2df60 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20  &initData, 0);. 
2df70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2df80 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e  ITE_OK ) rc = in
2df90 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20  itData.rc;.     
2dfa0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2dfb0 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  b, zSql);.      
2dfc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
2dfd0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
2dfe0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
2dff0 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
2e000 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
2e010 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  db);.    if( rc=
2e020 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
2e030 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
2e040 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  em;.    }.    go
2e050 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2e060 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65  error;.  }.  bre
2e070 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65  ak;  .}..#if !de
2e080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e090 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70  T_ANALYZE)./* Op
2e0a0 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73  code: LoadAnalys
2e0b0 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  is P1 * * * *.**
2e0c0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 73 71 6c  .** Read the sql
2e0d0 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
2e0e0 66 6f 72 20 64 61 74 61 62 61 73 65 20 50 31 20  for database P1 
2e0f0 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  and load the con
2e100 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20  tent.** of that 
2e110 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69  table into the i
2e120 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78 20 68 61  nternal index ha
2e130 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  sh table.  This 
2e140 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68  will cause.** th
2e150 65 20 61 6e 61 6c 79 73 69 73 20 74 6f 20 62 65  e analysis to be
2e160 20 75 73 65 64 20 77 68 65 6e 20 70 72 65 70 61   used when prepa
2e170 72 69 6e 67 20 61 6c 6c 20 73 75 62 73 65 71 75  ring all subsequ
2e180 65 6e 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a  ent queries..*/.
2e190 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c  case OP_LoadAnal
2e1a0 79 73 69 73 3a 20 7b 0a 20 20 61 73 73 65 72 74  ysis: {.  assert
2e1b0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2e1c0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
2e1d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2e1e0 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64 62  3AnalysisLoad(db
2e1f0 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 69 66  , pOp->p1);.  if
2e200 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2e210 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2e220 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e    break;  .}.#en
2e230 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2e240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
2e250 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  YZE) */../* Opco
2e260 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50 31  de: DropTable P1
2e270 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
2e280 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72  Remove the inter
2e290 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20  nal (in-memory) 
2e2a0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2e2b0 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a  that describe.**
2e2c0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
2e2d0 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
2e2e0 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
2e2f0 6c 65 64 20 61 66 74 65 72 20 61 20 74 61 62 6c  led after a tabl
2e300 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20  e.** is dropped 
2e310 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e 67  from disk (using
2e320 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 63   the Destroy opc
2e330 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74 6f  ode) in order to
2e340 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69 6e   keep .** the in
2e350 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
2e360 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
2e370 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e  schema consisten
2e380 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f  t with what is o
2e390 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20  n disk..*/.case 
2e3a0 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a  OP_DropTable: {.
2e3b0 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
2e3c0 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
2e3d0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
2e3e0 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.z);.  break;.
2e3f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72  }../* Opcode: Dr
2e400 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20 50  opIndex P1 * * P
2e410 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
2e420 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
2e430 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
2e440 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
2e450 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 69  escribe.** the i
2e460 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69 6e  ndex named P4 in
2e470 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
2e480 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
2e490 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ter an index.** 
2e4a0 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
2e4b0 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
2e4c0 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 0a  Destroy opcode).
2e4d0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ** in order to k
2e4e0 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
2e4f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2e500 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
2e510 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
2e520 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
2e530 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
2e540 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69  pIndex: {.  sqli
2e550 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
2e560 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d  teIndex(db, pOp-
2e570 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
2e580 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2e590 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67  Opcode: DropTrig
2e5a0 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ger P1 * * P4 *.
2e5b0 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
2e5c0 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
2e5d0 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
2e5e0 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
2e5f0 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ibe.** the trigg
2e600 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  er named P4 in d
2e610 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
2e620 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
2e630 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  r a trigger.** i
2e640 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64  s dropped from d
2e650 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44  isk (using the D
2e660 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69  estroy opcode) i
2e670 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
2e680 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
2e690 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2e6a0 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
2e6b0 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
2e6c0 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
2e6d0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
2e6e0 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71  pTrigger: {.  sq
2e6f0 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
2e700 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20  leteTrigger(db, 
2e710 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
2e720 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .z);.  break;.}.
2e730 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e740 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2e750 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a  CHECK./* Opcode:
2e760 20 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20   IntegrityCk P1 
2e770 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
2e780 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  * Do an analysis
2e790 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2e7a0 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e  y open database.
2e7b0 20 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65    Store in.** re
2e7c0 67 69 73 74 65 72 20 50 31 20 74 68 65 20 74 65  gister P1 the te
2e7d0 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d  xt of an error m
2e7e0 65 73 73 61 67 65 20 64 65 73 63 72 69 62 69 6e  essage describin
2e7f0 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  g any problems..
2e800 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d  ** If no problem
2e810 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f  s are found, sto
2e820 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67  re a NULL in reg
2e830 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ister P1..**.** 
2e840 54 68 65 20 72 65 67 69 73 74 65 72 20 50 33 20  The register P3 
2e850 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 78  contains the max
2e860 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
2e870 6c 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a  llowed errors..*
2e880 2a 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33  * At most reg(P3
2e890 29 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65  ) errors will be
2e8a0 20 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e   reported..** In
2e8b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2e8c0 65 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73  e analysis stops
2e8d0 20 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28   as soon as reg(
2e8e0 50 31 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a  P1) errors are .
2e8f0 2a 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31  ** seen.  Reg(P1
2e900 29 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  ) is updated wit
2e910 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
2e920 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67  errors remaining
2e930 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ..**.** The root
2e940 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66   page numbers of
2e950 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
2e960 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
2e970 69 6e 74 65 67 65 72 73 0a 2a 2a 20 73 74 6f 72  integers.** stor
2e980 65 64 20 69 6e 20 50 34 5f 49 4e 54 41 52 52 41  ed in P4_INTARRA
2e990 59 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  Y argument..**.*
2e9a0 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
2e9b0 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
2e9c0 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
2e9d0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2e9e0 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
2e9f0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2ea00 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
2ea10 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
2ea20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2ea30 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2ea40 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65   pragma..*/.case
2ea50 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a   OP_IntegrityCk:
2ea60 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20   {.  int nRoot; 
2ea70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ea80 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63  f tables to chec
2ea90 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72  k.  (Number of r
2eaa0 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20  oot pages.) */. 
2eab0 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20   int *aRoot;    
2eac0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f   /* Array of roo
2ead0 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f  tpage numbers fo
2eae0 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63  r tables to be c
2eaf0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
2eb00 6e 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e  nErr;       /* N
2eb10 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2eb20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68  reported */.  ch
2eb30 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a  ar *z;        /*
2eb40 20 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72   Text of the err
2eb50 6f 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d  or report */.  M
2eb60 65 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f  em *pnErr;     /
2eb70 2a 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69  * Register keepi
2eb80 6e 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f  ng track of erro
2eb90 72 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  rs remaining */.
2eba0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
2ebb0 73 52 65 61 64 65 72 20 29 3b 0a 20 20 6e 52 6f  sReader );.  nRo
2ebc0 6f 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  ot = pOp->p2;.  
2ebd0 61 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 34 2e  aRoot = pOp->p4.
2ebe0 61 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  ai;.  assert( nR
2ebf0 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  oot>0 );.  asser
2ec00 74 28 20 61 52 6f 6f 74 5b 6e 52 6f 6f 74 5d 3d  t( aRoot[nRoot]=
2ec10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ec20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
2ec30 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
2ec40 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
2ec50 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d 65  ;.  pnErr = &aMe
2ec60 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
2ec70 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c  sert( (pnErr->fl
2ec80 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
2ec90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
2eca0 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 28  pnErr->flags & (
2ecb0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
2ecc0 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20  ))==0 );.  pIn1 
2ecd0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2ece0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2ecf0 3e 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p5<db->nDb );. 
2ed00 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
2ed10 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
2ed20 2c 20 70 4f 70 2d 3e 70 35 29 20 29 3b 0a 20 20  , pOp->p5) );.  
2ed30 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  z = sqlite3Btree
2ed40 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 64  IntegrityCheck(d
2ed50 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e  b->aDb[pOp->p5].
2ed60 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f  pBt, aRoot, nRoo
2ed70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed90 20 20 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e      (int)pnErr->
2eda0 75 2e 69 2c 20 26 6e 45 72 72 29 3b 0a 20 20 70  u.i, &nErr);.  p
2edb0 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72  nErr->u.i -= nEr
2edc0 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
2edd0 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29  MemSetNull(pIn1)
2ede0 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20  ;.  if( nErr==0 
2edf0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ){.    assert( z
2ee00 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ==0 );.  }else i
2ee10 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( z==0 ){.    g
2ee20 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65  oto no_mem;.  }e
2ee30 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2ee40 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49  VdbeMemSetStr(pI
2ee50 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  n1, z, -1, SQLIT
2ee60 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f  E_UTF8, sqlite3_
2ee70 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44  free);.  }.  UPD
2ee80 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
2ee90 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65  (pIn1);.  sqlite
2eea0 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
2eeb0 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ing(pIn1, encodi
2eec0 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ng);.  break;.}.
2eed0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2eee0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2eef0 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  CHECK */../* Opc
2ef00 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50  ode: RowSetAdd P
2ef10 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
2ef20 6e 6f 70 73 69 73 3a 20 72 6f 77 73 65 74 28 50  nopsis: rowset(P
2ef30 31 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49  1)=r[P2].**.** I
2ef40 6e 73 65 72 74 20 74 68 65 20 69 6e 74 65 67 65  nsert the intege
2ef50 72 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20  r value held by 
2ef60 72 65 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f  register P2 into
2ef70 20 61 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78   a boolean index
2ef80 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69  .** held in regi
2ef90 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41  ster P1..**.** A
2efa0 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
2efb0 73 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61  s if P2 is not a
2efc0 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61  n integer..*/.ca
2efd0 73 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a  se OP_RowSetAdd:
2efe0 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c   {       /* in1,
2eff0 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in2 */.  pIn1 =
2f000 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
2f010 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
2f020 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
2f030 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73  rt( (pIn2->flags
2f040 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
2f050 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
2f060 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
2f070 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  t)==0 ){.    sql
2f080 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f  ite3VdbeMemSetRo
2f090 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20  wSet(pIn1);.    
2f0a0 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
2f0b0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
2f0c0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
2f0d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f  .  }.  sqlite3Ro
2f0e0 77 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d  wSetInsert(pIn1-
2f0f0 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 32  >u.pRowSet, pIn2
2f100 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b  ->u.i);.  break;
2f110 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
2f120 6f 77 53 65 74 52 65 61 64 20 50 31 20 50 32 20  owSetRead P1 P2 
2f130 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
2f140 69 73 3a 20 72 5b 50 33 5d 3d 72 6f 77 73 65 74  is: r[P3]=rowset
2f150 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61  (P1).**.** Extra
2f160 63 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ct the smallest 
2f170 76 61 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c 65  value from boole
2f180 61 6e 20 69 6e 64 65 78 20 50 31 20 61 6e 64 20  an index P1 and 
2f190 70 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69  put that value i
2f1a0 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  nto.** register 
2f1b0 50 33 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f 6c  P3.  Or, if bool
2f1c0 65 61 6e 20 69 6e 64 65 78 20 50 31 20 69 73 20  ean index P1 is 
2f1d0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c  initially empty,
2f1e0 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63   leave P3.** unc
2f1f0 68 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70 20  hanged and jump 
2f200 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
2f210 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f  2..*/.case OP_Ro
2f220 77 53 65 74 52 65 61 64 3a 20 7b 20 20 20 20 20  wSetRead: {     
2f230 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20    /* jump, in1, 
2f240 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 76 61  out3 */.  i64 va
2f250 6c 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  l;..  pIn1 = &aM
2f260 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
2f270 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
2f280 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
2f290 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 52   .   || sqlite3R
2f2a0 6f 77 53 65 74 4e 65 78 74 28 70 49 6e 31 2d 3e  owSetNext(pIn1->
2f2b0 75 2e 70 52 6f 77 53 65 74 2c 20 26 76 61 6c 29  u.pRowSet, &val)
2f2c0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ==0.  ){.    /* 
2f2d0 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65  The boolean inde
2f2e0 78 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  x is empty */.  
2f2f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2f300 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20  SetNull(pIn1);. 
2f310 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
2f320 65 6e 28 31 2c 32 29 3b 0a 20 20 20 20 67 6f 74  en(1,2);.    got
2f330 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  o jump_to_p2_and
2f340 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
2f350 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rupt;.  }else{. 
2f360 20 20 20 2f 2a 20 41 20 76 61 6c 75 65 20 77 61     /* A value wa
2f370 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68  s pulled from th
2f380 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 56  e index */.    V
2f390 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30  dbeBranchTaken(0
2f3a0 2c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,2);.    sqlite3
2f3b0 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
2f3c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20  &aMem[pOp->p3], 
2f3d0 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f  val);.  }.  goto
2f3e0 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72   check_for_inter
2f3f0 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  rupt;.}../* Opco
2f400 64 65 3a 20 52 6f 77 53 65 74 54 65 73 74 20 50  de: RowSetTest P
2f410 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53 79  1 P2 P3 P4.** Sy
2f420 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d  nopsis: if r[P3]
2f430 20 69 6e 20 72 6f 77 73 65 74 28 50 31 29 20 67   in rowset(P1) g
2f440 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67  oto P2.**.** Reg
2f450 69 73 74 65 72 20 50 33 20 69 73 20 61 73 73 75  ister P3 is assu
2f460 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36 34  med to hold a 64
2f470 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
2f480 75 65 2e 20 49 66 20 72 65 67 69 73 74 65 72 20  ue. If register 
2f490 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  P1.** contains a
2f4a0 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 61   RowSet object a
2f4b0 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74 20 6f  nd that RowSet o
2f4c0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  bject contains.*
2f4d0 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c 64  * the value held
2f4e0 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20   in P3, jump to 
2f4f0 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74 68  register P2. Oth
2f500 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20 74  erwise, insert t
2f510 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e  he.** integer in
2f520 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   P3 into the Row
2f530 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  Set and continue
2f540 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65   on to the.** ne
2f550 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  xt opcode..**.**
2f560 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65   The RowSet obje
2f570 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  ct is optimized 
2f580 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
2f590 72 65 20 73 75 63 63 65 73 73 69 76 65 20 73 65  re successive se
2f5a0 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72  ts.** of integer
2f5b0 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 73 65  s, where each se
2f5c0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75  t contains no du
2f5d0 70 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20 73  plicates. Each s
2f5e0 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20  et.** of values 
2f5f0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
2f600 20 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c   a unique P4 val
2f610 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65  ue. The first se
2f620 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50  t.** must have P
2f630 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20  4==0, the final 
2f640 73 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d  set P4=-1.  P4 m
2f650 75 73 74 20 62 65 20 65 69 74 68 65 72 20 2d 31  ust be either -1
2f660 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74   or.** non-negat
2f670 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65  ive.  For non-ne
2f680 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f 66  gative values of
2f690 20 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77   P4 only the low
2f6a0 65 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72 65  er 4.** bits are
2f6b0 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a   significant..**
2f6c0 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
2f6d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28  optimizations: (
2f6e0 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68  a) when P4==0 th
2f6f0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
2f700 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f  o test.** the ro
2f710 77 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  wset object for 
2f720 50 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61  P3, as it is gua
2f730 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63  ranteed not to c
2f740 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62  ontain it,.** (b
2f750 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68  ) when P4==-1 th
2f760 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
2f770 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c  o insert the val
2f780 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a  ue, as it will.*
2f790 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65  * never be teste
2f7a0 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77  d for, and (c) w
2f7b0 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74  hen a value that
2f7c0 20 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   is part of set 
2f7d0 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64  X is.** inserted
2f7e0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2f7f0 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20  ed to search to 
2f800 73 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20  see if the same 
2f810 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65  value was.** pre
2f820 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64  viously inserted
2f830 20 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   as part of set 
2f840 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61  X (only if it wa
2f850 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
2f860 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74  inserted as part
2f870 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   of some other s
2f880 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  et)..*/.case OP_
2f890 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20  RowSetTest: {   
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8b0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20    /* jump, in1, 
2f8c0 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  in3 */.  int iSe
2f8d0 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b  t;.  int exists;
2f8e0 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
2f8f0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
2f900 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
2f910 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70  3];.  iSet = pOp
2f920 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74  ->p4.i;.  assert
2f930 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn3->flags&ME
2f940 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  M_Int );..  /* I
2f950 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
2f960 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
2f970 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69   rowset object i
2f980 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31  n memory cell P1
2f990 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74  ,.  ** delete it
2f9a0 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c   now and initial
2f9b0 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65  ize P1 with an e
2f9c0 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f  mpty rowset.  */
2f9d0 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
2f9e0 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
2f9f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
2fa00 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
2fa10 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
2fa20 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
2fa30 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
2fa40 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
2fa50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2fa60 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
2fa70 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74  NT32 );.  assert
2fa80 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53  ( iSet==-1 || iS
2fa90 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  et>=0 );.  if( i
2faa0 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74  Set ){.    exist
2fab0 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65  s = sqlite3RowSe
2fac0 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52  tTest(pIn1->u.pR
2fad0 6f 77 53 65 74 2c 20 69 53 65 74 2c 20 70 49 6e  owSet, iSet, pIn
2fae0 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 56 64 62  3->u.i);.    Vdb
2faf0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 65 78 69  eBranchTaken(exi
2fb00 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69  sts!=0,2);.    i
2fb10 66 28 20 65 78 69 73 74 73 20 29 20 67 6f 74 6f  f( exists ) goto
2fb20 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
2fb30 0a 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29  .  if( iSet>=0 )
2fb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77  {.    sqlite3Row
2fb50 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
2fb60 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d  u.pRowSet, pIn3-
2fb70 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65  >u.i);.  }.  bre
2fb80 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  ak;.}...#ifndef 
2fb90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
2fba0 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  GER../* Opcode: 
2fbb0 50 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33  Program P1 P2 P3
2fbc0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65   P4 P5.**.** Exe
2fbd0 63 75 74 65 20 74 68 65 20 74 72 69 67 67 65 72  cute the trigger
2fbe0 20 70 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20   program passed 
2fbf0 61 73 20 50 34 20 28 74 79 70 65 20 50 34 5f 53  as P4 (type P4_S
2fc00 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a  UBPROGRAM). .**.
2fc10 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74  ** P1 contains t
2fc20 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2fc30 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  e memory cell th
2fc40 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2fc50 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a  first memory .**
2fc60 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61   cell in an arra
2fc70 79 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  y of values used
2fc80 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   as arguments to
2fc90 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
2fca0 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  . P2 .** contain
2fcb0 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f  s the address to
2fcc0 20 6a 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20   jump to if the 
2fcd0 73 75 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f  sub-program thro
2fce0 77 73 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a  ws an IGNORE .**
2fcf0 20 65 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67   exception using
2fd00 20 74 68 65 20 52 41 49 53 45 28 29 20 66 75 6e   the RAISE() fun
2fd10 63 74 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20  ction. Register 
2fd20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  P3 contains the 
2fd30 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61  address .** of a
2fd40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
2fd50 74 68 69 73 20 28 74 68 65 20 70 61 72 65 6e 74  this (the parent
2fd60 29 20 56 4d 20 74 68 61 74 20 69 73 20 75 73 65  ) VM that is use
2fd70 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2fd80 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71  e .** memory req
2fd90 75 69 72 65 64 20 62 79 20 74 68 65 20 73 75 62  uired by the sub
2fda0 2d 76 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65  -vdbe at runtime
2fdb0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  ..**.** P4 is a 
2fdc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  pointer to the V
2fdd0 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  M containing the
2fde0 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
2fdf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
2fe00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2fe10 72 65 63 75 72 73 69 76 65 20 70 72 6f 67 72 61  recursive progra
2fe20 6d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 20  m invocation is 
2fe30 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65  enabled..*/.case
2fe40 20 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20   OP_Program: {  
2fe50 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2fe60 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
2fe70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2fe80 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72  mber of memory r
2fe90 65 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62  egisters for sub
2fea0 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e  -program */.  in
2feb0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
2fec0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2fed0 66 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20  f runtime space 
2fee0 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62  required for sub
2fef0 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65  -program */.  Me
2ff00 6d 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20  m *pRt;         
2ff10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
2ff20 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75  r to allocate ru
2ff30 6e 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20  ntime space */. 
2ff40 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20   Mem *pMem;     
2ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2ff60 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2ff70 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ugh memory cells
2ff80 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b   */.  Mem *pEnd;
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ffa0 20 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c   Last memory cel
2ffb0 6c 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a  l in new array *
2ffc0 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
2ffd0 46 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e  Frame;      /* N
2ffe0 65 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f  ew vdbe frame to
2fff0 20 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20   execute in */. 
30000 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72   SubProgram *pPr
30010 6f 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d  ogram;   /* Sub-
30020 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
30030 74 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b  te */.  void *t;
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 2f 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66  /* Token identif
30060 79 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a  ying trigger */.
30070 0a 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f  .  pProgram = pO
30080 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
30090 20 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f    pRt = &aMem[pO
300a0 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
300b0 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e  ( pProgram->nOp>
300c0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
300d0 74 68 65 20 70 35 20 66 6c 61 67 20 69 73 20 63  the p5 flag is c
300e0 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72  lear, then recur
300f0 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
30100 6f 66 20 74 72 69 67 67 65 72 73 20 69 73 20 0a  of triggers is .
30110 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f    ** disabled fo
30120 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
30130 61 74 69 62 69 6c 69 74 79 20 28 70 35 20 69 73  atibility (p5 is
30140 20 73 65 74 20 69 66 20 74 68 69 73 20 73 75 62   set if this sub
30150 2d 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73  -program.  ** is
30160 20 72 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65   really a trigge
30170 72 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e  r, not a foreign
30180 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64   key action, and
30190 20 74 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20   the flag set.  
301a0 2a 2a 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  ** and cleared b
301b0 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 72 65  y the "PRAGMA re
301c0 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
301d0 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65  " command is cle
301e0 61 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ar)..  ** .  ** 
301f0 49 74 20 69 73 20 72 65 63 75 72 73 69 76 65 20  It is recursive 
30200 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72  invocation of tr
30210 69 67 67 65 72 73 2c 20 61 74 20 74 68 65 20 53  iggers, at the S
30220 51 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69  QL level, that i
30230 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64  s .  ** disabled
30240 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  . In some cases 
30250 61 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72  a single trigger
30260 20 6d 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f   may generate mo
30270 72 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a  re than one .  *
30280 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66  * SubProgram (if
30290 20 74 68 65 20 74 72 69 67 67 65 72 20 6d 61 79   the trigger may
302a0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
302b0 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  h more than one 
302c0 64 69 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20  different .  ** 
302d0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f  ON CONFLICT algo
302e0 72 69 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72  rithm). SubProgr
302f0 61 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 73  am structures as
30300 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 0a  sociated with a.
30310 20 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67    ** single trig
30320 67 65 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65  ger all have the
30330 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20   same value for 
30340 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74  the SubProgram.t
30350 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61  oken .  ** varia
30360 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
30370 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20  Op->p5 ){.    t 
30380 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65  = pProgram->toke
30390 6e 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  n;.    for(pFram
303a0 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
303b0 61 6d 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74  ame && pFrame->t
303c0 6f 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d  oken!=t; pFrame=
303d0 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
303e0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 61 6d 65  ;.    if( pFrame
303f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
30400 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d   if( p->nFrame>=
30410 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
30420 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
30430 44 45 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63  DEPTH] ){.    rc
30440 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
30450 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30460 45 72 72 6f 72 28 70 2c 20 22 74 6f 6f 20 6d 61  Error(p, "too ma
30470 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
30480 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 22 29  gger recursion")
30490 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
304a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
304b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
304c0 72 20 70 52 74 20 69 73 20 75 73 65 64 20 74 6f  r pRt is used to
304d0 20 73 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72   store the memor
304e0 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  y required to sa
304f0 76 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  ve the state.  *
30500 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
30510 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68   program, and th
30520 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  e memory require
30530 64 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  d at runtime to 
30540 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65  execute.  ** the
30550 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
30560 2e 20 49 66 20 74 68 69 73 20 74 72 69 67 67 65  . If this trigge
30570 72 20 68 61 73 20 62 65 65 6e 20 66 69 72 65 64  r has been fired
30580 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52   before, then pR
30590 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  t .  ** is alrea
305a0 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74  dy allocated. Ot
305b0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74  herwise, it must
305c0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
305d0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d    */.  if( (pRt-
305e0 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65  >flags&MEM_Frame
305f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  )==0 ){.    /* S
30600 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69  ubProgram.nMem i
30610 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
30620 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ber of memory ce
30630 6c 6c 73 20 75 73 65 64 20 62 79 20 74 68 65 20  lls used by the 
30640 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20  .    ** program 
30650 73 74 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f  stored in SubPro
30660 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c  gram.aOp. As wel
30670 6c 20 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20  l as these, one 
30680 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65  memory.    ** ce
30690 6c 6c 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ll is required f
306a0 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 75  or each cursor u
306b0 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 67 72  sed by the progr
306c0 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20  am. Set local.  
306d0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d    ** variable nM
306e0 65 6d 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56  em (and later, V
306f0 64 62 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d  dbeFrame.nChildM
30700 65 6d 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75  em) to this valu
30710 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d  e..    */.    nM
30720 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  em = pProgram->n
30730 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e  Mem + pProgram->
30740 6e 43 73 72 3b 0a 20 20 20 20 61 73 73 65 72 74  nCsr;.    assert
30750 28 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ( nMem>0 );.    
30760 69 66 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  if( pProgram->nC
30770 73 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b 2b 3b 0a  sr==0 ) nMem++;.
30780 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
30790 44 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72  D8(sizeof(VdbeFr
307a0 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20  ame)).          
307b0 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a      + nMem * siz
307c0 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20  eof(Mem).       
307d0 20 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61         + pProgra
307e0 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66  m->nCsr * sizeof
307f0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 29 3b 0a  (VdbeCursor *);.
30800 20 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c      pFrame = sql
30810 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
30820 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
30830 20 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a   if( !pFrame ){.
30840 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
30850 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
30860 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
30870 73 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74  se(pRt);.    pRt
30880 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72  ->flags = MEM_Fr
30890 61 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e  ame;.    pRt->u.
308a0 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b  pFrame = pFrame;
308b0 0a 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20  ..    pFrame->v 
308c0 3d 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  = p;.    pFrame-
308d0 3e 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65  >nChildMem = nMe
308e0 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  m;.    pFrame->n
308f0 43 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67  ChildCsr = pProg
30900 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70  ram->nCsr;.    p
30910 46 72 61 6d 65 2d 3e 70 63 20 3d 20 28 69 6e 74  Frame->pc = (int
30920 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
30930 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d    pFrame->aMem =
30940 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46   p->aMem;.    pF
30950 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e  rame->nMem = p->
30960 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  nMem;.    pFrame
30970 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43  ->apCsr = p->apC
30980 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  sr;.    pFrame->
30990 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75  nCursor = p->nCu
309a0 72 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  rsor;.    pFrame
309b0 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a  ->aOp = p->aOp;.
309c0 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20      pFrame->nOp 
309d0 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46  = p->nOp;.    pF
309e0 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50  rame->token = pP
309f0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23  rogram->token;.#
30a00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
30a10 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
30a20 54 55 53 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  TUS.    pFrame->
30a30 61 6e 45 78 65 63 20 3d 20 70 2d 3e 61 6e 45 78  anExec = p->anEx
30a40 65 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ec;.#endif..    
30a50 70 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d  pEnd = &VdbeFram
30a60 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72  eMem(pFrame)[pFr
30a70 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  ame->nChildMem];
30a80 0a 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64  .    for(pMem=Vd
30a90 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d  beFrameMem(pFram
30aa0 65 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20  e); pMem!=pEnd; 
30ab0 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70  pMem++){.      p
30ac0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
30ad0 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
30ae0 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b    pMem->db = db;
30af0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
30b00 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74      pFrame = pRt
30b10 2d 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20  ->u.pFrame;.    
30b20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d  assert( pProgram
30b30 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d  ->nMem+pProgram-
30b40 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e  >nCsr==pFrame->n
30b50 43 68 69 6c 64 4d 65 6d 20 0a 20 20 20 20 20 20  ChildMem .      
30b60 20 20 7c 7c 20 28 70 50 72 6f 67 72 61 6d 2d 3e    || (pProgram->
30b70 6e 43 73 72 3d 3d 30 20 26 26 20 70 50 72 6f 67  nCsr==0 && pProg
30b80 72 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70 46 72  ram->nMem+1==pFr
30b90 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 20  ame->nChildMem) 
30ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
30bb0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70  Program->nCsr==p
30bc0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72  Frame->nChildCsr
30bd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30be0 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
30bf0 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a  ==pFrame->pc );.
30c00 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65    }..  p->nFrame
30c10 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50  ++;.  pFrame->pP
30c20 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d  arent = p->pFram
30c30 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73  e;.  pFrame->las
30c40 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73  tRowid = db->las
30c50 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d 65  tRowid;.  pFrame
30c60 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e  ->nChange = p->n
30c70 43 68 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d 65  Change;.  pFrame
30c80 2d 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20 70 2d  ->nDbChange = p-
30c90 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  >db->nChange;.  
30ca0 61 73 73 65 72 74 28 20 70 46 72 61 6d 65 2d 3e  assert( pFrame->
30cb0 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 20  pAuxData==0 );. 
30cc0 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
30cd0 61 20 3d 20 70 2d 3e 70 41 75 78 44 61 74 61 3b  a = p->pAuxData;
30ce0 0a 20 20 70 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  p->pAuxData =
30cf0 20 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65   0;.  p->nChange
30d00 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d   = 0;.  p->pFram
30d10 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d  e = pFrame;.  p-
30d20 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 56  >aMem = aMem = V
30d30 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61  dbeFrameMem(pFra
30d40 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d  me);.  p->nMem =
30d50 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d   pFrame->nChildM
30d60 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  em;.  p->nCursor
30d70 20 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e   = (u16)pFrame->
30d80 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e  nChildCsr;.  p->
30d90 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
30da0 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
30db0 6e 4d 65 6d 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20  nMem];.  p->aOp 
30dc0 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d  = aOp = pProgram
30dd0 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20  ->aOp;.  p->nOp 
30de0 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b  = pProgram->nOp;
30df0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
30e00 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
30e10 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65  TATUS.  p->anExe
30e20 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  c = 0;.#endif.  
30e30 70 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a  pOp = &aOp[-1];.
30e40 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
30e50 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31  Opcode: Param P1
30e60 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
30e70 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f  This opcode is o
30e80 6e 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e 74  nly ever present
30e90 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73   in sub-programs
30ea0 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
30eb0 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69  .** OP_Program i
30ec0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79  nstruction. Copy
30ed0 20 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74   a value current
30ee0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d  ly stored in a m
30ef0 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f  emory .** cell o
30f00 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70  f the calling (p
30f10 61 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20  arent) frame to 
30f20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63  cell P2 in the c
30f30 75 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a  urrent frames .*
30f40 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  * address space.
30f50 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
30f60 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
30f70 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
30f80 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c  new.* .** and ol
30f90 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  d.* values..**.*
30fa0 2a 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66  * The address of
30fb0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
30fc0 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73   parent frame is
30fd0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61   determined by a
30fe0 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c  dding.** the val
30ff0 75 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67  ue of the P1 arg
31000 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c  ument to the val
31010 75 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67  ue of the P1 arg
31020 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  ument to the.** 
31030 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72  calling OP_Progr
31040 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  am instruction..
31050 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d  */.case OP_Param
31060 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
31070 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 46   out2 */.  VdbeF
31080 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
31090 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74  Mem *pIn;.  pOut
310a0 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
310b0 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72  e(p, pOp);.  pFr
310c0 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b  ame = p->pFrame;
310d0 0a 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65  .  pIn = &pFrame
310e0 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b  ->aMem[pOp->p1 +
310f0 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72   pFrame->aOp[pFr
31100 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20  ame->pc].p1];   
31110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
31120 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
31130 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65  t, pIn, MEM_Ephe
31140 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  m);.  break;.}..
31150 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
31160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
31170 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  IGGER */..#ifnde
31180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
31190 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63  REIGN_KEY./* Opc
311a0 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50  ode: FkCounter P
311b0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
311c0 6e 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b 50 31  nopsis: fkctr[P1
311d0 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  ]+=P2.**.** Incr
311e0 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61  ement a "constra
311f0 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20  int counter" by 
31200 50 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65  P2 (P2 may be ne
31210 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69  gative or positi
31220 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73  ve)..** If P1 is
31230 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64   non-zero, the d
31240 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69  atabase constrai
31250 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e  nt counter is in
31260 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64  cremented .** (d
31270 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
31280 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29  key constraints)
31290 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
312a0 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  P1 is zero, the 
312b0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  .** statement co
312c0 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65  unter is increme
312d0 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20  nted (immediate 
312e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
312f0 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73  traints)..*/.cas
31300 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20  e OP_FkCounter: 
31310 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
31320 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72  s & SQLITE_Defer
31330 46 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  FKs ){.    db->n
31340 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
31350 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65  += pOp->p2;.  }e
31360 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 31 20  lse if( pOp->p1 
31370 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  ){.    db->nDefe
31380 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d  rredCons += pOp-
31390 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >p2;.  }else{.  
313a0 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
313b0 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  nt += pOp->p2;. 
313c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
313d0 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65  * Opcode: FkIfZe
313e0 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ro P1 P2 * * *.*
313f0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 66  * Synopsis: if f
31400 6b 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f  kctr[P1]==0 goto
31410 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f   P2.**.** This o
31420 70 63 6f 64 65 20 74 65 73 74 73 20 69 66 20 61  pcode tests if a
31430 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
31440 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20  straint-counter 
31450 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72  is currently zer
31460 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d  o..** If so, jum
31470 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
31480 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
31490 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
314a0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73  the next .** ins
314b0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
314c0 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P1 is non-zer
314d0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70  o, then the jump
314e0 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65   is taken if the
314f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72   database constr
31500 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20  aint-counter.** 
31510 69 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65  is zero (the one
31520 20 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66   that counts def
31530 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
31540 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66   violations). If
31550 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20   P1 is.** zero, 
31560 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
31570 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
31580 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f  nt constraint-co
31590 75 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a  unter is zero.**
315a0 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
315b0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
315c0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a  nt violations)..
315d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a  */.case OP_FkIfZ
315e0 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ero: {         /
315f0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20  * jump */.  if( 
31600 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56  pOp->p1 ){.    V
31610 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 64  dbeBranchTaken(d
31620 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
31630 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  ==0 && db->nDefe
31640 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20  rredImmCons==0, 
31650 32 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  2);.    if( db->
31660 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30  nDeferredCons==0
31670 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   && db->nDeferre
31680 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f  dImmCons==0 ) go
31690 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
316a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
316b0 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e  BranchTaken(p->n
316c0 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20  FkConstraint==0 
316d0 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
316e0 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a  ImmCons==0, 2);.
316f0 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f      if( p->nFkCo
31700 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64  nstraint==0 && d
31710 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
31720 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75  ons==0 ) goto ju
31730 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
31740 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
31750 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
31760 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
31770 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EY */..#ifndef S
31780 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
31790 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f  NCREMENT./* Opco
317a0 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32  de: MemMax P1 P2
317b0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
317c0 69 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b  is: r[P1]=max(r[
317d0 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a  P1],r[P2]).**.**
317e0 20 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65   P1 is a registe
317f0 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72  r in the root fr
31800 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28  ame of this VM (
31810 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69  the root frame i
31820 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66  s.** different f
31830 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
31840 66 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e  frame if this in
31850 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69  struction is bei
31860 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77  ng executed.** w
31870 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67  ithin a sub-prog
31880 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61  ram). Set the va
31890 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
318a0 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  P1 to the maximu
318b0 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72  m of .** its cur
318c0 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74  rent value and t
318d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
318e0 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
318f0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
31900 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20  throws an error 
31910 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  if the memory ce
31920 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  ll is not initia
31930 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65  lly.** an intege
31940 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65  r..*/.case OP_Me
31950 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f  mMax: {        /
31960 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46  * in2 */.  VdbeF
31970 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
31980 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
31990 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
319a0 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
319b0 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
319c0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
319d0 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20  nt);.    pIn1 = 
319e0 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f  &pFrame->aMem[pO
319f0 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b  p->p1];.  }else{
31a00 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  .    pIn1 = &aMe
31a10 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a  m[pOp->p1];.  }.
31a20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
31a30 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
31a40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
31a50 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a  tegerify(pIn1);.
31a60 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
31a70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74  Op->p2];.  sqlit
31a80 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
31a90 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28  ify(pIn2);.  if(
31aa0 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d   pIn1->u.i<pIn2-
31ab0 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d  >u.i){.    pIn1-
31ac0 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69  >u.i = pIn2->u.i
31ad0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
31ae0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31af0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
31b00 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  MENT */../* Opco
31b10 64 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20  de: IfPos P1 P2 
31b20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
31b30 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74  is: if r[P1]>0 t
31b40 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67  hen r[P1]-=P3, g
31b50 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67  oto P2.**.** Reg
31b60 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f  ister P1 must co
31b70 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
31b80 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  ..** If the valu
31b90 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  e of register P1
31ba0 20 69 73 20 31 20 6f 72 20 67 72 65 61 74 65 72   is 1 or greater
31bb0 2c 20 73 75 62 74 72 61 63 74 20 50 33 20 66 72  , subtract P3 fr
31bc0 6f 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  om the.** value 
31bd0 69 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70 20 74  in P1 and jump t
31be0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o P2..**.** If t
31bf0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
31c00 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
31c10 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2c 20  is less than 1, 
31c20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  then the.** valu
31c30 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  e is unchanged a
31c40 6e 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65  nd control passe
31c50 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  s through to the
31c60 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
31c70 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  n..*/.case OP_If
31c80 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Pos: {        /*
31c90 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
31ca0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
31cb0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
31cc0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
31cd0 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72  _Int );.  VdbeBr
31ce0 61 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d  anchTaken( pIn1-
31cf0 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66  >u.i>0, 2);.  if
31d00 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b  ( pIn1->u.i>0 ){
31d10 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d  .    pIn1->u.i -
31d20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67  = pOp->p3;.    g
31d30 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
31d40 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
31d50 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65  /* Opcode: Offse
31d60 74 4c 69 6d 69 74 20 50 31 20 50 32 20 50 33 20  tLimit P1 P2 P3 
31d70 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
31d80 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e   if r[P1]>0 then
31d90 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78   r[P2]=r[P1]+max
31da0 28 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20 72  (0,r[P3]) else r
31db0 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20  [P2]=(-1).**.** 
31dc0 54 68 69 73 20 6f 70 63 6f 64 65 20 70 65 72 66  This opcode perf
31dd0 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20  orms a commonly 
31de0 75 73 65 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e  used computation
31df0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
31e00 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  .** LIMIT and OF
31e10 46 53 45 54 20 70 72 6f 63 65 73 73 2e 20 20 72  FSET process.  r
31e20 5b 50 31 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c  [P1] holds the l
31e30 69 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20 20 72  imit counter.  r
31e40 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68  [P3].** holds th
31e50 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
31e60 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 20 63 6f  .  The opcode co
31e70 6d 70 75 74 65 73 20 74 68 65 20 63 6f 6d 62 69  mputes the combi
31e80 6e 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  ned value.** of 
31e90 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
31ea0 46 53 45 54 20 61 6e 64 20 73 74 6f 72 65 73 20  FSET and stores 
31eb0 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20 72 5b  that value in r[
31ec0 50 32 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a  P2].  The r[P2].
31ed0 2a 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75 74 65  ** value compute
31ee0 64 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  d is the total n
31ef0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
31f00 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
31f10 62 65 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 6e  be.** visited in
31f20 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
31f30 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a  te the query..**
31f40 0a 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69 73 20  .** If r[P3] is 
31f50 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
31f60 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
31f70 72 65 20 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a  re is no OFFSET.
31f80 2a 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20  ** and r[P2] is 
31f90 73 65 74 20 74 6f 20 62 65 20 74 68 65 20 76 61  set to be the va
31fa0 6c 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  lue of the LIMIT
31fb0 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69  , r[P1]..**.** i
31fc0 66 20 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20  f r[P1] is zero 
31fd0 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61  or negative, tha
31fe0 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  t means there is
31ff0 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64   no LIMIT.** and
32000 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f   r[P2] is set to
32010 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   -1. .**.** Othe
32020 72 77 69 73 65 2c 20 72 5b 50 32 5d 20 69 73 20  rwise, r[P2] is 
32030 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
32040 66 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33  f r[P1] and r[P3
32050 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66  ]..*/.case OP_Of
32060 66 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20  fsetLimit: {    
32070 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e  /* in1, out2, in
32080 33 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20  3 */.  i64 x;.  
32090 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
320a0 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20  ->p1];.  pIn3 = 
320b0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
320c0 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
320d0 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
320e0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
320f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
32100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
32110 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
32120 49 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e  Int );.  x = pIn
32130 31 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c  1->u.i;.  if( x<
32140 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 41 64 64  =0 || sqlite3Add
32150 49 6e 74 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e  Int64(&x, pIn3->
32160 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a  u.i>0?pIn3->u.i:
32170 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  0) ){.    /* If 
32180 74 68 65 20 4c 49 4d 49 54 20 69 73 20 6c 65 73  the LIMIT is les
32190 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
321a0 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f  to zero, loop fo
321b0 72 65 76 65 72 2e 20 20 54 68 69 73 0a 20 20 20  rever.  This.   
321c0 20 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74 65   ** is documente
321d0 64 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20 69 66  d.  But also, if
321e0 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45   the LIMIT+OFFSE
321f0 54 20 65 78 63 65 65 64 73 20 32 5e 36 33 20 74  T exceeds 2^63 t
32200 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  hen.    ** also 
32210 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20 20 54  loop forever.  T
32220 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e  his is undocumen
32230 74 65 64 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f  ted.  In fact, o
32240 6e 65 20 63 6f 75 6c 64 20 61 72 67 75 65 0a 20  ne could argue. 
32250 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c     ** that the l
32260 6f 6f 70 20 73 68 6f 75 6c 64 20 74 65 72 6d 69  oop should termi
32270 6e 61 74 65 2e 20 20 42 75 74 20 61 73 73 75 6d  nate.  But assum
32280 69 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74  ing 1 billion it
32290 65 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  erations.    ** 
322a0 70 65 72 20 73 65 63 6f 6e 64 20 28 66 61 72 20  per second (far 
322b0 65 78 63 65 65 64 69 6e 67 20 74 68 65 20 63 61  exceeding the ca
322c0 70 61 62 69 6c 69 74 69 65 73 20 6f 66 20 61 6e  pabilities of an
322d0 79 20 63 75 72 72 65 6e 74 20 68 61 72 64 77 61  y current hardwa
322e0 72 65 29 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f  re).    ** it wo
322f0 75 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c 79 20  uld take nearly 
32300 33 30 30 20 79 65 61 72 73 20 74 6f 20 61 63 74  300 years to act
32310 75 61 6c 6c 79 20 72 65 61 63 68 20 74 68 65 20  ually reach the 
32320 6c 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a  limit.  So.    *
32330 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65  * looping foreve
32340 72 20 69 73 20 61 20 72 65 61 73 6f 6e 61 62 6c  r is a reasonabl
32350 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e  e approximation.
32360 20 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e   */.    pOut->u.
32370 69 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  i = -1;.  }else{
32380 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
32390 20 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   x;.  }.  break;
323a0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
323b0 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20 2a  fNotZero P1 P2 *
323c0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
323d0 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30 20 74 68  : if r[P1]!=0 th
323e0 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f  en r[P1]--, goto
323f0 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74   P2.**.** Regist
32400 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61  er P1 must conta
32410 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
32420 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  If the content o
32430 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
32440 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67 72  .** initially gr
32450 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
32460 20 74 68 65 6e 20 64 65 63 72 65 6d 65 6e 74 20   then decrement 
32470 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
32480 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20  ister P1..** If 
32490 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28  it is non-zero (
324a0 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69  negative or posi
324b0 74 69 76 65 29 20 61 6e 64 20 74 68 65 6e 20 61  tive) and then a
324c0 6c 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20  lso jump to P2. 
324d0 20 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72   .** If register
324e0 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79   P1 is initially
324f0 20 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69 74 20   zero, leave it 
32500 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 66 61  unchanged and fa
32510 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63  ll through..*/.c
32520 61 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  ase OP_IfNotZero
32530 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
32540 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
32550 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
32560 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  1];.  assert( pI
32570 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  n1->flags&MEM_In
32580 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  t );.  VdbeBranc
32590 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69  hTaken(pIn1->u.i
325a0 3c 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49  <0, 2);.  if( pI
325b0 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20  n1->u.i ){.     
325c0 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20  if( pIn1->u.i>0 
325d0 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20  ) pIn1->u.i--;. 
325e0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
325f0 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
32600 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
32610 44 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20  DecrJumpZero P1 
32620 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
32630 70 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31  psis: if (--r[P1
32640 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a  ])==0 goto P2.**
32650 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20  .** Register P1 
32660 6d 75 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74  must hold an int
32670 65 67 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74  eger.  Decrement
32680 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50 31   the value in P1
32690 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  .** and jump to 
326a0 50 32 20 69 66 20 74 68 65 20 6e 65 77 20 76 61  P2 if the new va
326b0 6c 75 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a  lue is exactly z
326c0 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ero..*/.case OP_
326d0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20  DecrJumpZero: { 
326e0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
326f0 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
32700 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
32710 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
32720 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  ags&MEM_Int );. 
32730 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53   if( pIn1->u.i>S
32740 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20  MALLEST_INT64 ) 
32750 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56  pIn1->u.i--;.  V
32760 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70  dbeBranchTaken(p
32770 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b  In1->u.i==0, 2);
32780 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
32790 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ==0 ) goto jump_
327a0 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
327b0 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  }.../* Opcode: A
327c0 67 67 53 74 65 70 30 20 2a 20 50 32 20 50 33 20  ggStep0 * P2 P3 
327d0 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
327e0 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73  s: accum=r[P3] s
327f0 74 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a  tep(r[P2@P5]).**
32800 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
32810 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
32820 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  r an aggregate. 
32830 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   The.** function
32840 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74   has P5 argument
32850 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69  s.   P4 is a poi
32860 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
32870 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  Def.** structure
32880 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
32890 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  the function.  R
328a0 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68  egister P3 is th
328b0 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72  e.** accumulator
328c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61  ..**.** The P5 a
328d0 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b  rguments are tak
328e0 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
328f0 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73   P2 and its.** s
32900 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a  uccessors..*/./*
32910 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70   Opcode: AggStep
32920 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a   * P2 P3 P4 P5.*
32930 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
32940 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50  m=r[P3] step(r[P
32950 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65  2@P5]).**.** Exe
32960 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75  cute the step fu
32970 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
32980 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a  gregate.  The.**
32990 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35   function has P5
329a0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34   arguments.   P4
329b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
329c0 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   an sqlite3_cont
329d0 65 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ext.** object th
329e0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 75  at is used to ru
329f0 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  n the function. 
32a00 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73 0a   Register P3 is.
32a10 2a 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d 75  ** as the accumu
32a20 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
32a30 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72   P5 arguments ar
32a40 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  e taken from reg
32a50 69 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73  ister P2 and its
32a60 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a  .** successors..
32a70 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
32a80 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63  e is initially c
32a90 6f 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74  oded as OP_AggSt
32aa0 65 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65  ep0.  On first e
32ab0 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  valuation,.** th
32ac0 65 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64  e FuncDef stored
32ad0 20 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72   in P4 is conver
32ae0 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69  ted into an sqli
32af0 74 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a  te3_context and.
32b00 2a 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  ** the opcode is
32b10 20 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68   changed.  In th
32b20 69 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74  is way, the init
32b30 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
32b40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e.** sqlite3_con
32b50 74 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  text only happen
32b60 73 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20  s once, instead 
32b70 6f 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20  of on each call 
32b80 74 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66  to the.** step f
32b90 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  unction..*/.case
32ba0 20 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a   OP_AggStep0: {.
32bb0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
32bc0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
32bd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
32be0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e  ->p4type==P4_FUN
32bf0 43 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f  CDEF );.  n = pO
32c00 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28  p->p5;.  assert(
32c10 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
32c20 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p3<=(p->nMem+
32c30 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
32c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
32c50 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20  0 || (pOp->p2>0 
32c60 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70  && pOp->p2+n<=(p
32c70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
32c80 75 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61  ursor)+1) );.  a
32c90 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
32ca0 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p2 || pOp->p
32cb0 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a  3>=pOp->p2+n );.
32cc0 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33    pCtx = sqlite3
32cd0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
32ce0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  , sizeof(*pCtx) 
32cf0 2b 20 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73  + (n-1)*sizeof(s
32d00 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b  qlite3_value*));
32d10 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
32d20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
32d30 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a  pCtx->pMem = 0;.
32d40 20 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20    pCtx->pFunc = 
32d50 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
32d60 20 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e   pCtx->iOp = (in
32d70 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20  t)(pOp - aOp);. 
32d80 20 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70   pCtx->pVdbe = p
32d90 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d  ;.  pCtx->argc =
32da0 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   n;.  pOp->p4typ
32db0 65 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a  e = P4_FUNCCTX;.
32dc0 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d    pOp->p4.pCtx =
32dd0 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70   pCtx;.  pOp->op
32de0 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74 65  code = OP_AggSte
32df0 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  p;.  /* Fall thr
32e00 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67  ough into OP_Agg
32e10 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f  Step */.}.case O
32e20 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69  P_AggStep: {.  i
32e30 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
32e40 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  context *pCtx;. 
32e50 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65   Mem *pMem;.  Me
32e60 6d 20 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m t;..  assert( 
32e70 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
32e80 46 55 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74  FUNCCTX );.  pCt
32e90 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  x = pOp->p4.pCtx
32ea0 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d  ;.  pMem = &aMem
32eb0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a  [pOp->p3];..  /*
32ec0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
32ed0 6e 20 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61  n is inside of a
32ee0 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 72 65   trigger, the re
32ef0 67 69 73 74 65 72 20 61 72 72 61 79 20 69 6e 20  gister array in 
32f00 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68  aMem[].  ** migh
32f10 74 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e  t change from on
32f20 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20  e evaluation to 
32f30 74 68 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e  the next.  The n
32f40 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
32f50 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f  e.  ** checks to
32f60 20 73 65 65 20 69 66 20 74 68 65 20 72 65 67 69   see if the regi
32f70 73 74 65 72 20 61 72 72 61 79 20 68 61 73 20 63  ster array has c
32f80 68 61 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73  hanged, and if s
32f90 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74  o it.  ** reinit
32fa0 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61  ializes the rela
32fb0 76 61 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68  vant parts of th
32fc0 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e sqlite3_contex
32fd0 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66  t object */.  if
32fe0 28 20 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20  ( pCtx->pMem != 
32ff0 70 4d 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78  pMem ){.    pCtx
33000 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20  ->pMem = pMem;. 
33010 20 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61     for(i=pCtx->a
33020 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  rgc-1; i>=0; i--
33030 29 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20  ) pCtx->argv[i] 
33040 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b  = &aMem[pOp->p2+
33050 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  i];.  }..#ifdef 
33060 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
33070 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e  or(i=0; i<pCtx->
33080 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
33090 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
330a0 69 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d  id(pCtx->argv[i]
330b0 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  ) );.    REGISTE
330c0 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b  R_TRACE(pOp->p2+
330d0 69 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d  i, pCtx->argv[i]
330e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
330f0 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73 71   pMem->n++;.  sq
33100 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
33110 28 26 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  (&t, db, MEM_Nul
33120 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74  l);.  pCtx->pOut
33130 20 3d 20 26 74 3b 0a 20 20 70 43 74 78 2d 3e 66   = &t;.  pCtx->f
33140 45 72 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a  ErrorOrAux = 0;.
33150 20 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67    pCtx->skipFlag
33160 20 3d 20 30 3b 0a 20 20 28 70 43 74 78 2d 3e 70   = 0;.  (pCtx->p
33170 46 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43  Func->xSFunc)(pC
33180 74 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43  tx,pCtx->argc,pC
33190 74 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d  tx->argv); /* IM
331a0 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30  P: R-24505-23230
331b0 20 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e   */.  if( pCtx->
331c0 66 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20  fErrorOrAux ){. 
331d0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45     if( pCtx->isE
331e0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71  rror ){.      sq
331f0 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
33200 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
33210 76 61 6c 75 65 5f 74 65 78 74 28 26 74 29 29 3b  value_text(&t));
33220 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
33230 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d  ->isError;.    }
33240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
33250 4d 65 6d 52 65 6c 65 61 73 65 28 26 74 29 3b 0a  MemRelease(&t);.
33260 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33270 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
33280 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rror;.  }else{. 
33290 20 20 20 61 73 73 65 72 74 28 20 74 2e 66 6c 61     assert( t.fla
332a0 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  gs==MEM_Null );.
332b0 20 20 7d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e    }.  if( pCtx->
332c0 73 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20  skipFlag ){.    
332d0 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
332e0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
332f0 65 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f  eq );.    i = pO
33300 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66  p[-1].p1;.    if
33310 28 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( i ) sqlite3Vdb
33320 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
33330 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20  em[i], 1);.  }. 
33340 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
33350 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50  code: AggFinal P
33360 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  1 P2 * P4 *.** S
33370 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72  ynopsis: accum=r
33380 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20  [P1] N=P2.**.** 
33390 45 78 65 63 75 74 65 20 74 68 65 20 66 69 6e 61  Execute the fina
333a0 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  lizer function f
333b0 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  or an aggregate.
333c0 20 20 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d    P1 is.** the m
333d0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74  emory location t
333e0 68 61 74 20 69 73 20 74 68 65 20 61 63 63 75 6d  hat is the accum
333f0 75 6c 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61  ulator for the a
33400 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ggregate..**.** 
33410 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  P2 is the number
33420 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68   of arguments th
33430 61 74 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  at the step func
33440 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a  tion takes and.*
33450 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
33460 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66  r to the FuncDef
33470 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
33480 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61  on.  The P2.** a
33490 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75  rgument is not u
334a0 73 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f  sed by this opco
334b0 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  de.  It is only 
334c0 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69  there to disambi
334d0 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f  guate.** functio
334e0 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65  ns that can take
334f0 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73   varying numbers
33500 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
33510 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65  The.** P4 argume
33520 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  nt is only neede
33530 64 20 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65  d for the degene
33540 72 61 74 65 20 63 61 73 65 20 77 68 65 72 65 0a  rate case where.
33550 2a 2a 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  ** the step func
33560 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65  tion was not pre
33570 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a  viously called..
33580 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69  */.case OP_AggFi
33590 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  nal: {.  Mem *pM
335a0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  em;.  assert( pO
335b0 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p1>0 && pOp->
335c0 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
335d0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
335e0 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70    pMem = &aMem[p
335f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
33600 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
33610 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  & ~(MEM_Null|MEM
33620 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72  _Agg))==0 );.  r
33630 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
33640 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c  emFinalize(pMem,
33650 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b   pOp->p4.pFunc);
33660 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
33670 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
33680 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  r(p, "%s", sqlit
33690 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d  e3_value_text(pM
336a0 65 6d 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61  em));.    goto a
336b0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
336c0 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
336d0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
336e0 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e  ng(pMem, encodin
336f0 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  g);.  UPDATE_MAX
33700 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b  _BLOBSIZE(pMem);
33710 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
33720 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d  beMemTooBig(pMem
33730 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
33740 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65  o_big;.  }.  bre
33750 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
33760 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
33770 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70  * Opcode: Checkp
33780 6f 69 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20  oint P1 P2 P3 * 
33790 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  *.**.** Checkpoi
337a0 6e 74 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  nt database P1. 
337b0 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
337c0 69 66 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72  if P1 is not cur
337d0 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c  rently in.** WAL
337e0 20 6d 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72   mode. Parameter
337f0 20 50 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51   P2 is one of SQ
33800 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
33810 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a  PASSIVE, FULL,.*
33820 2a 20 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52  * RESTART, or TR
33830 55 4e 43 41 54 45 2e 20 20 57 72 69 74 65 20 31  UNCATE.  Write 1
33840 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50   or 0 into mem[P
33850 33 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b 70  3] if the checkp
33860 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  oint returns.** 
33870 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e  SQLITE_BUSY or n
33880 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
33890 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
338a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
338b0 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72  the.** WAL after
338c0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
338d0 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61  into mem[P3+1] a
338e0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
338f0 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65   pages.** in the
33900 20 57 41 4c 20 74 68 61 74 20 68 61 76 65 20 62   WAL that have b
33910 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  een checkpointed
33920 20 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b   after the check
33930 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74  point.** complet
33940 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32  es into mem[P3+2
33950 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61  ].  However on a
33960 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b  n error, mem[P3+
33970 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33  1] and.** mem[P3
33980 2b 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69  +2] are initiali
33990 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61  zed to -1..*/.ca
339a0 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
339b0 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  : {.  int i;    
339c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
339e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  unter */.  int a
339f0 52 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  Res[3];         
33a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33a10 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  sults */.  Mem *
33a20 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
33a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
33a40 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
33a50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
33a60 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
33a70 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a  .  aRes[0] = 0;.
33a80 20 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73    aRes[1] = aRes
33a90 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65  [2] = -1;.  asse
33aa0 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c  rt( pOp->p2==SQL
33ab0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
33ac0 41 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c  ASSIVE.       ||
33ad0 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
33ae0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
33af0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
33b00 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
33b10 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20  POINT_RESTART.  
33b20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d       || pOp->p2=
33b30 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
33b40 4e 54 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b  NT_TRUNCATE.  );
33b50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
33b60 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f  heckpoint(db, pO
33b70 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
33b80 26 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b  &aRes[1], &aRes[
33b90 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  2]);.  if( rc ){
33ba0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33bb0 49 54 45 5f 42 55 53 59 20 29 20 67 6f 74 6f 20  ITE_BUSY ) goto 
33bc0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
33bd0 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  or;.    rc = SQL
33be0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73  ITE_OK;.    aRes
33bf0 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  [0] = 1;.  }.  f
33c00 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26  or(i=0, pMem = &
33c10 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69  aMem[pOp->p3]; i
33c20 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29  <3; i++, pMem++)
33c30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
33c40 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65  eMemSetInt64(pMe
33c50 6d 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29  m, (i64)aRes[i])
33c60 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61  ;.  }    .  brea
33c70 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a  k;.};  .#endif..
33c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33c90 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70  MIT_PRAGMA./* Op
33ca0 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64  code: JournalMod
33cb0 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
33cc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
33cd0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20  journal mode of 
33ce0 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 50  database P1 to P
33cf0 33 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e  3. P3 must be on
33d00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45  e of the.** PAGE
33d10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58  R_JOURNALMODE_XX
33d20 58 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61  X values. If cha
33d30 6e 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68  nging between th
33d40 65 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61  e various rollba
33d50 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c  ck.** modes (del
33d60 65 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70  ete, truncate, p
33d70 65 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20  ersist, off and 
33d80 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73  memory), this is
33d90 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65   a simple.** ope
33da0 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73  ration. No IO is
33db0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
33dc0 20 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74   If changing int
33dd0 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20  o or out of WAL 
33de0 6d 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64 75  mode the procedu
33df0 72 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  re is more compl
33e00 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72  icated..**.** Wr
33e10 69 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e  ite a string con
33e20 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61  taining the fina
33e30 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74  l journal-mode t
33e40 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
33e50 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61  /.case OP_Journa
33e60 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f  lMode: {    /* o
33e70 75 74 32 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ut2 */.  Btree *
33e80 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
33e90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
33ea0 65 20 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72  e to change jour
33eb0 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20  nal mode of */. 
33ec0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
33ef0 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
33f00 0a 20 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20  .  int eNew;    
33f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f20 20 20 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61     /* New journa
33f30 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  l mode */.  int 
33f40 65 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  eOld;           
33f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33f60 68 65 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d  he old journal m
33f70 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ode */.#ifndef S
33f80 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
33f90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
33fa0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
33fb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
33fc0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 70 50  base file for pP
33fd0 61 67 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ager */.#endif..
33fe0 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
33ff0 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
34000 0a 20 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70  .  eNew = pOp->p
34010 33 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65  3;.  assert( eNe
34020 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34030 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
34040 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
34050 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
34060 52 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20  RUNCATE .       
34070 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
34080 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
34090 53 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  ST .       || eN
340a0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
340b0 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20  LMODE_OFF.      
340c0 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
340d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
340e0 52 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  RY.       || eNe
340f0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34100 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20  MODE_WAL.       
34110 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
34120 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
34130 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
34140 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
34150 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
34160 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
34170 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adOnly==0 );..  
34180 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  pBt = db->aDb[pO
34190 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50  p->p1].pBt;.  pP
341a0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
341b0 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
341c0 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50   eOld = sqlite3P
341d0 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
341e0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  de(pPager);.  if
341f0 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  ( eNew==PAGER_JO
34200 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
34210 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20  ) eNew = eOld;. 
34220 20 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 67   if( !sqlite3Pag
34230 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72  erOkToChangeJour
34240 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20  nalMode(pPager) 
34250 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a  ) eNew = eOld;..
34260 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34270 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e  MIT_WAL.  zFilen
34280 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ame = sqlite3Pag
34290 65 72 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65  erFilename(pPage
342a0 72 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  r, 1);..  /* Do 
342b0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e  not allow a tran
342c0 73 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61  sition to journa
342d0 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61  l_mode=WAL for a
342e0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
342f0 6e 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  n temporary stor
34300 61 67 65 20 6f 72 20 69 66 20 74 68 65 20 56 46  age or if the VF
34310 53 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  S does not suppo
34320 72 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  rt shared memory
34330 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65   .  */.  if( eNe
34340 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34350 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28  MODE_WAL.   && (
34360 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34370 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20  zFilename)==0   
34380 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
34390 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c  file */.       |
343a0 7c 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57  | !sqlite3PagerW
343b0 61 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67  alSupported(pPag
343c0 65 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61  er))   /* No sha
343d0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f  red-memory suppo
343e0 72 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65  rt */.  ){.    e
343f0 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a  New = eOld;.  }.
34400 0a 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f  .  if( (eNew!=eO
34410 6c 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d  ld).   && (eOld=
34420 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34430 44 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d  DE_WAL || eNew==
34440 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34450 45 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20  E_WAL).  ){.    
34460 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
34470 6d 69 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65  mit || db->nVdbe
34480 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  Read>1 ){.      
34490 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
344a0 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
344b0 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20  VdbeError(p,.   
344c0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
344d0 68 61 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64  hange %s wal mod
344e0 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  e from within a 
344f0 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20  transaction",.  
34500 20 20 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50          (eNew==P
34510 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34520 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20  _WAL ? "into" : 
34530 22 6f 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20  "out of").      
34540 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  );.      goto ab
34550 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
34560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20  ;.    }else{. . 
34570 20 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50       if( eOld==P
34580 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34590 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
345a0 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41  /* If leaving WA
345b0 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68  L mode, close th
345c0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
345d0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63  uccessful, the c
345e0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  all.        ** t
345f0 6f 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28  o PagerCloseWal(
34600 29 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e  ) checkpoints an
34610 64 20 64 65 6c 65 74 65 73 20 74 68 65 20 77 72  d deletes the wr
34620 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20  ite-ahead-log . 
34630 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20         ** file. 
34640 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
34650 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68  k may still be h
34660 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
34670 61 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20  ase file .      
34680 20 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63    ** after a suc
34690 63 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20  cessful return. 
346a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
346b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
346c0 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50  PagerCloseWal(pP
346d0 61 67 65 72 2c 20 64 62 29 3b 0a 20 20 20 20 20  ager, db);.     
346e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
346f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34700 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
34710 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
34720 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20  ger, eNew);.    
34730 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
34740 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45  e if( eOld==PAGE
34750 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
34760 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
34770 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69  /* Cannot transi
34780 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72  tion directly fr
34790 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c  om MEMORY to WAL
347a0 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a  .  Use mode OFF.
347b0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e          ** as an
347c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f   intermediate */
347d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
347e0 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d  PagerSetJournalM
347f0 6f 64 65 28 70 50 61 67 65 72 2c 20 50 41 47 45  ode(pPager, PAGE
34800 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
34810 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  F);.      }.  . 
34820 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74       /* Open a t
34830 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
34840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34850 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
34860 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
34870 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74   ** mode, this t
34880 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79  ransaction alway
34890 73 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  s uses a rollbac
348a0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  k journal..     
348b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
348c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
348d0 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20  InTrans(pBt)==0 
348e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
348f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34900 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34910 65 33 42 74 72 65 65 53 65 74 56 65 72 73 69 6f  e3BtreeSetVersio
34920 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41  n(pBt, (eNew==PA
34930 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34940 57 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20  WAL ? 2 : 1));. 
34950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
34960 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
34970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
34980 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29  L */..  if( rc )
34990 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20   eNew = eOld;.  
349a0 65 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61  eNew = sqlite3Pa
349b0 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
349c0 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b  e(pPager, eNew);
349d0 0a 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ..  pOut->flags 
349e0 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74  = MEM_Str|MEM_St
349f0 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  atic|MEM_Term;. 
34a00 20 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72   pOut->z = (char
34a10 20 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   *)sqlite3Journa
34a20 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b  lModename(eNew);
34a30 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c  .  pOut->n = sql
34a40 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75  ite3Strlen30(pOu
34a50 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65  t->z);.  pOut->e
34a60 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
34a70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
34a80 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f  hangeEncoding(pO
34a90 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  ut, encoding);. 
34aa0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
34ab0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
34ac0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23  r;.  break;.};.#
34ad0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
34ae0 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a  OMIT_PRAGMA */..
34af0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
34b00 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
34b10 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
34b20 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29  ITE_OMIT_ATTACH)
34b30 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75  ./* Opcode: Vacu
34b40 75 6d 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  um P1 * * * *.**
34b50 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65  .** Vacuum the e
34b60 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 50  ntire database P
34b70 31 2e 20 20 50 31 20 69 73 20 30 20 66 6f 72 20  1.  P1 is 0 for 
34b80 22 6d 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72  "main", and 2 or
34b90 20 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20   more.** for an 
34ba0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
34bb0 65 2e 20 20 54 68 65 20 22 74 65 6d 70 22 20 64  e.  The "temp" d
34bc0 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
34bd0 62 65 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a  be vacuumed..*/.
34be0 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20  case OP_Vacuum: 
34bf0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
34c00 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
34c10 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56  rc = sqlite3RunV
34c20 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73  acuum(&p->zErrMs
34c30 67 2c 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  g, db, pOp->p1);
34c40 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
34c50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
34c60 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
34c70 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
34c80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
34c90 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20  _AUTOVACUUM)./* 
34ca0 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75  Opcode: IncrVacu
34cb0 75 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  um P1 P2 * * *.*
34cc0 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
34cd0 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68  ingle step of th
34ce0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
34cf0 63 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f  cuum procedure o
34d00 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61  n.** the P1 data
34d10 62 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63  base. If the vac
34d20 75 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64  uum has finished
34d30 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  , jump to instru
34d40 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68  ction.** P2. Oth
34d50 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
34d60 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
34d70 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
34d80 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63  .case OP_IncrVac
34d90 75 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  uum: {        /*
34da0 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65   jump */.  Btree
34db0 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74   *pBt;..  assert
34dc0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
34dd0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
34de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
34df0 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
34e00 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29  Mask, pOp->p1) )
34e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
34e20 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
34e30 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  pBt = db->aDb[pO
34e40 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63  p->p1].pBt;.  rc
34e50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
34e60 6e 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a  ncrVacuum(pBt);.
34e70 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
34e80 6e 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  n(rc==SQLITE_DON
34e90 45 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  E,2);.  if( rc )
34ea0 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  {.    if( rc!=SQ
34eb0 4c 49 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f  LITE_DONE ) goto
34ec0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
34ed0 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ror;.    rc = SQ
34ee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
34ef0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
34f00 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
34f10 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
34f20 45 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20  Expire P1 * * * 
34f30 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72  *.**.** Cause pr
34f40 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
34f50 65 6e 74 73 20 74 6f 20 65 78 70 69 72 65 2e 20  ents to expire. 
34f60 20 57 68 65 6e 20 61 6e 20 65 78 70 69 72 65 64   When an expired
34f70 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73   statement.** is
34f80 20 65 78 65 63 75 74 65 64 20 75 73 69 6e 67 20   executed using 
34f90 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69  sqlite3_step() i
34fa0 74 20 77 69 6c 6c 20 65 69 74 68 65 72 20 61 75  t will either au
34fb0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72  tomatically.** r
34fc0 65 70 72 65 70 61 72 65 20 69 74 73 65 6c 66 20  eprepare itself 
34fd0 28 69 66 20 69 74 20 77 61 73 20 6f 72 69 67 69  (if it was origi
34fe0 6e 61 6c 6c 79 20 63 72 65 61 74 65 64 20 75 73  nally created us
34ff0 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ing sqlite3_prep
35000 61 72 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20  are_v2()).** or 
35010 69 74 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  it will fail wit
35020 68 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e  h SQLITE_SCHEMA.
35030 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73  .** .** If P1 is
35040 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c   0, then all SQL
35050 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f   statements beco
35060 6d 65 20 65 78 70 69 72 65 64 2e 20 49 66 20 50  me expired. If P
35070 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  1 is non-zero,.*
35080 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  * then only the 
35090 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74  currently execut
350a0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ing statement is
350b0 20 65 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73   expired..*/.cas
350c0 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20  e OP_Expire: {. 
350d0 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b   if( !pOp->p1 ){
350e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
350f0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
35100 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73  ents(db);.  }els
35110 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  e{.    p->expire
35120 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  d = 1;.  }.  bre
35130 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
35140 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
35150 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64  D_CACHE./* Opcod
35160 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20  e: TableLock P1 
35170 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
35180 6e 6f 70 73 69 73 3a 20 69 44 62 3d 50 31 20 72  nopsis: iDb=P1 r
35190 6f 6f 74 3d 50 32 20 77 72 69 74 65 3d 50 33 0a  oot=P2 write=P3.
351a0 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c  **.** Obtain a l
351b0 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75  ock on a particu
351c0 6c 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20  lar table. This 
351d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f  instruction is o
351e0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  nly used when.**
351f0 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
35200 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61  e feature is ena
35210 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20  bled. .**.** P1 
35220 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
35230 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
35240 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66  sqlite3.aDb[] of
35250 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
35260 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f   on which the lo
35270 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ck is acquired. 
35280 20 41 20 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f   A readlock is o
35290 62 74 61 69 6e 65 64 20 69 66 20 50 33 3d 3d 30  btained if P3==0
352a0 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c   or.** a write l
352b0 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a  ock if P3==1..**
352c0 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73 20  .** P2 contains 
352d0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
352e0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f   the table to lo
352f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e  ck..**.** P4 con
35300 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
35310 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  to the name of t
35320 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6c  he table being l
35330 6f 63 6b 65 64 2e 20 54 68 69 73 20 69 73 20 6f  ocked. This is o
35340 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67  nly.** used to g
35350 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72  enerate an error
35360 20 6d 65 73 73 61 67 65 20 69 66 20 74 68 65 20   message if the 
35370 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
35380 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65  btained..*/.case
35390 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b   OP_TableLock: {
353a0 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
353b0 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b  k = (u8)pOp->p3;
353c0 0a 20 20 69 66 28 20 69 73 57 72 69 74 65 4c 6f  .  if( isWriteLo
353d0 63 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c  ck || 0==(db->fl
353e0 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
353f0 6e 63 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a 20  ncommitted) ){. 
35400 20 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d     int p1 = pOp-
35410 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72 74  >p1; .    assert
35420 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64 62  ( p1>=0 && p1<db
35430 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
35440 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
35450 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 31  p->btreeMask, p1
35460 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
35470 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20   isWriteLock==0 
35480 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  || isWriteLock==
35490 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
354a0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
354b0 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e  ble(db->aDb[p1].
354c0 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73  pBt, pOp->p2, is
354d0 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
354e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
354f0 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  if( (rc&0xFF)==S
35500 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
35510 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
35520 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
35530 7a 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  z;.        sqlit
35540 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
35550 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
35560 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a  s locked: %s", z
35570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35580 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
35590 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
355a0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
355b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
355c0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
355d0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
355e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
355f0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
35600 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50  : VBegin * * * P
35610 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79  4 *.**.** P4 may
35620 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
35630 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
35640 20 73 74 72 75 63 74 75 72 65 2e 20 49 66 20 73   structure. If s
35650 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20  o, call the .** 
35660 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f  xBegin method fo
35670 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a  r that table..**
35680 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65  .** Also, whethe
35690 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73  r or not P4 is s
356a0 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  et, check that t
356b0 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  his is not being
356c0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20   called from.** 
356d0 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63  within a callbac
356e0 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  k to a virtual t
356f0 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74  able xSync() met
35700 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74  hod. If it is, t
35710 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
35720 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
35730 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
35740 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e  /.case OP_VBegin
35750 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56  : {.  VTable *pV
35760 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70  Tab;.  pVTab = p
35770 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20  Op->p4.pVtab;.  
35780 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
35790 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29  Begin(db, pVTab)
357a0 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20 29 20  ;.  if( pVTab ) 
357b0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
357c0 74 45 72 72 6d 73 67 28 70 2c 20 70 56 54 61 62  tErrmsg(p, pVTab
357d0 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  ->pVtab);.  if( 
357e0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
357f0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
35800 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
35810 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
35820 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
35830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35840 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35850 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65  ./* Opcode: VCre
35860 61 74 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ate P1 P2 * * *.
35870 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 61 20 72 65  **.** P2 is a re
35880 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
35890 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
358a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
358b0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 50 31   database .** P1
358c0 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61  . Call the xCrea
358d0 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  te method for th
358e0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
358f0 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a  e OP_VCreate: {.
35900 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20    Mem sMem;     
35910 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72       /* For stor
35920 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62  ing the record b
35930 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
35940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
35950 61 62 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ab;  /* Name of 
35960 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
35970 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26  e */..  memset(&
35980 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sMem, 0, sizeof(
35990 73 4d 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e 64  sMem));.  sMem.d
359a0 62 20 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65 63  b = db;.  /* Bec
359b0 61 75 73 65 20 50 32 20 69 73 20 61 6c 77 61 79  ause P2 is alway
359c0 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
359d0 67 2c 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  g, it is impossi
359e0 62 6c 65 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ble for the.  **
359f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
35a00 6f 70 79 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f  opy() to fail */
35a10 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d  .  assert( (aMem
35a20 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20  [pOp->p2].flags 
35a30 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29 3b  & MEM_Str)!=0 );
35a40 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d  .  assert( (aMem
35a50 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20  [pOp->p2].flags 
35a60 26 20 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d 30  & MEM_Static)!=0
35a70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
35a80 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 26 73  e3VdbeMemCopy(&s
35a90 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Mem, &aMem[pOp->
35aa0 70 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p2]);.  assert( 
35ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
35ac0 0a 20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74  .  zTab = (const
35ad0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
35ae0 61 6c 75 65 5f 74 65 78 74 28 26 73 4d 65 6d 29  alue_text(&sMem)
35af0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
35b00 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
35b10 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 54  iled );.  if( zT
35b20 61 62 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ab ){.    rc = s
35b30 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72  qlite3VtabCallCr
35b40 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31  eate(db, pOp->p1
35b50 2c 20 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72 72  , zTab, &p->zErr
35b60 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
35b70 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
35b80 65 28 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28 20  e(&sMem);.  if( 
35b90 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
35ba0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
35bb0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
35bc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
35bd0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
35be0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35bf0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35c00 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73  ./* Opcode: VDes
35c10 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a  troy P1 * * P4 *
35c20 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65  .**.** P4 is the
35c30 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75   name of a virtu
35c40 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  al table in data
35c50 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74  base P1.  Call t
35c60 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68  he xDestroy meth
35c70 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  od.** of that ta
35c80 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
35c90 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64 62  VDestroy: {.  db
35ca0 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a 20  ->nVDestroy++;. 
35cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
35cc0 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c  bCallDestroy(db,
35cd0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
35ce0 34 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44 65  4.z);.  db->nVDe
35cf0 73 74 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20 72  stroy--;.  if( r
35d00 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
35d10 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
35d20 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
35d30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
35d40 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
35d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35d60 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
35d70 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e  /* Opcode: VOpen
35d80 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
35d90 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
35da0 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
35db0 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
35dc0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
35dd0 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69  ructure..** P1 i
35de0 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
35df0 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  r.  This opcode 
35e00 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74  opens a cursor t
35e10 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  o the virtual.**
35e20 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65   table and store
35e30 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e  s that cursor in
35e40 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
35e50 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43  VOpen: {.  VdbeC
35e60 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73  ursor *pCur;.  s
35e70 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
35e80 6f 72 20 2a 70 56 43 75 72 3b 0a 20 20 73 71 6c  or *pVCur;.  sql
35e90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
35ea0 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
35eb0 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
35ec0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e;..  assert( p-
35ed0 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20  >bIsReader );.  
35ee0 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 43 75  pCur = 0;.  pVCu
35ef0 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d  r = 0;.  pVtab =
35f00 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
35f10 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56 74  pVtab;.  if( pVt
35f20 61 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70  ab==0 || NEVER(p
35f30 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30  Vtab->pModule==0
35f40 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
35f50 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
35f60 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
35f70 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to_error;.  }.  
35f80 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
35f90 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20 3d  >pModule;.  rc =
35fa0 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28   pModule->xOpen(
35fb0 70 56 74 61 62 2c 20 26 70 56 43 75 72 29 3b 0a  pVtab, &pVCur);.
35fc0 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
35fd0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
35fe0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
35ff0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
36000 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  o_error;..  /* I
36010 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65  nitialize sqlite
36020 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
36030 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70 56  se class */.  pV
36040 43 75 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74  Cur->pVtab = pVt
36050 61 62 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  ab;..  /* Initia
36060 6c 69 7a 65 20 76 64 62 65 20 63 75 72 73 6f 72  lize vdbe cursor
36070 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43 75   object */.  pCu
36080 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  r = allocateCurs
36090 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  or(p, pOp->p1, 0
360a0 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 56 54  , -1, CURTYPE_VT
360b0 41 42 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20  AB);.  if( pCur 
360c0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 75 63 2e  ){.    pCur->uc.
360d0 70 56 43 75 72 20 3d 20 70 56 43 75 72 3b 0a 20  pVCur = pVCur;. 
360e0 20 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b 2b     pVtab->nRef++
360f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
36100 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
36110 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
36120 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
36130 56 43 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20  VCur);.    goto 
36140 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72  no_mem;.  }.  br
36150 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
36160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36170 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
36180 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36190 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
361a0 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65  * Opcode: VFilte
361b0 72 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  r P1 P2 P3 P4 *.
361c0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 70 6c  ** Synopsis: ipl
361d0 61 6e 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d 27  an=r[P3] zplan='
361e0 50 34 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P4'.**.** P1 is 
361f0 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
36200 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32  using VOpen.  P2
36210 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 74   is an address t
36220 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20  o jump to if.** 
36230 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65 73  the filtered res
36240 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74 79  ult set is empty
36250 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69  ..**.** P4 is ei
36260 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73  ther NULL or a s
36270 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20 67  tring that was g
36280 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
36290 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65  xBestIndex.** me
362a0 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75  thod of the modu
362b0 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72  le.  The interpr
362c0 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  etation of the P
362d0 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74  4 string is left
362e0 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c  .** to the modul
362f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
36300 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
36310 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
36320 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f  xFilter method o
36330 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
36340 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ble specified.**
36350 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74   by P1.  The int
36360 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20  eger query plan 
36370 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69  parameter to xFi
36380 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 69  lter is stored i
36390 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33  n register.** P3
363a0 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31 20  . Register P3+1 
363b0 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63 20  stores the argc 
363c0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20  parameter to be 
363d0 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a  passed to the.**
363e0 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
363f0 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e   Registers P3+2.
36400 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74  .P3+1+argc are t
36410 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74  he argc.** addit
36420 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73  ional parameters
36430 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73 65   which are passe
36440 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20  d to.** xFilter 
36450 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74 65  as argv. Registe
36460 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61  r P3+2 becomes a
36470 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73  rgv[0] when pass
36480 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a  ed to xFilter..*
36490 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d  *.** A jump is m
364a0 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68 65  ade to P2 if the
364b0 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74 65   result set afte
364c0 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c  r filtering woul
364d0 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63  d be empty..*/.c
364e0 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
364f0 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20  {   /* jump */. 
36500 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
36510 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74   iQuery;.  const
36520 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
36530 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20  *pModule;.  Mem 
36540 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a  *pQuery;.  Mem *
36550 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33  pArgc;.  sqlite3
36560 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
36570 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
36580 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64  tab *pVtab;.  Vd
36590 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
365a0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74    int res;.  int
365b0 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72   i;.  Mem **apAr
365c0 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26  g;..  pQuery = &
365d0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
365e0 20 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79   pArgc = &pQuery
365f0 5b 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d  [1];.  pCur = p-
36600 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
36610 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
36620 56 61 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b  Valid(pQuery) );
36630 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
36640 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72  E(pOp->p3, pQuer
36650 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  y);.  assert( pC
36660 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  ur->eCurType==CU
36670 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20  RTYPE_VTAB );.  
36680 70 56 43 75 72 20 3d 20 70 43 75 72 2d 3e 75 63  pVCur = pCur->uc
36690 2e 70 56 43 75 72 3b 0a 20 20 70 56 74 61 62 20  .pVCur;.  pVtab 
366a0 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a  = pVCur->pVtab;.
366b0 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
366c0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f  b->pModule;..  /
366d0 2a 20 47 72 61 62 20 74 68 65 20 69 6e 64 65 78  * Grab the index
366e0 20 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63   number and argc
366f0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
36700 20 61 73 73 65 72 74 28 20 28 70 51 75 65 72 79   assert( (pQuery
36710 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29  ->flags&MEM_Int)
36720 21 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c  !=0 && pArgc->fl
36730 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
36740 20 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41    nArg = (int)pA
36750 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65  rgc->u.i;.  iQue
36760 72 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79  ry = (int)pQuery
36770 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76  ->u.i;..  /* Inv
36780 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20  oke the xFilter 
36790 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73 20  method */.  res 
367a0 3d 20 30 3b 0a 20 20 61 70 41 72 67 20 3d 20 70  = 0;.  apArg = p
367b0 2d 3e 61 70 41 72 67 3b 0a 20 20 66 6f 72 28 69  ->apArg;.  for(i
367c0 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b   = 0; i<nArg; i+
367d0 2b 29 7b 0a 20 20 20 20 61 70 41 72 67 5b 69 5d  +){.    apArg[i]
367e0 20 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a   = &pArgc[i+1];.
367f0 20 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75    }.  rc = pModu
36800 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 43 75  le->xFilter(pVCu
36810 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e  r, iQuery, pOp->
36820 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72  p4.z, nArg, apAr
36830 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  g);.  sqlite3Vta
36840 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c  bImportErrmsg(p,
36850 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72   pVtab);.  if( r
36860 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
36870 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72  ue_to_error;.  r
36880 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45  es = pModule->xE
36890 6f 66 28 70 56 43 75 72 29 3b 0a 20 20 70 43 75  of(pVCur);.  pCu
368a0 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  r->nullRow = 0;.
368b0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
368c0 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
368d0 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75  f( res ) goto ju
368e0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
368f0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
36900 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36910 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
36920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36930 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
36940 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20  Opcode: VColumn 
36950 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
36960 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
36970 76 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a 2a  vcolumn(P2).**.*
36980 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
36990 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63  e of the P2-th c
369a0 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
369b0 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74 75  row of the virtu
369c0 61 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68  al-table that th
369d0 65 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20  e .** P1 cursor 
369e0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  is pointing to i
369f0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e  nto register P3.
36a00 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c  .*/.case OP_VCol
36a10 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  umn: {.  sqlite3
36a20 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
36a30 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
36a40 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
36a50 20 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73   Mem *pDest;.  s
36a60 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73  qlite3_context s
36a70 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65  Context;..  Vdbe
36a80 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
36a90 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
36aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
36ab0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
36ac0 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  YPE_VTAB );.  as
36ad0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
36ae0 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  && pOp->p3<=(p->
36af0 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
36b00 73 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20  sor) );.  pDest 
36b10 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
36b20 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
36b30 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a  ange(p, pDest);.
36b40 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c    if( pCur->null
36b50 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Row ){.    sqlit
36b60 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
36b70 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
36b80 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
36b90 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72  = pCur->uc.pVCur
36ba0 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75  ->pVtab;.  pModu
36bb0 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  le = pVtab->pMod
36bc0 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ule;.  assert( p
36bd0 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20  Module->xColumn 
36be0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f  );.  memset(&sCo
36bf0 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66  ntext, 0, sizeof
36c00 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 73  (sContext));.  s
36c10 43 6f 6e 74 65 78 74 2e 70 4f 75 74 20 3d 20 70  Context.pOut = p
36c20 44 65 73 74 3b 0a 20 20 4d 65 6d 53 65 74 54 79  Dest;.  MemSetTy
36c30 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d 45  peFlag(pDest, ME
36c40 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 72 63 20 3d 20  M_Null);.  rc = 
36c50 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e  pModule->xColumn
36c60 28 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 2c  (pCur->uc.pVCur,
36c70 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d   &sContext, pOp-
36c80 3e 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2);.  sqlite3V
36c90 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
36ca0 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28  p, pVtab);.  if(
36cb0 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f   sContext.isErro
36cc0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 43  r ){.    rc = sC
36cd0 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a  ontext.isError;.
36ce0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
36cf0 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
36d00 70 44 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67 29  pDest, encoding)
36d10 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
36d20 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73  CE(pOp->p3, pDes
36d30 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
36d40 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29  _BLOBSIZE(pDest)
36d50 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
36d60 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44  VdbeMemTooBig(pD
36d70 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  est) ){.    goto
36d80 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
36d90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
36da0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
36db0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
36dc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
36dd0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
36de0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
36df0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
36e00 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
36e10 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20  VNext P1 P2 * * 
36e20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  *.**.** Advance 
36e30 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50 31  virtual table P1
36e40 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
36e50 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20 73   in its result s
36e60 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74  et and.** jump t
36e70 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
36e80 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76 69  .  Or, if the vi
36e90 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73 20  rtual table has 
36ea0 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20 65  reached.** the e
36eb0 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c 74  nd of its result
36ec0 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20   set, then fall 
36ed0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
36ee0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
36ef0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65 78  .*/.case OP_VNex
36f00 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  t: {   /* jump *
36f10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  /.  sqlite3_vtab
36f20 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
36f30 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
36f40 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20  *pModule;.  int 
36f50 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  res;.  VdbeCurso
36f60 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73 20  r *pCur;..  res 
36f70 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d  = 0;.  pCur = p-
36f80 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
36f90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
36fa0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
36fb0 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28  PE_VTAB );.  if(
36fc0 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29   pCur->nullRow )
36fd0 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  {.    break;.  }
36fe0 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d  .  pVtab = pCur-
36ff0 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61 62  >uc.pVCur->pVtab
37000 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56  ;.  pModule = pV
37010 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
37020 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d  assert( pModule-
37030 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20  >xNext );..  /* 
37040 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74  Invoke the xNext
37050 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
37060 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69   module. There i
37070 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65  s no way for the
37080 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  .  ** underlying
37090 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
370a0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
370b0 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73  or if one occurs
370c0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65   during.  ** xNe
370d0 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69  xt(). Instead, i
370e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
370f0 73 2c 20 74 72 75 65 20 69 73 20 72 65 74 75 72  s, true is retur
37100 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20  ned (indicating 
37110 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20  that .  ** data 
37120 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e  is available) an
37130 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
37140 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78   returned when x
37150 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73  Column or.  ** s
37160 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64  ome other method
37170 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64   is next invoked
37180 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69 72   on the save vir
37190 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
371a0 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  r..  */.  rc = p
371b0 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43  Module->xNext(pC
371c0 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20  ur->uc.pVCur);. 
371d0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
371e0 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
371f0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
37200 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
37210 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20  _error;.  res = 
37220 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 43  pModule->xEof(pC
37230 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20  ur->uc.pVCur);. 
37240 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
37250 28 21 72 65 73 2c 32 29 3b 0a 20 20 69 66 28 20  (!res,2);.  if( 
37260 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  !res ){.    /* I
37270 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 2c  f there is data,
37280 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
37290 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
372a0 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72  p2_and_check_for
372b0 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a  _interrupt;.  }.
372c0 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72    goto check_for
372d0 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23 65  _interrupt;.}.#e
372e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
372f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37300 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37310 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37320 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
37330 20 56 52 65 6e 61 6d 65 20 50 31 20 2a 20 2a 20   VRename P1 * * 
37340 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
37350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37360 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
37370 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33  ject, an sqlite3
37380 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
37390 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
373a0 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72  invokes the corr
373b0 65 73 70 6f 6e 64 69 6e 67 20 78 52 65 6e 61 6d  esponding xRenam
373c0 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 76 61  e method. The va
373d0 6c 75 65 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  lue.** in regist
373e0 65 72 20 50 31 20 69 73 20 70 61 73 73 65 64 20  er P1 is passed 
373f0 61 73 20 74 68 65 20 7a 4e 61 6d 65 20 61 72 67  as the zName arg
37400 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 78 52 65  ument to the xRe
37410 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  name method..*/.
37420 63 61 73 65 20 4f 50 5f 56 52 65 6e 61 6d 65 3a  case OP_VRename:
37430 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
37440 62 20 2a 70 56 74 61 62 3b 0a 20 20 4d 65 6d 20  b *pVtab;.  Mem 
37450 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70 56 74 61 62  *pName;..  pVtab
37460 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
37470 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4e 61 6d 65  ->pVtab;.  pName
37480 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
37490 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 74  ];.  assert( pVt
374a0 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65  ab->pModule->xRe
374b0 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  name );.  assert
374c0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4e 61  ( memIsValid(pNa
374d0 6d 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  me) );.  assert(
374e0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
374f0 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
37500 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61  ACE(pOp->p1, pNa
37510 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  me);.  assert( p
37520 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Name->flags & ME
37530 4d 5f 53 74 72 20 29 3b 0a 20 20 74 65 73 74 63  M_Str );.  testc
37540 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d  ase( pName->enc=
37550 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
37560 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 61 6d    testcase( pNam
37570 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  e->enc==SQLITE_U
37580 54 46 31 36 42 45 20 29 3b 0a 20 20 74 65 73 74  TF16BE );.  test
37590 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63  case( pName->enc
375a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
375b0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
375c0 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
375d0 64 69 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c 49  ding(pName, SQLI
375e0 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
375f0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
37600 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
37610 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
37620 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56 74  ule->xRename(pVt
37630 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20  ab, pName->z);. 
37640 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
37650 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
37660 62 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64  b);.  p->expired
37670 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20 29   = 0;.  if( rc )
37680 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
37690 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
376a0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  k;.}.#endif..#if
376b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
376c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
376d0 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74 65   Opcode: VUpdate
376e0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
376f0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 64 61 74  ** Synopsis: dat
37700 61 3d 72 5b 50 33 40 50 32 5d 0a 2a 2a 0a 2a 2a  a=r[P3@P2].**.**
37710 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
37720 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
37730 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
37740 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
37750 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f  cture..** This o
37760 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68  pcode invokes th
37770 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
37780 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20  xUpdate method. 
37790 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  P2 values.** are
377a0 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f   contiguous memo
377b0 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e  ry cells startin
377c0 67 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20  g at P3 to pass 
377d0 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a  to the xUpdate .
377e0 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54  ** invocation. T
377f0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
37800 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63  ster (P3+P2-1) c
37810 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
37820 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65  e .** p2th eleme
37830 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61  nt of the argv a
37840 72 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78  rray passed to x
37850 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  Update..**.** Th
37860 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
37870 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54   will do a DELET
37880 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f  E or an INSERT o
37890 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61  r both..** The a
378a0 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28  rgv[0] element (
378b0 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64  which correspond
378c0 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  s to memory cell
378d0 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72   P3).** is the r
378e0 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f  owid of a row to
378f0 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67   delete.  If arg
37900 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65  v[0] is NULL the
37910 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f  n no .** deletio
37920 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61  n occurs.  The a
37930 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69  rgv[1] element i
37940 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  s the rowid of t
37950 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20  he new .** row. 
37960 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c   This can be NUL
37970 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69  L to have the vi
37980 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65  rtual table sele
37990 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72  ct the new .** r
379a0 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e  owid for itself.
379b0 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
379c0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
379d0 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74   array are .** t
379e0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c  he values of col
379f0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20  umns in the new 
37a00 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32  row..**.** If P2
37a10 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65  ==1 then no inse
37a20 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  rt is performed.
37a30 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65    argv[0] is the
37a40 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72   rowid of.** a r
37a50 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a  ow to delete..**
37a60 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c  .** P1 is a bool
37a70 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20  ean flag. If it 
37a80 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
37a90 6e 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63  nd the xUpdate c
37aa0 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  all.** is succes
37ab0 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76  sful, then the v
37ac0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
37ad0 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
37ae0 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a  sert_rowid() .**
37af0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
37b00 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69  alue of the rowi
37b10 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75  d for the row ju
37b20 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  st inserted..**.
37b30 2a 2a 20 50 35 20 69 73 20 74 68 65 20 65 72 72  ** P5 is the err
37b40 6f 72 20 61 63 74 69 6f 6e 73 20 28 4f 45 5f 52  or actions (OE_R
37b50 65 70 6c 61 63 65 2c 20 4f 45 5f 46 61 69 6c 2c  eplace, OE_Fail,
37b60 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29   OE_Ignore, etc)
37b70 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 69 6e 20   to.** apply in 
37b80 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 63 6f  the case of a co
37b90 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72 65  nstraint failure
37ba0 20 6f 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f 72   on an insert or
37bb0 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65   update..*/.case
37bc0 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
37bd0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
37be0 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
37bf0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
37c00 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72  odule;.  int nAr
37c10 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  g;.  int i;.  sq
37c20 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
37c30 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b  ;.  Mem **apArg;
37c40 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61  .  Mem *pX;..  a
37c50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
37c60 31 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  1        || pOp-
37c70 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c  >p5==OE_Fail   |
37c80 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f  | pOp->p5==OE_Ro
37c90 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 7c  llback .       |
37ca0 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62  | pOp->p5==OE_Ab
37cb0 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ort || pOp->p5==
37cc0 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70  OE_Ignore || pOp
37cd0 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  ->p5==OE_Replace
37ce0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37cf0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
37d00 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
37d10 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
37d20 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30  ;.  if( pVtab==0
37d30 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d   || NEVER(pVtab-
37d40 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a  >pModule==0) ){.
37d50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
37d60 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f  LOCKED;.    goto
37d70 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
37d80 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75  ror;.  }.  pModu
37d90 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  le = pVtab->pMod
37da0 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f  ule;.  nArg = pO
37db0 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
37dc0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
37dd0 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41  _VTAB );.  if( A
37de0 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78  LWAYS(pModule->x
37df0 55 70 64 61 74 65 29 20 29 7b 0a 20 20 20 20 75  Update) ){.    u
37e00 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74  8 vtabOnConflict
37e10 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e   = db->vtabOnCon
37e20 66 6c 69 63 74 3b 0a 20 20 20 20 61 70 41 72 67  flict;.    apArg
37e30 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20   = p->apArg;.   
37e40 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d   pX = &aMem[pOp-
37e50 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >p3];.    for(i=
37e60 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
37e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
37e80 65 6d 49 73 56 61 6c 69 64 28 70 58 29 20 29 3b  emIsValid(pX) );
37e90 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  .      memAboutT
37ea0 6f 43 68 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a  oChange(p, pX);.
37eb0 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d        apArg[i] =
37ec0 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b   pX;.      pX++;
37ed0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 76  .    }.    db->v
37ee0 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20  tabOnConflict = 
37ef0 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63 20  pOp->p5;.    rc 
37f00 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61  = pModule->xUpda
37f10 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20  te(pVtab, nArg, 
37f20 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a  apArg, &rowid);.
37f30 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f      db->vtabOnCo
37f40 6e 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e 43  nflict = vtabOnC
37f50 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 73 71 6c  onflict;.    sql
37f60 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
37f70 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rmsg(p, pVtab);.
37f80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37f90 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31  TE_OK && pOp->p1
37fa0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
37fb0 28 20 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72  ( nArg>1 && apAr
37fc0 67 5b 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30  g[0] && (apArg[0
37fd0 5d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ]->flags&MEM_Nul
37fe0 6c 29 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  l) );.      db->
37ff0 6c 61 73 74 52 6f 77 69 64 20 3d 20 72 6f 77 69  lastRowid = rowi
38000 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
38010 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
38020 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
38030 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
38040 62 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  bConstraint ){. 
38050 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
38060 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
38070 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
38080 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
38090 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  se{.        p->e
380a0 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 28 70  rrorAction = ((p
380b0 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61  Op->p5==OE_Repla
380c0 63 65 29 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a  ce) ? OE_Abort :
380d0 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20   pOp->p5);.     
380e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
380f0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b      p->nChange++
38100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
38110 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
38120 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
38130 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
38140 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
38150 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
38160 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 20 53 51 4c  */..#ifndef  SQL
38170 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
38180 52 41 47 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65  RAGMAS./* Opcode
38190 3a 20 50 61 67 65 63 6f 75 6e 74 20 50 31 20 50  : Pagecount P1 P
381a0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  2 * * *.**.** Wr
381b0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
381c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
381d0 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 74  in database P1 t
381e0 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 32  o memory cell P2
381f0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 67  ..*/.case OP_Pag
38200 65 63 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20  ecount: {       
38210 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
38220 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
38230 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
38240 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73  .  pOut->u.i = s
38250 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
38260 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  age(db->aDb[pOp-
38270 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72 65  >p1].pBt);.  bre
38280 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ak;.}.#endif...#
38290 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f  ifndef  SQLITE_O
382a0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
382b0 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 78  S./* Opcode: Max
382c0 50 67 63 6e 74 20 50 31 20 50 32 20 50 33 20 2a  Pgcnt P1 P2 P3 *
382d0 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20   *.**.** Try to 
382e0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
382f0 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 64  page count for d
38300 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 74 68  atabase P1 to th
38310 65 20 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a 2a  e value in P3..*
38320 2a 20 44 6f 2