/ Hex Artifact Content
Login

Artifact 89a12451405a17c6e8d39b5826acb6999f1283e4e43d2e83a7ac7c9a7094a86a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43  ;.    }.    *(zC
3740: 73 72 2b 2b 29 20 3d 20 63 3b 0a 20 20 20 20 73  sr++) = c;.    s
3750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3760: 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22  100, zCsr, "%d["
3770: 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  , pMem->n);.    
3780: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3790: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
37a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36     for(i=0; i<16
37b0: 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69   && i<pMem->n; i
37c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
37d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
37e0: 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28   zCsr, "%02X", (
37f0: 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20  (int)pMem->z[i] 
3800: 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20  & 0xFF));.      
3810: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3820: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3830: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3840: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
3850: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
3860: 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e   char z = pMem->
3870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[i];.      if( 
3880: 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20  z<32 || z>126 ) 
3890: 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20  *zCsr++ = '.';. 
38a0: 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b       else *zCsr+
38b0: 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  + = z;.    }.   
38c0: 20 2a 28 7a 43 73 72 2b 2b 29 20 3d 20 27 5d 27   *(zCsr++) = ']'
38d0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
38e0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
38f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3900: 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a  (100, zCsr,"+%dz
3910: 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29  ",pMem->u.nZero)
3920: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3940: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
3950: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
3960: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
3970: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
3980: 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66  t j, k;.    zBuf
3990: 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [0] = ' ';.    i
39a0: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29  f( f & MEM_Dyn )
39b0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
39c0: 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'z';.      ass
39d0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
39e0: 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29  tatic|MEM_Ephem)
39f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3a00: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3a10: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42  atic ){.      zB
3a20: 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20  uf[1] = 't';.   
3a30: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3a40: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
3a50: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
3a60: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3a70: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
3a80: 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20  zBuf[1] = 'e';. 
3a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
3aa0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
3ab0: 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Dyn))==0 );.  
3ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3ad0: 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20  Buf[1] = 's';.  
3ae0: 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20    }.    k = 2;. 
3af0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3b00: 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b  ntf(100, &zBuf[k
3b10: 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e  ], "%d", pMem->n
3b20: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3b30: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3b40: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3b50: 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  k++] = '[';.    
3b60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26  for(j=0; j<15 &&
3b70: 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29   j<pMem->n; j++)
3b80: 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20 70  {.      u8 c = p
3b90: 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20  Mem->z[j];.     
3ba0: 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20   if( c>=0x20 && 
3bb0: 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20  c<0x7f ){.      
3bc0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b    zBuf[k++] = c;
3bd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3be0: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
3bf0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = '.';.      }. 
3c00: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b     }.    zBuf[k+
3c10: 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71  +] = ']';.    sq
3c20: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
3c30: 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63  00,&zBuf[k], enc
3c40: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3c50: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3c60: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3c70: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3c80: 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  k++] = 0;.  }.}.
3c90: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
3ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3cb0: 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75  * Print the valu
3cc0: 65 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  e of a register 
3cd0: 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72 70  for tracing purp
3ce0: 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  oses:.*/.static 
3cf0: 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69  void memTracePri
3d00: 6e 74 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66  nt(Mem *p){.  if
3d10: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3d20: 5f 55 6e 64 65 66 69 6e 65 64 20 29 7b 0a 20 20  _Undefined ){.  
3d30: 20 20 70 72 69 6e 74 66 28 22 20 75 6e 64 65 66    printf(" undef
3d40: 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ined");.  }else 
3d50: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3d60: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
3d70: 72 69 6e 74 66 28 22 20 4e 55 4c 4c 22 29 3b 0a  rintf(" NULL");.
3d80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
3d90: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
3da0: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d  |MEM_Str))==(MEM
3db0: 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b  _Int|MEM_Str) ){
3dc0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 73 69  .    printf(" si
3dd0: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
3de0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3df0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
3e00: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
3e10: 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29  i:%lld", p->u.i)
3e20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3e30: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
3e40: 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28  OINT.  }else if(
3e50: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
3e60: 52 65 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e  Real ){.    prin
3e70: 74 66 28 22 20 72 3a 25 67 22 2c 20 70 2d 3e 75  tf(" r:%g", p->u
3e80: 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  .r);.#endif.  }e
3e90: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ea0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b   & MEM_RowSet ){
3eb0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 28 72  .    printf(" (r
3ec0: 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73  owset)");.  }els
3ed0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
3ee0: 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
3ef0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
3f00: 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20  rint(p, zBuf);. 
3f10: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
3f20: 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66   zBuf);.  }.  if
3f30: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3f40: 5f 53 75 62 74 79 70 65 20 29 20 70 72 69 6e 74  _Subtype ) print
3f50: 66 28 22 20 73 75 62 74 79 70 65 3d 30 78 25 30  f(" subtype=0x%0
3f60: 32 78 22 2c 20 70 2d 3e 65 53 75 62 74 79 70 65  2x", p->eSubtype
3f70: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3f80: 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 69   registerTrace(i
3f90: 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29  nt iReg, Mem *p)
3fa0: 7b 0a 20 20 70 72 69 6e 74 66 28 22 52 45 47 5b  {.  printf("REG[
3fb0: 25 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a  %d] = ", iReg);.
3fc0: 20 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28    memTracePrint(
3fd0: 70 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  p);.  printf("\n
3fe0: 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ");.}.#endif..#i
3ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4000: 47 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  G.#  define REGI
4010: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20  STER_TRACE(R,M) 
4020: 69 66 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  if(db->flags&SQL
4030: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 72 65  ITE_VdbeTrace)re
4040: 67 69 73 74 65 72 54 72 61 63 65 28 52 2c 4d 29  gisterTrace(R,M)
4050: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4060: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
4070: 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  R,M).#endif...#i
4080: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4090: 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d 65  E../* .** hwtime
40a0: 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c 69  .h contains inli
40b0: 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f 64  ne assembler cod
40c0: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
40d0: 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72 66  ng .** high-perf
40e0: 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20 72  ormance timing r
40f0: 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63  outines..*/.#inc
4100: 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22 0a  lude "hwtime.h".
4110: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4120: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
4130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
4140: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
4150: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
4160: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
4170: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
4180: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
4190: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
41a0: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
41b0: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
41c0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
41d0: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
41e0: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
41f0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
4200: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
4210: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
4220: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
4240: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
4250: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
4260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4270: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
4280: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4290: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
42a0: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
42b0: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
42c0: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
42d0: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
42e0: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
42f0: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
4300: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
4310: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
4320: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4330: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
4340: 69 73 74 65 72 20 6f 66 20 70 4f 70 2d 3e 70 32  ister of pOp->p2
4350: 20 61 66 74 65 72 20 66 69 72 73 74 20 70 72 65   after first pre
4360: 70 61 72 69 6e 67 20 69 74 20 74 6f 20 62 65 0a  paring it to be.
4370: 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
4380: 69 74 68 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ith an integer v
4390: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
43a0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
43b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
43c0: 61 73 65 57 69 74 68 43 6c 65 61 72 28 4d 65 6d  aseWithClear(Mem
43d0: 20 2a 70 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74   *pOut){.  sqlit
43e0: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
43f0: 28 70 4f 75 74 29 3b 0a 20 20 70 4f 75 74 2d 3e  (pOut);.  pOut->
4400: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4410: 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a  .  return pOut;.
4420: 7d 0a 73 74 61 74 69 63 20 4d 65 6d 20 2a 6f 75  }.static Mem *ou
4430: 74 32 50 72 65 72 65 6c 65 61 73 65 28 56 64 62  t2Prerelease(Vdb
4440: 65 20 2a 70 2c 20 56 64 62 65 4f 70 20 2a 70 4f  e *p, VdbeOp *pO
4450: 70 29 7b 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 3b  p){.  Mem *pOut;
4460: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
4470: 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p2>0 );.  assert
4480: 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  ( pOp->p2<=(p->n
4490: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
44a0: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
44b0: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
44c0: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
44d0: 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
44e0: 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e    if( VdbeMemDyn
44f0: 61 6d 69 63 28 70 4f 75 74 29 20 29 7b 20 2f 2a  amic(pOut) ){ /*
4500: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
4510: 46 41 4c 53 45 2a 2f 0a 20 20 20 20 72 65 74 75  FALSE*/.    retu
4520: 72 6e 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73  rn out2Prereleas
4530: 65 57 69 74 68 43 6c 65 61 72 28 70 4f 75 74 29  eWithClear(pOut)
4540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4550: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
4560: 5f 49 6e 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  _Int;.    return
4570: 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   pOut;.  }.}.../
4580: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 73 20  *.** Execute as 
4590: 6d 75 63 68 20 6f 66 20 61 20 56 44 42 45 20 70  much of a VDBE p
45a0: 72 6f 67 72 61 6d 20 61 73 20 77 65 20 63 61 6e  rogram as we can
45b0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  ..** This is the
45c0: 20 63 6f 72 65 20 6f 66 20 73 71 6c 69 74 65 33   core of sqlite3
45d0: 5f 73 74 65 70 28 29 2e 20 20 0a 2a 2f 0a 69 6e  _step().  .*/.in
45e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  t sqlite3VdbeExe
45f0: 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  c(.  Vdbe *p    
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
4620: 7b 0a 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  {.  Op *aOp = p-
4630: 3e 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  >aOp;          /
4640: 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f 70  * Copy of p->aOp
4650: 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20   */.  Op *pOp = 
4660: 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  aOp;            
4670: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72   /* Current oper
4680: 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 64 65 66  ation */.#if def
4690: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
46a0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
46b0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 4f 70  BE_PROFILE).  Op
46c0: 20 2a 70 4f 72 69 67 4f 70 3b 20 20 20 20 20 20   *pOrigOp;      
46d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
46e0: 65 20 6f 66 20 70 4f 70 20 61 74 20 74 68 65 20  e of pOp at the 
46f0: 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
4700: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
4710: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4720: 69 6e 74 20 6e 45 78 74 72 61 44 65 6c 65 74 65  int nExtraDelete
4730: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 56 65   = 0;      /* Ve
4740: 72 69 66 69 65 73 20 46 4f 52 44 45 4c 45 54 45  rifies FORDELETE
4750: 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45 20 66   and AUXDELETE f
4760: 6c 61 67 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  lags */.#endif. 
4770: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4780: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  _OK;        /* V
4790: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
47a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
47b0: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  = p->db;       /
47c0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
47d0: 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68 65  /.  u8 resetSche
47e0: 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20 2f  maOnFault = 0; /
47f0: 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20 61  * Reset schema a
4800: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 66  fter an error if
4810: 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 75   positive */.  u
4820: 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43  8 encoding = ENC
4830: 28 64 62 29 3b 20 20 20 20 20 2f 2a 20 54 68 65  (db);     /* The
4840: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
4850: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6d  ng */.  int iCom
4860: 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pare = 0;       
4870: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
4880: 6c 61 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  last comparison 
4890: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 56  */.  unsigned nV
48a0: 6d 53 74 65 70 20 3d 20 30 3b 20 20 20 20 20 20  mStep = 0;      
48b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 69 72  /* Number of vir
48c0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 73 74 65  tual machine ste
48d0: 70 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ps */.#ifndef SQ
48e0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
48f0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 75 6e  SS_CALLBACK.  un
4900: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
4910: 4c 69 6d 69 74 20 3d 20 30 3b 2f 2a 20 49 6e 76  Limit = 0;/* Inv
4920: 6f 6b 65 20 78 50 72 6f 67 72 65 73 73 28 29 20  oke xProgress() 
4930: 77 68 65 6e 20 6e 56 6d 53 74 65 70 20 72 65 61  when nVmStep rea
4940: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 23 65 6e  ches this */.#en
4950: 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20  dif.  Mem *aMem 
4960: 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  = p->aMem;      
4970: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61   /* Copy of p->a
4980: 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  Mem */.  Mem *pI
4990: 6e 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n1 = 0;         
49a0: 20 20 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74      /* 1st input
49b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
49c0: 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20  m *pIn2 = 0;    
49d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20           /* 2nd 
49e0: 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  input operand */
49f0: 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30  .  Mem *pIn3 = 0
4a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4a10: 20 33 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61   3rd input opera
4a20: 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75  nd */.  Mem *pOu
4a30: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
4a40: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65     /* Output ope
4a50: 72 61 6e 64 20 2a 2f 0a 23 69 66 64 65 66 20 56  rand */.#ifdef V
4a60: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 75 36  DBE_PROFILE.  u6
4a70: 34 20 73 74 61 72 74 3b 20 20 20 20 20 20 20 20  4 start;        
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 50 55 20           /* CPU 
4a90: 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61 74 20 73  clock count at s
4aa0: 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20 2a  tart of opcode *
4ab0: 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20  /.#endif.  /*** 
4ac0: 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55 4e 49  INSERT STACK UNI
4ad0: 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20  ON HERE ***/..  
4ae0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4af0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
4b00: 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f   );  /* sqlite3_
4b10: 73 74 65 70 28 29 20 76 65 72 69 66 69 65 73 20  step() verifies 
4b20: 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  this */.  sqlite
4b30: 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 20  3VdbeEnter(p);. 
4b40: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
4b50: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
4b60: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
4b70: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
4b80: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
4b90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4ba0: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
4bb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4bc0: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
4bd0: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  */.    goto no_m
4be0: 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  em;.  }.  assert
4bf0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4c00: 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
4c10: 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  f)==SQLITE_BUSY 
4c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4c30: 62 49 73 52 65 61 64 65 72 20 7c 7c 20 70 2d 3e  bIsReader || p->
4c40: 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a 20  readOnly!=0 );. 
4c50: 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
4c60: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
4c70: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b  p->explain==0 );
4c80: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
4c90: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
4ca0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
4cb0: 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  0;.  if( db->u1.
4cc0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
4cd0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
4ce0: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 73  o_interrupt;.  s
4cf0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
4d00: 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e 64 65 66  eSql(p);.#ifndef
4d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
4d20: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
4d30: 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65   if( db->xProgre
4d40: 73 73 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  ss ){.    u32 iP
4d50: 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f 75 6e 74  rior = p->aCount
4d60: 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  er[SQLITE_STMTST
4d70: 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20  ATUS_VM_STEP];. 
4d80: 20 20 20 61 73 73 65 72 74 28 20 30 20 3c 20 64     assert( 0 < d
4d90: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
4da0: 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73  );.    nProgress
4db0: 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e 50 72 6f  Limit = db->nPro
4dc0: 67 72 65 73 73 4f 70 73 20 2d 20 28 69 50 72 69  gressOps - (iPri
4dd0: 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f 67 72 65  or % db->nProgre
4de0: 73 73 4f 70 73 29 3b 0a 20 20 7d 0a 23 65 6e 64  ssOps);.  }.#end
4df0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4e00: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4e10: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4e20: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4e30: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
4e40: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
4e50: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
4e60: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
4e70: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
4e80: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
4e90: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
4ea0: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
4eb0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4ec0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
4ed0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4ee0: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
4ef0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
4f00: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
4f10: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
4f20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
4f30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
4f40: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f50: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
4f60: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
4f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
4f80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4f90: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
4fa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
4fb0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
4fc0: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
4fd0: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
4fe0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
4ff0: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
5000: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
5010: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
5020: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
5030: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
5040: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5050: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5070: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5080: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5090: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
50a0: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
50b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
50c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
50d0: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
50e0: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
50f0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
5100: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
5110: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
5120: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
5130: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
5140: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5150: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5160: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5170: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5190: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
51a0: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
51b0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
51c0: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
51d0: 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e  te3Hwtime();.#en
51e0: 64 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b  dif.    nVmStep+
51f0: 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
5200: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
5210: 4e 53 54 41 54 55 53 0a 20 20 20 20 69 66 28 20  NSTATUS.    if( 
5220: 70 2d 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e 61  p->anExec ) p->a
5230: 6e 45 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d  nExec[(int)(pOp-
5240: 61 4f 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a  aOp)]++;.#endif.
5250: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
5260: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
5270: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
5280: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
5290: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
52a0: 47 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  G.    if( db->fl
52b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
52c0: 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
52d0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
52e0: 4f 70 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 29  Op(stdout, (int)
52f0: 28 70 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70  (pOp - aOp), pOp
5300: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
5310: 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43        ..    /* C
5320: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
5330: 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c 61  e need to simula
5340: 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70 74 2e  te an interrupt.
5350: 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70    This only happ
5360: 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 65  ens.    ** if we
5370: 20 68 61 76 65 20 61 20 73 70 65 63 69 61 6c 20   have a special 
5380: 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 20  test build..    
5390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
53a0: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 73 71  _TEST.    if( sq
53b0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
53c0: 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  count>0 ){.     
53d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
53e0: 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20  pt_count--;.    
53f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
5400: 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30  terrupt_count==0
5410: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5420: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
5430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5440: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
5450: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
5460: 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  on other operand
5470: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
5480: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20  TE_DEBUG.    {. 
5490: 20 20 20 20 20 75 38 20 6f 70 50 72 6f 70 65 72       u8 opProper
54a0: 74 79 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  ty = sqlite3Opco
54b0: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
54c0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69  opcode];.      i
54d0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
54e0: 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29   OPFLG_IN1)!=0 )
54f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5500: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
5510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5520: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
5530: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
5540: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5550: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5560: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29  aMem[pOp->p1]) )
5570: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5580: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
5590: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
55a0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
55b0: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
55c0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
55d0: 31 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  1, &aMem[pOp->p1
55e0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
55f0: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5600: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d  y & OPFLG_IN2)!=
5610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
5620: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
5630: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5640: 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  ( pOp->p2<=(p->n
5650: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
5660: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  or) );.        a
5670: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
5680: 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  d(&aMem[pOp->p2]
5690: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
56a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
56b0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
56c0: 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  ts(&aMem[pOp->p2
56d0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ]) );.        RE
56e0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
56f0: 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p2, &aMem[pOp-
5700: 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2]);.      }. 
5710: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
5720: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33  erty & OPFLG_IN3
5730: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
5740: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
5750: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
5760: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  ert( pOp->p3<=(p
5770: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
5780: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
5790: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
57a0: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
57b0: 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  p3]) );.        
57c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
57d0: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
57e0: 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d  iants(&aMem[pOp-
57f0: 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  >p3]) );.       
5800: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
5810: 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70  pOp->p3, &aMem[p
5820: 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
5830: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50  }.      if( (opP
5840: 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
5850: 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20  OUT2)!=0 ){.    
5860: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5870: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p2>0 );.       
5880: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5890: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
58a0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
58b0: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
58c0: 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
58d0: 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20  pOp->p2]);.     
58e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70   }.      if( (op
58f0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
5900: 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20  _OUT3)!=0 ){.   
5910: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5920: 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p3>0 );.      
5930: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5940: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
5950: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
5960: 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
5970: 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
5980: 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
5990: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
59a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59b0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
59c0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
59d0: 4c 45 29 0a 20 20 20 20 70 4f 72 69 67 4f 70 20  LE).    pOrigOp 
59e0: 3d 20 70 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20  = pOp;.#endif.  
59f0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
5a00: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a  ->opcode ){../**
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57  ***********.** W
5a60: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61  hat follows is a
5a70: 20 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20   massive switch 
5a80: 73 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20  statement where 
5a90: 65 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d  each case implem
5aa0: 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61  ents a.** separa
5ab0: 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  te instruction i
5ac0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
5ad0: 63 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f  chine.  If we fo
5ae0: 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a  llow the usual.*
5af0: 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f  * indentation co
5b00: 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20  nventions, each 
5b10: 63 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69  case should be i
5b20: 6e 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61  ndented by 6 spa
5b30: 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61  ces.  But.** tha
5b40: 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61  t is a lot of wa
5b50: 73 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68  sted space on th
5b60: 65 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20  e left margin.  
5b70: 53 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68  So the code with
5b80: 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68  in.** the switch
5b90: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20   statement will 
5ba0: 62 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65  break with conve
5bb0: 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75  ntion and be flu
5bc0: 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72  sh-left. Another
5bd0: 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20  .** big comment 
5be0: 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73  (similar to this
5bf0: 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20   one) will mark 
5c00: 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  the point in the
5c10: 20 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77   code where.** w
5c20: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63  e transition bac
5c30: 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65  k to normal inde
5c40: 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ntation..**.** T
5c50: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66  he formatting of
5c60: 20 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d   each case is im
5c70: 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61  portant.  The ma
5c80: 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74  kefile for SQLit
5c90: 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74  e.** generates t
5ca0: 77 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f  wo C files "opco
5cb0: 64 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f  des.h" and "opco
5cc0: 64 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69  des.c" by scanni
5cd0: 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20  ng this.** file 
5ce0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65  looking for line
5cf0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
5d00: 68 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54  h "case OP_".  T
5d10: 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c  he opcodes.h fil
5d20: 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69  es.** will be fi
5d30: 6c 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e  lled with #defin
5d40: 65 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69  es that give uni
5d50: 71 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  que integer valu
5d60: 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70  es to each.** op
5d70: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63  code and the opc
5d80: 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66  odes.c file is f
5d90: 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72  illed with an ar
5da0: 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77  ray of strings w
5db0: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72  here.** each str
5dc0: 69 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f  ing is the symbo
5dd0: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  lic name for the
5de0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f   corresponding o
5df0: 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a  pcode.  If the.*
5e00: 2a 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74  * case statement
5e10: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
5e20: 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65  a comment of the
5e30: 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61   form "/# same a
5e40: 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61  s ... #/".** tha
5e50: 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65  t comment is use
5e60: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5e70: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  he particular va
5e80: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
5e90: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b  e..**.** Other k
5ea0: 65 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63  eywords in the c
5eb0: 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c  omment that foll
5ec0: 6f 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72  ows each case ar
5ed0: 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e  e used to.** con
5ee0: 73 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47  struct the OPFLG
5ef0: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c  _INITIALIZER val
5f00: 75 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  ue that initiali
5f10: 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72  zes opcodeProper
5f20: 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64  ty[]..** Keyword
5f30: 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20  s include: in1, 
5f40: 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20  in2, in3, out2, 
5f50: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
5f60: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
5f70: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
5f80: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5f90: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
5fa0: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
5fb0: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
5fc0: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
5fd0: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
5fe0: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
5ff0: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
6000: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
6010: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
6020: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
6030: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
6040: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
6050: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
6060: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
6070: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
6080: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
6090: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
60a0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
60b0: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
60c0: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
60d0: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
60e0: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
60f0: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
6100: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6160: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
6170: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
6180: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6190: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
61a0: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
61b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
61c0: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
61d0: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
61e0: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
61f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
6200: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
6210: 2a 2a 20 54 68 65 20 50 31 20 70 61 72 61 6d 65  ** The P1 parame
6220: 74 65 72 20 69 73 20 6e 6f 74 20 61 63 74 75 61  ter is not actua
6230: 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68 69 73  lly used by this
6240: 20 6f 70 63 6f 64 65 2e 20 20 48 6f 77 65 76 65   opcode.  Howeve
6250: 72 2c 20 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65  r, it.** is some
6260: 74 69 6d 65 73 20 73 65 74 20 74 6f 20 31 20 69  times set to 1 i
6270: 6e 73 74 65 61 64 20 6f 66 20 30 20 61 73 20 61  nstead of 0 as a
6280: 20 68 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d   hint to the com
6290: 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a  mand-line shell.
62a0: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 47 6f 74  ** that this Got
62b0: 6f 20 69 73 20 74 68 65 20 62 6f 74 74 6f 6d 20  o is the bottom 
62c0: 6f 66 20 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68  of a loop and th
62d0: 61 74 20 74 68 65 20 6c 69 6e 65 73 20 66 72 6f  at the lines fro
62e0: 6d 20 50 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20  m P2 down.** to 
62f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65  the current line
6300: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
6310: 74 65 64 20 66 6f 72 20 45 58 50 4c 41 49 4e 20  ted for EXPLAIN 
6320: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20  output..*/.case 
6330: 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20  OP_Goto: {      
6340: 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
6350: 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  /.jump_to_p2_and
6360: 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
6370: 72 75 70 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61  rupt:.  pOp = &a
6380: 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b  Op[pOp->p2 - 1];
6390: 0a 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74  ..  /* Opcodes t
63a0: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
63b0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20  the bottom of a 
63c0: 6c 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f  loop (OP_Next, O
63d0: 50 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f  P_Prev,.  ** OP_
63e0: 56 4e 65 78 74 2c 20 4f 50 5f 52 6f 77 53 65 74  VNext, OP_RowSet
63f0: 4e 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74  Next, or OP_Sort
6400: 65 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70  erNext) all jump
6410: 20 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20   here upon.  ** 
6420: 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65  completion.  Che
6430: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c  ck to see if sql
6440: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29  ite3_interrupt()
6450: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
6460: 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  .  ** or if the 
6470: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
6480: 6b 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  k needs to be in
6490: 76 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a  voked. .  **.  *
64a0: 2a 20 54 68 69 73 20 63 6f 64 65 20 75 73 65 73  * This code uses
64b0: 20 75 6e 73 74 72 75 63 74 75 72 65 64 20 22 67   unstructured "g
64c0: 6f 74 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20  oto" statements 
64d0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  and does not loo
64e0: 6b 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75  k clean..  ** Bu
64f0: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75  t that is not du
6500: 65 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69  e to sloppy codi
6510: 6e 67 20 68 61 62 69 74 73 2e 20 54 68 65 20 63  ng habits. The c
6520: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  ode is written t
6530: 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72  his.  ** way for
6540: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f   performance, to
6550: 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
6560: 20 72 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75   run the interru
6570: 70 74 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a  pt and progress.
6580: 20 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65    ** checks on e
6590: 76 65 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68  very opcode.  Th
65a0: 69 73 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33  is helps sqlite3
65b0: 5f 73 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61  _step() to run a
65c0: 62 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66  bout 1.5%.  ** f
65d0: 61 73 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20  aster according 
65e0: 74 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74  to "valgrind --t
65f0: 6f 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20  ool=cachegrind" 
6600: 2a 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  */.check_for_int
6610: 65 72 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62  errupt:.  if( db
6620: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
6630: 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  ed ) goto abort_
6640: 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74  due_to_interrupt
6650: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6660: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
6670: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c  ALLBACK.  /* Cal
6680: 6c 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  l the progress c
6690: 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73  allback if it is
66a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
66b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d  the required num
66c0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45  ber.  ** of VDBE
66d0: 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20 65   ops have been e
66e0: 78 65 63 75 74 65 64 20 28 65 69 74 68 65 72 20  xecuted (either 
66f0: 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63  since this invoc
6700: 61 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71  ation of.  ** sq
6710: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
6720: 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69  or since last ti
6730: 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  me the progress 
6740: 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c  callback was cal
6750: 6c 65 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68  led)..  ** If th
6760: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6770: 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
6780: 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76  zero, exit the v
6790: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77  irtual machine w
67a0: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72  ith.  ** a retur
67b0: 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42  n code SQLITE_AB
67c0: 4f 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ORT..  */.  if( 
67d0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30  db->xProgress!=0
67e0: 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72   && nVmStep>=nPr
67f0: 6f 67 72 65 73 73 4c 69 6d 69 74 20 29 7b 0a 20  ogressLimit ){. 
6800: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
6810: 50 72 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29  ProgressOps!=0 )
6820: 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c  ;.    nProgressL
6830: 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b  imit = nVmStep +
6840: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
6850: 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d  s - (nVmStep%db-
6860: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a  >nProgressOps);.
6870: 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f      if( db->xPro
6880: 67 72 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72  gress(db->pProgr
6890: 65 73 73 41 72 67 29 20 29 7b 0a 20 20 20 20 20  essArg) ){.     
68a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
68b0: 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f  ERRUPT;.      go
68c0: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
68d0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
68e0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65  .#endif.  .  bre
68f0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
6900: 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a  :  Gosub P1 P2 *
6910: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
6920: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64   the current add
6930: 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74  ress onto regist
6940: 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65  er P1.** and the
6950: 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  n jump to addres
6960: 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  s P2..*/.case OP
6970: 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20  _Gosub: {       
6980: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
6990: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
69a0: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
69b0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
69c0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49  nCursor) );.  pI
69d0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
69e0: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56  p1];.  assert( V
69f0: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49  dbeMemDynamic(pI
6a00: 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41  n1)==0 );.  memA
6a10: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
6a20: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  pIn1);.  pIn1->f
6a30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6a40: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69    pIn1->u.i = (i
6a50: 6e 74 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20  nt)(pOp-aOp);.  
6a60: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
6a70: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a  Op->p1, pIn1);..
6a80: 20 20 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f    /* Most jump o
6a90: 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67  perations do a g
6aa0: 6f 74 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74  oto to this spot
6ab0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64   in order to upd
6ac0: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70  ate.  ** the pOp
6ad0: 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d   pointer. */.jum
6ae0: 70 5f 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d  p_to_p2:.  pOp =
6af0: 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20   &aOp[pOp->p2 - 
6b00: 31 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1];.  break;.}..
6b10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75  /* Opcode:  Retu
6b20: 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  rn P1 * * * *.**
6b30: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
6b40: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
6b50: 20 61 66 74 65 72 20 74 68 65 20 61 64 64 72 65   after the addre
6b60: 73 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ss in register P
6b70: 31 2e 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65  1.  After.** the
6b80: 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20   jump, register 
6b90: 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66  P1 becomes undef
6ba0: 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ined..*/.case OP
6bb0: 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20  _Return: {      
6bc0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
6bd0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
6be0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6bf0: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d  ( pIn1->flags==M
6c00: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20  EM_Int );.  pOp 
6c10: 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69  = &aOp[pIn1->u.i
6c20: 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ];.  pIn1->flags
6c30: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
6c40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6c50: 20 4f 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72   Opcode: InitCor
6c60: 6f 75 74 69 6e 65 20 50 31 20 50 32 20 50 33 20  outine P1 P2 P3 
6c70: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70  * *.**.** Set up
6c80: 20 72 65 67 69 73 74 65 72 20 50 31 20 73 6f 20   register P1 so 
6c90: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65  that it will Yie
6ca0: 6c 64 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74  ld to the corout
6cb0: 69 6e 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61  ine.** located a
6cc0: 74 20 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a  t address P3..**
6cd0: 0a 2a 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65  .** If P2!=0 the
6ce0: 6e 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20  n the coroutine 
6cf0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
6d00: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
6d10: 77 73 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64  ws.** this opcod
6d20: 65 2e 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72  e.  So jump over
6d30: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69   the coroutine i
6d40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f  mplementation to
6d50: 0a 2a 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a  .** address P2..
6d60: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
6d70: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a  EndCoroutine.*/.
6d80: 63 61 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  case OP_InitCoro
6d90: 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20  utine: {     /* 
6da0: 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
6db0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20  ( pOp->p1>0 &&  
6dc0: 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p1<=(p->nMe
6dd0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
6de0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6df0: 4f 70 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70  Op->p2>=0 && pOp
6e00: 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  ->p2<p->nOp );. 
6e10: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
6e20: 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70  >=0 && pOp->p3<p
6e30: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20  ->nOp );.  pOut 
6e40: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
6e50: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56 64 62  ;.  assert( !Vdb
6e60: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
6e70: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  ) );.  pOut->u.i
6e80: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
6e90: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
6ea0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70  MEM_Int;.  if( p
6eb0: 4f 70 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75  Op->p2 ) goto ju
6ec0: 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
6ed0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6ee0: 20 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50    EndCoroutine P
6ef0: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6f00: 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  The instruction 
6f10: 61 74 20 74 68 65 20 61 64 64 72 65 73 73 20 69  at the address i
6f20: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
6f30: 20 61 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d   a Yield..** Jum
6f40: 70 20 74 6f 20 74 68 65 20 50 32 20 70 61 72 61  p to the P2 para
6f50: 6d 65 74 65 72 20 6f 66 20 74 68 61 74 20 59 69  meter of that Yi
6f60: 65 6c 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  eld..** After th
6f70: 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72  e jump, register
6f80: 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65   P1 becomes unde
6f90: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  fined..**.** See
6fa0: 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75   also: InitCorou
6fb0: 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  tine.*/.case OP_
6fc0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20  EndCoroutine: { 
6fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
6fe0: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43   */.  VdbeOp *pC
6ff0: 61 6c 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20  aller;.  pIn1 = 
7000: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
7010: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
7020: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29  flags==MEM_Int )
7030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
7040: 2d 3e 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31  ->u.i>=0 && pIn1
7050: 2d 3e 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  ->u.i<p->nOp );.
7060: 20 20 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70    pCaller = &aOp
7070: 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61  [pIn1->u.i];.  a
7080: 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e  ssert( pCaller->
7090: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64  opcode==OP_Yield
70a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
70b0: 61 6c 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20  aller->p2>=0 && 
70c0: 70 43 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e  pCaller->p2<p->n
70d0: 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61  Op );.  pOp = &a
70e0: 4f 70 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d  Op[pCaller->p2 -
70f0: 20 31 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61   1];.  pIn1->fla
7100: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
7110: 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ed;.  break;.}..
7120: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c  /* Opcode:  Yiel
7130: 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
7140: 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f  .** Swap the pro
7150: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74  gram counter wit
7160: 68 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  h the value in r
7170: 65 67 69 73 74 65 72 20 50 31 2e 20 20 54 68 69  egister P1.  Thi
7180: 73 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66  s.** has the eff
7190: 65 63 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20  ect of yielding 
71a0: 74 6f 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a  to a coroutine..
71b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72  **.** If the cor
71c0: 6f 75 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c  outine that is l
71d0: 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 73 20  aunched by this 
71e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73  instruction ends
71f0: 20 77 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f   with.** Yield o
7200: 72 20 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f  r Return then co
7210: 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65  ntinue to the ne
7220: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  xt instruction. 
7230: 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63   But if.** the c
7240: 6f 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65  oroutine launche
7250: 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
7260: 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a  ction ends with.
7270: 2a 2a 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  ** EndCoroutine,
7280: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
7290: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e   rather than con
72a0: 74 69 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65  tinuing with the
72b0: 0a 2a 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63  .** next instruc
72c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
72d0: 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74  also: InitCorout
72e0: 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59  ine.*/.case OP_Y
72f0: 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20  ield: {         
7300: 20 20 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20     /* in1, jump 
7310: 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b  */.  int pcDest;
7320: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
7330: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
7340: 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d  rt( VdbeMemDynam
7350: 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20  ic(pIn1)==0 );. 
7360: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
7370: 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74  EM_Int;.  pcDest
7380: 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e   = (int)pIn1->u.
7390: 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d  i;.  pIn1->u.i =
73a0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
73b0: 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
73c0: 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e  ACE(pOp->p1, pIn
73d0: 31 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  1);.  pOp = &aOp
73e0: 5b 70 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61  [pcDest];.  brea
73f0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7400: 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31    HaltIfNull  P1
7410: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
7420: 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50  Synopsis: if r[P
7430: 33 5d 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a  3]=null halt.**.
7440: 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c  ** Check the val
7450: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
7460: 33 2e 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c  3.  If it is NUL
7470: 4c 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e  L then Halt usin
7480: 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50  g.** parameter P
7490: 31 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73  1, P2, and P4 as
74a0: 20 69 66 20 74 68 69 73 20 77 65 72 65 20 61 20   if this were a 
74b0: 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Halt instruction
74c0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c  .  If the.** val
74d0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
74e0: 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  3 is not NULL, t
74f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7500: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
7510: 54 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  The P5 parameter
7520: 20 73 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f   should be 1..*/
7530: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e  .case OP_HaltIfN
7540: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69  ull: {      /* i
7550: 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26  n3 */.  pIn3 = &
7560: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
7570: 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
7580: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
7590: 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46   ) break;.  /* F
75a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
75b0: 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f   OP_Halt */.}../
75c0: 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20  * Opcode:  Halt 
75d0: 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a  P1 P2 * P4 P5.**
75e0: 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61  .** Exit immedia
75f0: 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20  tely.  All open 
7600: 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65  cursors, etc are
7610: 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d   closed.** autom
7620: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  atically..**.** 
7630: 50 31 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  P1 is the result
7640: 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
7650: 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  y sqlite3_exec()
7660: 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  , sqlite3_reset(
7670: 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33  ),.** or sqlite3
7680: 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f  _finalize().  Fo
7690: 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c  r a normal halt,
76a0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   this should be 
76b0: 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a  SQLITE_OK (0)..*
76c0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74  * For errors, it
76d0: 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68   can be some oth
76e0: 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31  er value.  If P1
76f0: 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c  !=0 then P2 will
7700: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
7710: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20  ether or not to 
7720: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72  rollback the cur
7730: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
7740: 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61  .  Do not rollba
7750: 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f  ck.** if P2==OE_
7760: 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c  Fail. Do the rol
7770: 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f  lback if P2==OE_
7780: 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32  Rollback.  If P2
7790: 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74  ==OE_Abort,.** t
77a0: 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c  hen back out all
77b0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 68 61   changes that ha
77c0: 76 65 20 6f 63 63 75 72 72 65 64 20 64 75 72 69  ve occurred duri
77d0: 6e 67 20 74 68 69 73 20 65 78 65 63 75 74 69 6f  ng this executio
77e0: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
77f0: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c  , but do not rol
7800: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
7810: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
7820: 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20   P4 is not null 
7830: 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72  then it is an er
7840: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
7850: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20  ng..**.** P5 is 
7860: 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
7870: 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69  0 and 4, inclusi
7880: 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ve, that modifie
7890: 73 20 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e  s the P4 string.
78a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e  .**.**    0:  (n
78b0: 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20  o change).**    
78c0: 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  1:  NOT NULL con
78d0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50  traint failed: P
78e0: 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51  4.**    2:  UNIQ
78f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
7900: 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33  iled: P4.**    3
7910: 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  :  CHECK constra
7920: 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a  int failed: P4.*
7930: 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e  *    4:  FOREIGN
7940: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
7950: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a  failed: P4.**.**
7960: 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65   If P5 is not ze
7970: 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c  ro and P4 is NUL
7980: 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74 68 69  L, then everythi
7990: 6e 67 20 61 66 74 65 72 20 74 68 65 20 22 3a 22  ng after the ":"
79a0: 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a   is.** omitted..
79b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
79c0: 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20  n implied "Halt 
79d0: 30 20 30 20 30 22 20 69 6e 73 74 72 75 63 74 69  0 0 0" instructi
79e0: 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20 74  on inserted at t
79f0: 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a  he very end of.*
7a00: 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e  * every program.
7a10: 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74    So a jump past
7a20: 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
7a30: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f  ction of the pro
7a40: 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73  gram.** is the s
7a50: 61 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e 67  ame as executing
7a60: 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f   Halt..*/.case O
7a70: 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65  P_Halt: {.  Vdbe
7a80: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
7a90: 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78   int pcx;..  pcx
7aa0: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
7ab0: 4f 70 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  Op);.  if( pOp->
7ac0: 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  p1==SQLITE_OK &&
7ad0: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
7ae0: 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75    /* Halt the su
7af0: 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72  b-program. Retur
7b00: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
7b10: 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a   parent frame. *
7b20: 2f 0a 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70  /.    pFrame = p
7b30: 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  ->pFrame;.    p-
7b40: 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  >pFrame = pFrame
7b50: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  ->pParent;.    p
7b60: 2d 3e 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20  ->nFrame--;.    
7b70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
7b80: 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
7b90: 61 6e 67 65 29 3b 0a 20 20 20 20 70 63 78 20 3d  ange);.    pcx =
7ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
7bb0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
7bc0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
7bd0: 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  2==OE_Ignore ){.
7be0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
7bf0: 74 69 6f 6e 20 70 63 78 20 69 73 20 74 68 65 20  tion pcx is the 
7c00: 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20  OP_Program that 
7c10: 69 6e 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d  invoked the sub-
7c20: 70 72 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a  program .      *
7c30: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
7c40: 67 20 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65  g halted. If the
7c50: 20 70 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   p2 instruction 
7c60: 6f 66 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a  of this OP_Halt.
7c70: 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
7c80: 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f  tion is set to O
7c90: 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74  E_Ignore, then t
7ca0: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  he sub-program i
7cb0: 73 20 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20  s throwing.     
7cc0: 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78   ** an IGNORE ex
7cd0: 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  ception. In this
7ce0: 20 63 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68   case jump to th
7cf0: 65 20 61 64 64 72 65 73 73 20 73 70 65 63 69 66  e address specif
7d00: 69 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ied.      ** as 
7d10: 74 68 65 20 70 32 20 6f 66 20 74 68 65 20 63 61  the p2 of the ca
7d20: 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d  lling OP_Program
7d30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 78 20  .  */.      pcx 
7d40: 3d 20 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32  = p->aOp[pcx].p2
7d50: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f  -1;.    }.    aO
7d60: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = p->aOp;.    
7d70: 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  aMem = p->aMem;.
7d80: 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70      pOp = &aOp[p
7d90: 63 78 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  cx];.    break;.
7da0: 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f    }.  p->rc = pO
7db0: 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f  p->p1;.  p->erro
7dc0: 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f  rAction = (u8)pO
7dd0: 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d  p->p2;.  p->pc =
7de0: 20 70 63 78 3b 0a 20 20 61 73 73 65 72 74 28 20   pcx;.  assert( 
7df0: 70 4f 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20  pOp->p5<=4 );.  
7e00: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
7e10: 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a   if( pOp->p5 ){.
7e20: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
7e30: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
7e40: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f  azType[] = { "NO
7e50: 54 20 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45  T NULL", "UNIQUE
7e60: 22 2c 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20  ", "CHECK",.    
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 20 20 22 46 4f 52 45 49 47           "FOREIG
7ea0: 4e 20 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20  N KEY" };.      
7eb0: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
7ec0: 35 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  5==1 );.      te
7ed0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d  stcase( pOp->p5=
7ee0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =2 );.      test
7ef0: 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33  case( pOp->p5==3
7f00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f10: 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29  se( pOp->p5==4 )
7f20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7f30: 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20  dbeError(p, "%s 
7f40: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7f50: 64 22 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e  d", azType[pOp->
7f60: 70 35 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  p5-1]);.      if
7f70: 28 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  ( pOp->p4.z ){. 
7f80: 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
7f90: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
7fa0: 74 66 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c  tf(db, "%z: %s",
7fb0: 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70   p->zErrMsg, pOp
7fc0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d  ->p4.z);.      }
7fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
7ff0: 6f 72 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  or(p, "%s", pOp-
8000: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  >p4.z);.    }.  
8010: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f    sqlite3_log(pO
8020: 70 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74  p->p1, "abort at
8030: 20 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22   %d in [%s]: %s"
8040: 2c 20 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20  , pcx, p->zSql, 
8050: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  p->zErrMsg);.  }
8060: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8070: 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73  dbeHalt(p);.  as
8080: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8090: 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
80a0: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
80b0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
80c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
80d0: 55 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  USY ){.    p->rc
80e0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
80f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8100: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8110: 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
8120: 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
8130: 52 41 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73  RAINT );.    ass
8140: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8150: 4f 4b 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  OK || db->nDefer
8160: 72 65 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d  redCons>0 || db-
8170: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8180: 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  s>0 );.    rc = 
8190: 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45  p->rc ? SQLITE_E
81a0: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
81b0: 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76  NE;.  }.  goto v
81c0: 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  dbe_return;.}../
81d0: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65  * Opcode: Intege
81e0: 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  r P1 P2 * * *.**
81f0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8200: 3d 50 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32  =P1.**.** The 32
8210: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
8220: 75 65 20 50 31 20 69 73 20 77 72 69 74 74 65 6e  ue P1 is written
8230: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
8240: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
8250: 74 65 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20  teger: {        
8260: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
8270: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
8280: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
8290: 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Out->u.i = pOp->
82a0: 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p1;.  break;.}..
82b0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34  /* Opcode: Int64
82c0: 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20   * P2 * P4 *.** 
82d0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
82e0: 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  P4.**.** P4 is a
82f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
8300: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
8310: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
8320: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
8330: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
8340: 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20  e OP_Int64: {   
8350: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
8360: 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  */.  pOut = out2
8370: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
8380: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
8390: 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b  p->p4.pI64!=0 );
83a0: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a  .  pOut->u.i = *
83b0: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20  pOp->p4.pI64;.  
83c0: 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
83d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
83e0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20  OATING_POINT./* 
83f0: 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50  Opcode: Real * P
8400: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
8410: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a  psis: r[P2]=P4.*
8420: 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
8430: 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74  nter to a 64-bit
8440: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
8450: 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20  value..** Write 
8460: 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20  that value into 
8470: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
8480: 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20  case OP_Real: { 
8490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
84a0: 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20  me as TK_FLOAT, 
84b0: 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d  out2 */.  pOut =
84c0: 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
84d0: 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
84e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61  >flags = MEM_Rea
84f0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  l;.  assert( !sq
8500: 6c 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d  lite3IsNaN(*pOp-
8510: 3e 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20  >p4.pReal) );.  
8520: 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70  pOut->u.r = *pOp
8530: 2d 3e 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72  ->p4.pReal;.  br
8540: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  eak;.}.#endif../
8550: 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67  * Opcode: String
8560: 38 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  8 * P2 * P4 *.**
8570: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8580: 3d 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70  ='P4'.**.** P4 p
8590: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74  oints to a nul t
85a0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
85b0: 73 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63  string. This opc
85c0: 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ode is transform
85d0: 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74  ed .** into a St
85e0: 72 69 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f  ring opcode befo
85f0: 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  re it is execute
8600: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
8610: 74 69 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a  time.  During.**
8620: 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   this transforma
8630: 74 69 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68  tion, the length
8640: 20 6f 66 20 73 74 72 69 6e 67 20 50 34 20 69 73   of string P4 is
8650: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74   computed and st
8660: 6f 72 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50  ored.** as the P
8670: 31 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  1 parameter..*/.
8680: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a  case OP_String8:
8690: 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61   {         /* sa
86a0: 6d 65 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c  me as TK_STRING,
86b0: 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72   out2 */.  asser
86c0: 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  t( pOp->p4.z!=0 
86d0: 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
86e0: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
86f0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  p);.  pOp->opcod
8700: 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20  e = OP_String;. 
8710: 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74   pOp->p1 = sqlit
8720: 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e  e3Strlen30(pOp->
8730: 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20  p4.z);..#ifndef 
8740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
8750: 36 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67  6.  if( encoding
8760: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
8770: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8780: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
8790: 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  Out, pOp->p4.z, 
87a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
87b0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
87c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
87d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
87e0: 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  ==SQLITE_TOOBIG 
87f0: 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
8800: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62  E_OK!=sqlite3Vdb
8810: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
8820: 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20  pOut, encoding) 
8830: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
8840: 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d     assert( pOut-
8850: 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70  >szMalloc>0 && p
8860: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f  Out->zMalloc==pO
8870: 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73  ut->z );.    ass
8880: 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61  ert( VdbeMemDyna
8890: 6d 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a  mic(pOut)==0 );.
88a0: 20 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c      pOut->szMall
88b0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  oc = 0;.    pOut
88c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
88d0: 74 61 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70  tatic;.    if( p
88e0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44  Op->p4type==P4_D
88f0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
8900: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8910: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
8920: 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74    }.    pOp->p4t
8930: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
8940: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
8950: 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70  = pOut->z;.    p
8960: 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e  Op->p1 = pOut->n
8970: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
8980: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f  ( rc==SQLITE_TOO
8990: 42 49 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  BIG );.#endif.  
89a0: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
89b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
89c0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
89d0: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
89e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
89f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
8a00: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
8a10: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
8a20: 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f  se, OP_String */
8a30: 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a  .}.  ./* Opcode:
8a40: 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 50 33   String P1 P2 P3
8a50: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
8a60: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28  is: r[P2]='P4' (
8a70: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68  len=P1).**.** Th
8a80: 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50  e string value P
8a90: 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28  4 of length P1 (
8aa0: 62 79 74 65 73 29 20 69 73 20 73 74 6f 72 65 64  bytes) is stored
8ab0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
8ac0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20  .**.** If P3 is 
8ad0: 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65  not zero and the
8ae0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
8af0: 73 74 65 72 20 50 33 20 69 73 20 65 71 75 61 6c  ster P3 is equal
8b00: 20 74 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20   to P5, then.** 
8b10: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  the datatype of 
8b20: 74 68 65 20 72 65 67 69 73 74 65 72 20 50 32 20  the register P2 
8b30: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
8b40: 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65  BLOB.  The conte
8b50: 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  nt is.** the sam
8b60: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79  e sequence of by
8b70: 74 65 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  tes, it is merel
8b80: 79 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  y interpreted as
8b90: 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a   a BLOB instead.
8ba0: 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20  ** of a string, 
8bb0: 61 73 20 69 66 20 69 74 20 68 61 64 20 62 65 65  as if it had bee
8bc0: 6e 20 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65  n CAST.  In othe
8bd0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69  r words:.**.** i
8be0: 66 28 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67  f( P3!=0 and reg
8bf0: 5b 50 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50  [P3]==P5 ) reg[P
8c00: 32 5d 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50  2] := CAST(reg[P
8c10: 32 5d 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63  2] as BLOB).*/.c
8c20: 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b  ase OP_String: {
8c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
8c40: 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  2 */.  assert( p
8c50: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20  Op->p4.z!=0 );. 
8c60: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
8c70: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
8c80: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
8c90: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
8ca0: 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
8cb0: 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34  Out->z = pOp->p4
8cc0: 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  .z;.  pOut->n = 
8cd0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d  pOp->p1;.  pOut-
8ce0: 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
8cf0: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
8d00: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69  OBSIZE(pOut);.#i
8d10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
8d20: 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
8d30: 4c 4f 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e  LOBS.  if( pOp->
8d40: 70 33 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  p3>0 ){.    asse
8d50: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
8d60: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
8d70: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e  rsor) );.    pIn
8d80: 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
8d90: 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  3];.    assert( 
8da0: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
8db0: 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  M_Int );.    if(
8dc0: 20 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d   pIn3->u.i==pOp-
8dd0: 3e 70 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67  >p5 ) pOut->flag
8de0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  s = MEM_Blob|MEM
8df0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d  _Static|MEM_Term
8e00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
8e10: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8e20: 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50  de: Null P1 P2 P
8e30: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
8e40: 73 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c  s: r[P2..P3]=NUL
8e50: 4c 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  L.**.** Write a 
8e60: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
8e70: 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67  ers P2.  If P3 g
8e80: 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20  reater than P2, 
8e90: 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
8ea0: 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67  ** NULL into reg
8eb0: 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65  ister P3 and eve
8ec0: 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 62  ry register in b
8ed0: 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33  etween P2 and P3
8ee0: 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c  .  If P3.** is l
8ef0: 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79 70  ess than P2 (typ
8f00: 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72  ically P3 is zer
8f10: 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67  o) then only reg
8f20: 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73  ister P2 is.** s
8f30: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
8f40: 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75  * If the P1 valu
8f50: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
8f60: 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65  hen also set the
8f70: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61   MEM_Cleared fla
8f80: 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c  g so that.** NUL
8f90: 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f  L values will no
8fa0: 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  t compare equal 
8fb0: 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e  even if SQLITE_N
8fc0: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a  ULLEQ is set on.
8fd0: 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45  ** OP_Ne or OP_E
8fe0: 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75  q..*/.case OP_Nu
8ff0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
9000: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
9010: 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c   cnt;.  u16 null
9020: 46 6c 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  Flag;.  pOut = o
9030: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
9040: 20 70 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70   pOp);.  cnt = p
9050: 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a  Op->p3-pOp->p2;.
9060: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
9070: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
9080: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
9090: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
90a0: 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70  ullFlag = pOp->p
90b0: 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  1 ? (MEM_Null|ME
90c0: 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d  M_Cleared) : MEM
90d0: 5f 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e  _Null;.  pOut->n
90e0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63   = 0;.  while( c
90f0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74  nt>0 ){.    pOut
9100: 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74  ++;.    memAbout
9110: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
9120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9130: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
9140: 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  t);.    pOut->fl
9150: 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a  ags = nullFlag;.
9160: 20 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b      pOut->n = 0;
9170: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a  .    cnt--;.  }.
9180: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9190: 70 63 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20  pcode: SoftNull 
91a0: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  P1 * * * *.** Sy
91b0: 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55  nopsis: r[P1]=NU
91c0: 4c 4c 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67  LL.**.** Set reg
91d0: 69 73 74 65 72 20 50 31 20 74 6f 20 68 61 76 65  ister P1 to have
91e0: 20 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20   the value NULL 
91f0: 61 73 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f  as seen by the O
9200: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20  P_MakeRecord.** 
9210: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74  instruction, but
9220: 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79   do not free any
9230: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9240: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9250: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  d with.** the re
9260: 67 69 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20  gister, so that 
9270: 69 66 20 74 68 65 20 76 61 6c 75 65 20 77 61 73  if the value was
9280: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
9290: 62 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72  b that was.** pr
92a0: 65 76 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20  eviously copied 
92b0: 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20  using OP_SCopy, 
92c0: 74 68 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20  the copies will 
92d0: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76  continue to be v
92e0: 61 6c 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  alid..*/.case OP
92f0: 5f 53 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61  _SoftNull: {.  a
9300: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
9310: 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d   && pOp->p1<=(p-
9320: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
9330: 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20  rsor) );.  pOut 
9340: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
9350: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
9360: 3d 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 7c 4d  = (pOut->flags|M
9370: 45 4d 5f 4e 75 6c 6c 29 26 7e 4d 45 4d 5f 55 6e  EM_Null)&~MEM_Un
9380: 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b  defined;.  break
9390: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
93a0: 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20  Blob P1 P2 * P4 
93b0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
93c0: 5b 50 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29  [P2]=P4 (len=P1)
93d0: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
93e0: 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61   to a blob of da
93f0: 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67  ta P1 bytes long
9400: 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a  .  Store this.**
9410: 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
9420: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
9430: 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20  _Blob: {        
9440: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
9450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
9460: 2d 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  ->p1 <= SQLITE_M
9470: 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70  AX_LENGTH );.  p
9480: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
9490: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
94a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
94b0: 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e  tStr(pOut, pOp->
94c0: 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  p4.z, pOp->p1, 0
94d0: 2c 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  , 0);.  pOut->en
94e0: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
94f0: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
9500: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
9510: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
9520: 3a 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32  : Variable P1 P2
9530: 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
9540: 73 69 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d  sis: r[P2]=param
9550: 65 74 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a  eter(P1,P4).**.*
9560: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76  * Transfer the v
9570: 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70  alues of bound p
9580: 61 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f  arameter P1 into
9590: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a   register P2.**.
95a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
95b0: 74 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68  ter is named, th
95c0: 65 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65  en its name appe
95d0: 61 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68  ars in P4..** Th
95e0: 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73  e P4 value is us
95f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69  ed by sqlite3_bi
9600: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
9610: 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e()..*/.case OP_
9620: 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20  Variable: {     
9630: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9640: 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20  /.  Mem *pVar;  
9650: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65       /* Value be
9660: 69 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64 20  ing transferred 
9670: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
9680: 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p1>0 && pOp->
9690: 70 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20  p1<=p->nVar );. 
96a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
96b0: 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34  .z==0 || pOp->p4
96c0: 2e 7a 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74  .z==sqlite3VList
96d0: 4e 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c  NumToName(p->pVL
96e0: 69 73 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  ist,pOp->p1) );.
96f0: 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61    pVar = &p->aVa
9700: 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a  r[pOp->p1 - 1];.
9710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9720: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29  eMemTooBig(pVar)
9730: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
9740: 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  _big;.  }.  pOut
9750: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
9760: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
9770: 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
9780: 4f 75 74 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53  Out, pVar, MEM_S
9790: 74 61 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45  tatic);.  UPDATE
97a0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
97b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
97c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65  ./* Opcode: Move
97d0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
97e0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40   Synopsis: r[P2@
97f0: 50 33 5d 3d 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a  P3]=r[P1@P3].**.
9800: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 50 33 20 76  ** Move the P3 v
9810: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
9820: 72 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76  r P1..P1+P3-1 ov
9830: 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  er into.** regis
9840: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31  ters P2..P2+P3-1
9850: 2e 20 20 52 65 67 69 73 74 65 72 73 20 50 31 2e  .  Registers P1.
9860: 2e 50 31 2b 50 33 2d 31 20 61 72 65 0a 2a 2a 20  .P1+P3-1 are.** 
9870: 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e  left holding a N
9880: 55 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ULL.  It is an e
9890: 72 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65  rror for registe
98a0: 72 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e  r ranges.** P1..
98b0: 50 31 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e  P1+P3-1 and P2..
98c0: 50 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c  P2+P3-1 to overl
98d0: 61 70 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  ap.  It is an er
98e0: 72 6f 72 0a 2a 2a 20 66 6f 72 20 50 33 20 74 6f  ror.** for P3 to
98f0: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   be less than 1.
9900: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65  .*/.case OP_Move
9910: 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  : {.  int n;    
9920: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9930: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 6c 65   of registers le
9940: 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  ft to copy */.  
9950: 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20  int p1;         
9960: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20   /* Register to 
9970: 63 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  copy from */.  i
9980: 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20  nt p2;          
9990: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63  /* Register to c
99a0: 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d  opy to */..  n =
99b0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d   pOp->p3;.  p1 =
99c0: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
99d0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65   pOp->p2;.  asse
99e0: 72 74 28 20 6e 3e 30 20 26 26 20 70 31 3e 30 20  rt( n>0 && p1>0 
99f0: 26 26 20 70 32 3e 30 20 29 3b 0a 20 20 61 73 73  && p2>0 );.  ass
9a00: 65 72 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c  ert( p1+n<=p2 ||
9a10: 20 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20   p2+n<=p1 );..  
9a20: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d  pIn1 = &aMem[p1]
9a30: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
9a40: 5b 70 32 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  [p2];.  do{.    
9a50: 61 73 73 65 72 74 28 20 70 4f 75 74 3c 3d 26 61  assert( pOut<=&a
9a60: 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  Mem[(p->nMem+1 -
9a70: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b   p->nCursor)] );
9a80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
9a90: 31 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65  1<=&aMem[(p->nMe
9aa0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
9ab0: 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  )] );.    assert
9ac0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
9ad0: 31 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f  1) );.    memAbo
9ae0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
9af0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
9b00: 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74  VdbeMemMove(pOut
9b10: 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 20  , pIn1);.#ifdef 
9b20: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9b30: 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70   if( pOut->pScop
9b40: 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d  yFrom>=&aMem[p1]
9b50: 20 26 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79   && pOut->pScopy
9b60: 46 72 6f 6d 3c 70 4f 75 74 20 29 7b 0a 20 20 20  From<pOut ){.   
9b70: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
9b80: 72 6f 6d 20 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d  rom += pOp->p2 -
9b90: 20 70 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   p1;.    }.#endi
9ba0: 66 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61  f.    Deephemera
9bb0: 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 20 20  lize(pOut);.    
9bc0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
9bd0: 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  2++, pOut);.    
9be0: 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74  pIn1++;.    pOut
9bf0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
9c00: 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  n );.  break;.}.
9c10: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79  ./* Opcode: Copy
9c20: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
9c30: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40   Synopsis: r[P2@
9c40: 50 33 2b 31 5d 3d 72 5b 50 31 40 50 33 2b 31 5d  P3+1]=r[P1@P3+1]
9c50: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  .**.** Make a co
9c60: 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  py of registers 
9c70: 50 31 2e 2e 50 31 2b 50 33 20 69 6e 74 6f 20 72  P1..P1+P3 into r
9c80: 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b  egisters P2..P2+
9c90: 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P3..**.** This i
9ca0: 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73  nstruction makes
9cb0: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
9cc0: 74 68 65 20 76 61 6c 75 65 2e 20 20 41 20 64 75  the value.  A du
9cd0: 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61  plicate.** is ma
9ce0: 64 65 20 6f 66 20 61 6e 79 20 73 74 72 69 6e 67  de of any string
9cf0: 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e   or blob constan
9d00: 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f  t.  See also OP_
9d10: 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  SCopy..*/.case O
9d20: 50 5f 43 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 20  P_Copy: {.  int 
9d30: 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70  n;..  n = pOp->p
9d40: 33 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  3;.  pIn1 = &aMe
9d50: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
9d60: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
9d70: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
9d80: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 77  Out!=pIn1 );.  w
9d90: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 73  hile( 1 ){.    s
9da0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
9db0: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
9dc0: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
9dd0: 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
9de0: 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69 66 64 65  ize(pOut);.#ifde
9df0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9e00: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
9e10: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
9e20: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
9e30: 43 45 28 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  CE(pOp->p2+pOp->
9e40: 70 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 20  p3-n, pOut);.   
9e50: 20 69 66 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 20   if( (n--)==0 ) 
9e60: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 75 74 2b  break;.    pOut+
9e70: 2b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  +;.    pIn1++;. 
9e80: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
9e90: 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79 20  * Opcode: SCopy 
9ea0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
9eb0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
9ec0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20  [P1].**.** Make 
9ed0: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
9ee0: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  f register P1 in
9ef0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
9f00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
9f10: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73  uction makes a s
9f20: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
9f30: 68 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  he value.  If th
9f40: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20  e value.** is a 
9f50: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20  string or blob, 
9f60: 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73  then the copy is
9f70: 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20   only a pointer 
9f80: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
9f90: 61 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20  al and hence if 
9fa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61  the original cha
9fb0: 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65  nges so will the
9fc0: 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c   copy..** Worse,
9fd0: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
9fe0: 20 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   is deallocated,
9ff0: 20 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65   the copy become
a000: 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68  s invalid..** Th
a010: 75 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d  us the program m
a020: 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
a030: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
a040: 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a  will not change.
a050: 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  ** during the li
a060: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  fetime of the co
a070: 70 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79  py.  Use OP_Copy
a080: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c   to make a compl
a090: 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a  ete.** copy..*/.
a0a0: 63 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b  case OP_SCopy: {
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
a0c0: 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  ut2 */.  pIn1 = 
a0d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
a0e0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
a0f0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
a100: 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b  t( pOut!=pIn1 );
a110: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
a120: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
a130: 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68  t, pIn1, MEM_Eph
a140: 65 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  em);.#ifdef SQLI
a150: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
a160: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d  Out->pScopyFrom=
a170: 3d 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70  =0 ) pOut->pScop
a180: 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65  yFrom = pIn1;.#e
a190: 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ndif.  break;.}.
a1a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43  ./* Opcode: IntC
a1b0: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
a1c0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
a1d0: 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  2]=r[P1].**.** T
a1e0: 72 61 6e 73 66 65 72 20 74 68 65 20 69 6e 74 65  ransfer the inte
a1f0: 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 69  ger value held i
a200: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  n register P1 in
a210: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
a220: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
a230: 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
a240: 6f 6e 20 6f 66 20 53 43 6f 70 79 20 74 68 61 74  on of SCopy that
a250: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
a260: 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65  integer.** value
a270: 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  s..*/.case OP_In
a280: 74 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20  tCopy: {        
a290: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
a2a0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
a2b0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
a2c0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
a2d0: 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
a2e0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
a2f0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74  Op->p2];.  sqlit
a300: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
a310: 34 28 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e  4(pOut, pIn1->u.
a320: 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  i);.  break;.}..
a330: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
a340: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
a350: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75  .** Synopsis: ou
a360: 74 70 75 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a  tput=r[P1@P2].**
a370: 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
a380: 73 20 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b  s P1 through P1+
a390: 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73  P2-1 contain a s
a3a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20  ingle row of.** 
a3b0: 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70  results. This op
a3c0: 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 20  code causes the 
a3d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
a3e0: 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  all to terminate
a3f0: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49  .** with an SQLI
a400: 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f  TE_ROW return co
a410: 64 65 20 61 6e 64 20 69 74 20 73 65 74 73 20 75  de and it sets u
a420: 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74  p the sqlite3_st
a430: 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  mt.** structure 
a440: 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63 65 73  to provide acces
a450: 73 20 74 6f 20 74 68 65 20 72 28 50 31 29 2e 2e  s to the r(P1)..
a460: 72 28 50 31 2b 50 32 2d 31 29 20 76 61 6c 75 65  r(P1+P2-1) value
a470: 73 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  s as.** the resu
a480: 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20  lt row..*/.case 
a490: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a  OP_ResultRow: {.
a4a0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
a4b0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
a4c0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70  p->nResColumn==p
a4d0: 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65  Op->p2 );.  asse
a4e0: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b  rt( pOp->p1>0 );
a4f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a500: 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  p1+pOp->p2<=(p->
a510: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
a520: 73 6f 72 29 2b 31 20 29 3b 0a 0a 23 69 66 6e 64  sor)+1 );..#ifnd
a530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
a540: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
a550: 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72  .  /* Run the pr
a560: 6f 67 72 65 73 73 20 63 6f 75 6e 74 65 72 20 6a  ogress counter j
a570: 75 73 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  ust before retur
a580: 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ning..  */.  if(
a590: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d   db->xProgress!=
a5a0: 30 0a 20 20 20 26 26 20 6e 56 6d 53 74 65 70 3e  0.   && nVmStep>
a5b0: 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 0a  =nProgressLimit.
a5c0: 20 20 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72     && db->xProgr
a5d0: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
a5e0: 73 41 72 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20  sArg)!=0.  ){.  
a5f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
a600: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74  TERRUPT;.    got
a610: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
a620: 72 72 6f 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rror;.  }.#endif
a630: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73  ..  /* If this s
a640: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f  tatement has vio
a650: 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20  lated immediate 
a660: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a670: 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a  traints, do.  **
a680: 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20   not return the 
a690: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
a6a0: 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20  odified. And do 
a6b0: 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20  not RELEASE the 
a6c0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
a6d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e  ransaction. It n
a6e0: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
a6f0: 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66  d back.  */.  if
a700: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
a710: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
a720: 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a  eckFk(p, 0)) ){.
a730: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
a740: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
a750: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73  ntRows );.    as
a760: 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d  sert( p->usesStm
a770: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  tJournal );.    
a780: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
a790: 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
a7a0: 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
a7b0: 5f 43 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20  _CountRows flag 
a7c0: 69 73 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65  is set in sqlite
a7d0: 33 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68  3.flags mask, th
a7e0: 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61  en .  ** DML sta
a7f0: 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74  tements invoke t
a800: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65  his opcode to re
a810: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
a820: 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f  of rows .  ** mo
a830: 64 69 66 69 65 64 20 74 6f 20 74 68 65 20 75 73  dified to the us
a840: 65 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  er. This is the 
a850: 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 61 20  only way that a 
a860: 56 4d 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65  VM that.  ** ope
a870: 6e 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ns a statement t
a880: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69  ransaction may i
a890: 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64  nvoke this opcod
a8a0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
a8b0: 63 61 73 65 20 74 68 69 73 20 69 73 20 73 75 63  case this is suc
a8c0: 68 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63  h a statement, c
a8d0: 6c 6f 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65  lose any stateme
a8e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
a8f0: 20 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68   ** opened by th
a900: 69 73 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74  is VM before ret
a910: 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74  urning control t
a920: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
a930: 20 69 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75   is to.  ** ensu
a940: 72 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  re that statemen
a950: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  t-transactions a
a960: 72 65 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64  re always nested
a970: 2c 20 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e  , not overlappin
a980: 67 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  g..  ** If the o
a990: 70 65 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  pen statement-tr
a9a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
a9b0: 20 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68   closed here, th
a9c0: 65 6e 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a  en the user.  **
a9d0: 20 6d 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65   may step anothe
a9e0: 72 20 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20  r VM that opens 
a9f0: 69 74 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e  its own statemen
aa00: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  t transaction. T
aa10: 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61  his.  ** may lea
aa20: 64 20 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67  d to overlapping
aa30: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
aa40: 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  actions..  **.  
aa50: 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  ** The statement
aa60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
aa70: 6e 65 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65  never a top-leve
aa80: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  l transaction.  
aa90: 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52  Hence.  ** the R
aaa0: 45 4c 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f  ELEASE call belo
aab0: 77 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  w can never fail
aac0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
aad0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
aae0: 30 20 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53  0 || db->flags&S
aaf0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
ab00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ab10: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
ab20: 65 6e 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54  ent(p, SAVEPOINT
ab30: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73  _RELEASE);.  ass
ab40: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
ab50: 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61  OK );..  /* Inva
ab60: 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d  lidate all ephem
ab70: 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20  eral cursor row 
ab80: 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63  caches */.  p->c
ab90: 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61  acheCtr = (p->ca
aba0: 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a  cheCtr + 2)|1;..
abb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
abc0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
abd0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72  e current row ar
abe0: 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  e \000 terminate
abf0: 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20  d.  ** and have 
ac00: 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65  an assigned type
ac10: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
ac20: 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69  re de-ephemerali
ac30: 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69  zed as.  ** a si
ac40: 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a  de effect..  */.
ac50: 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73    pMem = p->pRes
ac60: 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70  ultSet = &aMem[p
ac70: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
ac80: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
ac90: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
aca0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65   memIsValid(&pMe
acb0: 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65  m[i]) );.    Dee
acc0: 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65  phemeralize(&pMe
acd0: 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  m[i]);.    asser
ace0: 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67  t( (pMem[i].flag
acf0: 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d  s & MEM_Ephem)==
ad00: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
ad10: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
ad20: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
ad30: 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  lob))==0 );.    
ad40: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
ad50: 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d  lTerminate(&pMem
ad60: 5b 69 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54  [i]);.    REGIST
ad70: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
ad80: 2b 69 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  +i, &pMem[i]);. 
ad90: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
ada0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
adb0: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20   no_mem;..  if( 
adc0: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
add0: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b  ITE_TRACE_ROW ){
ade0: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
adf0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
ae00: 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c  , db->pTraceArg,
ae10: 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   p, 0);.  }..  /
ae20: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
ae30: 52 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63  ROW.  */.  p->pc
ae40: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
ae50: 4f 70 29 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20  Op) + 1;.  rc = 
ae60: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f  SQLITE_ROW;.  go
ae70: 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
ae80: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
ae90: 6e 63 61 74 20 50 31 20 50 32 20 50 33 20 2a 20  ncat P1 P2 P3 * 
aea0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
aeb0: 5b 50 33 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d  [P3]=r[P2]+r[P1]
aec0: 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  .**.** Add the t
aed0: 65 78 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ext in register 
aee0: 50 31 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  P1 onto the end 
aef0: 6f 66 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a  of the text in.*
af00: 2a 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  * register P2 an
af10: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
af20: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
af30: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
af40: 74 68 65 20 50 31 20 6f 72 20 50 32 20 74 65 78  the P1 or P2 tex
af50: 74 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20  t are NULL then 
af60: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33  store NULL in P3
af70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50  ..**.**   P3 = P
af80: 32 20 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74  2 || P1.**.** It
af90: 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   is illegal for 
afa0: 50 31 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20  P1 and P3 to be 
afb0: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
afc0: 72 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a  r. Sometimes,.**
afd0: 20 69 66 20 50 33 20 69 73 20 74 68 65 20 73 61   if P3 is the sa
afe0: 6d 65 20 72 65 67 69 73 74 65 72 20 61 73 20 50  me register as P
aff0: 32 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  2, the implement
b000: 61 74 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a  ation is able.**
b010: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63   to avoid a memc
b020: 70 79 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  py()..*/.case OP
b030: 5f 43 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20  _Concat: {      
b040: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
b050: 54 4b 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20  TK_CONCAT, in1, 
b060: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
b070: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e  64 nByte;..  pIn
b080: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
b090: 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1];.  pIn2 = &aM
b0a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70  em[pOp->p2];.  p
b0b0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
b0c0: 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
b0d0: 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20  pIn1!=pOut );.  
b0e0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
b0f0: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
b100: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
b110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b120: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
b130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b140: 69 66 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  if( ExpandBlob(p
b150: 49 6e 31 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c  In1) || ExpandBl
b160: 6f 62 28 70 49 6e 32 29 20 29 20 67 6f 74 6f 20  ob(pIn2) ) goto 
b170: 6e 6f 5f 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67  no_mem;.  String
b180: 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ify(pIn1, encodi
b190: 6e 67 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  ng);.  Stringify
b1a0: 28 70 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn2, encoding)
b1b0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31  ;.  nByte = pIn1
b1c0: 2d 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20  ->n + pIn2->n;. 
b1d0: 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61   if( nByte>db->a
b1e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
b1f0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
b200: 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
b210: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b220: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
b230: 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c  t, (int)nByte+2,
b240: 20 70 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a   pOut==pIn2) ){.
b250: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
b260: 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70  .  }.  MemSetTyp
b270: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
b280: 53 74 72 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  Str);.  if( pOut
b290: 21 3d 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65  !=pIn2 ){.    me
b2a0: 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49  mcpy(pOut->z, pI
b2b0: 6e 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b  n2->z, pIn2->n);
b2c0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
b2d0: 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c  Out->z[pIn2->n],
b2e0: 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e   pIn1->z, pIn1->
b2f0: 6e 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42  n);.  pOut->z[nB
b300: 79 74 65 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e  yte]=0;.  pOut->
b310: 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a  z[nByte+1] = 0;.
b320: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
b330: 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75   MEM_Term;.  pOu
b340: 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74  t->n = (int)nByt
b350: 65 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  e;.  pOut->enc =
b360: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
b370: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
b380: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
b390: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
b3a0: 64 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  dd P1 P2 P3 * *.
b3b0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b3c0: 33 5d 3d 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a  3]=r[P1]+r[P2].*
b3d0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c  *.** Add the val
b3e0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b3f0: 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
b400: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b410: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b420: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b430: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b440: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b450: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b460: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b470: 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20  de: Multiply P1 
b480: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b490: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b4a0: 31 5d 2a 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a  1]*r[P2].**.**.*
b4b0: 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20 76  * Multiply the v
b4c0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b4d0: 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65   P1 by the value
b4e0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
b4f0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
b500: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b510: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b520: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b530: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b540: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
b550: 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20 50  code: Subtract P
b560: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b570: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b580: 5b 50 32 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P2]-r[P1].**.**
b590: 20 53 75 62 74 72 61 63 74 20 74 68 65 20 76 61   Subtract the va
b5a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b5b0: 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75  P1 from the valu
b5c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b5d0: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
b5e0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b5f0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b600: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b610: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b620: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
b630: 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20 50 31  pcode: Divide P1
b640: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
b650: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
b660: 50 32 5d 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P2]/r[P1].**.** 
b670: 44 69 76 69 64 65 20 74 68 65 20 76 61 6c 75 65  Divide the value
b680: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b690: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
b6a0: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
b6b0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b6c0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b6d0: 50 33 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49  P3 (P3=P2/P1). I
b6e0: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a  f the value in .
b6f0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 69  ** register P1 i
b700: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
b710: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b720: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b730: 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   is .** NULL, th
b740: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b750: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b760: 52 65 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20  Remainder P1 P2 
b770: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b780: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25  is: r[P3]=r[P2]%
b790: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
b7a0: 75 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ute the remainde
b7b0: 72 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20  r after integer 
b7c0: 72 65 67 69 73 74 65 72 20 50 32 20 69 73 20 64  register P2 is d
b7d0: 69 76 69 64 65 64 20 62 79 20 0a 2a 2a 20 72 65  ivided by .** re
b7e0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 73 74  gister P1 and st
b7f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b800: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 0a  n register P3. .
b810: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
b820: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
b830: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
b840: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
b850: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
b860: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b870: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b880: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8a0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
b8b0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
b8c0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
b8d0: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
b8e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b8f0: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
b900: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b910: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
b920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
b930: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
b940: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
b950: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b970: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
b980: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
b990: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
b9a0: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
b9b0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
b9c0: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
b9d0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 63 68 61 72  , out3 */.  char
b9e0: 20 62 49 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53   bIntint;   /* S
b9f0: 74 61 72 74 65 64 20 6f 75 74 20 61 73 20 74 77  tarted out as tw
ba00: 6f 20 69 6e 74 65 67 65 72 20 6f 70 65 72 61 6e  o integer operan
ba10: 64 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  ds */.  u16 flag
ba20: 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  s;      /* Combi
ba30: 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20  ned MEM_* flags 
ba40: 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73  from both inputs
ba50: 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 31 3b   */.  u16 type1;
ba60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63        /* Numeric
ba70: 20 74 79 70 65 20 6f 66 20 6c 65 66 74 20 6f 70   type of left op
ba80: 65 72 61 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74  erand */.  u16 t
ba90: 79 70 65 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ype2;      /* Nu
baa0: 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 72 69  meric type of ri
bab0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
bac0: 20 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20   i64 iA;        
bad0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
bae0: 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e  e of left operan
baf0: 64 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20  d */.  i64 iB;  
bb00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
bb10: 72 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  r value of right
bb20: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
bb30: 75 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a  uble rA;      /*
bb40: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c   Real value of l
bb50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
bb60: 20 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20   double rB;     
bb70: 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f   /* Real value o
bb80: 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  f right operand 
bb90: 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  */..  pIn1 = &aM
bba0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74  em[pOp->p1];.  t
bbb0: 79 70 65 31 20 3d 20 6e 75 6d 65 72 69 63 54 79  ype1 = numericTy
bbc0: 70 65 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  pe(pIn1);.  pIn2
bbd0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
bbe0: 5d 3b 0a 20 20 74 79 70 65 32 20 3d 20 6e 75 6d  ];.  type2 = num
bbf0: 65 72 69 63 54 79 70 65 28 70 49 6e 32 29 3b 0a  ericType(pIn2);.
bc00: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
bc10: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
bc20: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c   = pIn1->flags |
bc30: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn2->flags;.  
bc40: 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
bc50: 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f  _Null)!=0 ) goto
bc60: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
bc70: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66  lt_is_null;.  if
bc80: 28 20 28 74 79 70 65 31 20 26 20 74 79 70 65 32  ( (type1 & type2
bc90: 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
bca0: 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d  {.    iA = pIn1-
bcb0: 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70  >u.i;.    iB = p
bcc0: 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49  In2->u.i;.    bI
bcd0: 6e 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73  ntint = 1;.    s
bce0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
bcf0: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
bd00: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69   OP_Add:       i
bd10: 66 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74  f( sqlite3AddInt
bd20: 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74  64(&iB,iA) ) got
bd30: 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61  o fp_math;  brea
bd40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
bd50: 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20  _Subtract:  if( 
bd60: 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28  sqlite3SubInt64(
bd70: 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66  &iB,iA) ) goto f
bd80: 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a  p_math;  break;.
bd90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
bda0: 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c  ltiply:  if( sql
bdb0: 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42  ite3MulInt64(&iB
bdc0: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d  ,iA) ) goto fp_m
bdd0: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ath;  break;.   
bde0: 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64     case OP_Divid
bdf0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
be00: 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72   iA==0 ) goto ar
be10: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
be20: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
be30: 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69   if( iA==-1 && i
be40: 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  B==SMALLEST_INT6
be50: 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  4 ) goto fp_math
be60: 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20  ;.        iB /= 
be70: 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  iA;.        brea
be80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
be90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bea0: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
beb0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
bec0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
bed0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
bee0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
bef0: 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20       iB %= iA;. 
bf00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bf20: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a  pOut->u.i = iB;.
bf30: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
bf40: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
bf50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bf60: 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a 66 70 5f  bIntint = 0;.fp_
bf70: 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73  math:.    rA = s
bf80: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
bf90: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72  lue(pIn1);.    r
bfa0: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  B = sqlite3VdbeR
bfb0: 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  ealValue(pIn2);.
bfc0: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
bfd0: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  >opcode ){.     
bfe0: 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20   case OP_Add:   
bff0: 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20        rB += rA; 
c000: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c010: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
c020: 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41  act:    rB -= rA
c030: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c040: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
c050: 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20  tiply:    rB *= 
c060: 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  rA;       break;
c070: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44  .      case OP_D
c080: 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  ivide: {.       
c090: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
c0a0: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
c0b0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c0c0: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  INT... */.      
c0d0: 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c    if( rA==(doubl
c0e0: 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  e)0 ) goto arith
c0f0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c100: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42  null;.        rB
c110: 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20   /= rA;.        
c120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c130: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
c140: 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69 36          iA = (i6
c150: 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42  4)rA;.        iB
c160: 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20   = (i64)rB;.    
c170: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
c180: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
c190: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
c1a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
c1b0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
c1c0: 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c       rB = (doubl
c1d0: 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20  e)(iB % iA);.   
c1e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c1f0: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
c200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
c210: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
c220: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a  pOut->u.i = rB;.
c230: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c240: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
c250: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
c260: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42   sqlite3IsNaN(rB
c270: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c280: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
c290: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d  t_is_null;.    }
c2a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 72 20 3d  .    pOut->u.r =
c2b0: 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   rB;.    MemSetT
c2c0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
c2d0: 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28  M_Real);.    if(
c2e0: 20 28 28 74 79 70 65 31 7c 74 79 70 65 32 29 26   ((type1|type2)&
c2f0: 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20  MEM_Real)==0 && 
c300: 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20  !bIntint ){.    
c310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
c320: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 4f 75  egerAffinity(pOu
c330: 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  t);.    }.#endif
c340: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61  .  }.  break;..a
c350: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
c360: 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69  _is_null:.  sqli
c370: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
c380: 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  l(pOut);.  break
c390: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c3a0: 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20 50  CollSeq P1 * * P
c3b0: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  4.**.** P4 is a 
c3c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c  pointer to a Col
c3d0: 6c 53 65 71 20 73 74 72 75 63 74 2e 20 49 66 20  lSeq struct. If 
c3e0: 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
c3f0: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
c400: 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65  .** or aggregate
c410: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65   calls sqlite3Ge
c420: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20  tFuncCollSeq(), 
c430: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
c440: 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20  equence will.** 
c450: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
c460: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
c470: 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c   built-in min(),
c480: 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69   max() and nulli
c490: 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  f().** functions
c4a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73  ..**.** If P1 is
c4b0: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c4c0: 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72  it is a register
c4d0: 20 74 68 61 74 20 61 20 73 75 62 73 65 71 75 65   that a subseque
c4e0: 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d  nt min() or.** m
c4f0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 77  ax() aggregate w
c500: 69 6c 6c 20 73 65 74 20 74 6f 20 31 20 69 66 20  ill set to 1 if 
c510: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
c520: 69 73 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d  is not the minim
c530: 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d  um or.** maximum
c540: 2e 20 20 54 68 65 20 50 31 20 72 65 67 69 73 74  .  The P1 regist
c550: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
c560: 64 20 74 6f 20 30 20 62 79 20 74 68 69 73 20 69  d to 0 by this i
c570: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
c580: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
c590: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
c5a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c5b0: 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64  e aforementioned
c5c0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f   functions.** to
c5d0: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
c5e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c5f0: 20 73 65 74 20 62 79 20 74 68 69 73 20 6f 70 63   set by this opc
c600: 6f 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ode is not avail
c610: 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79  able.** publicly
c620: 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e  .  Only built-in
c630: 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
c640: 61 63 63 65 73 73 20 74 6f 20 74 68 69 73 20 66  access to this f
c650: 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20  eature..*/.case 
c660: 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20  OP_CollSeq: {.  
c670: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
c680: 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20  ype==P4_COLLSEQ 
c690: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
c6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c6b0: 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26  dbeMemSetInt64(&
c6c0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30  aMem[pOp->p1], 0
c6d0: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
c6e0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75  }../* Opcode: Fu
c6f0: 6e 63 74 69 6f 6e 30 20 50 31 20 50 32 20 50 33  nction0 P1 P2 P3
c700: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
c710: 69 73 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72  is: r[P3]=func(r
c720: 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49  [P2@P5]).**.** I
c730: 6e 76 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e  nvoke a user fun
c740: 63 74 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70  ction (P4 is a p
c750: 6f 69 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63  ointer to a Func
c760: 44 65 66 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  Def object that.
c770: 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  ** defines the f
c780: 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35  unction) with P5
c790: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
c7a0: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
c7b0: 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73  2 and.** success
c7c0: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
c7d0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
c7e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
c7f0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65  gister P3..** Re
c800: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
c810: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
c820: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
c830: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
c840: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
c850: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
c860: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
c870: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
c880: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
c890: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
c8a0: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
c8b0: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
c8c0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
c8d0: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
c8e0: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
c8f0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
c900: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c910: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
c920: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
c930: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
c940: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
c950: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
c960: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
c970: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
c980: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
c990: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
c9a0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
c9b0: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
c9c0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63  * See also: Func
c9d0: 74 69 6f 6e 2c 20 41 67 67 53 74 65 70 2c 20 41  tion, AggStep, A
c9e0: 67 67 46 69 6e 61 6c 0a 2a 2f 0a 2f 2a 20 4f 70  ggFinal.*/./* Op
c9f0: 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50  code: Function P
ca00: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
ca10: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
ca20: 3d 66 75 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a  =func(r[P2@P5]).
ca30: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
ca40: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
ca50: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
ca60: 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   an sqlite3_cont
ca70: 65 78 74 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  ext object that.
ca80: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ** contains a po
ca90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
caa0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 72 75 6e 29  ction to be run)
cab0: 20 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e   with P5 argumen
cac0: 74 73 20 74 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d  ts taken.** from
cad0: 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
cae0: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68   successors.  Th
caf0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
cb00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72  function is stor
cb10: 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ed.** in registe
cb20: 72 20 50 33 2e 20 20 52 65 67 69 73 74 65 72 20  r P3.  Register 
cb30: 50 33 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  P3 must not be o
cb40: 6e 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ne of the functi
cb50: 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a  on inputs..**.**
cb60: 20 50 31 20 69 73 20 61 20 33 32 2d 62 69 74 20   P1 is a 32-bit 
cb70: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
cb80: 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ng whether or no
cb90: 74 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  t each argument 
cba0: 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74  to the .** funct
cbb0: 69 6f 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e  ion was determin
cbc0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ed to be constan
cbd0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
cbe0: 65 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 0a  e. If the first.
cbf0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  ** argument was 
cc00: 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69  constant then bi
cc10: 74 20 30 20 6f 66 20 50 31 20 69 73 20 73 65 74  t 0 of P1 is set
cc20: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
cc30: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
cc40: 68 65 74 68 65 72 20 6d 65 74 61 20 64 61 74 61  hether meta data
cc50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cc60: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
cc70: 20 61 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20   argument using 
cc80: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73  the.** sqlite3_s
cc90: 65 74 5f 61 75 78 64 61 74 61 28 29 20 41 50 49  et_auxdata() API
cca0: 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 72   may be safely r
ccb0: 65 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68  etained until th
ccc0: 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61  e next.** invoca
ccd0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63  tion of this opc
cce0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66  ode..**.** SQL f
ccf0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 69  unctions are ini
cd00: 74 69 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  tially coded as 
cd10: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 20 77 69 74  OP_Function0 wit
cd20: 68 20 50 34 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  h P4 pointing.**
cd30: 20 74 6f 20 61 20 46 75 6e 63 44 65 66 20 6f 62   to a FuncDef ob
cd40: 6a 65 63 74 2e 20 20 42 75 74 20 6f 6e 20 66 69  ject.  But on fi
cd50: 72 73 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20  rst evaluation, 
cd60: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
cd70: 73 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  s.** automatical
cd80: 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  ly converted int
cd90: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e  o an sqlite3_con
cda0: 74 65 78 74 20 6f 62 6a 65 63 74 20 61 6e 64 20  text object and 
cdb0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
cdc0: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 69 73   changed to this
cdd0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
cde0: 6f 64 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ode.  In this wa
cdf0: 79 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  y, the initializ
ce00: 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ation of.** the 
ce10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ce20: 6f 62 6a 65 63 74 20 6f 63 63 75 72 73 20 6f 6e  object occurs on
ce30: 6c 79 20 6f 6e 63 65 2c 20 72 61 74 68 65 72 20  ly once, rather 
ce40: 74 68 61 6e 20 6f 6e 63 65 20 66 6f 72 20 65 61  than once for ea
ce50: 63 68 0a 2a 2a 20 65 76 61 6c 75 61 74 69 6f 6e  ch.** evaluation
ce60: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
ce70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
ce80: 3a 20 46 75 6e 63 74 69 6f 6e 30 2c 20 41 67 67  : Function0, Agg
ce90: 53 74 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a  Step, AggFinal.*
cea0: 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69  /.case OP_Functi
ceb0: 6f 6e 30 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  on0: {.  int n;.
cec0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
ced0: 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65  t *pCtx;..  asse
cee0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
cef0: 3d 50 34 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20  =P4_FUNCDEF );. 
cf00: 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20   n = pOp->p5;.  
cf10: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
cf20: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
cf30: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
cf40: 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73 73 65  ursor) );.  asse
cf50: 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70  rt( n==0 || (pOp
cf60: 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
cf70: 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  2+n<=(p->nMem+1 
cf80: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 29  - p->nCursor)+1)
cf90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
cfa0: 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c  p->p3<pOp->p2 ||
cfb0: 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70   pOp->p3>=pOp->p
cfc0: 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78 20 3d 20  2+n );.  pCtx = 
cfd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
cfe0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
cff0: 2a 70 43 74 78 29 20 2b 20 28 6e 2d 31 29 2a 73  *pCtx) + (n-1)*s
d000: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61  izeof(sqlite3_va
d010: 6c 75 65 2a 29 29 3b 0a 20 20 69 66 28 20 70 43  lue*));.  if( pC
d020: 74 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  tx==0 ) goto no_
d030: 6d 65 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75  mem;.  pCtx->pOu
d040: 74 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70  t = 0;.  pCtx->p
d050: 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
d060: 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f  Func;.  pCtx->iO
d070: 70 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  p = (int)(pOp - 
d080: 61 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56  aOp);.  pCtx->pV
d090: 64 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d  dbe = p;.  pCtx-
d0a0: 3e 61 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70  >argc = n;.  pOp
d0b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55  ->p4type = P4_FU
d0c0: 4e 43 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34  NCCTX;.  pOp->p4
d0d0: 2e 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20  .pCtx = pCtx;.  
d0e0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
d0f0: 5f 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20  _Function;.  /* 
d100: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
d110: 6f 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 2a 2f  o OP_Function */
d120: 0a 7d 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74  .}.case OP_Funct
d130: 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a  ion: {.  int i;.
d140: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
d150: 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65  t *pCtx;..  asse
d160: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
d170: 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20  =P4_FUNCCTX );. 
d180: 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e   pCtx = pOp->p4.
d190: 70 43 74 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pCtx;..  /* If t
d1a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d1b0: 69 6e 73 69 64 65 20 6f 66 20 61 20 74 72 69 67  inside of a trig
d1c0: 67 65 72 2c 20 74 68 65 20 72 65 67 69 73 74 65  ger, the registe
d1d0: 72 20 61 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b  r array in aMem[
d1e0: 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20 63 68 61  ].  ** might cha
d1f0: 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61  nge from one eva
d200: 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e  luation to the n
d210: 65 78 74 2e 20 20 54 68 65 20 6e 65 78 74 20 62  ext.  The next b
d220: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a  lock of code.  *
d230: 2a 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  * checks to see 
d240: 69 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  if the register 
d250: 61 72 72 61 79 20 68 61 73 20 63 68 61 6e 67 65  array has change
d260: 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 69 74 0a  d, and if so it.
d270: 20 20 2a 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a    ** reinitializ
d280: 65 73 20 74 68 65 20 72 65 6c 61 76 61 6e 74 20  es the relavant 
d290: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 71 6c  parts of the sql
d2a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a  ite3_context obj
d2b0: 65 63 74 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20  ect */.  pOut = 
d2c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
d2d0: 20 20 69 66 28 20 70 43 74 78 2d 3e 70 4f 75 74    if( pCtx->pOut
d2e0: 20 21 3d 20 70 4f 75 74 20 29 7b 0a 20 20 20 20   != pOut ){.    
d2f0: 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 70 4f 75  pCtx->pOut = pOu
d300: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74  t;.    for(i=pCt
d310: 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b  x->argc-1; i>=0;
d320: 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76   i--) pCtx->argv
d330: 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  [i] = &aMem[pOp-
d340: 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 6d  >p2+i];.  }..  m
d350: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
d360: 70 2c 20 70 4f 75 74 29 3b 0a 23 69 66 64 65 66  p, pOut);.#ifdef
d370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d380: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d  for(i=0; i<pCtx-
d390: 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >argc; i++){.   
d3a0: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
d3b0: 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69  lid(pCtx->argv[i
d3c0: 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
d3d0: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
d3e0: 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69  +i, pCtx->argv[i
d3f0: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
d400: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
d410: 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  pOut, MEM_Null);
d420: 0a 20 20 70 43 74 78 2d 3e 66 45 72 72 6f 72 4f  .  pCtx->fErrorO
d430: 72 41 75 78 20 3d 20 30 3b 0a 20 20 28 2a 70 43  rAux = 0;.  (*pC
d440: 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  tx->pFunc->xSFun
d450: 63 29 28 70 43 74 78 2c 20 70 43 74 78 2d 3e 61  c)(pCtx, pCtx->a
d460: 72 67 63 2c 20 70 43 74 78 2d 3e 61 72 67 76 29  rgc, pCtx->argv)
d470: 3b 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35  ;/* IMP: R-24505
d480: 2d 32 33 32 33 30 20 2a 2f 0a 0a 20 20 2f 2a 20  -23230 */..  /* 
d490: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
d4a0: 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
d4b0: 72 2c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65  r, throw an exce
d4c0: 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ption */.  if( p
d4d0: 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78  Ctx->fErrorOrAux
d4e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78   ){.    if( pCtx
d4f0: 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->isError ){.   
d500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
d510: 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c  ror(p, "%s", sql
d520: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
d530: 70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 63  pOut));.      rc
d540: 20 3d 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72   = pCtx->isError
d550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d560: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
d570: 44 61 74 61 28 64 62 2c 20 26 70 2d 3e 70 41 75  Data(db, &p->pAu
d580: 78 44 61 74 61 2c 20 70 43 74 78 2d 3e 69 4f 70  xData, pCtx->iOp
d590: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
d5a0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
d5b0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
d5c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
d5d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d5e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f  he function into
d5f0: 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a   register P3 */.
d600: 20 20 69 66 28 20 70 4f 75 74 2d 3e 66 6c 61 67    if( pOut->flag
d610: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
d620: 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 73 71  _Blob) ){.    sq
d630: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
d640: 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e  ncoding(pOut, en
d650: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  coding);.    if(
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
d670: 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 20 67 6f  ooBig(pOut) ) go
d680: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
d690: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
d6a0: 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
d6b0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
d6c0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
d6d0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
d6e0: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
d6f0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
d700: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
d710: 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]&r[P2].**.** T
d720: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
d730: 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75   AND of the valu
d740: 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  es in register P
d750: 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20  1 and P2 and.** 
d760: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
d770: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
d780: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
d790: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
d7a0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
d7b0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .*/./* Opcode: B
d7c0: 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20  itOr P1 P2 P3 * 
d7d0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d7e0: 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d  [P3]=r[P1]|r[P2]
d7f0: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
d800: 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20 74  bit-wise OR of t
d810: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
d820: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
d830: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
d840: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
d850: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
d860: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
d870: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
d880: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
d890: 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20  code: ShiftLeft 
d8a0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
d8b0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
d8c0: 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]<<r[P1].**.
d8d0: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
d8e0: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
d8f0: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
d900: 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a 20   left by the.** 
d910: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73  number of bits s
d920: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
d930: 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73  integer in regis
d940: 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65  ter P1..** Store
d950: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
d960: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
d970: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
d980: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
d990: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
d9a0: 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 52  * Opcode: ShiftR
d9b0: 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a 20  ight P1 P2 P3 * 
d9c0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d9d0: 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50 31  [P3]=r[P2]>>r[P1
d9e0: 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68  ].**.** Shift th
d9f0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
da00: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74  in register P2 t
da10: 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 20 74  o the right by t
da20: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
da30: 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62  bits specified b
da40: 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  y the integer in
da50: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
da60: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
da70: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
da80: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
da90: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
daa0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
dab0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  ..*/.case OP_Bit
dac0: 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  And:            
dad0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dae0: 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20  TK_BITAND, in1, 
daf0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
db00: 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20 20  e OP_BitOr:     
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db20: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f 52  same as TK_BITOR
db30: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
db40: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
db50: 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20 20  tLeft:          
db60: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
db70: 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_LSHIFT, in1, i
db80: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
db90: 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20   OP_ShiftRight: 
dba0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
dbb0: 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46 54  ame as TK_RSHIFT
dbc0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
dbd0: 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a 20 20   */.  i64 iA;.  
dbe0: 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20 69 42  u64 uA;.  i64 iB
dbf0: 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49  ;.  u8 op;..  pI
dc00: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
dc10: 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
dc20: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
dc30: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
dc40: 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49  ->p3];.  if( (pI
dc50: 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32  n1->flags | pIn2
dc60: 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e  ->flags) & MEM_N
dc70: 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ull ){.    sqlit
dc80: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
dc90: 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61  (pOut);.    brea
dca0: 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20 73 71  k;.  }.  iA = sq
dcb0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
dcc0: 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20  e(pIn2);.  iB = 
dcd0: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
dce0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20  lue(pIn1);.  op 
dcf0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
dd00: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41   if( op==OP_BitA
dd10: 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26 3d 20  nd ){.    iA &= 
dd20: 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  iB;.  }else if( 
dd30: 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a  op==OP_BitOr ){.
dd40: 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20      iA |= iB;.  
dd50: 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d 30 20  }else if( iB!=0 
dd60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
dd70: 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  p==OP_ShiftRight
dd80: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74   || op==OP_Shift
dd90: 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Left );..    /* 
dda0: 49 66 20 73 68 69 66 74 69 6e 67 20 62 79 20 61  If shifting by a
ddb0: 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75 6e 74   negative amount
ddc0: 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65 20 6f  , shift in the o
ddd0: 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 20 2a  ther direction *
dde0: 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30 20 29  /.    if( iB<0 )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d 3d 4f  OP_ShiftRight==O
de10: 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20 29 3b  P_ShiftLeft+1 );
de20: 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50  .      op = 2*OP
de30: 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31 20 2d  _ShiftLeft + 1 -
de40: 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20 3d 20   op;.      iB = 
de50: 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a  iB>(-64) ? -iB :
de60: 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   64;.    }..    
de70: 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20  if( iB>=64 ){.  
de80: 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d 30 20      iA = (iA>=0 
de90: 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  || op==OP_ShiftL
dea0: 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20  eft) ? 0 : -1;. 
deb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dec0: 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69 41 2c  memcpy(&uA, &iA,
ded0: 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20   sizeof(uA));.  
dee0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53      if( op==OP_S
def0: 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20 20 20  hiftLeft ){.    
df00: 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20      uA <<= iB;. 
df10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df20: 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20      uA >>= iB;. 
df30: 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65         /* Sign-e
df40: 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67 68 74  xtend on a right
df50: 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65 67 61   shift of a nega
df60: 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  tive number */. 
df70: 20 20 20 20 20 20 20 69 66 28 20 69 41 3c 30 20         if( iA<0 
df80: 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36 34 29  ) uA |= ((((u64)
df90: 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33 32 29  0xffffffff)<<32)
dfa0: 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c 3c 20  |0xffffffff) << 
dfb0: 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d  (64-iB);.      }
dfc0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 69  .      memcpy(&i
dfd0: 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66 28 69  A, &uA, sizeof(i
dfe0: 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  A));.    }.  }. 
dff0: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b   pOut->u.i = iA;
e000: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
e010: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
e020: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
e030: 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20   Opcode: AddImm 
e040: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
e050: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d  Synopsis: r[P1]=
e060: 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a 20  r[P1]+P2.** .** 
e070: 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  Add the constant
e080: 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75 65   P2 to the value
e090: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
e0a0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
e0b0: 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65  s always an inte
e0c0: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f  ger..**.** To fo
e0d0: 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65 72  rce any register
e0e0: 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
e0f0: 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a  r, just add 0..*
e100: 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d  /.case OP_AddImm
e110: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
e120: 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  * in1 */.  pIn1 
e130: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
e140: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
e150: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
e160: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
e170: 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b  ntegerify(pIn1);
e180: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20  .  pIn1->u.i += 
e190: 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b  pOp->p2;.  break
e1a0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
e1b0: 4d 75 73 74 42 65 49 6e 74 20 50 31 20 50 32 20  MustBeInt P1 P2 
e1c0: 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72  * * *.** .** For
e1d0: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
e1e0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
e1f0: 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  e an integer.  I
e200: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
e210: 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 6e 20 69  n P1 is not an i
e220: 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f  nteger and canno
e230: 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
e240: 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  nto an integer.*
e250: 2a 20 77 69 74 68 6f 75 74 20 64 61 74 61 20 6c  * without data l
e260: 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  oss, then jump i
e270: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
e280: 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a  , or if P2==0.**
e290: 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45   raise an SQLITE
e2a0: 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 65 70 74  _MISMATCH except
e2b0: 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
e2c0: 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 20 20 20  MustBeInt: {    
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
e2e0: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
e2f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
e300: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
e310: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
e320: 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66  0 ){.    applyAf
e330: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
e340: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
e350: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
e360: 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
e370: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pIn1->flags&MEM
e380: 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b 0a 20 20  _Int)==0, 2);.  
e390: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
e3a0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
e3b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
e3c0: 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p2==0 ){.    
e3d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3e0: 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  MISMATCH;.      
e3f0: 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
e400: 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
e410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e420: 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
e430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e440: 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46   }.  MemSetTypeF
e450: 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e  lag(pIn1, MEM_In
e460: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
e470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e480: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
e490: 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  NT./* Opcode: Re
e4a0: 61 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a 20  alAffinity P1 * 
e4b0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72  * * *.**.** If r
e4c0: 65 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64 73  egister P1 holds
e4d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 76   an integer conv
e4e0: 65 72 74 20 69 74 20 74 6f 20 61 20 72 65 61 6c  ert it to a real
e4f0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
e500: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
e510: 64 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  d when extractin
e520: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
e530: 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  om a column that
e540: 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66 66  .** has REAL aff
e550: 69 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f 6c  inity.  Such col
e560: 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20 73  umn values may s
e570: 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  till be stored a
e580: 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20 66  s.** integers, f
e590: 6f 72 20 73 70 61 63 65 20 65 66 66 69 63 69 65  or space efficie
e5a0: 6e 63 79 2c 20 62 75 74 20 61 66 74 65 72 20 65  ncy, but after e
e5b0: 78 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61 6e  xtraction we wan
e5c0: 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76  t them.** to hav
e5d0: 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76 61  e only a real va
e5e0: 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lue..*/.case OP_
e5f0: 52 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20  RealAffinity: { 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e   /* in1 */.  pIn
e620: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
e630: 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  1];.  if( pIn1->
e640: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
e650: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e660: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e  beMemRealify(pIn
e670: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
e680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
e690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
e6a0: 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  AST./* Opcode: C
e6b0: 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ast P1 P2 * * *.
e6c0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66  ** Synopsis: aff
e6d0: 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a  inity(r[P1]).**.
e6e0: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
e6f0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
e700: 31 20 74 6f 20 62 65 20 74 68 65 20 74 79 70 65  1 to be the type
e710: 20 64 65 66 69 6e 65 64 20 62 79 20 50 32 2e 0a   defined by P2..
e720: 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  ** .** <ul>.** <
e730: 6c 69 20 76 61 6c 75 65 3d 22 39 37 22 3e 20 54  li value="97"> T
e740: 45 58 54 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  EXT.** <li value
e750: 3d 22 39 38 22 3e 20 42 4c 4f 42 0a 2a 2a 20 3c  ="98"> BLOB.** <
e760: 6c 69 20 76 61 6c 75 65 3d 22 39 39 22 3e 20 4e  li value="99"> N
e770: 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69 20 76 61  UMERIC.** <li va
e780: 6c 75 65 3d 22 31 30 30 22 3e 20 49 4e 54 45 47  lue="100"> INTEG
e790: 45 52 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65 3d  ER.** <li value=
e7a0: 22 31 30 31 22 3e 20 52 45 41 4c 0a 2a 2a 20 3c  "101"> REAL.** <
e7b0: 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  /ul>.**.** A NUL
e7c0: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
e7d0: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
e7e0: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
e7f0: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
e800: 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20 20 20  e OP_Cast: {    
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e820: 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74   in1 */.  assert
e830: 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54  ( pOp->p2>=SQLIT
e840: 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f  E_AFF_BLOB && pO
e850: 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46  p->p2<=SQLITE_AF
e860: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65 73 74  F_REAL );.  test
e870: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e880: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
e890: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
e8a0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
e8b0: 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74  F_BLOB );.  test
e8c0: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e8d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
e8e0: 43 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  C );.  testcase(
e8f0: 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
e900: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
e910: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
e920: 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  >p2==SQLITE_AFF_
e930: 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d  REAL );.  pIn1 =
e940: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
e950: 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
e960: 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20  nge(p, pIn1);.  
e970: 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
e980: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
e990: 56 64 62 65 4d 65 6d 43 61 73 74 28 70 49 6e 31  VdbeMemCast(pIn1
e9a0: 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64  , pOp->p2, encod
e9b0: 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  ing);.  UPDATE_M
e9c0: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31  AX_BLOBSIZE(pIn1
e9d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
e9e0: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
e9f0: 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
ea00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ea10: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
ea20: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20 50  ./* Opcode: Eq P
ea30: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
ea40: 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b   Synopsis: IF r[
ea50: 50 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  P3]==r[P1].**.**
ea60: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
ea70: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
ea80: 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72  P1 and P3.  If r
ea90: 65 67 28 50 33 29 3d 3d 72 65 67 28 50 31 29 20  eg(P3)==reg(P1) 
eaa0: 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20  then.** jump to 
eab0: 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20  address P2.  Or 
eac0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54  if the SQLITE_ST
ead0: 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65  OREP2 flag is se
eae0: 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a  t in P5, then.**
eaf0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
eb00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
eb10: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
eb20: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
eb30: 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f  _AFF_MASK portio
eb40: 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20  n of P5 must be 
eb50: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72  an affinity char
eb60: 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54  acter -.** SQLIT
eb70: 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49  E_AFF_TEXT, SQLI
eb80: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20  TE_AFF_INTEGER, 
eb90: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e  and so forth. An
eba0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
ebb0: 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62   .** to coerce b
ebc0: 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72  oth inputs accor
ebd0: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66  ding to this aff
ebe0: 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65  inity before the
ebf0: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
ec00: 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53  s made. If the S
ec10: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69  QLITE_AFF_MASK i
ec20: 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d  s 0x00, then num
ec30: 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79  eric.** affinity
ec40: 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74   is used. Note t
ec50: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
ec60: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
ec70: 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20   stored.** back 
ec80: 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  into the input r
ec90: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
eca0: 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63  P3.  So this opc
ecb0: 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a  ode can cause.**
ecc0: 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e   persistent chan
ecd0: 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ges to registers
ece0: 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a   P1 and P3..**.*
ecf0: 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65  * Once any conve
ed00: 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65  rsions have take
ed10: 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69  n place, and nei
ed20: 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55  ther value is NU
ed30: 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  LL, .** the valu
ed40: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  es are compared.
ed50: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
ed60: 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d  are blobs then m
ed70: 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73  emcmp() is.** us
ed80: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ed90: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
eda0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
edb0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a  If both values.*
edc0: 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e  * are text, then
edd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
ede0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
edf0: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
ee00: 0a 2a 2a 20 50 34 20 69 73 20 75 73 65 64 20 74  .** P4 is used t
ee10: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
ee20: 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e  son.  If P4 is n
ee30: 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65  ot specified the
ee40: 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73  n.** memcmp() is
ee50: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
ee60: 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49   text string.  I
ee70: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
ee80: 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68  e.** numeric, th
ee90: 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d  en a numeric com
eea0: 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e  parison is used.
eeb0: 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   If the two valu
eec0: 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66  es.** are of dif
eed0: 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68  ferent types, th
eee0: 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63  en numbers are c
eef0: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
ef00: 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61  han.** strings a
ef10: 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63  nd strings are c
ef20: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
ef30: 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a  han blobs..**.**
ef40: 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   If SQLITE_NULLE
ef50: 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 74  Q is set in P5 t
ef60: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
ef70: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
ef80: 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a  always either.**
ef90: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61   true or false a
efa0: 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c  nd is never NULL
efb0: 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61  .  If both opera
efc0: 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  nds are NULL the
efd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
efe0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
eff0: 20 74 72 75 65 2e 20 20 49 66 20 65 69 74 68 65   true.  If eithe
f000: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f010: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
f020: 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49  t is false..** I
f030: 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e  f neither operan
f040: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65  d is NULL the re
f050: 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65  sult is the same
f060: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
f070: 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  if.** the SQLITE
f080: 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72  _NULLEQ flag wer
f090: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50  e omitted from P
f0a0: 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68  5..**.** If both
f0b0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
f0c0: 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e  and SQLITE_KEEPN
f0d0: 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65  ULL flags are se
f0e0: 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  t then the.** co
f0f0: 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69  ntent of r[P2] i
f100: 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
f110: 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  f the new value 
f120: 69 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61  is NULL or 0 (fa
f130: 6c 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  lse)..** In othe
f140: 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72  r words, a prior
f150: 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c   r[P2] value wil
f160: 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69  l not be overwri
f170: 74 74 65 6e 20 62 79 20 31 20 28 74 72 75 65 29  tten by 1 (true)
f180: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
f190: 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Ne P1 P2 P3 P4 P
f1a0: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
f1b0: 46 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a  F r[P3]!=r[P1].*
f1c0: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
f1d0: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 45 71  just like the Eq
f1e0: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
f1f0: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
f200: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
f210: 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69  operands in regi
f220: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 20  sters P1 and P3 
f230: 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20  are not equal.  
f240: 53 65 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64  See the Eq opcod
f250: 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f  e for.** additio
f260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
f270: 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53  .**.** If both S
f280: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e  QLITE_STOREP2 an
f290: 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  d SQLITE_KEEPNUL
f2a0: 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20  L flags are set 
f2b0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  then the.** cont
f2c0: 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20  ent of r[P2] is 
f2d0: 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20  only changed if 
f2e0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
f2f0: 20 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72 75 65   NULL or 1 (true
f300: 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  )..** In other w
f310: 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b  ords, a prior r[
f320: 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  P2] value will n
f330: 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ot be overwritte
f340: 6e 20 62 79 20 30 20 28 66 61 6c 73 65 29 2e 0a  n by 0 (false)..
f350: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74  */./* Opcode: Lt
f360: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
f370: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
f380: 72 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P3]<r[P1].**.*
f390: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
f3a0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f3b0: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20   P1 and P3.  If 
f3c0: 72 65 67 28 50 33 29 3c 72 65 67 28 50 31 29 20  reg(P3)<reg(P1) 
f3d0: 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20  then.** jump to 
f3e0: 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20  address P2.  Or 
f3f0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54  if the SQLITE_ST
f400: 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65  OREP2 flag is se
f410: 74 20 69 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a  t in P5 store.**
f420: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
f430: 6f 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f 72 20  omparison (0 or 
f440: 31 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20  1 or NULL) into 
f450: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
f460: 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
f470: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20  _JUMPIFNULL bit 
f480: 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64  of P5 is set and
f490: 20 65 69 74 68 65 72 20 72 65 67 28 50 31 29 20   either reg(P1) 
f4a0: 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69 73  or.** reg(P3) is
f4b0: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 74   NULL then the t
f4c0: 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20 49  ake the jump.  I
f4d0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d  f the SQLITE_JUM
f4e0: 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20  PIFNULL .** bit 
f4f0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66 61  is clear then fa
f500: 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65 69  ll through if ei
f510: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
f520: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
f530: 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20  SQLITE_AFF_MASK 
f540: 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75  portion of P5 mu
f550: 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69 74  st be an affinit
f560: 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a  y character -.**
f570: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
f580: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  , SQLITE_AFF_INT
f590: 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72  EGER, and so for
f5a0: 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  th. An attempt i
f5b0: 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f  s made .** to co
f5c0: 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74 73  erce both inputs
f5d0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
f5e0: 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66 6f  is affinity befo
f5f0: 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72  re the.** compar
f600: 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49 66  ison is made. If
f610: 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
f620: 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74 68  MASK is 0x00, th
f630: 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66  en numeric.** af
f640: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e 20  finity is used. 
f650: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 66  Note that the af
f660: 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69 6f  finity conversio
f670: 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ns are stored.**
f680: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 69   back into the i
f690: 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 50  nput registers P
f6a0: 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74 68  1 and P3.  So th
f6b0: 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63 61  is opcode can ca
f6c0: 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e  use.** persisten
f6d0: 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65 67  t changes to reg
f6e0: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f6f0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79  ..**.** Once any
f700: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61 76   conversions hav
f710: 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61  e taken place, a
f720: 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75 65  nd neither value
f730: 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68   is NULL, .** th
f740: 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d  e values are com
f750: 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20 76  pared. If both v
f760: 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73 20  alues are blobs 
f770: 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73  then memcmp() is
f780: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65  .** used to dete
f790: 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  rmine the result
f7a0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
f7b0: 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76 61  son.  If both va
f7c0: 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78 74  lues.** are text
f7d0: 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f  , then the appro
f7e0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
f7f0: 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66   function specif
f800: 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20  ied in.** P4 is 
f810: 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
f820: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
f830: 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66  P4 is not specif
f840: 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63  ied then.** memc
f850: 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  mp() is used to 
f860: 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74 72  compare text str
f870: 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76 61  ing.  If both va
f880: 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65  lues are.** nume
f890: 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65  ric, then a nume
f8a0: 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  ric comparison i
f8b0: 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20 74  s used. If the t
f8c0: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  wo values.** are
f8d0: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74 79   of different ty
f8e0: 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72  pes, then number
f8f0: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
f900: 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74   less than.** st
f910: 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e 67  rings and string
f920: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
f930: 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73   less than blobs
f940: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
f950: 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Le P1 P2 P3 P4 P
f960: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
f970: 46 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a  F r[P3]<=r[P1].*
f980: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
f990: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
f9a0: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
f9b0: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
f9c0: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
f9d0: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
f9e0: 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20 74  ter P3 is less t
f9f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
fa00: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
fa10: 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  * register P1.  
fa20: 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  See the Lt opcod
fa30: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
fa40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
fa50: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20 50  ./* Opcode: Gt P
fa60: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
fa70: 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b   Synopsis: IF r[
fa80: 50 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P3]>r[P1].**.** 
fa90: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
faa0: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
fab0: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
fac0: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
fad0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
fae0: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
faf0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
fb00: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
fb10: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
fb20: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
fb30: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
fb40: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fb50: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65  */./* Opcode: Ge
fb60: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
fb70: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
fb80: 72 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a  r[P3]>=r[P1].**.
fb90: 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
fba0: 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f  st like the Lt o
fbb0: 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61  pcode except tha
fbc0: 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
fbd0: 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ken if.** the co
fbe0: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
fbf0: 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20  r P3 is greater 
fc00: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fc10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
fc20: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
fc30: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
fc40: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
fc50: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
fc60: 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20  /.case OP_Eq:   
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fc80: 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75  ame as TK_EQ, ju
fc90: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
fca0: 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20  case OP_Ne:     
fcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
fcc0: 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70  e as TK_NE, jump
fcd0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
fce0: 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20  se OP_Lt:       
fcf0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
fd00: 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20  as TK_LT, jump, 
fd10: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
fd20: 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20   OP_Le:         
fd30: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
fd40: 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e   TK_LE, jump, in
fd50: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
fd60: 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20 20  P_Gt:           
fd70: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fd80: 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_GT, jump, in1,
fd90: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fda0: 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  Ge: {           
fdb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fdc0: 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  GE, jump, in1, i
fdd0: 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c  n3 */.  int res,
fde0: 20 72 65 73 32 3b 20 20 20 20 20 20 2f 2a 20 52   res2;      /* R
fdf0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d  esult of the com
fe00: 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20  parison of pIn1 
fe10: 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a  against pIn3 */.
fe20: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
fe30: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
fe40: 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d  y to use for com
fe50: 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36  parison */.  u16
fe60: 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20   flags1;        
fe70: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74   /* Copy of init
fe80: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e  ial value of pIn
fe90: 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31  1->flags */.  u1
fea0: 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20 20  6 flags3;       
feb0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69    /* Copy of ini
fec0: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49  tial value of pI
fed0: 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  n3->flags */..  
fee0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
fef0: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20  ->p1];.  pIn3 = 
ff00: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
ff10: 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d    flags1 = pIn1-
ff20: 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73 33  >flags;.  flags3
ff30: 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a   = pIn3->flags;.
ff40: 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
ff50: 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c  flags3)&MEM_Null
ff60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f   ){.    /* One o
ff70: 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  r both operands 
ff80: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  are NULL */.    
ff90: 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
ffa0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20  LITE_NULLEQ ){. 
ffb0: 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54       /* If SQLIT
ffc0: 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20  E_NULLEQ is set 
ffd0: 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79  (which will only
ffe0: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f   happen if the o
fff0: 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20  perator is.     
10000 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f   ** OP_Eq or OP_
10010 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68  Ne) then take th
10020 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65  e jump or not de
10030 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
10040 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e  er.      ** or n
10050 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  ot both operands
10060 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20   are null..     
10070 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10080 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
10090 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  P_Eq || pOp->opc
100a0 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
100b0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
100c0 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65  gs1 & MEM_Cleare
100d0 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
100e0 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20  ssert( (pOp->p5 
100f0 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
10100 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
10110 20 69 66 28 20 28 66 6c 61 67 73 31 26 66 6c 61   if( (flags1&fla
10120 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  gs3&MEM_Null)!=0
10130 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67  .       && (flag
10140 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d  s3&MEM_Cleared)=
10150 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
10160 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a      res = 0;  /*
10170 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 65 71   Operands are eq
10180 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ual */.      }el
10190 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
101a0 3d 20 31 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64  = 1;  /* Operand
101b0 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20  s are not equal 
101c0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
101d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
101e0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
101f0 63 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61  clear and at lea
10200 73 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69  st one operand i
10210 73 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a  s NULL,.      **
10220 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10230 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e   is always NULL.
10240 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
10250 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  mp is taken if t
10260 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
10270 4e 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e  NULL bit is set.
10280 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10290 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
102a0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
102b0 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26          pOut = &
102c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
102d0 20 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65 20         iCompare 
102e0 3d 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61  = 1;    /* Opera
102f0 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  nds are not equa
10300 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
10310 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
10320 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20   pOut);.        
10330 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
10340 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
10350 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
10360 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
10370 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pOut);.      }el
10380 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
10390 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29  BranchTaken(2,3)
103a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
103b0 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a  p->p5 & SQLITE_J
103c0 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20  UMPIFNULL ){.   
103d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70         goto jump
103e0 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20  _to_p2;.        
103f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10410 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69  else{.    /* Nei
10420 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
10430 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70  NULL.  Do a comp
10440 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61  arison. */.    a
10450 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
10460 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  5 & SQLITE_AFF_M
10470 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ASK;.    if( aff
10480 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46  inity>=SQLITE_AF
10490 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
104a0 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c     if( (flags1 |
104b0 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74 72   flags3)&MEM_Str
104c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
104d0 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49  (flags1 & (MEM_I
104e0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
104f0 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
10500 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c  {.          appl
10510 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
10520 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20  (pIn1,0);.      
10530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
10540 61 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67  ags3!=pIn3->flag
10550 73 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65  s ); /* Possible
10560 20 69 66 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a   if pIn1==pIn3 *
10570 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  /.          flag
10580 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73  s3 = pIn3->flags
10590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
105a0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33 20      if( (flags3 
105b0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
105c0 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d  eal|MEM_Str))==M
105d0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
105e0 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
105f0 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 30 29  Affinity(pIn3,0)
10600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10610 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e    }.      /* Han
10620 64 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  dle the common c
10630 61 73 65 20 6f 66 20 69 6e 74 65 67 65 72 20 63  ase of integer c
10640 6f 6d 70 61 72 69 73 6f 6e 20 68 65 72 65 2c 20  omparison here, 
10650 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  as an.      ** o
10660 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20  ptimization, to 
10670 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
10680 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
10690 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  e() */.      if(
106a0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
106b0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
106c0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
106d0 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75       if( pIn3->u
106e0 2e 69 20 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29  .i > pIn1->u.i )
106f0 7b 20 72 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f  { res = +1; goto
10700 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20   compare_op; }. 
10710 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d         if( pIn3-
10720 3e 75 2e 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69  >u.i < pIn1->u.i
10730 20 29 7b 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f   ){ res = -1; go
10740 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d  to compare_op; }
10750 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30  .        res = 0
10760 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63  ;.        goto c
10770 6f 6d 70 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20  ompare_op;.     
10780 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
10790 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54   affinity==SQLIT
107a0 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20  E_AFF_TEXT ){.  
107b0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20      if( (flags1 
107c0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26  & MEM_Str)==0 &&
107d0 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f   (flags1 & (MEM_
107e0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d  Int|MEM_Real))!=
107f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
10800 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61  tcase( pIn1->fla
10810 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
10820 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10830 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
10840 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
10850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
10860 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31  emStringify(pIn1
10870 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a  , encoding, 1);.
10880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10890 28 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79  ( (flags1&MEM_Dy
108a0 6e 29 20 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61  n) != (pIn1->fla
108b0 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20  gs&MEM_Dyn) );. 
108c0 20 20 20 20 20 20 20 66 6c 61 67 73 31 20 3d 20         flags1 = 
108d0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e  (pIn1->flags & ~
108e0 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
108f0 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 54 79  (flags1 & MEM_Ty
10900 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  peMask);.       
10910 20 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70   assert( pIn1!=p
10920 49 6e 33 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  In3 );.      }. 
10930 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33       if( (flags3
10940 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26   & MEM_Str)==0 &
10950 26 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d  & (flags3 & (MEM
10960 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21  _Int|MEM_Real))!
10970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
10980 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c  stcase( pIn3->fl
10990 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
109a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
109b0 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  e( pIn3->flags &
109c0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
109d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109e0 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e  MemStringify(pIn
109f0 33 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b  3, encoding, 1);
10a00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10a10 65 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44  e( (flags3&MEM_D
10a20 79 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c  yn) != (pIn3->fl
10a30 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a  ags&MEM_Dyn) );.
10a40 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d          flags3 =
10a50 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
10a60 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c  ~MEM_TypeMask) |
10a70 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54   (flags3 & MEM_T
10a80 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ypeMask);.      
10a90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
10aa0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
10ab0 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70  =P4_COLLSEQ || p
10ac0 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20  Op->p4.pColl==0 
10ad0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  );.    res = sql
10ae0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
10af0 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e  In3, pIn1, pOp->
10b00 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63  p4.pColl);.  }.c
10b10 6f 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 73 77 69  ompare_op:.  swi
10b20 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
10b30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f   ){.    case OP_
10b40 45 71 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65  Eq:    res2 = re
10b50 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s==0;     break;
10b60 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a  .    case OP_Ne:
10b70 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3b 20      res2 = res; 
10b80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10b90 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20    case OP_Lt:   
10ba0 20 72 65 73 32 20 3d 20 72 65 73 3c 30 3b 20 20   res2 = res<0;  
10bb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10bc0 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65  ase OP_Le:    re
10bd0 73 32 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20  s2 = res<=0;    
10be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10bf0 20 4f 50 5f 47 74 3a 20 20 20 20 72 65 73 32 20   OP_Gt:    res2 
10c00 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20 62 72  = res>0;      br
10c10 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
10c20 3a 20 20 20 20 20 20 20 72 65 73 32 20 3d 20 72  :       res2 = r
10c30 65 73 3e 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es>=0;     break
10c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f  ;.  }..  /* Undo
10c50 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
10c60 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69  e by applyAffini
10c70 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75  ty() to the inpu
10c80 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  t registers. */.
10c90 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d    assert( (pIn1-
10ca0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
10cb0 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20 4d  ) == (flags1 & M
10cc0 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e  EM_Dyn) );.  pIn
10cd0 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  1->flags = flags
10ce0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  1;.  assert( (pI
10cf0 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
10d00 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33 20  Dyn) == (flags3 
10d10 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  & MEM_Dyn) );.  
10d20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  pIn3->flags = fl
10d30 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f 70  ags3;..  if( pOp
10d40 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
10d50 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f 75  OREP2 ){.    pOu
10d60 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
10d70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  2];.    iCompare
10d80 20 3d 20 72 65 73 3b 0a 20 20 20 20 72 65 73 32   = res;.    res2
10d90 20 3d 20 72 65 73 32 21 3d 30 3b 20 20 2f 2a 20   = res2!=0;  /* 
10da0 46 6f 72 20 74 68 69 73 20 70 61 74 68 20 72 65  For this path re
10db0 73 32 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  s2 must be exact
10dc0 6c 79 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 20  ly 0 or 1 */.   
10dd0 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20   if( (pOp->p5 & 
10de0 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 29  SQLITE_KEEPNULL)
10df0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
10e00 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66 6c 61  The KEEPNULL fla
10e10 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 45 71  g prevents OP_Eq
10e20 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e   from overwritin
10e30 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20 31 0a  g a NULL with 1.
10e40 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 72 65        ** and pre
10e50 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72 6f 6d  vents OP_Ne from
10e60 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e 55 4c   overwriting NUL
10e70 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69 73 20  L with 0.  This 
10e80 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  flag.      ** is
10e90 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 63 6f   only used in co
10ea0 6e 74 65 78 74 73 20 77 68 65 72 65 20 65 69 74  ntexts where eit
10eb0 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  her:.      **   
10ec0 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (1) op==OP_Eq &&
10ed0 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c   (r[P2]==NULL ||
10ee0 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20 20 20   r[P2]==0).     
10ef0 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d 4f 50   **   (2) op==OP
10f00 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e  _Ne && (r[P2]==N
10f10 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 31 29  ULL || r[P2]==1)
10f20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 66  .      ** Theref
10f30 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  ore it is not ne
10f40 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b  cessary to check
10f50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
10f60 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20 20 20  r[P2] for.      
10f70 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20  ** NULL. */.    
10f80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
10f90 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c 7c 20  pcode==OP_Ne || 
10fa0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
10fb0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
10fc0 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c 20 72  rt( res2==0 || r
10fd0 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  es2==1 );.      
10fe0 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d  testcase( res2==
10ff0 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0 && pOp->opcode
11000 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
11010 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d   testcase( res2=
11020 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =1 && pOp->opcod
11030 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  e==OP_Eq );.    
11040 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
11050 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 && pOp->opco
11060 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  de==OP_Ne );.   
11070 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
11080 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==1 && pOp->opc
11090 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
110a0 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
110b0 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d 72 65  code==OP_Eq)==re
110c0 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  s2 ) break;.    
110d0 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  }.    memAboutTo
110e0 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
110f0 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
11100 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
11110 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  t);.    pOut->u.
11120 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20 52 45  i = res2;.    RE
11130 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
11140 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d  ->p2, pOut);.  }
11150 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72  else{.    VdbeBr
11160 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
11170 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  , (pOp->p5 & SQL
11180 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33 29  ITE_NULLEQ)?2:3)
11190 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32 20 29  ;.    if( res2 )
111a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  {.      goto jum
111b0 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20  p_to_p2;.    }. 
111c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
111d0 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65 4e 6f  * Opcode: ElseNo
111e0 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a  tEq * P2 * * *.*
111f0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
11200 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74 65 6c   must immediatel
11210 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c  y follow an OP_L
11220 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d 70 61  t or OP_Gt compa
11230 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
11240 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f 66 20  ** If result of 
11250 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69  an OP_Eq compari
11260 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  son on the same 
11270 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20  two operands.** 
11280 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20 4e 55  would have be NU
11290 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30 29 2c  LL or false (0),
112a0 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d 70 20   then then jump 
112b0 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68  to P2. .** If th
112c0 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f  e result of an O
112d0 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20  P_Eq comparison 
112e0 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  on the two previ
112f0 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20  ous operands.** 
11300 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
11310 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e 20 66  true (1), then f
11320 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
11330 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  case OP_ElseNotE
11340 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 73 61  q: {       /* sa
11350 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50 45 2c  me as TK_ESCAPE,
11360 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
11370 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20  t( pOp>aOp );.  
11380 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
11390 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c  opcode==OP_Lt ||
113a0 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
113b0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
113c0 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35 20 26  rt( pOp[-1].p5 &
113d0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
113e0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
113f0 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21 3d 30  aken(iCompare!=0
11400 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43 6f 6d  , 2);.  if( iCom
11410 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f 20 6a  pare!=0 ) goto j
11420 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
11430 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
11440 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a  e: Permutation *
11450 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
11460 53 65 74 20 74 68 65 20 70 65 72 6d 75 74 61 74  Set the permutat
11470 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
11480 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
11490 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78 74 0a  tor in the next.
114a0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ** instruction. 
114b0 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
114c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
114d0 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a 2a 2a  e P4 operand..**
114e0 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61 74  .** The permutat
114f0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ion is only vali
11500 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74  d until the next
11510 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68 61 74   OP_Compare that
11520 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46 4c   has.** the OPFL
11530 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73  AG_PERMUTE bit s
11540 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69 63 61  et in P5. Typica
11550 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72 6d 75  lly the OP_Permu
11560 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a  tation should .*
11570 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69 61 74  * occur immediat
11580 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ely prior to the
11590 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2a 0a   OP_Compare..**.
115a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  ** The first int
115b0 65 67 65 72 20 69 6e 20 74 68 65 20 50 34 20 69  eger in the P4 i
115c0 6e 74 65 67 65 72 20 61 72 72 61 79 20 69 73 20  nteger array is 
115d0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
115e0 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20 64  e array.** and d
115f0 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65 20 70  oes not become p
11600 61 72 74 20 6f 66 20 74 68 65 20 70 65 72 6d 75  art of the permu
11610 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  tation..*/.case 
11620 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20  OP_Permutation: 
11630 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
11640 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41  >p4type==P4_INTA
11650 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74  RRAY );.  assert
11660 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a  ( pOp->p4.ai );.
11670 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
11680 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6d 70  .opcode==OP_Comp
11690 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  are );.  assert(
116a0 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f 50 46   pOp[1].p5 & OPF
116b0 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b 0a 20  LAG_PERMUTE );. 
116c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
116d0 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50 31  code: Compare P1
116e0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
116f0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 40 50  Synopsis: r[P1@P
11700 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33 5d 0a  3] <-> r[P2@P3].
11710 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  **.** Compare tw
11720 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65 67  o vectors of reg
11730 69 73 74 65 72 73 20 69 6e 20 72 65 67 28 50 31  isters in reg(P1
11740 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29 20  )..reg(P1+P3-1) 
11750 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65  (call this.** ve
11760 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20 69 6e  ctor "A") and in
11770 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32   reg(P2)..reg(P2
11780 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53  +P3-1) ("B").  S
11790 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
117a0 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  f.** the compari
117b0 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74  son for use by t
117c0 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20  he next OP_Jump 
117d0 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20  instruct..**.** 
117e0 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50  If P5 has the OP
117f0 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
11800 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6f   set, then the o
11810 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72 69 73  rder of comparis
11820 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69  on is.** determi
11830 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
11840 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74  recent OP_Permut
11850 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ation operator. 
11860 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41   If the.** OPFLA
11870 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 69 73  G_PERMUTE bit is
11880 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 67   clear, then reg
11890 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70 61 72  ister are compar
118a0 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69 61 6c  ed in sequential
118b0 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a  .** order..**.**
118c0 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66 6f   P4 is a KeyInfo
118d0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
118e0 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e  defines collatin
118f0 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20  g sequences and 
11900 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66  sort.** orders f
11910 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
11920 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74  n.  The permutat
11930 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20 72  ion applies to r
11940 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79  egisters.** only
11950 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 65  .  The KeyInfo e
11960 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65 64  lements are used
11970 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a   sequentially..*
11980 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
11990 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63 6f  son is a sort co
119a0 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c  mparison, so NUL
119b0 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  Ls compare equal
119c0 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c  ,.** NULLs are l
119d0 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72 73  ess than numbers
119e0 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c 65  , numbers are le
119f0 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 2c  ss than strings,
11a00 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73 20  .** and strings 
11a10 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  are less than bl
11a20 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  obs..*/.case OP_
11a30 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74  Compare: {.  int
11a40 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
11a50 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b  nt p1;.  int p2;
11a60 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
11a70 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
11a80 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  t idx;.  CollSeq
11a90 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43   *pColl;    /* C
11aa0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11ab0 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73  e to use on this
11ac0 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   term */.  int b
11ad0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Rev;          /*
11ae0 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45 4e   True for DESCEN
11af0 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72 20  DING sort order 
11b00 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
11b10 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  te;     /* The p
11b20 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a 0a 20  ermutation */.. 
11b30 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20   if( (pOp->p5 & 
11b40 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d  OPFLAG_PERMUTE)=
11b50 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72 6d 75  =0 ){.    aPermu
11b60 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  te = 0;.  }else{
11b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
11b80 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65  >aOp );.    asse
11b90 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
11ba0 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61 74 69  de==OP_Permutati
11bb0 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  on );.    assert
11bc0 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65  ( pOp[-1].p4type
11bd0 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b  ==P4_INTARRAY );
11be0 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d 20  .    aPermute = 
11bf0 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20 2b 20  pOp[-1].p4.ai + 
11c00 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  1;.    assert( a
11c10 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a 20 20  Permute!=0 );.  
11c20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  }.  n = pOp->p3;
11c30 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  .  pKeyInfo = pO
11c40 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
11c50 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
11c60 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
11c70 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d  nfo!=0 );.  p1 =
11c80 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
11c90 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64 65 66   pOp->p2;.#ifdef
11ca0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11cb0 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
11cc0 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20      int k, mx = 
11cd0 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
11ce0 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50  k<n; k++) if( aP
11cf0 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d  ermute[k]>mx ) m
11d00 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b  x = aPermute[k];
11d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
11d20 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e  0 && p1+mx<=(p->
11d30 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
11d40 73 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73  sor)+1 );.    as
11d50 73 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32  sert( p2>0 && p2
11d60 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  +mx<=(p->nMem+1 
11d70 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
11d80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11d90 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
11da0 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  p1+n<=(p->nMem+1
11db0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
11dc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11dd0 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70  p2>0 && p2+n<=(p
11de0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
11df0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a  ursor)+1 );.  }.
11e00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11e10 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28  _DEBUG */.  for(
11e20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
11e30 20 20 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75      idx = aPermu
11e40 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d  te ? aPermute[i]
11e50 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74   : i;.    assert
11e60 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
11e70 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p1+idx]) );. 
11e80 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
11e90 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69  Valid(&aMem[p2+i
11ea0 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  dx]) );.    REGI
11eb0 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64  STER_TRACE(p1+id
11ec0 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  x, &aMem[p1+idx]
11ed0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
11ee0 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61  TRACE(p2+idx, &a
11ef0 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20  Mem[p2+idx]);.  
11f00 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79    assert( i<pKey
11f10 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Info->nField );.
11f20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79      pColl = pKey
11f30 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a  Info->aColl[i];.
11f40 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49      bRev = pKeyI
11f50 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
11f60 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  i];.    iCompare
11f70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
11f80 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64  pare(&aMem[p1+id
11f90 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78  x], &aMem[p2+idx
11fa0 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  ], pColl);.    i
11fb0 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20  f( iCompare ){. 
11fc0 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20       if( bRev ) 
11fd0 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d  iCompare = -iCom
11fe0 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61  pare;.      brea
11ff0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  k;.    }.  }.  b
12000 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12010 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50  de: Jump P1 P2 P
12020 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
12030 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
12040 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50  ion at address P
12050 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70  1, P2, or P3 dep
12060 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
12070 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74  r.** in the most
12080 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61   recent OP_Compa
12090 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  re instruction t
120a0 68 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73  he P1 vector was
120b0 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71   less than.** eq
120c0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
120d0 65 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76  er than the P2 v
120e0 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76  ector, respectiv
120f0 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ely..*/.case OP_
12100 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20  Jump: {         
12110 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
12120 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20   if( iCompare<0 
12130 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
12140 68 54 61 6b 65 6e 28 30 2c 33 29 3b 20 70 4f 70  hTaken(0,3); pOp
12150 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20   = &aOp[pOp->p1 
12160 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  - 1];.  }else if
12170 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ( iCompare==0 ){
12180 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
12190 61 6b 65 6e 28 31 2c 33 29 3b 20 70 4f 70 20 3d  aken(1,3); pOp =
121a0 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20   &aOp[pOp->p2 - 
121b0 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
121c0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
121d0 28 32 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f  (2,3); pOp = &aO
121e0 70 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a  p[pOp->p3 - 1];.
121f0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12200 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
12210 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
12220 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
12230 72 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a  r[P1] && r[P2]).
12240 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
12250 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68  ogical AND of th
12260 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
12270 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 32 20  sters P1 and P2 
12280 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65  and.** write the
12290 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
122a0 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ister P3..**.** 
122b0 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72 20  If either P1 or 
122c0 50 32 20 69 73 20 30 20 28 66 61 6c 73 65 29 20  P2 is 0 (false) 
122d0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
122e0 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20  is 0 even if.** 
122f0 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
12300 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
12310 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f   and true or two
12320 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61   NULLs give.** a
12330 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f   NULL output..*/
12340 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50  ./* Opcode: Or P
12350 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
12360 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
12370 72 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a  r[P1] || r[P2]).
12380 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
12390 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65  ogical OR of the
123a0 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
123b0 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ter P1 and P2 an
123c0 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61  d.** store the a
123d0 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65  nswer in registe
123e0 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
123f0 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
12400 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29  s nonzero (true)
12410 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
12420 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20   is 1 (true).** 
12430 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65  even if the othe
12440 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  r input is NULL.
12450 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c    A NULL and fal
12460 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a  se or two NULLs.
12470 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f  ** give a NULL o
12480 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f  utput..*/.case O
12490 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  P_And:          
124a0 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
124b0 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_AND, in1, in2,
124c0 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
124d0 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Or: {          
124e0 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
124f0 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  _OR, in1, in2, o
12500 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b  ut3 */.  int v1;
12510 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
12520 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20  and:  0==FALSE, 
12530 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
12540 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  OWN or NULL */. 
12550 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52   int v2;    /* R
12560 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d  ight operand: 0=
12570 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
12580 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
12590 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ULL */..  pIn1 =
125a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
125b0 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
125c0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
125d0 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d  .    v1 = 2;.  }
125e0 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73  else{.    v1 = s
125f0 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
12600 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d  ue(pIn1)!=0;.  }
12610 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
12620 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
12630 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
12640 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32  M_Null ){.    v2
12650 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
12660 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
12670 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32  dbeIntValue(pIn2
12680 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )!=0;.  }.  if( 
12690 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
126a0 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74 69  And ){.    stati
126b0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
126c0 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b   char and_logic[
126d0 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30  ] = { 0, 0, 0, 0
126e0 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20  , 1, 2, 0, 2, 2 
126f0 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64 5f  };.    v1 = and_
12700 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
12710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
12720 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
12730 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63  ed char or_logic
12740 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
12750 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32  1, 1, 1, 2, 1, 2
12760 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f   };.    v1 = or_
12770 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
12780 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d    }.  pOut = &aM
12790 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
127a0 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20  f( v1==2 ){.    
127b0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
127c0 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
127d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75    }else{.    pOu
127e0 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20  t->u.i = v1;.   
127f0 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
12800 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
12810 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12820 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50  /* Opcode: Not P
12830 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
12840 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21  nopsis: r[P2]= !
12850 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  r[P1].**.** Inte
12860 72 70 72 65 74 20 74 68 65 20 76 61 6c 75 65 20  rpret the value 
12870 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
12880 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
12890 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a  e.  Store the.**
128a0 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d   boolean complem
128b0 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ent in register 
128c0 50 32 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  P2.  If the valu
128d0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
128e0 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   is .** NULL, th
128f0 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f  en a NULL is sto
12900 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  red in P2..*/.ca
12910 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20  se OP_Not: {    
12920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12930 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69  ame as TK_NOT, i
12940 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49  n1, out2 */.  pI
12950 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
12960 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p1];.  pOut = &a
12970 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
12980 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
12990 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69  tNull(pOut);.  i
129a0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
129b0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
129c0 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
129d0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
129e0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 21 73 71   pOut->u.i = !sq
129f0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
12a00 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62  e(pIn1);.  }.  b
12a10 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12a20 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32  de: BitNot P1 P2
12a30 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
12a40 69 73 3a 20 72 5b 50 31 5d 3d 20 7e 72 5b 50 31  is: r[P1]= ~r[P1
12a50 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ].**.** Interpre
12a60 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
12a70 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
12a80 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f  an integer.  Sto
12a90 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63  re the.** ones-c
12aa0 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  omplement of the
12ab0 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72   P1 value into r
12ac0 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20  egister P2.  If 
12ad0 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55  P1 holds.** a NU
12ae0 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20  LL then store a 
12af0 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63  NULL in P2..*/.c
12b00 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b  ase OP_BitNot: {
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f  same as TK_BITNO
12b30 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  T, in1, out2 */.
12b40 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
12b50 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
12b60 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
12b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
12b80 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
12b90 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
12ba0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
12bb0 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  =0 ){.    pOut->
12bc0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
12bd0 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
12be0 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74   ~sqlite3VdbeInt
12bf0 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d  Value(pIn1);.  }
12c00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12c10 4f 70 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20  Opcode: Once P1 
12c20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
12c30 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69  f the P1 value i
12c40 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 50  s equal to the P
12c50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4f  1 value on the O
12c60 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 20 61 74  P_Init opcode at
12c70 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  .** instruction 
12c80 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  0, then jump to 
12c90 50 32 2e 20 20 49 66 20 74 68 65 20 74 77 6f 20  P2.  If the two 
12ca0 50 31 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  P1 values differ
12cb0 2c 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 68  , then.** set th
12cc0 65 20 50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68  e P1 value on th
12cd0 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 65 71 75  is opcode to equ
12ce0 61 6c 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  al the P1 value 
12cf0 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69 74 0a 2a  on the OP_Init.*
12d00 2a 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  * and fall throu
12d10 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  gh..*/.case OP_O
12d20 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
12d30 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
12d40 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30  assert( p->aOp[0
12d50 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ].opcode==OP_Ini
12d60 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  t );.  VdbeBranc
12d70 68 54 61 6b 65 6e 28 70 2d 3e 61 4f 70 5b 30 5d  hTaken(p->aOp[0]
12d80 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 2c 20 32 29  .p1==pOp->p1, 2)
12d90 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30  ;.  if( p->aOp[0
12da0 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b  ].p1==pOp->p1 ){
12db0 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
12dc0 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  o_p2;.  }else{. 
12dd0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e     pOp->p1 = p->
12de0 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20 20 7d 0a 20  aOp[0].p1;.  }. 
12df0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
12e00 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20 50  code: If P1 P2 P
12e10 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
12e20 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
12e30 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
12e40 50 31 20 69 73 20 74 72 75 65 2e 20 20 54 68 65  P1 is true.  The
12e50 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e   value.** is con
12e60 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66 20  sidered true if 
12e70 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e  it is numeric an
12e80 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  d non-zero.  If 
12e90 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
12ea0 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
12eb0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
12ec0 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20   and only if P3 
12ed0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
12ee0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74  /* Opcode: IfNot
12ef0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
12f00 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
12f10 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
12f20 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46 61  egister P1 is Fa
12f30 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  lse.  The value.
12f40 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
12f50 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
12f60 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
12f70 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
12f80 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
12f90 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
12fa0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
12fb0 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73  nd only if P3 is
12fc0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61   non-zero..*/.ca
12fd0 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
12fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
12ff0 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
13000 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
13010 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
13020 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
13030 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
13040 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
13050 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
13060 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20  Null ){.    c = 
13070 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65  pOp->p3;.  }else
13080 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13090 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
130a0 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  INT.    c = sqli
130b0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
130c0 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a  pIn1)!=0;.#else.
130d0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
130e0 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
130f0 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  1)!=0.0;.#endif.
13100 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
13110 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20  ode==OP_IfNot ) 
13120 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 56 64  c = !c;.  }.  Vd
13130 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21  beBranchTaken(c!
13140 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20  =0, 2);.  if( c 
13150 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
13160 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
13170 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13180 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20  e: IsNull P1 P2 
13190 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
131a0 73 3a 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c  s: if r[P1]==NUL
131b0 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  L goto P2.**.** 
131c0 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
131d0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
131e0 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a  ter P1 is NULL..
131f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c  */.case OP_IsNul
13200 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
13210 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53  /* same as TK_IS
13220 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
13230 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13240 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
13250 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
13260 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
13270 4d 5f 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a  M_Null)!=0, 2);.
13280 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
13290 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
132a0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
132b0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
132c0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
132d0 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
132e0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
132f0 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
13300 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  NULL goto P2.**.
13310 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
13320 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
13330 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74  gister P1 is not
13340 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65   NULL.  .*/.case
13350 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20   OP_NotNull: {  
13360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
13370 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  e as TK_NOTNULL,
13380 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
13390 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
133a0 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
133b0 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
133c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
133d0 6c 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)==0, 2);.  if(
133e0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
133f0 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
13400 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
13410 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
13420 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
13430 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
13440 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
13450 73 3a 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a  s: r[P3]=PX.**.*
13460 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
13470 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72  data that cursor
13480 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73   P1 points to as
13490 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69   a structure bui
134a0 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  lt using.** the 
134b0 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72  MakeRecord instr
134c0 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68  uction.  (See th
134d0 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  e MakeRecord opc
134e0 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
134f0 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  al.** informatio
13500 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d  n about the form
13510 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29  at of the data.)
13520 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32    Extract the P2
13530 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72  -th column.** fr
13540 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20  om this record. 
13550 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   If there are le
13560 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a  ss that (P2+1) .
13570 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ** values in the
13580 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74   record, extract
13590 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54   a NULL..**.** T
135a0 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  he value extract
135b0 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ed is stored in 
135c0 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a  register P3..**.
135d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ** If the column
135e0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
135f0 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20  than P2 fields, 
13600 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e  then extract a N
13610 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20  ULL.  Or,.** if 
13620 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20  the P4 argument 
13630 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20  is a P4_MEM use 
13640 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13650 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a   P4 argument as.
13660 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ** the result..*
13670 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
13680 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69  AG_CLEARCACHE bi
13690 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61  t is set on P5 a
136a0 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64  nd P1 is a pseud
136b0 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a  o-table cursor,.
136c0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  ** then the cach
136d0 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
136e0 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74  is reset prior t
136f0 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65  o extracting the
13700 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20   column..** The 
13710 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  first OP_Column 
13720 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f  against a pseudo
13730 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65  -table after the
13740 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
13750 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  ntent.** registe
13760 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68  r has changed sh
13770 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62  ould have this b
13780 69 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  it set..**.** If
13790 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47   the OPFLAG_LENG
137a0 54 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47  THARG and OPFLAG
137b0 5f 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20  _TYPEOFARG bits 
137c0 61 72 65 20 73 65 74 20 6f 6e 20 50 35 20 77 68  are set on P5 wh
137d0 65 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  en.** the result
137e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
137f0 6f 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61  o only be used a
13800 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f  s the argument o
13810 66 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20  f a length().** 
13820 6f 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  or typeof() func
13830 74 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  tion, respective
13840 6c 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67  ly.  The loading
13850 20 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20   of large blobs 
13860 63 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65  can be.** skippe
13870 64 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  d for length() a
13880 6e 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c  nd all content l
13890 6f 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b  oading can be sk
138a0 69 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66  ipped for typeof
138b0 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ()..*/.case OP_C
138c0 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70  olumn: {.  int p
138d0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
138e0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74   column number t
138f0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
13900 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
13910 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
13920 75 72 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72  ursor */.  BtCur
13930 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a  sor *pCrsr;   /*
13940 20 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f   The BTree curso
13950 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66  r */.  u32 *aOff
13960 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66  set;      /* aOf
13970 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65  fset[i] is offse
13980 74 20 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61  t to start of da
13990 74 61 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75  ta for i-th colu
139a0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  mn */.  int len;
139b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
139c0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
139d0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
139e0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a  for the column *
139f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
13a00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13a10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20  ounter */.  Mem 
13a20 2a 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f  *pDest;        /
13a30 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
13a40 20 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76   the extracted v
13a50 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d  alue */.  Mem sM
13a60 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
13a70 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20  For storing the 
13a80 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
13a90 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
13aa0 75 38 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20  u8 *zData;   /* 
13ab0 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  Part of the reco
13ac0 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
13ad0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
13ae0 7a 48 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74  zHdr;    /* Next
13af0 20 75 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f   unparsed byte o
13b00 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
13b10 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64    const u8 *zEnd
13b20 48 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20  Hdr; /* Pointer 
13b30 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66  to first byte af
13b40 74 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a  ter the header *
13b50 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20  /.  u32 offset; 
13b60 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
13b70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a   into the data *
13b80 2f 0a 20 20 75 36 34 20 6f 66 66 73 65 74 36 34  /.  u64 offset64
13b90 3b 20 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74  ;      /* 64-bit
13ba0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
13bb0 20 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20 20   avail;         
13bc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
13bd0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
13be0 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74 3b  data */.  u32 t;
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c00 41 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f 6d  A type code from
13c10 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64   the record head
13c20 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65  er */.  Mem *pRe
13c30 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73  g;         /* Ps
13c40 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 20  eudoTable input 
13c50 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 70  register */..  p
13c60 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
13c70 2d 3e 70 31 5d 3b 0a 20 20 70 32 20 3d 20 70 4f  ->p1];.  p2 = pO
13c80 70 2d 3e 70 32 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->p2;..  /* If 
13c90 74 68 65 20 63 75 72 73 6f 72 20 63 61 63 68 65  the cursor cache
13ca0 20 69 73 20 73 74 61 6c 65 2c 20 62 72 69 6e 67   is stale, bring
13cb0 20 69 74 20 75 70 2d 74 6f 2d 64 61 74 65 20 2a   it up-to-date *
13cc0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
13cd0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
13ce0 28 26 70 43 2c 20 26 70 32 29 3b 0a 20 20 69 66  (&pC, &p2);.  if
13cf0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
13d00 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
13d10 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
13d20 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
13d30 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
13d40 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
13d50 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Dest = &aMem[pOp
13d60 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p3];.  memAbou
13d70 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65  tToChange(p, pDe
13d80 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  st);.  assert( p
13d90 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
13da0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
13db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  );.  assert( pC!
13dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13dd0 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 20 29 3b  p2<pC->nField );
13de0 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43 2d  .  aOffset = pC-
13df0 3e 61 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  >aOffset;.  asse
13e00 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
13e10 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29  !=CURTYPE_VTAB )
13e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
13e30 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50  eCurType!=CURTYP
13e40 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e  E_PSEUDO || pC->
13e50 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 61 73 73  nullRow );.  ass
13e60 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
13e70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45  e!=CURTYPE_SORTE
13e80 52 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e  R );..  if( pC->
13e90 63 61 63 68 65 53 74 61 74 75 73 21 3d 70 2d 3e  cacheStatus!=p->
13ea0 63 61 63 68 65 43 74 72 20 29 7b 20 20 20 20 20  cacheCtr ){     
13eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f 50 54             /*OPT
13ec0 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
13ed0 53 45 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d  SE*/.    if( pC-
13ee0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
13ef0 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79    if( pC->eCurTy
13f00 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55  pe==CURTYPE_PSEU
13f10 44 4f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  DO ){.        as
13f20 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 73 65  sert( pC->uc.pse
13f30 75 64 6f 54 61 62 6c 65 52 65 67 3e 30 20 29 3b  udoTableReg>0 );
13f40 0a 20 20 20 20 20 20 20 20 70 52 65 67 20 3d 20  .        pReg = 
13f50 26 61 4d 65 6d 5b 70 43 2d 3e 75 63 2e 70 73 65  &aMem[pC->uc.pse
13f60 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20  udoTableReg];.  
13f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13f80 65 67 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  eg->flags & MEM_
13f90 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
13fa0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
13fb0 69 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20 20  id(pReg) );.    
13fc0 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53      pC->payloadS
13fd0 69 7a 65 20 3d 20 70 43 2d 3e 73 7a 52 6f 77 20  ize = pC->szRow 
13fe0 3d 20 61 76 61 69 6c 20 3d 20 70 52 65 67 2d 3e  = avail = pReg->
13ff0 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61  n;.        pC->a
14000 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 65 67 2d  Row = (u8*)pReg-
14010 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  >z;.      }else{
14020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14030 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
14040 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67  Dest);.        g
14050 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
14060 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
14070 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 72 73  else{.      pCrs
14080 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
14090 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
140a0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
140b0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
140c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140d0 43 72 73 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Crsr );.      as
140e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
140f0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
14100 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20  pCrsr) );.      
14110 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
14120 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
14130 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29  yloadSize(pCrsr)
14140 3b 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77  ;.      pC->aRow
14150 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
14160 61 79 6c 6f 61 64 46 65 74 63 68 28 70 43 72 73  ayloadFetch(pCrs
14170 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
14180 20 20 61 73 73 65 72 74 28 20 61 76 61 69 6c 3c    assert( avail<
14190 3d 36 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d 61  =65536 );  /* Ma
141a0 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 20  ximum page size 
141b0 69 73 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20 20  is 64KiB */.    
141c0 20 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61    if( pC->payloa
141d0 64 53 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76  dSize <= (u32)av
141e0 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ail ){.        p
141f0 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 43 2d 3e 70  C->szRow = pC->p
14200 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20  ayloadSize;.    
14210 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e    }else if( pC->
14220 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75  payloadSize > (u
14230 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
14240 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14250 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  H] ){.        go
14260 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20  to too_big;.    
14270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14280 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76 61   pC->szRow = ava
14290 69 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  il;.      }.    
142a0 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  }.    pC->cacheS
142b0 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65  tatus = p->cache
142c0 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e 69 48 64  Ctr;.    pC->iHd
142d0 72 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72  rOffset = getVar
142e0 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f 77 2c 20  int32(pC->aRow, 
142f0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 70 43 2d  offset);.    pC-
14300 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b  >nHdrParsed = 0;
14310 0a 20 20 20 20 61 4f 66 66 73 65 74 5b 30 5d 20  .    aOffset[0] 
14320 3d 20 6f 66 66 73 65 74 3b 0a 0a 0a 20 20 20 20  = offset;...    
14330 69 66 28 20 61 76 61 69 6c 3c 6f 66 66 73 65 74  if( avail<offset
14340 20 29 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d   ){      /*OPTIM
14350 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
14360 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e  */.      /* pC->
14370 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 61  aRow does not ha
14380 76 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  ve to hold the e
14390 6e 74 69 72 65 20 72 6f 77 2c 20 62 75 74 20 69  ntire row, but i
143a0 74 20 64 6f 65 73 20 61 74 20 6c 65 61 73 74 0a  t does at least.
143b0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
143c0 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65   cover the heade
143d0 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  r of the record.
143e0 20 20 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f    If pC->aRow do
143f0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20  es not contain. 
14400 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70       ** the comp
14410 6c 65 74 65 20 68 65 61 64 65 72 2c 20 74 68 65  lete header, the
14420 6e 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  n set it to zero
14430 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 68 65  , forcing the he
14440 61 64 65 72 20 74 6f 20 62 65 0a 20 20 20 20 20  ader to be.     
14450 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
14460 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
14470 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30      pC->aRow = 0
14480 3b 0a 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f  ;.      pC->szRo
14490 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
144a0 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72   Make sure a cor
144b0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68 61  rupt database ha
144c0 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61  s not given us a
144d0 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65  n oversize heade
144e0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 74  r..      ** Do t
144f0 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64  his now to avoid
14500 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d   an oversize mem
14510 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ory allocation..
14520 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14530 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63  * Type entries c
14540 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  an be between 1 
14550 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68  and 5 bytes each
14560 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62  .  But 4 and 5 b
14570 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  yte.      ** typ
14580 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64  es use so much d
14590 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20 74  ata space that t
145a0 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65  here can only be
145b0 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a   4096 and 32 of.
145c0 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72        ** them, r
145d0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f  espectively.  So
145e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61   the maximum hea
145f0 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c  der length resul
14600 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 20  ts from a.      
14610 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 66  ** 3-byte type f
14620 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d  or each of the m
14630 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20  aximum of 32768 
14640 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
14650 65 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ee.      ** extr
14660 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 20  a bytes for the 
14670 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74  header length it
14680 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b  self.  32768*3 +
14690 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20   3 = 98307..    
146a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
146b0 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 7c 7c  ffset > 98307 ||
146c0 20 6f 66 66 73 65 74 20 3e 20 70 43 2d 3e 70 61   offset > pC->pa
146d0 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20  yloadSize ){.   
146e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
146f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14700 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
14710 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
14720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14730 65 20 69 66 28 20 6f 66 66 73 65 74 3e 30 20 29  e if( offset>0 )
14740 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  { /*OPTIMIZATION
14750 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20  -IF-TRUE*/.     
14760 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
14770 67 20 67 6f 74 6f 20 69 73 20 61 6e 20 6f 70 74  g goto is an opt
14780 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 63  imization.  It c
14790 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 6e  an be omitted an
147a0 64 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 72 79  d.      ** every
147b0 74 68 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c  thing will still
147c0 20 77 6f 72 6b 2e 20 20 42 75 74 20 4f 50 5f 43   work.  But OP_C
147d0 6f 6c 75 6d 6e 20 69 73 20 6d 65 61 73 75 72 61  olumn is measura
147e0 62 6c 79 20 66 61 73 74 65 72 0a 20 20 20 20 20  bly faster.     
147f0 20 2a 2a 20 62 79 20 73 6b 69 70 70 69 6e 67 20   ** by skipping 
14800 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 63  the subsequent c
14810 6f 6e 64 69 74 69 6f 6e 61 6c 2c 20 77 68 69 63  onditional, whic
14820 68 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65  h is always true
14830 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14840 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
14850 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
14860 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
14870 3d 70 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f  =p2 );         /
14880 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b  * Conditional sk
14890 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ipped */.      g
148a0 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65  oto op_column_re
148b0 61 64 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d  ad_header;.    }
148c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
148d0 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 74 68  sure at least th
148e0 65 20 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74  e first p2+1 ent
148f0 72 69 65 73 20 6f 66 20 74 68 65 20 68 65 61 64  ries of the head
14900 65 72 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a  er have been.  *
14910 2a 20 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c  * parsed and val
14920 69 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  id information i
14930 73 20 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61  s in aOffset[] a
14940 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a  nd pC->aType[]..
14950 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e    */.  if( pC->n
14960 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b  HdrParsed<=p2 ){
14970 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14980 20 69 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20   is more header 
14990 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61  available for pa
149a0 72 73 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63  rsing in the rec
149b0 6f 72 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20  ord, try.    ** 
149c0 74 6f 20 65 78 74 72 61 63 74 20 61 64 64 69 74  to extract addit
149d0 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20  ional fields up 
149e0 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31  through the p2+1
149f0 2d 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a  -th field .    *
14a00 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48  /.    if( pC->iH
14a10 64 72 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74  drOffset<aOffset
14a20 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
14a30 4d 61 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20  Make sure zData 
14a40 70 6f 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68  points to enough
14a50 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   of the record t
14a60 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64  o cover the head
14a70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
14a80 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a   pC->aRow==0 ){.
14a90 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
14aa0 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sMem, 0, sizeof(
14ab0 73 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  sMem));.        
14ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14ad0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
14ae0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
14af0 61 4f 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65  aOffset[0], &sMe
14b00 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
14b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14b20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
14b30 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
14b40 20 7a 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d   zData = (u8*)sM
14b50 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  em.z;.      }els
14b60 65 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61  e{.        zData
14b70 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20   = pC->aRow;.   
14b80 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
14b90 20 46 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79   Fill in pC->aTy
14ba0 70 65 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65  pe[i] and aOffse
14bb0 74 5b 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f  t[i] values thro
14bc0 75 67 68 20 74 68 65 20 70 32 2d 74 68 20 66 69  ugh the p2-th fi
14bd0 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63  eld. */.    op_c
14be0 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65  olumn_read_heade
14bf0 72 3a 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d  r:.      i = pC-
14c00 3e 6e 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20  >nHdrParsed;.   
14c10 20 20 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f     offset64 = aO
14c20 66 66 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20  ffset[i];.      
14c30 7a 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70  zHdr = zData + p
14c40 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20  C->iHdrOffset;. 
14c50 20 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a       zEndHdr = z
14c60 44 61 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30  Data + aOffset[0
14c70 5d 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ];.      do{.   
14c80 20 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a 48       if( (t = zH
14c90 64 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20  dr[0])<0x80 ){. 
14ca0 20 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b           zHdr++;
14cb0 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
14cc0 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64  t64 += sqlite3Vd
14cd0 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
14ce0 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20  ypeLen(t);.     
14cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d00 20 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69      zHdr += sqli
14d10 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a  te3GetVarint32(z
14d20 48 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20  Hdr, &t);.      
14d30 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20      offset64 += 
14d40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14d50 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20  lTypeLen(t);.   
14d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
14d70 43 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20  C->aType[i++] = 
14d80 74 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73  t;.        aOffs
14d90 65 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f 66  et[i] = (u32)(of
14da0 66 73 65 74 36 34 20 26 20 30 78 66 66 66 66 66  fset64 & 0xfffff
14db0 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  fff);.      }whi
14dc0 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 64  le( i<=p2 && zHd
14dd0 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20  r<zEndHdr );..  
14de0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
14df0 64 20 69 73 20 63 6f 72 72 75 70 74 20 69 66 20  d is corrupt if 
14e00 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
14e10 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
14e20 20 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20       ** (1) the 
14e30 62 79 74 65 73 20 6f 66 20 74 68 65 20 68 65 61  bytes of the hea
14e40 64 65 72 20 65 78 74 65 6e 64 20 70 61 73 74 20  der extend past 
14e50 74 68 65 20 64 65 63 6c 61 72 65 64 20 68 65 61  the declared hea
14e60 64 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  der size.      *
14e70 2a 20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65  * (2) the entire
14e80 20 68 65 61 64 65 72 20 77 61 73 20 75 73 65 64   header was used
14e90 20 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74   but not all dat
14ea0 61 20 77 61 73 20 75 73 65 64 0a 20 20 20 20 20  a was used.     
14eb0 20 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20   ** (3) the end 
14ec0 6f 66 20 74 68 65 20 64 61 74 61 20 65 78 74 65  of the data exte
14ed0 6e 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65  nds beyond the e
14ee0 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
14ef0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14f00 20 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64   if( (zHdr>=zEnd
14f10 48 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e  Hdr && (zHdr>zEn
14f20 64 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34  dHdr || offset64
14f30 21 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  !=pC->payloadSiz
14f40 65 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f  e)).       || (o
14f50 66 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61  ffset64 > pC->pa
14f60 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20  yloadSize).     
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14f80 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71  pC->aRow==0 ) sq
14f90 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
14fa0 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20  ase(&sMem);.    
14fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14fc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14fd0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
14fe0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
14ff0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 43       }..      pC
15000 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 69  ->nHdrParsed = i
15010 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64 72  ;.      pC->iHdr
15020 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 28 7a  Offset = (u32)(z
15030 48 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20  Hdr - zData);.  
15040 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77      if( pC->aRow
15050 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
15060 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
15070 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
15080 20 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20 20       t = 0;.    
15090 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74  }..    /* If aft
150a0 65 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74  er trying to ext
150b0 72 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73  ract new entries
150c0 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72   from the header
150d0 2c 20 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a  , nHdrParsed is.
150e0 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74      ** still not
150f0 20 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20   up to p2, that 
15100 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
15110 65 63 6f 72 64 20 68 61 73 20 66 65 77 65 72 20  ecord has fewer 
15120 74 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63  than p2.    ** c
15130 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20  olumns.  So the 
15140 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65  result will be e
15150 69 74 68 65 72 20 74 68 65 20 64 65 66 61 75 6c  ither the defaul
15160 74 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c  t value or a NUL
15170 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
15180 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  ( pC->nHdrParsed
15190 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66  <=p2 ){.      if
151a0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
151b0 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  4_MEM ){.       
151c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
151d0 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74  hallowCopy(pDest
151e0 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20  , pOp->p4.pMem, 
151f0 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  MEM_Static);.   
15200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15210 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
15220 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a  SetNull(pDest);.
15230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
15240 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
15250 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15260 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79  .    t = pC->aTy
15270 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  pe[p2];.  }..  /
15280 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f  * Extract the co
15290 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32  ntent for the p2
152a0 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43  +1-th column.  C
152b0 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a  ontrol can only.
152c0 20 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20    ** reach this 
152d0 70 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74  point if aOffset
152e0 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32  [p2], aOffset[p2
152f0 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79  +1], and pC->aTy
15300 70 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20  pe[p2] are.  ** 
15310 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a  all valid..  */.
15320 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d    assert( p2<pC-
15330 3e 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20  >nHdrParsed );. 
15340 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
15350 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
15360 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
15370 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
15380 73 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66  s(pDest) );.  if
15390 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
153a0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 73  (pDest) ){.    s
153b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
153c0 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 7d  Null(pDest);.  }
153d0 0a 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70 43  .  assert( t==pC
153e0 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a 20  ->aType[p2] );. 
153f0 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e 3d   if( pC->szRow>=
15400 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29 7b  aOffset[p2+1] ){
15410 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
15420 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
15430 77 68 65 72 65 20 74 68 65 20 64 65 73 69 72 65  where the desire
15440 64 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20 6f  d content fits o
15450 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  n the original. 
15460 20 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68 65     ** page - whe
15470 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  re the content i
15480 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65 72  s not on an over
15490 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 20  flow page */.   
154a0 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
154b0 77 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d 3b  w + aOffset[p2];
154c0 0a 20 20 20 20 69 66 28 20 74 3c 31 32 20 29 7b  .    if( t<12 ){
154d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
154e0 62 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61 74  beSerialGet(zDat
154f0 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  a, t, pDest);.  
15500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
15510 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
15520 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
15530 67 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65 72  g, we need a per
15540 73 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20 6e  sistent value, n
15550 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d 45  ot.      ** a ME
15560 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20 20  M_Ephem value.  
15570 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
15580 20 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74 20   fast short-cut 
15590 74 68 61 74 20 69 73 20 65 71 75 69 76 61 6c 65  that is equivale
155a0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 63  nt.      ** to c
155b0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 64  alling sqlite3Vd
155c0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
155d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 65  d sqlite3VdbeDee
155e0 70 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a 20  phemeralize().. 
155f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
15600 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
15610 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
15620 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  lob, MEM_Str|MEM
15630 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20 70  _Term };.      p
15640 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d 20  Dest->n = len = 
15650 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  (t-12)/2;.      
15660 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
15670 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66 28  oding;.      if(
15680 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f 63   pDest->szMalloc
15690 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20 20   < len+2 ){.    
156a0 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
156b0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
156c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
156d0 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65 73  VdbeMemGrow(pDes
156e0 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20 67  t, len+2, 0) ) g
156f0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
15700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15710 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65 73   pDest->z = pDes
15720 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  t->zMalloc;.    
15730 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
15740 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74 61  (pDest->z, zData
15750 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70 44  , len);.      pD
15760 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30 3b  est->z[len] = 0;
15770 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b  .      pDest->z[
15780 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  len+1] = 0;.    
15790 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d    pDest->flags =
157a0 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20 20   aFlag[t&1];.   
157b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
157c0 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
157d0 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54 68  oding;.    /* Th
157e0 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e  is branch happen
157f0 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74  s only when cont
15800 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c  ent is on overfl
15810 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ow pages */.    
15820 69 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  if( ((pOp->p5 & 
15830 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
15840 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
15850 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RG))!=0.        
15860 20 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20    && ((t>=12 && 
15870 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f  (t&1)==0) || (pO
15880 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54  p->p5 & OPFLAG_T
15890 59 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20  YPEOFARG)!=0)). 
158a0 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71      || (len = sq
158b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
158c0 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20  ypeLen(t))==0.  
158d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f    ){.      /* Co
158e0 6e 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76  ntent is irrelev
158f0 61 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ant for.      **
15900 20 20 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f      1. the typeo
15910 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20  f() function,.  
15920 20 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65      **    2. the
15930 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74   length(X) funct
15940 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c  ion if X is a bl
15950 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ob, and.      **
15960 20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f      3. if the co
15970 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20  ntent length is 
15980 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53  zero..      ** S
15990 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65  o we might as we
159a0 6c 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e  ll use bogus con
159b0 74 65 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e  tent rather than
159c0 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a   reading.      *
159d0 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  * content from d
159e0 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  isk. .      **. 
159f0 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67 68       ** Although
15a00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15a10 61 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61 64  alGet() may read
15a20 20 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65 73   at most 8 bytes
15a30 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
15a40 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
15a50 20 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69 6e   to it, debuggin
15a60 67 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65 4d  g function VdbeM
15a70 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29 20  emPrettyPrint() 
15a80 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  may.      ** rea
15a90 64 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20 31  d up to 16. So 1
15aa0 36 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75 73  6 bytes of bogus
15ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70 70   content is supp
15ac0 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lied..      */. 
15ad0 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20 61       static u8 a
15ae0 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54 68  Zero[16];  /* Th
15af0 69 73 20 69 73 20 74 68 65 20 62 6f 67 75 73 20  is is the bogus 
15b00 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20  content */.     
15b10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15b20 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20  alGet(aZero, t, 
15b30 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  pDest);.    }els
15b40 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
15b50 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
15b60 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75  Btree(pC->uc.pCu
15b70 72 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70 32  rsor, aOffset[p2
15b80 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a  ], len, pDest);.
15b90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15ba0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
15bb0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
15bc0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
15bd0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 63  VdbeSerialGet((c
15be0 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d 3e  onst u8*)pDest->
15bf0 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  z, t, pDest);.  
15c00 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
15c10 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a   &= ~MEM_Ephem;.
15c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f      }.  }..op_co
15c30 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41  lumn_out:.  UPDA
15c40 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
15c50 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54  pDest);.  REGIST
15c60 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
15c70 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61  , pDest);.  brea
15c80 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
15c90 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32 20   Affinity P1 P2 
15ca0 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
15cb0 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b 50  is: affinity(r[P
15cc0 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70  1@P2]).**.** App
15cd0 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  ly affinities to
15ce0 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20 72   a range of P2 r
15cf0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
15d00 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a  g with P1..**.**
15d10 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67 20   P4 is a string 
15d20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61  that is P2 chara
15d30 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20  cters long. The 
15d40 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
15d50 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
15d60 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
15d70 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
15d80 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
15d90 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
15da0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
15db0 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73  he range..*/.cas
15dc0 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b  e OP_Affinity: {
15dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15de0 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54  Affinity;   /* T
15df0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62  he affinity to b
15e00 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63  e applied */.  c
15e10 68 61 72 20 63 41 66 66 3b 20 20 20 20 20 20 20  har cAff;       
15e20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
15e30 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  gle character of
15e40 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20   affinity */..  
15e50 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
15e60 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
15e70 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b   zAffinity!=0 );
15e80 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
15e90 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30  nity[pOp->p2]==0
15ea0 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
15eb0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77  em[pOp->p1];.  w
15ec0 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20 2a 28  hile( (cAff = *(
15ed0 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30  zAffinity++))!=0
15ee0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15ef0 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
15f00 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  [(p->nMem+1 - p-
15f10 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20  >nCursor)] );.  
15f20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
15f30 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
15f40 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
15f50 70 49 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f  pIn1, cAff, enco
15f60 64 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b  ding);.    pIn1+
15f70 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
15f80 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
15f90 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
15fa0 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
15fb0 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28  is: r[P3]=mkrec(
15fc0 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  r[P1@P2]).**.** 
15fd0 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69 73  Convert P2 regis
15fe0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
15ff0 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20  ith P1 into the 
16000 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a  [record format].
16010 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74 61  ** use as a data
16020 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
16030 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
16040 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
16050 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f   index.  The OP_
16060 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61  Column opcode ca
16070 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 63  n decode the rec
16080 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a  ord later..**.**
16090 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72   P4 may be a str
160a0 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
160b0 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
160c0 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63 74   The nth charact
160d0 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72  er of the.** str
160e0 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  ing indicates th
160f0 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
16100 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  y that should be
16110 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74   used for the nt
16120 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  h.** field of th
16130 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a  e index key..**.
16140 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66  ** The mapping f
16150 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f  rom character to
16160 20 61 66 66 69 6e 69 74 79 20 69 73 20 67 69 76   affinity is giv
16170 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  en by the SQLITE
16180 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20  _AFF_.** macros 
16190 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
161a0 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66  eInt.h..**.** If
161b0 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P4 is NULL then
161c0 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64   all index field
161d0 73 20 68 61 76 65 20 74 68 65 20 61 66 66 69 6e  s have the affin
161e0 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73  ity BLOB..*/.cas
161f0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a  e OP_MakeRecord:
16200 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65 63   {.  u8 *zNewRec
16210 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ord;        /* A
16220 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
16230 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
16240 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
16250 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20 20 20   Mem *pRec;     
16260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
16270 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75  ew record */.  u
16280 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  64 nData;       
16290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
162a0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
162b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20   space */.  int 
162c0 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  nHdr;           
162d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
162e0 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  bytes of header 
162f0 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e  space */.  i64 n
16300 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
16310 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63 65 20    /* Data space 
16320 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
16330 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36  s record */.  i6
16340 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20  4 nZero;        
16350 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16360 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  f zero bytes at 
16370 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
16380 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
16390 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20 20 20  Varint;         
163a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
163b0 79 74 65 73 20 69 6e 20 61 20 76 61 72 69 6e 74  ytes in a varint
163c0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
163d0 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  _type;       /* 
163e0 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Type field */.  
163f0 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20 20 20  Mem *pData0;    
16400 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16410 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62  field to be comb
16420 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 72 65  ined into the re
16430 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  cord */.  Mem *p
16440 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
16450 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64 20 6f   /* Last field o
16460 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
16470 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
16480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16490 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
164a0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
164b0 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b  char *zAffinity;
164c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66         /* The af
164d0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
164e0 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  r the record */.
164f0 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61    int file_forma
16500 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  t;       /* File
16510 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 66   format to use f
16520 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  or encoding */. 
16530 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16540 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
16550 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63   used in zNewRec
16560 6f 72 64 5b 5d 20 68 65 61 64 65 72 20 2a 2f 0a  ord[] header */.
16570 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
16580 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
16590 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65  e used in zNewRe
165a0 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 6e 74 20 2a  cord[] content *
165b0 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
165c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
165d0 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c 64 20  ngth of a field 
165e0 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e  */..  /* Assumin
165f0 67 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  g the record con
16600 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20  tains N fields, 
16610 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
16620 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b  t looks.  ** lik
16630 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
16640 2a 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
16690 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74 79 70  | hdr-size | typ
166a0 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c 20 2e  e 0 | type 1 | .
166b0 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20 7c 20  .. | type N-1 | 
166c0 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20 64 61  data0 | ... | da
166d0 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d  ta N-1 | .  ** -
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16720 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a  -------.  **.  *
16730 2a 20 44 61 74 61 28 30 29 20 69 73 20 74 61 6b  * Data(0) is tak
16740 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
16750 20 50 31 2e 20 20 44 61 74 61 28 31 29 20 63 6f   P1.  Data(1) co
16760 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73 74 65  mes from registe
16770 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e 64 20  r P1+1.  ** and 
16780 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20  so forth..  **. 
16790 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20 66 69   ** Each type fi
167a0 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e 74 20  eld is a varint 
167b0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
167c0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
167d0 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72 65 73  the .  ** corres
167e0 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65 6c 65  ponding data ele
167f0 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69 74 65  ment (see sqlite
16800 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
16810 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68 64 72  )). The.  ** hdr
16820 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
16830 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77 68 69  lso a varint whi
16840 63 68 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ch is the offset
16850 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
16860 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
16870 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61 30 2e  record to data0.
16880 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20 3d 20  .  */.  nData = 
16890 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
168a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
168b0 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20   data space */. 
168c0 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20 20 20   nHdr = 0;      
168d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
168e0 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   bytes of header
168f0 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a 65 72   space */.  nZer
16900 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  o = 0;         /
16910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f  * Number of zero
16920 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
16930 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
16940 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  */.  nField = pO
16950 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69  p->p1;.  zAffini
16960 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  ty = pOp->p4.z;.
16970 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
16980 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20  >0 && pOp->p2>0 
16990 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c  && pOp->p2+nFiel
169a0 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  d<=(p->nMem+1 - 
169b0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
169c0 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61 4d 65  .  pData0 = &aMe
169d0 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69  m[nField];.  nFi
169e0 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  eld = pOp->p2;. 
169f0 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30   pLast = &pData0
16a00 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69  [nField-1];.  fi
16a10 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d  le_format = p->m
16a20 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
16a30 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  t;..  /* Identif
16a40 79 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  y the output reg
16a50 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  ister */.  asser
16a60 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e  t( pOp->p3<pOp->
16a70 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70  p1 || pOp->p3>=p
16a80 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29  Op->p1+pOp->p2 )
16a90 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
16aa0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
16ab0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
16ac0 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70   pOut);..  /* Ap
16ad0 70 6c 79 20 74 68 65 20 72 65 71 75 65 73 74 65  ply the requeste
16ae0 64 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 6c  d affinity to al
16af0 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20  l inputs.  */.  
16b00 61 73 73 65 72 74 28 20 70 44 61 74 61 30 3c 3d  assert( pData0<=
16b10 70 4c 61 73 74 20 29 3b 0a 20 20 69 66 28 20 7a  pLast );.  if( z
16b20 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  Affinity ){.    
16b30 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20  pRec = pData0;. 
16b40 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 70 70     do{.      app
16b50 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 63 2b  lyAffinity(pRec+
16b60 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b  +, *(zAffinity++
16b70 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  ), encoding);.  
16b80 20 20 20 20 61 73 73 65 72 74 28 20 7a 41 66 66      assert( zAff
16b90 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70  inity[0]==0 || p
16ba0 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20  Rec<=pLast );.  
16bb0 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e    }while( zAffin
16bc0 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23  ity[0] );.  }..#
16bd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16be0 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20  BLE_NULL_TRIM.  
16bf0 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e 20 62 65 20  /* NULLs can be 
16c00 73 61 66 65 6c 79 20 74 72 69 6d 6d 65 64 20 66  safely trimmed f
16c10 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
16c20 68 65 20 72 65 63 6f 72 64 2c 20 61 73 20 6c 6f  he record, as lo
16c30 6e 67 20 61 73 0a 20 20 2a 2a 20 61 73 20 74 68  ng as.  ** as th
16c40 65 20 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 20  e schema format 
16c50 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
16c60 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6d 69   none of the omi
16c70 74 74 65 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tted columns.  *
16c80 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c  * have a non-NUL
16c90 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  L default value.
16ca0 20 20 41 6c 73 6f 2c 20 74 68 65 20 72 65 63 6f    Also, the reco
16cb0 72 64 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20  rd must be left 
16cc0 77 69 74 68 0a 20 20 2a 2a 20 61 74 20 6c 65 61  with.  ** at lea
16cd0 73 74 20 6f 6e 65 20 66 69 65 6c 64 2e 20 20 49  st one field.  I
16ce0 66 20 50 35 3e 30 20 74 68 65 6e 20 69 74 20 77  f P5>0 then it w
16cf0 69 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f 72 65 20  ill be one more 
16d00 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  than the.  ** in
16d10 64 65 78 20 6f 66 20 74 68 65 20 72 69 67 68 74  dex of the right
16d20 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 77 69 74  -most column wit
16d30 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66  h a non-NULL def
16d40 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
16d50 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
16d60 20 20 20 77 68 69 6c 65 28 20 28 70 4c 61 73 74     while( (pLast
16d70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
16d80 6c 6c 29 21 3d 30 20 26 26 20 6e 46 69 65 6c 64  ll)!=0 && nField
16d90 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20  >pOp->p5 ){.    
16da0 20 20 70 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20    pLast--;.     
16db0 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d   nField--;.    }
16dc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16dd0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
16de0 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  he elements that
16df0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68   will make up th
16e00 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75  e record to figu
16e10 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20  re.  ** out how 
16e20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
16e30 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e  quired for the n
16e40 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ew record..  */.
16e50 20 20 70 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a    pRec = pLast;.
16e60 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
16e70 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65  ( memIsValid(pRe
16e80 63 29 20 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e  c) );.    pRec->
16e90 75 54 65 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74  uTemp = serial_t
16ea0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
16eb0 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63  eSerialType(pRec
16ec0 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26  , file_format, &
16ed0 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 52  len);.    if( pR
16ee0 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ec->flags & MEM_
16ef0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
16f00 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( nData ){.     
16f10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
16f20 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
16f30 70 52 65 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pRec) ) goto no_
16f40 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mem;.      }else
16f50 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 6f 20  {.        nZero 
16f60 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
16f70 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d  ;.        len -=
16f80 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRec->u.nZero;.
16f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16fa0 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a    nData += len;.
16fb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
16fc0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29  rial_type==127 )
16fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16fe0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38  serial_type==128
16ff0 20 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20   );.    nHdr += 
17000 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37  serial_type<=127
17010 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 56 61   ? 1 : sqlite3Va
17020 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
17030 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ype);.    if( pR
17040 65 63 3d 3d 70 44 61 74 61 30 20 29 20 62 72 65  ec==pData0 ) bre
17050 61 6b 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a  ak;.    pRec--;.
17060 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20    }while(1);..  
17070 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17080 52 2d 32 32 35 36 34 2d 31 31 36 34 37 20 54 68  R-22564-11647 Th
17090 65 20 68 65 61 64 65 72 20 62 65 67 69 6e 73 20  e header begins 
170a0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 76 61  with a single va
170b0 72 69 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68 20  rint.  ** which 
170c0 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
170d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
170e0 79 74 65 73 20 69 6e 20 74 68 65 20 68 65 61 64  ytes in the head
170f0 65 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 20  er. The varint. 
17100 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65   ** value is the
17110 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
17120 64 65 72 20 69 6e 20 62 79 74 65 73 20 69 6e 63  der in bytes inc
17130 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20  luding the size 
17140 76 61 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65  varint.  ** itse
17150 6c 66 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  lf. */.  testcas
17160 65 28 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a  e( nHdr==126 );.
17170 20 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72    testcase( nHdr
17180 3d 3d 31 32 37 20 29 3b 0a 20 20 69 66 28 20 6e  ==127 );.  if( n
17190 48 64 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20  Hdr<=126 ){.    
171a0 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
171b0 73 65 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b  se */.    nHdr +
171c0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
171d0 20 20 2f 2a 20 52 61 72 65 20 63 61 73 65 20 6f    /* Rare case o
171e0 66 20 61 20 72 65 61 6c 6c 79 20 6c 61 72 67 65  f a really large
171f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e   header */.    n
17200 56 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33  Varint = sqlite3
17210 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b  VarintLen(nHdr);
17220 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61  .    nHdr += nVa
17230 72 69 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 56  rint;.    if( nV
17240 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72  arint<sqlite3Var
17250 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e  intLen(nHdr) ) n
17260 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79  Hdr++;.  }.  nBy
17270 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b  te = nHdr+nData;
17280 0a 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 5a 65  .  if( nByte+nZe
17290 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  ro>db->aLimit[SQ
172a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
172b0 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
172c0 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f  oo_big;.  }..  /
172d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
172e0 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
172f0 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61 72  has a buffer lar
17300 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f  ge enough to sto
17310 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77  re .  ** the new
17320 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75 74   record. The out
17330 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70 4f  put register (pO
17340 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61 6c  p->p3) is not al
17350 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65  lowed to.  ** be
17360 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75   one of the inpu
17370 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65 63  t registers (bec
17380 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ause the followi
17390 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20  ng call to.  ** 
173a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
173b0 65 61 72 41 6e 64 52 65 73 69 7a 65 28 29 20 63  earAndResize() c
173c0 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20 74 68 65  ould clobber the
173d0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 69 74   value before it
173e0 20 69 73 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a   is used)..  */.
173f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
17400 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
17410 7a 65 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42  ze(pOut, (int)nB
17420 79 74 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  yte) ){.    goto
17430 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a   no_mem;.  }.  z
17440 4e 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20  NewRecord = (u8 
17450 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a  *)pOut->z;..  /*
17460 20 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72   Write the recor
17470 64 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61  d */.  i = putVa
17480 72 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72  rint32(zNewRecor
17490 64 2c 20 6e 48 64 72 29 3b 0a 20 20 6a 20 3d 20  d, nHdr);.  j = 
174a0 6e 48 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  nHdr;.  assert( 
174b0 70 44 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b  pData0<=pLast );
174c0 0a 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30  .  pRec = pData0
174d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 65 72 69  ;.  do{.    seri
174e0 61 6c 5f 74 79 70 65 20 3d 20 70 52 65 63 2d 3e  al_type = pRec->
174f0 75 54 65 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56  uTemp;.    /* EV
17500 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35  IDENCE-OF: R-065
17510 32 39 2d 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69  29-47362 Followi
17520 6e 67 20 74 68 65 20 73 69 7a 65 20 76 61 72 69  ng the size vari
17530 6e 74 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  nt are one or mo
17540 72 65 0a 20 20 20 20 2a 2a 20 61 64 64 69 74 69  re.    ** additi
17550 6f 6e 61 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e  onal varints, on
17560 65 20 70 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  e per column. */
17570 0a 20 20 20 20 69 20 2b 3d 20 70 75 74 56 61 72  .    i += putVar
17580 69 6e 74 33 32 28 26 7a 4e 65 77 52 65 63 6f 72  int32(&zNewRecor
17590 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  d[i], serial_typ
175a0 65 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  e);            /
175b0 2a 20 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f  * serial type */
175c0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
175d0 2d 4f 46 3a 20 52 2d 36 34 35 33 36 2d 35 31 37  -OF: R-64536-517
175e0 32 38 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f  28 The values fo
175f0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  r each column in
17600 20 74 68 65 20 72 65 63 6f 72 64 0a 20 20 20 20   the record.    
17610 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
17620 6f 6c 6c 6f 77 20 74 68 65 20 68 65 61 64 65 72  ollow the header
17630 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b 3d 20 73 71  . */.    j += sq
17640 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
17650 75 74 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a  ut(&zNewRecord[j
17660 5d 2c 20 70 52 65 63 2c 20 73 65 72 69 61 6c 5f  ], pRec, serial_
17670 74 79 70 65 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e  type); /* conten
17680 74 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 28  t */.  }while( (
17690 2b 2b 70 52 65 63 29 3c 3d 70 4c 61 73 74 20 29  ++pRec)<=pLast )
176a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e  ;.  assert( i==n
176b0 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Hdr );.  assert(
176c0 20 6a 3d 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20   j==nByte );..  
176d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
176e0 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
176f0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
17700 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74  ursor) );.  pOut
17710 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65  ->n = (int)nByte
17720 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
17730 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66  = MEM_Blob;.  if
17740 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70  ( nZero ){.    p
17750 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e  Out->u.nZero = n
17760 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Zero;.    pOut->
17770 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72  flags |= MEM_Zer
17780 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65  o;.  }.  pOut->e
17790 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
177a0 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68  ;  /* In case th
177b0 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63  e blob is ever c
177c0 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78 74  onverted to text
177d0 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54   */.  REGISTER_T
177e0 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f  RACE(pOp->p3, pO
177f0 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ut);.  UPDATE_MA
17800 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
17810 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
17820 20 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50   Opcode: Count P
17830 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
17840 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f  nopsis: r[P2]=co
17850 75 6e 74 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  unt().**.** Stor
17860 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
17870 65 6e 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65  entries (an inte
17880 67 65 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68  ger value) in th
17890 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
178a0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63   .** opened by c
178b0 75 72 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69  ursor P1 in regi
178c0 73 74 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64  ster P2.*/.#ifnd
178d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
178e0 54 52 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f  TREECOUNT.case O
178f0 50 5f 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20  P_Count: {      
17900 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
17910 69 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74  i64 nEntry;.  Bt
17920 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a  Cursor *pCrsr;..
17930 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
17940 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75  sr[pOp->p1]->eCu
17950 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17960 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
17970 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
17980 70 31 5d 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b  p1]->uc.pCursor;
17990 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72  .  assert( pCrsr
179a0 20 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30   );.  nEntry = 0
179b0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
179c0 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
179d0 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
179e0 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
179f0 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70  ite3BtreeCount(p
17a00 43 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a  Crsr, &nEntry);.
17a10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17a20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
17a30 6f 72 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  or;.  pOut = out
17a40 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
17a50 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  Op);.  pOut->u.i
17a60 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65   = nEntry;.  bre
17a70 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
17a80 20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69   Opcode: Savepoi
17a90 6e 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  nt P1 * * P4 *.*
17aa0 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61  *.** Open, relea
17ab0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74  se or rollback t
17ac0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d  he savepoint nam
17ad0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
17ae0 50 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  P4, depending.**
17af0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
17b00 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e   P1. To open a n
17b10 65 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31  ew savepoint, P1
17b20 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20  ==0. To release 
17b30 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65  (commit) an.** e
17b40 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e  xisting savepoin
17b50 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20  t, P1==1, or to 
17b60 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73  rollback an exis
17b70 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50  ting savepoint P
17b80 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  1==2..*/.case OP
17b90 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20  _Savepoint: {.  
17ba0 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20  int p1;         
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f  /* Value of P1 o
17bd0 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72  perand */.  char
17be0 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c00 61 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ame of savepoint
17c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
17c20 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e  .  Savepoint *pN
17c30 65 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  ew;.  Savepoint 
17c40 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53  *pSavepoint;.  S
17c50 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a  avepoint *pTmp;.
17c60 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74    int iSavepoint
17c70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70  ;.  int ii;..  p
17c80 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a  1 = pOp->p1;.  z
17c90 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  Name = pOp->p4.z
17ca0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
17cb0 68 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d  hat the p1 param
17cc0 65 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41  eter is valid. A
17cd0 6c 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72  lso that if ther
17ce0 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a  e is no open.  *
17cf0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  * transaction, t
17d00 68 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74  hen there cannot
17d10 20 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e   be any savepoin
17d20 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts. .  */.  asse
17d30 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  rt( db->pSavepoi
17d40 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74  nt==0 || db->aut
17d50 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  oCommit==0 );.  
17d60 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45  assert( p1==SAVE
17d70 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d  POINT_BEGIN||p1=
17d80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
17d90 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  SE||p1==SAVEPOIN
17da0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
17db0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76  assert( db->pSav
17dc0 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73  epoint || db->is
17dd0 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
17de0 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  oint==0 );.  ass
17df0 65 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f  ert( checkSavepo
17e00 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a  intCount(db) );.
17e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
17e20 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28  Reader );..  if(
17e30 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
17e40 45 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20  EGIN ){.    if( 
17e50 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30  db->nVdbeWrite>0
17e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   ){.      /* A n
17e70 65 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  ew savepoint can
17e80 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69  not be created i
17e90 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
17ea0 76 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20  ve write .      
17eb0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69  ** statements (i
17ec0 2e 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72  .e. open read/wr
17ed0 69 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  ite incremental 
17ee0 62 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20  blob handles).. 
17ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
17f00 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
17f10 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
17f20 61 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73  avepoint - SQL s
17f30 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f  tatements in pro
17f40 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72  gress");.      r
17f50 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17f70 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
17f80 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
17f90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17fa0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
17fb0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  BLE.      /* Thi
17fc0 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65  s call is Ok eve
17fd0 6e 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f  n if this savepo
17fe0 69 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  int is actually 
17ff0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
18000 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
18010 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
18020 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70  should not promp
18030 74 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20  t xSavepoint()) 
18040 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20  callbacks..     
18050 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
18060 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
18070 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65  epoint being ope
18080 6e 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  ned, it is guara
18090 6e 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  nteed.      ** t
180a0 68 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72  hat the db->aVTr
180b0 61 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65  ans[] array is e
180c0 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mpty.  */.      
180d0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f  assert( db->auto
180e0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
180f0 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20  >nVTrans==0 );. 
18100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18110 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
18120 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  b, SAVEPOINT_BEG
18130 49 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN,.            
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
18160 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
18170 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
18180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18190 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
181a0 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20  error;.#endif.. 
181b0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
181c0 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73   new savepoint s
181d0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
181e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
181f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
18200 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f  b, sizeof(Savepo
18210 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20  int)+nName+1);. 
18220 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
18230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
18240 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Name = (char *)&
18250 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
18260 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e   memcpy(pNew->zN
18270 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
18280 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20  e+1);.    .     
18290 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
182a0 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61  s no open transa
182b0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b  ction, then mark
182c0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
182d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74  al.        ** "t
182e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
182f0 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20  oint". */.      
18300 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
18310 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
18320 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
18330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
18340 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
18350 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a  nSavepoint = 1;.
18360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18370 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61           db->nSa
18380 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  vepoint++;.     
18390 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
183a0 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61   Link the new sa
183b0 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65  vepoint into the
183c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
183d0 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  's list. */.    
183e0 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
183f0 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
18400 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53  ;.        db->pS
18410 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b  avepoint = pNew;
18420 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
18430 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64  DeferredCons = d
18440 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
18450 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
18460 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
18470 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
18480 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d  ImmCons;.      }
18490 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
184a0 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d      iSavepoint =
184b0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   0;..    /* Find
184c0 20 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70   the named savep
184d0 6f 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69  oint. If there i
184e0 73 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f  s no such savepo
184f0 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20  int, then an.   
18500 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20   ** an error is 
18510 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
18520 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  user.  */.    fo
18530 72 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  r(.      pSavepo
18540 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  int = db->pSavep
18550 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61  oint; .      pSa
18560 76 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74  vepoint && sqlit
18570 65 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70  e3StrICmp(pSavep
18580 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  oint->zName, zNa
18590 6d 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65  me);.      pSave
185a0 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69  point = pSavepoi
185b0 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b  nt->pNext.    ){
185c0 0a 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e  .      iSavepoin
185d0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
185e0 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29  f( !pSavepoint )
185f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18600 64 62 65 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20  dbeError(p, "no 
18610 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20  such savepoint: 
18620 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
18630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
18640 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
18650 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  if( db->nVdbeWri
18660 74 65 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45  te>0 && p1==SAVE
18670 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
18680 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
18690 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
186a0 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29  release (commit)
186b0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20   a savepoint if 
186c0 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20  there are .     
186d0 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65   ** active write
186e0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
186f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
18700 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
18710 22 63 61 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20  "cannot release 
18720 73 61 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20  savepoint - ".  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61          "SQL sta
18750 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
18760 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ess");.      rc 
18770 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
18780 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20     }else{..     
18790 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
187a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
187b0 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
187c0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  on savepoint. If
187d0 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e   so,.      ** an
187e0 64 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  d this is a RELE
187f0 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65  ASE command, the
18800 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
18810 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20  ansaction .     
18820 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64   ** is committed
18830 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
18840 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74    int isTransact
18850 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ion = pSavepoint
18860 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62  ->pNext==0 && db
18870 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
18880 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
18890 69 66 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f  if( isTransactio
188a0 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49  n && p1==SAVEPOI
188b0 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
188c0 20 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20        if( (rc = 
188d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
188e0 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54  Fk(p, 1))!=SQLIT
188f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18900 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
18910 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
18920 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
18930 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
18940 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
18950 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45  eHalt(p)==SQLITE
18960 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
18970 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29     p->pc = (int)
18980 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
18990 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
189a0 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
189b0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20       p->rc = rc 
189c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
189d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
189e0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
189f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
18a00 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
18a10 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  vepoint = 0;.   
18a20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b       rc = p->rc;
18a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18a40 20 20 20 20 20 20 69 6e 74 20 69 73 53 63 68 65        int isSche
18a50 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20  maChange;.      
18a60 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64    iSavepoint = d
18a70 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20  b->nSavepoint - 
18a80 69 53 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a  iSavepoint - 1;.
18a90 20 20 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d          if( p1==
18aa0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
18ab0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
18ac0 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d  isSchemaChange =
18ad0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
18ae0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
18af0 65 73 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  es)!=0;.        
18b00 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
18b10 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
18b20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
18b30 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
18b40 41 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e 61  AllCursors(db->a
18b50 44 62 5b 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20  Db[ii].pBt,.    
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f     SQLITE_ABORT_
18b90 52 4f 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20  ROLLBACK,.      
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3d   isSchemaChange=
18bd0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  =0);.           
18be0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18bf0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
18c00 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
18c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18c30 20 20 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67     isSchemaChang
18c40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
18c50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
18c60 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  0; ii<db->nDb; i
18c70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
18c80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18c90 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61  eSavepoint(db->a
18ca0 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20  Db[ii].pBt, p1, 
18cb0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
18cc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18ce0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
18cf0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
18d00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
18d20 66 28 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67  f( isSchemaChang
18d30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
18d40 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
18d50 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
18d60 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
18d70 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
18d80 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
18d90 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
18da0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d  db->flags = (db-
18db0 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f  >flags | SQLITE_
18dc0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
18dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18de0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65  }.  .      /* Re
18df0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
18e00 68 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45  her this is a RE
18e10 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
18e20 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a  K, destroy all .
18e30 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69        ** savepoi
18e40 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64  nts nested insid
18e50 65 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  e of the savepoi
18e60 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
18e70 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77  d on. */.      w
18e80 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
18e90 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74  oint!=pSavepoint
18ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70   ){.        pTmp
18eb0 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
18ec0 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  t;.        db->p
18ed0 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
18ee0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
18ef0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18f00 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20  b, pTmp);.      
18f10 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
18f20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  --;.      }..   
18f30 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61     /* If it is a
18f40 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64   RELEASE, then d
18f50 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
18f60 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
18f70 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ted on .      **
18f80 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61   too. If it is a
18f90 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68   ROLLBACK TO, th
18fa0 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65  en set the numbe
18fb0 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20  r of deferred . 
18fc0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
18fd0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72  nt violations pr
18fe0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
18ff0 61 62 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c  abase to the val
19000 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  ue stored.      
19010 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76 65  ** when the save
19020 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
19030 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
19040 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
19050 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
19060 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65 70    assert( pSavep
19070 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70  oint==db->pSavep
19080 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  oint );.        
19090 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
190a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
190b0 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
190c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
190d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
190e0 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61     if( !isTransa
190f0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19100 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e     db->nSavepoin
19110 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
19120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19130 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
19140 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  dCons = pSavepoi
19150 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  nt->nDeferredCon
19160 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  s;.        db->n
19170 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
19180 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44  = pSavepoint->nD
19190 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
191a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
191b0 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f  f( !isTransactio
191c0 6e 20 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49  n || p1==SAVEPOI
191d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
191e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
191f0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
19200 28 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  (db, p1, iSavepo
19210 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
19220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19230 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
19240 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
19250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
19260 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
19270 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
19280 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ..  break;.}../*
19290 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d   Opcode: AutoCom
192a0 6d 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  mit P1 P2 * * *.
192b0 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61  **.** Set the da
192c0 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d  tabase auto-comm
192d0 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31  it flag to P1 (1
192e0 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69 73   or 0). If P2 is
192f0 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62   true, roll.** b
19300 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c  ack any currentl
19310 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20 74  y active btree t
19320 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20  ransactions. If 
19330 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61 63  there are any ac
19340 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61  tive.** VMs (apa
19350 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65  rt from this one
19360 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41  ), then a ROLLBA
19370 43 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d  CK fails.  A COM
19380 4d 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20  MIT fails if.** 
19390 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
193a0 20 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20   writing VMs or 
193b0 61 63 74 69 76 65 20 56 4d 73 20 74 68 61 74 20  active VMs that 
193c0 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
193d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
193e0 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20  truction causes 
193f0 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a  the VM to halt..
19400 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43  */.case OP_AutoC
19410 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64  ommit: {.  int d
19420 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
19430 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63  ;.  int iRollbac
19440 6b 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74  k;..  desiredAut
19450 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70  oCommit = pOp->p
19460 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d  1;.  iRollback =
19470 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65   pOp->p2;.  asse
19480 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
19490 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69  ommit==1 || desi
194a0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  redAutoCommit==0
194b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
194c0 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d  siredAutoCommit=
194d0 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d  =1 || iRollback=
194e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
194f0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
19500 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73  0 );  /* At leas
19510 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73  t this one VM is
19520 20 61 63 74 69 76 65 20 2a 2f 0a 20 20 61 73 73   active */.  ass
19530 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
19540 72 20 29 3b 0a 0a 20 20 69 66 28 20 64 65 73 69  r );..  if( desi
19550 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64  redAutoCommit!=d
19560 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
19570 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61  .    if( iRollba
19580 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ck ){.      asse
19590 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
195a0 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20  ommit==1 );.    
195b0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
195c0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
195d0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
195e0 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
195f0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ommit = 1;.    }
19600 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65 64  else if( desired
19610 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  AutoCommit && db
19620 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29  ->nVdbeWrite>0 )
19630 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
19640 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
19650 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d  mplements a COMM
19660 49 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73  IT and other VMs
19670 20 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20   are writing.   
19680 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
19690 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67  error indicating
196a0 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
196b0 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  VMs must complet
196c0 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 20 20  e first. .      
196d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
196e0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61  VdbeError(p, "ca
196f0 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e  nnot commit tran
19700 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20  saction - ".    
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65        "SQL state
19730 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73  ments in progres
19740 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s");.      rc = 
19750 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
19760 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19770 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
19780 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
19790 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
197a0 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54  Fk(p, 1))!=SQLIT
197b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
197c0 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
197d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
197e0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
197f0 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74  = (u8)desiredAut
19800 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  oCommit;.    }. 
19810 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
19820 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54  beHalt(p)==SQLIT
19830 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
19840 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  p->pc = (int)(pO
19850 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20  p - aOp);.      
19860 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
19870 20 28 75 38 29 28 31 2d 64 65 73 69 72 65 64 41   (u8)(1-desiredA
19880 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  utoCommit);.    
19890 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
198a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
198b0 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
198c0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
198d0 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
198e0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ment==0 );.    s
198f0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
19900 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69  oints(db);.    i
19910 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19930 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19950 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
19960 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  R;.    }.    got
19970 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
19980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
19990 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a  te3VdbeError(p,.
199a0 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65          (!desire
199b0 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61  dAutoCommit)?"ca
199c0 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
199d0 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nsaction within 
199e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28  a transaction":(
199f0 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62  .        (iRollb
19a00 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c  ack)?"cannot rol
19a10 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73  lback - no trans
19a20 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
19a30 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
19a40 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f        "cannot co
19a50 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61  mmit - no transa
19a60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
19a70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20  ));.         .  
19a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
19a90 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  ROR;.    goto ab
19aa0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
19ab0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
19ac0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  ../* Opcode: Tra
19ad0 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20 50  nsaction P1 P2 P
19ae0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65  3 P4 P5.**.** Be
19af0 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
19b00 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 50 31  n on database P1
19b10 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
19b20 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  n is not already
19b30 0a 2a 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49  .** active..** I
19b40 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P2 is non-zero
19b50 2c 20 74 68 65 6e 20 61 20 77 72 69 74 65 2d 74  , then a write-t
19b60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19b70 61 72 74 65 64 2c 20 6f 72 20 69 66 20 61 20 0a  arted, or if a .
19b80 2a 2a 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  ** read-transact
19b90 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
19ba0 63 74 69 76 65 2c 20 69 74 20 69 73 20 75 70 67  ctive, it is upg
19bb0 72 61 64 65 64 20 74 6f 20 61 20 77 72 69 74 65  raded to a write
19bc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  -transaction..**
19bd0 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20   If P2 is zero, 
19be0 74 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  then a read-tran
19bf0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
19c00 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ed..**.** P1 is 
19c10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
19c20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
19c30 6e 20 77 68 69 63 68 20 74 68 65 20 74 72 61 6e  n which the tran
19c40 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74  saction is.** st
19c50 61 72 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20  arted.  Index 0 
19c60 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
19c70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
19c80 64 65 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20  dex 1 is the.** 
19c90 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65  file used for te
19ca0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
19cb0 20 49 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72   Indices of 2 or
19cc0 20 6d 6f 72 65 20 61 72 65 20 75 73 65 64 20 66   more are used f
19cd0 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  or.** attached d
19ce0 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
19cf0 49 66 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  If a write-trans
19d00 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
19d10 64 20 61 6e 64 20 74 68 65 20 56 64 62 65 2e 75  d and the Vdbe.u
19d20 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66  sesStmtJournal f
19d30 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75 65 20 28  lag is.** true (
19d40 74 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74  this flag is set
19d50 20 69 66 20 74 68 65 20 56 64 62 65 20 6d 61 79   if the Vdbe may
19d60 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74 68 61   modify more tha
19d70 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61  n one row and ma
19d80 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
19d90 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 29 2c 20  ORT exception), 
19da0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
19db0 73 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  saction may also
19dc0 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d   be opened..** M
19dd0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
19de0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
19df0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
19e00 6e 65 64 20 69 66 66 20 74 68 65 20 64 61 74 61  ned iff the data
19e10 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
19e20 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
19e30 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69  not in autocommi
19e40 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74 68  t mode, or if th
19e50 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a  ere are other.**
19e60 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
19e70 74 73 2e 20 41 20 73 74 61 74 65 6d 65 6e 74 20  ts. A statement 
19e80 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f  transaction allo
19e90 77 73 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ws the changes m
19ea0 61 64 65 20 62 79 20 74 68 69 73 0a 2a 2a 20 56  ade by this.** V
19eb0 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  DBE to be rolled
19ec0 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e 20 65   back after an e
19ed0 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68 61 76  rror without hav
19ee0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ing to roll back
19ef0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74   the.** entire t
19f00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e  ransaction. If n
19f10 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  o error is encou
19f20 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74 61 74  ntered, the stat
19f30 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19f40 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61  n.** will automa
19f50 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77  tically commit w
19f60 68 65 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c  hen the VDBE hal
19f70 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21  ts..**.** If P5!
19f80 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  =0 then this opc
19f90 6f 64 65 20 61 6c 73 6f 20 63 68 65 63 6b 73 20  ode also checks 
19fa0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
19fb0 65 20 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20  e against P3.** 
19fc0 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 67  and the schema g
19fd0 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65  eneration counte
19fe0 72 20 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a  r against P4..**
19ff0 20 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e   The cookie chan
1a000 67 65 73 20 69 74 73 20 76 61 6c 75 65 20 77 68  ges its value wh
1a010 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
1a020 61 73 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ase schema chang
1a030 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72  es..** This oper
1a040 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
1a050 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 61   detect when tha
1a060 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73  t the cookie has
1a070 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20   changed.** and 
1a080 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
1a090 20 70 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74   process needs t
1a0a0 6f 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68  o reread the sch
1a0b0 65 6d 61 2e 20 20 49 66 20 74 68 65 20 73 63 68  ema.  If the sch
1a0c0 65 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e  ema.** cookie in
1a0d0 20 50 33 20 64 69 66 66 65 72 73 20 66 72 6f 6d   P3 differs from
1a0e0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1a0f0 69 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ie in the databa
1a100 73 65 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20  se header or.** 
1a110 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 67 65  if the schema ge
1a120 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72  neration counter
1a130 20 69 6e 20 50 34 20 64 69 66 66 65 72 73 20 66   in P4 differs f
1a140 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 0a  rom the current.
1a150 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f  ** generation co
1a160 75 6e 74 65 72 2c 20 74 68 65 6e 20 61 6e 20 53  unter, then an S
1a170 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 72 72  QLITE_SCHEMA err
1a180 6f 72 20 69 73 20 72 61 69 73 65 64 20 61 6e 64  or is raised and
1a190 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61   execution.** ha
1a1a0 6c 74 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  lts.  The sqlite
1a1b0 33 5f 73 74 65 70 28 29 20 77 72 61 70 70 65 72  3_step() wrapper
1a1c0 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20   function might 
1a1d0 74 68 65 6e 20 72 65 70 72 65 70 61 72 65 20 74  then reprepare t
1a1e0 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
1a1f0 61 6e 64 20 72 65 72 75 6e 20 69 74 20 66 72 6f  and rerun it fro
1a200 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e  m the beginning.
1a210 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e  .*/.case OP_Tran
1a220 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72  saction: {.  Btr
1a230 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69  ee *pBt;.  int i
1a240 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e  Meta;.  int iGen
1a250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1a260 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61  bIsReader );.  a
1a270 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
1a280 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32  ly==0 || pOp->p2
1a290 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1a2a0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1a2b0 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
1a2c0 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
1a2d0 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
1a2e0 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b  ask, pOp->p1) );
1a2f0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26  .  if( pOp->p2 &
1a300 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
1a310 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29  QLITE_QueryOnly)
1a320 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
1a330 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1a340 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
1a350 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1a360 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44  }.  pBt = db->aD
1a370 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a  b[pOp->p1].pBt;.
1a380 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20  .  if( pBt ){.  
1a390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a3a0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
1a3b0 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20  t, pOp->p2);.   
1a3c0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
1a3d0 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
1a3e0 48 4f 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  HOT );.    testc
1a3f0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
1a400 42 55 53 59 5f 52 45 43 4f 56 45 52 59 20 29 3b  BUSY_RECOVERY );
1a410 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a430 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
1a440 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1a450 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69        p->pc = (i
1a460 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
1a470 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a480 72 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  rc;.        goto
1a490 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1a4b0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1a4c0 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ror;.    }..    
1a4d0 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 70  if( pOp->p2 && p
1a4e0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
1a4f0 6c 20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e  l .     && (db->
1a500 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
1a510 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1a520 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
1a530 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a540 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
1a550 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1a560 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30  p->iStatement==0
1a570 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1a580 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
1a590 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61  nt>=0 && db->nSa
1a5a0 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20  vepoint>=0 );.  
1a5b0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
1a5c0 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20  ment++; .       
1a5d0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
1a5e0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
1a5f0 2b 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  + db->nStatement
1a600 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
1a620 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
1a630 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20  AVEPOINT_BEGIN, 
1a640 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29  p->iStatement-1)
1a650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1a660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a680 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1a690 70 42 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65  pBt, p->iStateme
1a6a0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nt);.      }..  
1a6b0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
1a6c0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
1a6d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
1a6e0 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
1a6f0 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  constraint.     
1a700 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20   ** counter. If 
1a710 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
1a720 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
1a730 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1a740 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  k,.      ** the 
1a750 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f  value of this co
1a760 75 6e 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62  unter needs to b
1a770 65 20 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20  e restored too. 
1a780 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   */.      p->nSt
1a790 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e  mtDefCons = db->
1a7a0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20  nDeferredCons;. 
1a7b0 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66       p->nStmtDef
1a7c0 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  ImmCons = db->nD
1a7d0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
1a7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61      }..    /* Ga
1a7f0 74 68 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ther the schema 
1a800 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66  version number f
1a810 6f 72 20 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20  or checking:.   
1a820 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
1a830 4f 4e 2d 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35  ON-OF: R-03189-5
1a840 31 31 33 35 20 41 73 20 65 61 63 68 20 53 51 4c  1135 As each SQL
1a850 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c   statement runs,
1a860 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20   the schema.    
1a870 2a 2a 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68  ** version is ch
1a880 65 63 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20  ecked to ensure 
1a890 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20  that the schema 
1a8a0 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  has not changed 
1a8b0 73 69 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a  since the.    **
1a8c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77   SQL statement w
1a8d0 61 73 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20  as prepared..   
1a8e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1a8f0 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c  treeGetMeta(pBt,
1a900 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
1a910 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69  RSION, (u32 *)&i
1a920 4d 65 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20  Meta);.    iGen 
1a930 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
1a940 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e  1].pSchema->iGen
1a950 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65  eration;.  }else
1a960 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65  {.    iGen = iMe
1a970 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ta = 0;.  }.  as
1a980 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30  sert( pOp->p5==0
1a990 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   || pOp->p4type=
1a9a0 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69  =P4_INT32 );.  i
1a9b0 66 28 20 70 4f 70 2d 3e 70 35 20 26 26 20 28 69  f( pOp->p5 && (i
1a9c0 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c  Meta!=pOp->p3 ||
1a9d0 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69   iGen!=pOp->p4.i
1a9e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1a9f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
1aa00 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
1aa10 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1aa20 44 62 53 74 72 44 75 70 28 64 62 2c 20 22 64 61  DbStrDup(db, "da
1aa30 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
1aa40 73 20 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20  s changed");.   
1aa50 20 2f 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d   /* If the schem
1aa60 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68  a-cookie from th
1aa70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1aa80 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b  matches the cook
1aa90 69 65 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  ie .    ** store
1aaa0 64 20 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65  d with the in-me
1aab0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
1aac0 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d  ion of the schem
1aad0 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  a, do.    ** not
1aae0 20 72 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65   reload the sche
1aaf0 6d 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ma from the data
1ab00 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
1ab10 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74  *.    ** If virt
1ab20 75 61 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69  ual-tables are i
1ab30 6e 20 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e  n use, this is n
1ab40 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d  ot just an optim
1ab50 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20  ization..    ** 
1ab60 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20  Often, v-tables 
1ab70 73 74 6f 72 65 20 74 68 65 69 72 20 64 61 74 61  store their data
1ab80 20 69 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65   in other SQLite
1ab90 20 74 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20   tables, which. 
1aba0 20 20 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65     ** are querie
1abb0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e  d from within xN
1abc0 65 78 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20  ext() and other 
1abd0 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20  v-table methods 
1abe0 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65  using.    ** pre
1abf0 70 61 72 65 64 20 71 75 65 72 69 65 73 2e 20 49  pared queries. I
1ac00 66 20 73 75 63 68 20 61 20 71 75 65 72 79 20 69  f such a query i
1ac10 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77  s out-of-date, w
1ac20 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
1ac30 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20  .    ** discard 
1ac40 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1ac50 65 6d 61 2c 20 61 73 20 74 68 65 20 75 73 65 72  ema, as the user
1ac60 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69   code implementi
1ac70 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d  ng the.    ** v-
1ac80 74 61 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65  table would have
1ac90 20 74 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72   to be ready for
1aca0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
1acb0 62 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  b structure itse
1acc0 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  lf.    ** to be 
1acd0 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
1ace0 65 76 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65  ever sqlite3_ste
1acf0 70 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  p() is called fr
1ad00 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  om within .    *
1ad10 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68  * a v-table meth
1ad20 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  od..    */.    i
1ad30 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  f( db->aDb[pOp->
1ad40 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  p1].pSchema->sch
1ad50 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74  ema_cookie!=iMet
1ad60 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
1ad70 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
1ad80 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  (db, pOp->p1);. 
1ad90 20 20 20 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69     }.    p->expi
1ada0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  red = 1;.    rc 
1adb0 3d 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b  = SQLITE_SCHEMA;
1adc0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
1add0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1ade0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
1adf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1ae00 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32  ReadCookie P1 P2
1ae10 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   P3 * *.**.** Re
1ae20 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72  ad cookie number
1ae30 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73   P3 from databas
1ae40 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69  e P1 and write i
1ae50 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
1ae60 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20  P2..** P3==1 is 
1ae70 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  the schema versi
1ae80 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68  on.  P3==2 is th
1ae90 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  e database forma
1aea0 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74  t..** P3==3 is t
1aeb0 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70  he recommended p
1aec0 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c  ager cache size,
1aed0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   and so forth.  
1aee0 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20  P1==0 is.** the 
1aef0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1af00 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20  le and P1==1 is 
1af10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1af20 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1af30 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
1af40 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  les..**.** There
1af50 20 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d   must be a read-
1af60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1af70 62 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74  base (either a t
1af80 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
1af90 73 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72  st be started or
1afa0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
1afb0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62  n open cursor) b
1afc0 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69  efore.** executi
1afd0 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  ng this instruct
1afe0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
1aff0 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20  ReadCookie: {   
1b000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
1b010 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  ut2 */.  int iMe
1b020 74 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  ta;.  int iDb;. 
1b030 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20   int iCookie;.. 
1b040 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
1b050 65 61 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d  eader );.  iDb =
1b060 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f   pOp->p1;.  iCoo
1b070 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  kie = pOp->p3;. 
1b080 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
1b090 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  <SQLITE_N_BTREE_
1b0a0 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74  META );.  assert
1b0b0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
1b0c0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
1b0d0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
1b0e0 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ].pBt!=0 );.  as
1b0f0 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
1b100 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
1b110 44 62 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  Db) );..  sqlite
1b120 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62  3BtreeGetMeta(db
1b130 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
1b140 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29  iCookie, (u32 *)
1b150 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20  &iMeta);.  pOut 
1b160 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
1b170 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74  (p, pOp);.  pOut
1b180 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20  ->u.i = iMeta;. 
1b190 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1b1a0 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20  code: SetCookie 
1b1b0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
1b1c0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 74  ** Write the int
1b1d0 65 67 65 72 20 76 61 6c 75 65 20 50 33 20 69 6e  eger value P3 in
1b1e0 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72  to cookie number
1b1f0 20 50 32 20 6f 66 20 64 61 74 61 62 61 73 65 20   P2 of database 
1b200 50 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20  P1..** P2==1 is 
1b210 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  the schema versi
1b220 6f 6e 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68  on.  P2==2 is th
1b230 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  e database forma
1b240 74 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74  t..** P2==3 is t
1b250 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70  he recommended p
1b260 61 67 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73  ager cache .** s
1b270 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ize, and so fort
1b280 68 2e 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65  h.  P1==0 is the
1b290 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1b2a0 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73  ile and P1==1 is
1b2b0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1b2c0 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73  e file used to s
1b2d0 74 6f 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74  tore temporary t
1b2e0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  ables..**.** A t
1b2f0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1b300 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
1b310 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
1b320 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
1b330 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b   OP_SetCookie: {
1b340 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73  .  Db *pDb;.  as
1b350 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51  sert( pOp->p2<SQ
1b360 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
1b370 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  A );.  assert( p
1b380 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1b390 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
1b3a0 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
1b3b0 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
1b3c0 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  k, pOp->p1) );. 
1b3d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
1b3e0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62  Only==0 );.  pDb
1b3f0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d   = &db->aDb[pOp-
1b400 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1b410 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  pDb->pBt!=0 );. 
1b420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b430 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1b440 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20  db, pOp->p1, 0) 
1b450 29 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65  );.  /* See note
1b460 20 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69   about index shi
1b470 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64  fting on OP_Read
1b480 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d  Cookie */.  rc =
1b490 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1b4a0 61 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74  ateMeta(pDb->pBt
1b4b0 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
1b4c0 70 33 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  p3);.  if( pOp->
1b4d0 70 32 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41  p2==BTREE_SCHEMA
1b4e0 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  _VERSION ){.    
1b4f0 2f 2a 20 57 68 65 6e 20 74 68 65 20 73 63 68 65  /* When the sche
1b500 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  ma cookie change
1b510 73 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65  s, record the ne
1b520 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61  w cookie interna
1b530 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  lly */.    pDb->
1b540 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
1b550 63 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33  cookie = pOp->p3
1b560 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
1b570 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
1b580 43 68 61 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65  Changes;.  }else
1b590 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54   if( pOp->p2==BT
1b5a0 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20  REE_FILE_FORMAT 
1b5b0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ){.    /* Record
1b5c0 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
1b5d0 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  file format */. 
1b5e0 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
1b5f0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70  >file_format = p
1b600 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66  Op->p3;.  }.  if
1b610 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a  ( pOp->p1==1 ){.
1b620 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74      /* Invalidat
1b630 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73  e all prepared s
1b640 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76  tatements whenev
1b650 65 72 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  er the TEMP data
1b660 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65  base.    ** sche
1b670 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20  ma is changed.  
1b680 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a  Ticket #1644 */.
1b690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
1b6a0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
1b6b0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e  nts(db);.    p->
1b6c0 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d  expired = 0;.  }
1b6d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1b6e0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1b6f0 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
1b700 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e  ./* Opcode: Open
1b710 52 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34  Read P1 P2 P3 P4
1b720 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1b730 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a   root=P2 iDb=P3.
1b740 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61  **.** Open a rea
1b750 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f  d-only cursor fo
1b760 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
1b770 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
1b780 70 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e  page is.** P2 in
1b790 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1b7a0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
1b7b0 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e  file is determin
1b7c0 65 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33  ed by P3. .** P3
1b7d0 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61  ==0 means the ma
1b7e0 69 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d  in database, P3=
1b7f0 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  =1 means the dat
1b800 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a  abase used for .
1b810 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
1b820 6c 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65  les, and P3>1 me
1b830 61 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72  ans used the cor
1b840 72 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63  responding attac
1b850 68 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  hed.** database.
1b860 20 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63    Give the new c
1b870 75 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  ursor an identif
1b880 69 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20  ier of P1.  The 
1b890 50 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65  P1.** values nee
1b8a0 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75  d not be contigu
1b8b0 6f 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76  ous but all P1 v
1b8c0 61 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20  alues should be 
1b8d0 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a  small integers..
1b8e0 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
1b8f0 72 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e  r for P1 to be n
1b900 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  egative..**.** I
1b910 66 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65  f P5!=0 then use
1b920 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1b930 72 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74  register P2 as t
1b940 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f  he root page, no
1b950 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  t.** the value o
1b960 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  f P2 itself..**.
1b970 2a 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  ** There will be
1b980 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1b990 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65  the database whe
1b9a0 6e 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61  never there is a
1b9b0 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  n.** open cursor
1b9c0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1b9d0 73 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20  se was unlocked 
1b9e0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e  prior to this in
1b9f0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65  struction.** the
1ba00 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
1ba10 20 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72   acquired as par
1ba20 74 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75  t of this instru
1ba30 63 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a  ction.  A read.*
1ba40 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74  * lock allows ot
1ba50 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f  her processes to
1ba60 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1ba70 73 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73  se but prohibits
1ba80 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72  .** any other pr
1ba90 6f 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66  ocess from modif
1baa0 79 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ying the databas
1bab0 65 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  e.  The read loc
1bac0 6b 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64  k is.** released
1bad0 20 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   when all cursor
1bae0 73 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49  s are closed.  I
1baf0 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
1bb00 6f 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  on attempts.** t
1bb10 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  o get a read loc
1bb20 6b 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65  k but fails, the
1bb30 20 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74   script terminat
1bb40 65 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  es with an.** SQ
1bb50 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
1bb60 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1bb70 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  P4 value may be 
1bb80 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
1bb90 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20  r (P4_INT32) or 
1bba0 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
1bbb0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
1bbc0 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29  ure (P4_KEYINFO)
1bbd0 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69  . If it is a poi
1bbe0 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
1bbf0 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  o .** structure,
1bc00 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63   then said struc
1bc10 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65  ture defines the
1bc20 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c   content and col
1bc30 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65  lating .** seque
1bc40 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nce of the index
1bc50 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f   being opened. O
1bc60 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
1bc70 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
1bc80 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73  * value, it is s
1bc90 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1bca0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
1bcb0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1bcc0 53 65 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72  See also: OpenWr
1bcd0 69 74 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a  ite, ReopenIdx.*
1bce0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f  /./* Opcode: Reo
1bcf0 70 65 6e 49 64 78 20 50 31 20 50 32 20 50 33 20  penIdx P1 P2 P3 
1bd00 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
1bd10 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50  s: root=P2 iDb=P
1bd20 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70  3.**.** The Reop
1bd30 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72  enIdx opcode wor
1bd40 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20  ks exactly like 
1bd50 52 65 61 64 4f 70 65 6e 20 65 78 63 65 70 74 20  ReadOpen except 
1bd60 74 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a  that it first.**
1bd70 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
1bd80 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  f the cursor on 
1bd90 50 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  P1 is already op
1bda0 65 6e 20 77 69 74 68 20 61 20 72 6f 6f 74 20 70  en with a root p
1bdb0 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  age.** number of
1bdc0 20 50 32 20 61 6e 64 20 69 66 20 69 74 20 69 73   P2 and if it is
1bdd0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63   this opcode bec
1bde0 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  omes a no-op.  I
1bdf0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
1be00 2a 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  * if the cursor 
1be10 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
1be20 20 64 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69   do not reopen i
1be30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f  t..**.** The Reo
1be40 70 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61  penIdx opcode ma
1be50 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
1be60 69 74 68 20 50 35 3d 3d 30 20 61 6e 64 20 77 69  ith P5==0 and wi
1be70 74 68 20 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61  th P4 being.** a
1be80 20 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65   P4_KEYINFO obje
1be90 63 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ct.  Furthermore
1bea0 2c 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d  , the P3 value m
1beb0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1bec0 61 73 0a 2a 2a 20 65 76 65 72 79 20 6f 74 68 65  as.** every othe
1bed0 72 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f  r ReopenIdx or O
1bee0 70 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20  penRead for the 
1bef0 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
1bf00 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  er..**.** See th
1bf10 65 20 4f 70 65 6e 52 65 61 64 20 6f 70 63 6f 64  e OpenRead opcod
1bf20 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
1bf30 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1bf40 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f  nformation..*/./
1bf50 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72  * Opcode: OpenWr
1bf60 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ite P1 P2 P3 P4 
1bf70 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1bf80 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1bf90 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
1bfa0 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61  /write cursor na
1bfb0 6d 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61  med P1 on the ta
1bfc0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
1bfd0 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  se root.** page 
1bfe0 69 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35  is P2.  Or if P5
1bff0 21 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74  !=0 use the cont
1c000 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
1c010 50 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  P2 to find the.*
1c020 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a  * root page..**.
1c030 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
1c040 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
1c050 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
1c060 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
1c070 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
1c080 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
1c090 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
1c0a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1c0b0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
1c0c0 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
1c0d0 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
1c0e0 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
1c0f0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
1c100 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
1c110 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
1c120 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
1c130 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
1c140 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
1c150 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
1c160 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1c170 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ns in the table,
1c180 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61   or to the.** la
1c190 72 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61  rgest index of a
1c1a0 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ny column of the
1c1b0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61   table that is a
1c1c0 63 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a  ctually used..**
1c1d0 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
1c1e0 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20  tion works just 
1c1f0 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78  like OpenRead ex
1c200 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65  cept that it ope
1c210 6e 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ns the cursor.**
1c220 20 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d   in read/write m
1c230 6f 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65  ode.  For a give
1c240 6e 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63  n table, there c
1c250 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  an be one or mor
1c260 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  e read-only.** c
1c270 75 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67  ursors or a sing
1c280 6c 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75  le read/write cu
1c290 72 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74  rsor but not bot
1c2a0 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  h..**.** See als
1c2b0 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63  o OpenRead..*/.c
1c2c0 61 73 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  ase OP_ReopenIdx
1c2d0 3a 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  : {.  int nField
1c2e0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1c2f0 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b  yInfo;.  int p2;
1c300 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
1c310 74 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65  t wrFlag;.  Btre
1c320 65 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72  e *pX;.  VdbeCur
1c330 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20  sor *pCur;.  Db 
1c340 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
1c350 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70   pOp->p5==0 || p
1c360 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53  Op->p5==OPFLAG_S
1c370 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72  EEKEQ );.  asser
1c380 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1c390 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20  P4_KEYINFO );.  
1c3a0 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
1c3b0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
1c3c0 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67  pCur && pCur->pg
1c3d0 6e 6f 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70  noRoot==(u32)pOp
1c3e0 2d 3e 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65  ->p2 ){.    asse
1c3f0 72 74 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70  rt( pCur->iDb==p
1c400 4f 70 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f  Op->p3 );      /
1c410 2a 20 47 75 61 72 61 6e 74 65 65 64 20 62 79 20  * Guaranteed by 
1c420 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1c430 6f 72 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f  or */.    goto o
1c440 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68  pen_cursor_set_h
1c450 69 6e 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  ints;.  }.  /* I
1c460 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1c470 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
1c480 65 6e 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  en or is open on
1c490 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
1c4a0 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61  * index, then fa
1c4b0 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
1c4c0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66  OP_OpenRead to f
1c4d0 6f 72 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f  orce a reopen */
1c4e0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61  .case OP_OpenRea
1c4f0 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57  d:.case OP_OpenW
1c500 72 69 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28  rite:..  assert(
1c510 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1c520 5f 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f  _OpenWrite || pO
1c530 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
1c540 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b  >p5==OPFLAG_SEEK
1c550 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
1c560 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
1c570 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
1c580 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65  pcode==OP_OpenRe
1c590 61 64 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  ad || pOp->opcod
1c5a0 65 3d 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a  e==OP_ReopenIdx.
1c5b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
1c5c0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a  readOnly==0 );..
1c5d0 20 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64    if( p->expired
1c5e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1c5f0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1c600 43 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  CK;.    goto abo
1c610 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c620 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d  .  }..  nField =
1c630 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d   0;.  pKeyInfo =
1c640 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e   0;.  p2 = pOp->
1c650 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d  p2;.  iDb = pOp-
1c660 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >p3;.  assert( i
1c670 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1c680 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1c690 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1c6a0 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20  btreeMask, iDb) 
1c6b0 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
1c6c0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d  aDb[iDb];.  pX =
1c6d0 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73   pDb->pBt;.  ass
1c6e0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1c6f0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1c700 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b  =OP_OpenWrite ){
1c710 0a 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 46  .    assert( OPF
1c720 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42  LAG_FORDELETE==B
1c730 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 29  TREE_FORDELETE )
1c740 3b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 42  ;.    wrFlag = B
1c750 54 52 45 45 5f 57 52 43 53 52 20 7c 20 28 70 4f  TREE_WRCSR | (pO
1c760 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 46  p->p5 & OPFLAG_F
1c770 4f 52 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 61  ORDELETE);.    a
1c780 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1c790 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1c7a0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
1c7b0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
1c7c0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c  a->file_format <
1c7d0 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
1c7e0 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20  Format ){.      
1c7f0 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
1c800 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53 63  ormat = pDb->pSc
1c810 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1c820 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
1c830 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 30  {.    wrFlag = 0
1c840 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1c850 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32 49  >p5 & OPFLAG_P2I
1c860 53 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73 65  SREG ){.    asse
1c870 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20  rt( p2>0 );.    
1c880 61 73 73 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e  assert( p2<=(p->
1c890 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
1c8a0 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 32  sor) );.    pIn2
1c8b0 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
1c8c0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
1c8d0 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20  alid(pIn2) );.  
1c8e0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d    assert( (pIn2-
1c8f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1c900 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  )!=0 );.    sqli
1c910 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
1c920 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20  rify(pIn2);.    
1c930 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e  p2 = (int)pIn2->
1c940 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  u.i;.    /* The 
1c950 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20  p2 value always 
1c960 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69  comes from a pri
1c970 6f 72 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  or OP_CreateTabl
1c980 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20  e opcode and.   
1c990 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20   ** that opcode 
1c9a0 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20  will always set 
1c9b0 74 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20  the p2 value to 
1c9c0 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73  2 or more or els
1c9d0 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49  e fail..    ** I
1c9e0 66 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66  f there were a f
1c9f0 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70  ailure, the prep
1ca00 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
1ca10 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64  ould have halted
1ca20 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72  .    ** before r
1ca30 65 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73  eaching this ins
1ca40 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  truction. */.   
1ca50 20 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20 29   assert( p2>=2 )
1ca60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1ca70 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1ca80 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
1ca90 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1caa0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1cab0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  rt( pKeyInfo->en
1cac0 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20  c==ENC(db) );.  
1cad0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1cae0 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1caf0 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
1cb00 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1cb10 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3b 0a 20  Info->nXField;. 
1cb20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1cb30 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1cb40 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d   ){.    nField =
1cb50 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d 0a   pOp->p4.i;.  }.
1cb60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1cb70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1cb80 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a 20  ( nField>=0 );. 
1cb90 20 74 65 73 74 63 61 73 65 28 20 6e 46 69 65 6c   testcase( nFiel
1cba0 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62 6c  d==0 );  /* Tabl
1cbb0 65 20 77 69 74 68 20 49 4e 54 45 47 45 52 20 50  e with INTEGER P
1cbc0 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 6e  RIMARY KEY and n
1cbd0 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20  othing else */. 
1cbe0 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65   pCur = allocate
1cbf0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1cc00 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20  1, nField, iDb, 
1cc10 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a  CURTYPE_BTREE);.
1cc20 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
1cc30 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1cc40 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  Cur->nullRow = 1
1cc50 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65  ;.  pCur->isOrde
1cc60 72 65 64 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d  red = 1;.  pCur-
1cc70 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b 0a  >pgnoRoot = p2;.
1cc80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1cc90 42 55 47 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  BUG.  pCur->wrFl
1cca0 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23 65 6e  ag = wrFlag;.#en
1ccb0 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  dif.  rc = sqlit
1ccc0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 58  e3BtreeCursor(pX
1ccd0 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70 4b  , p2, wrFlag, pK
1cce0 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 75 63  eyInfo, pCur->uc
1ccf0 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75  .pCursor);.  pCu
1cd00 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
1cd10 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74  eyInfo;.  /* Set
1cd20 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e   the VdbeCursor.
1cd30 69 73 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65  isTable variable
1cd40 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  . Previous versi
1cd50 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69  ons of.  ** SQLi
1cd60 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  te used to check
1cd70 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   if the root-pag
1cd80 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e  e flags were san
1cd90 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a  e at this point.
1cda0 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20    ** and report 
1cdb0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1cdc0 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65  ion if they were
1cdd0 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63   not, but this c
1cde0 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69  heck has.  ** si
1cdf0 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  nce moved into t
1ce00 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20  he btree layer. 
1ce10 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73   */  .  pCur->is
1ce20 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74  Table = pOp->p4t
1ce30 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b  ype!=P4_KEYINFO;
1ce40 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65  ..open_cursor_se
1ce50 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73 65 72  t_hints:.  asser
1ce60 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  t( OPFLAG_BULKCS
1ce70 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  R==BTREE_BULKLOA
1ce80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  D );.  assert( O
1ce90 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54  PFLAG_SEEKEQ==BT
1cea0 52 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20  REE_SEEK_EQ );. 
1ceb0 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
1cec0 70 35 20 26 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  p5 & OPFLAG_BULK
1ced0 43 53 52 20 29 3b 0a 23 69 66 64 65 66 20 53 51  CSR );.#ifdef SQ
1cee0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
1cef0 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65 73 74 63  OR_HINTS.  testc
1cf00 61 73 65 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f  ase( pOp->p2 & O
1cf10 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a  PFLAG_SEEKEQ );.
1cf20 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1cf30 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46  BtreeCursorHintF
1cf40 6c 61 67 73 28 70 43 75 72 2d 3e 75 63 2e 70 43  lags(pCur->uc.pC
1cf50 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ursor,.         
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
1cf80 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52   (OPFLAG_BULKCSR
1cf90 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 29  |OPFLAG_SEEKEQ))
1cfa0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
1cfb0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1cfc0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
1cfd0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  }../* Opcode: Op
1cfe0 65 6e 45 70 68 65 6d 65 72 61 6c 20 50 31 20 50  enEphemeral P1 P
1cff0 32 20 2a 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e  2 * P4 P5.** Syn
1d000 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50  opsis: nColumn=P
1d010 32 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  2.**.** Open a n
1d020 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  ew cursor P1 to 
1d030 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
1d040 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
1d050 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65   is always opene
1d060 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65  d read/write eve
1d070 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69  n if .** the mai
1d080 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  n database is re
1d090 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70  ad-only.  The ep
1d0a0 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
1d0b0 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f   is deleted auto
1d0c0 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
1d0d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
1d0e0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  sed..**.** P2 is
1d0f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1d100 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70  olumns in the ep
1d110 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
1d120 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1d130 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74  nts to a BTree t
1d140 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e  able if P4==0 an
1d150 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64  d to a BTree ind
1d160 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e  ex.** if P4 is n
1d170 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20  ot 0.  If P4 is 
1d180 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
1d190 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
1d1a0 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
1d1b0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  at defines the f
1d1c0 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e  ormat of keys in
1d1d0 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
1d1e0 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d 65 74  * The P5 paramet
1d1f0 65 72 20 63 61 6e 20 62 65 20 61 20 6d 61 73 6b  er can be a mask
1d200 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 2a 20   of the BTREE_* 
1d210 66 6c 61 67 73 20 64 65 66 69 6e 65 64 0a 2a 2a  flags defined.**
1d220 20 69 6e 20 62 74 72 65 65 2e 68 2e 20 20 54 68   in btree.h.  Th
1d230 65 73 65 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f  ese flags contro
1d240 6c 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65  l aspects of the
1d250 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a   operation of.**
1d260 20 74 68 65 20 62 74 72 65 65 2e 20 20 54 68 65   the btree.  The
1d270 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1d280 4e 41 4c 20 61 6e 64 20 42 54 52 45 45 5f 53 49  NAL and BTREE_SI
1d290 4e 47 4c 45 20 66 6c 61 67 73 20 61 72 65 0a 2a  NGLE flags are.*
1d2a0 2a 20 61 64 64 65 64 20 61 75 74 6f 6d 61 74 69  * added automati
1d2b0 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  cally..*/./* Opc
1d2c0 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64  ode: OpenAutoind
1d2d0 65 78 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ex P1 P2 * P4 *.
1d2e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f  ** Synopsis: nCo
1d2f0 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 54 68  lumn=P2.**.** Th
1d300 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1d310 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f  the same as OP_O
1d320 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20 49  penEphemeral.  I
1d330 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66 65  t has a.** diffe
1d340 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69 73  rent name to dis
1d350 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73 65  tinguish its use
1d360 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74 65  .  Tables create
1d370 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68  d using.** by th
1d380 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  is opcode will b
1d390 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d  e used for autom
1d3a0 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1d3b0 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e   transient.** in
1d3c0 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a  dices in joins..
1d3d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41  */.case OP_OpenA
1d3e0 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65 20  utoindex: .case 
1d3f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1d400 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1d410 20 2a 70 43 78 3b 0a 20 20 4b 65 79 49 6e 66 6f   *pCx;.  KeyInfo
1d420 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73   *pKeyInfo;..  s
1d430 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
1d440 76 66 73 46 6c 61 67 73 20 3d 20 0a 20 20 20 20  vfsFlags = .    
1d450 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1d460 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
1d470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1d480 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  TE |.      SQLIT
1d490 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1d4a0 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f   |.      SQLITE_
1d4b0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1d4c0 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  SE |.      SQLIT
1d4d0 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1d4e0 5f 44 42 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _DB;.  assert( p
1d4f0 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61  Op->p1>=0 );.  a
1d500 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
1d510 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
1d520 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1d530 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
1d540 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54 52   -1, CURTYPE_BTR
1d550 45 45 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d  EE);.  if( pCx==
1d560 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1d570 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20  .  pCx->nullRow 
1d580 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 45 70  = 1;.  pCx->isEp
1d590 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20 20 72  hemeral = 1;.  r
1d5a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1d5b0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
1d5c0 2c 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 78  , db, &pCx->pBtx
1d5d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1d5e0 20 20 20 20 20 20 20 20 20 20 20 42 54 52 45 45             BTREE
1d5f0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _OMIT_JOURNAL | 
1d600 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70  BTREE_SINGLE | p
1d610 4f 70 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73  Op->p5, vfsFlags
1d620 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1d630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d640 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
1d650 65 67 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70  eginTrans(pCx->p
1d660 42 74 78 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  Btx, 1);.  }.  i
1d670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d680 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1d690 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
1d6a0 69 73 20 72 65 71 75 69 72 65 64 2c 20 63 72 65  is required, cre
1d6b0 61 74 65 20 69 74 20 62 79 20 63 61 6c 6c 69 6e  ate it by callin
1d6c0 67 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  g.    ** sqlite3
1d6d0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
1d6e0 28 29 20 77 69 74 68 20 74 68 65 20 42 54 52 45  () with the BTRE
1d6f0 45 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62  E_BLOBKEY flag b
1d700 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65  efore.    ** ope
1d710 6e 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74 72  ning it. If a tr
1d720 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73  ansient table is
1d730 20 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74 20   required, just 
1d740 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 61  use the.    ** a
1d750 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1d760 61 74 65 64 20 74 61 62 6c 65 20 77 69 74 68 20  ated table with 
1d770 72 6f 6f 74 2d 70 61 67 65 20 31 20 28 61 6e 20  root-page 1 (an 
1d780 42 4c 4f 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c  BLOB_INTKEY tabl
1d790 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
1d7a0 66 28 20 28 70 43 78 2d 3e 70 4b 65 79 49 6e 66  f( (pCx->pKeyInf
1d7b0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  o = pKeyInfo = p
1d7c0 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 29  Op->p4.pKeyInfo)
1d7d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1d7e0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73   pgno;.      ass
1d7f0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
1d800 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
1d810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d820 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1d830 6c 65 28 70 43 78 2d 3e 70 42 74 78 2c 20 26 70  le(pCx->pBtx, &p
1d840 67 6e 6f 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  gno, BTREE_BLOBK
1d850 45 59 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a  EY | pOp->p5); .
1d860 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d880 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
1d890 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29  =MASTER_ROOT+1 )
1d8a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d8b0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1d8c0 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  db );.        as
1d8d0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1d8e0 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
1d8f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d900 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1d910 70 43 78 2d 3e 70 42 74 78 2c 20 70 67 6e 6f 2c  pCx->pBtx, pgno,
1d920 20 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20   BTREE_WRCSR,.  
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
1d950 65 79 49 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e  eyInfo, pCx->uc.
1d960 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
1d970 7d 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54  }.      pCx->isT
1d980 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  able = 0;.    }e
1d990 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1d9a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d9b0 6f 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 4d 41  or(pCx->pBtx, MA
1d9c0 53 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45  STER_ROOT, BTREE
1d9d0 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20  _WRCSR,.        
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 20 20 20 30 2c 20 70 43 78 2d 3e 75 63        0, pCx->uc
1da00 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
1da10 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1da20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
1da30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1da40 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1da50 0a 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65  .  pCx->isOrdere
1da60 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54  d = (pOp->p5!=BT
1da70 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
1da80 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1da90 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4f 70 65  pcode: SorterOpe
1daa0 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  n P1 P2 P3 P4 *.
1dab0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1dac0 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f  e works like OP_
1dad0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78  OpenEphemeral ex
1dae0 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65  cept that it ope
1daf0 6e 73 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e  ns.** a transien
1db00 74 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  t index that is 
1db10 73 70 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73  specifically des
1db20 69 67 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61  igned to sort la
1db30 72 67 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73  rge.** tables us
1db40 69 6e 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ing an external 
1db50 6d 65 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72  merge-sort algor
1db60 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ithm..**.** If a
1db70 72 67 75 6d 65 6e 74 20 50 33 20 69 73 20 6e 6f  rgument P3 is no
1db80 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
1db90 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1dba0 68 65 20 73 6f 72 74 65 72 20 6d 61 79 0a 2a 2a  he sorter may.**
1dbb0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 73   assume that a s
1dbc0 74 61 62 6c 65 20 73 6f 72 74 20 63 6f 6e 73 69  table sort consi
1dbd0 64 65 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  dering the first
1dbe0 20 50 33 20 66 69 65 6c 64 73 20 6f 66 20 65 61   P3 fields of ea
1dbf0 63 68 0a 2a 2a 20 6b 65 79 20 69 73 20 73 75 66  ch.** key is suf
1dc00 66 69 63 69 65 6e 74 20 74 6f 20 70 72 6f 64 75  ficient to produ
1dc10 63 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ce the required 
1dc20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65  results..*/.case
1dc30 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20   OP_SorterOpen: 
1dc40 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1dc50 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pCx;..  assert( 
1dc60 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1dc70 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
1dc80 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c  =0 );.  pCx = al
1dc90 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1dca0 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
1dcb0 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 53 4f  , -1, CURTYPE_SO
1dcc0 52 54 45 52 29 3b 0a 20 20 69 66 28 20 70 43 78  RTER);.  if( pCx
1dcd0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1dce0 6d 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e  m;.  pCx->pKeyIn
1dcf0 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
1dd00 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28  yInfo;.  assert(
1dd10 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   pCx->pKeyInfo->
1dd20 64 62 3d 3d 64 62 20 29 3b 0a 20 20 61 73 73 65  db==db );.  asse
1dd30 72 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66  rt( pCx->pKeyInf
1dd40 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20  o->enc==ENC(db) 
1dd50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dd60 33 56 64 62 65 53 6f 72 74 65 72 49 6e 69 74 28  3VdbeSorterInit(
1dd70 64 62 2c 20 70 4f 70 2d 3e 70 33 2c 20 70 43 78  db, pOp->p3, pCx
1dd80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
1dd90 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1dda0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
1ddb0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
1ddc0 71 75 65 6e 63 65 54 65 73 74 20 50 31 20 50 32  quenceTest P1 P2
1ddd0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
1dde0 69 73 3a 20 69 66 28 20 63 75 72 73 6f 72 5b 50  is: if( cursor[P
1ddf0 31 5d 2e 63 74 72 2b 2b 20 29 20 70 63 20 3d 20  1].ctr++ ) pc = 
1de00 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  P2.**.** P1 is a
1de10 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20   sorter cursor. 
1de20 49 66 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  If the sequence 
1de30 63 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72 65  counter is curre
1de40 6e 74 6c 79 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a  ntly zero, jump.
1de50 2a 2a 20 74 6f 20 50 32 2e 20 52 65 67 61 72 64  ** to P2. Regard
1de60 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
1de70 6f 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20  or not the jump 
1de80 69 73 20 74 61 6b 65 6e 2c 20 69 6e 63 72 65 6d  is taken, increm
1de90 65 6e 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 73  ent the.** the s
1dea0 65 71 75 65 6e 63 65 20 76 61 6c 75 65 2e 0a 2a  equence value..*
1deb0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e  /.case OP_Sequen
1dec0 63 65 54 65 73 74 3a 20 7b 0a 20 20 56 64 62 65  ceTest: {.  Vdbe
1ded0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73  Cursor *pC;.  as
1dee0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1def0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1df00 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
1df10 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1df20 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  1];.  assert( is
1df30 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20  Sorter(pC) );.  
1df40 69 66 28 20 28 70 43 2d 3e 73 65 71 43 6f 75 6e  if( (pC->seqCoun
1df50 74 2b 2b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67  t++)==0 ){.    g
1df60 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
1df70 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1df80 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50  /* Opcode: OpenP
1df90 73 65 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a  seudo P1 P2 P3 *
1dfa0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
1dfb0 50 33 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b  P3 columns in r[
1dfc0 50 32 5d 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  P2].**.** Open a
1dfd0 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61 74   new cursor that
1dfe0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b   points to a fak
1dff0 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  e table that con
1e000 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a  tains a single.*
1e010 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20  * row of data.  
1e020 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
1e030 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 73 20 74  hat one row is t
1e040 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65  he content of me
1e050 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65 72  mory.** register
1e060 20 50 32 2e 20 20 49 6e 20 6f 74 68 65 72 20 77   P2.  In other w
1e070 6f 72 64 73 2c 20 63 75 72 73 6f 72 20 50 31 20  ords, cursor P1 
1e080 62 65 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73  becomes an alias
1e090 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d   for the .** MEM
1e0a0 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f  _Blob content co
1e0b0 6e 74 61 69 6e 65 64 20 69 6e 20 72 65 67 69 73  ntained in regis
1e0c0 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20  ter P2..**.** A 
1e0d0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72 65  pseudo-table cre
1e0e0 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 63  ated by this opc
1e0f0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 68  ode is used to h
1e100 6f 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  old a single.** 
1e110 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  row output from 
1e120 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68  the sorter so th
1e130 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62  at the row can b
1e140 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74  e decomposed int
1e150 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  o.** individual 
1e160 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68  columns using th
1e170 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
1e180 64 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75  de.  The OP_Colu
1e190 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  mn opcode.** is 
1e1a0 74 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20  the only cursor 
1e1b0 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72 6b  opcode that work
1e1c0 73 20 77 69 74 68 20 61 20 70 73 65 75 64 6f 2d  s with a pseudo-
1e1d0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20  table..**.** P3 
1e1e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1e1f0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
1e200 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c  ecords that will
1e210 20 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a   be stored by.**
1e220 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1e230 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70  e..*/.case OP_Op
1e240 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64  enPseudo: {.  Vd
1e250 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a  beCursor *pCx;..
1e260 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e270 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1e280 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a  ( pOp->p3>=0 );.
1e290 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1e2a0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1e2b0 31 2c 20 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20  1, pOp->p3, -1, 
1e2c0 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 29 3b  CURTYPE_PSEUDO);
1e2d0 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
1e2e0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1e2f0 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
1e300 0a 20 20 70 43 78 2d 3e 75 63 2e 70 73 65 75 64  .  pCx->uc.pseud
1e310 6f 54 61 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d  oTableReg = pOp-
1e320 3e 70 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61  >p2;.  pCx->isTa
1e330 62 6c 65 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ble = 1;.  asser
1e340 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b  t( pOp->p5==0 );
1e350 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1e360 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20 50 31  Opcode: Close P1
1e370 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43   * * * *.**.** C
1e380 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 70 72  lose a cursor pr
1e390 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
1e3a0 61 73 20 50 31 2e 20 20 49 66 20 50 31 20 69 73  as P1.  If P1 is
1e3b0 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   not.** currentl
1e3c0 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 69 6e 73  y open, this ins
1e3d0 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  truction is a no
1e3e0 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  -op..*/.case OP_
1e3f0 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73 65 72  Close: {.  asser
1e400 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1e410 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1e420 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  sor );.  sqlite3
1e430 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
1e440 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  , p->apCsr[pOp->
1e450 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72  p1]);.  p->apCsr
1e460 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b 0a 20  [pOp->p1] = 0;. 
1e470 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65   break;.}..#ifde
1e480 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e490 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
1e4a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75  ./* Opcode: Colu
1e4b0 6d 6e 73 55 73 65 64 20 50 31 20 2a 20 2a 20 50  mnsUsed P1 * * P
1e4c0 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  4 *.**.** This o
1e4d0 70 63 6f 64 65 20 28 77 68 69 63 68 20 6f 6e 6c  pcode (which onl
1e4e0 79 20 65 78 69 73 74 73 20 69 66 20 53 51 4c 69  y exists if SQLi
1e4f0 74 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  te was compiled 
1e500 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  with.** SQLITE_E
1e510 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
1e520 44 5f 4d 41 53 4b 29 20 69 64 65 6e 74 69 66 69  D_MASK) identifi
1e530 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
1e540 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
1e550 20 6f 72 20 69 6e 64 65 78 20 66 6f 72 20 63 75   or index for cu
1e560 72 73 6f 72 20 50 31 20 61 72 65 20 75 73 65 64  rsor P1 are used
1e570 2e 20 20 50 34 20 69 73 20 61 20 36 34 2d 62 69  .  P4 is a 64-bi
1e580 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 28 50 34  t integer.** (P4
1e590 5f 49 4e 54 36 34 29 20 69 6e 20 77 68 69 63 68  _INT64) in which
1e5a0 20 74 68 65 20 66 69 72 73 74 20 36 33 20 62 69   the first 63 bi
1e5b0 74 73 20 61 72 65 20 6f 6e 65 20 66 6f 72 20 65  ts are one for e
1e5c0 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ach of the.** fi
1e5d0 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f  rst 63 columns o
1e5e0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1e5f0 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 61 63  ndex that are ac
1e600 74 75 61 6c 6c 79 20 75 73 65 64 0a 2a 2a 20 62  tually used.** b
1e610 79 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  y the cursor.  T
1e620 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
1e630 74 20 69 73 20 73 65 74 20 69 66 20 61 6e 79 20  t is set if any 
1e640 63 6f 6c 75 6d 6e 20 61 66 74 65 72 0a 2a 2a 20  column after.** 
1e650 74 68 65 20 36 34 74 68 20 69 73 20 75 73 65 64  the 64th is used
1e660 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c  ..*/.case OP_Col
1e670 75 6d 6e 73 55 73 65 64 3a 20 7b 0a 20 20 56 64  umnsUsed: {.  Vd
1e680 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1e690 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1e6a0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1e6b0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
1e6c0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
1e6d0 0a 20 20 70 43 2d 3e 6d 61 73 6b 55 73 65 64 20  .  pC->maskUsed 
1e6e0 3d 20 2a 28 75 36 34 2a 29 70 4f 70 2d 3e 70 34  = *(u64*)pOp->p4
1e6f0 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
1e700 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
1e710 6f 64 65 3a 20 53 65 65 6b 47 45 20 50 31 20 50  ode: SeekGE P1 P
1e720 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
1e730 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
1e740 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  P4].**.** If cur
1e750 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1e760 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1e770 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1e780 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1e790 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1e7a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1e7b0 61 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66 20  as the key.  If 
1e7c0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1e7d0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1e7e0 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1e7f0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1e800 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1e810 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1e820 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1e830 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1e840 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1e850 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1e860 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1e870 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73  s to the smalles
1e880 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1e890 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e8a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1e8b0 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1e8c0 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1e8d0 72 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72 20  rds .** greater 
1e8e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e8f0 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1e900 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1e910 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1e920 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
1e930 72 20 50 31 20 77 61 73 20 6f 70 65 6e 65 64 20  r P1 was opened 
1e940 75 73 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47  using the OPFLAG
1e950 5f 53 45 45 4b 45 51 20 66 6c 61 67 2c 20 74 68  _SEEKEQ flag, th
1e960 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64  en this.** opcod
1e970 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61  e will always la
1e980 6e 64 20 6f 6e 20 61 20 72 65 63 6f 72 64 20 74  nd on a record t
1e990 68 61 74 20 65 71 75 61 6c 6c 79 20 65 71 75 61  hat equally equa
1e9a0 6c 73 20 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a  ls the key, or.*
1e9b0 2a 20 65 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65  * else jump imme
1e9c0 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20  diately to P2.  
1e9d0 57 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  When the cursor 
1e9e0 69 73 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  is OPFLAG_SEEKEQ
1e9f0 2c 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65  , this.** opcode
1ea00 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
1ea10 64 20 62 79 20 61 6e 20 49 64 78 4c 45 20 6f 70  d by an IdxLE op
1ea20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 73 61  code with the sa
1ea30 6d 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a  me arguments..**
1ea40 20 54 68 65 20 49 64 78 4c 45 20 6f 70 63 6f 64   The IdxLE opcod
1ea50 65 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  e will be skippe
1ea60 64 20 69 66 20 74 68 69 73 20 6f 70 63 6f 64 65  d if this opcode
1ea70 20 73 75 63 63 65 65 64 73 2c 20 62 75 74 20 74   succeeds, but t
1ea80 68 65 0a 2a 2a 20 49 64 78 4c 45 20 6f 70 63 6f  he.** IdxLE opco
1ea90 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  de will be used 
1eaa0 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f  on subsequent lo
1eab0 6f 70 20 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a  op iterations..*
1eac0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
1ead0 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1eae0 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  or configured to
1eaf0 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64   move in forward
1eb00 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20   order,.** from 
1eb10 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  the beginning to
1eb20 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49  ward the end.  I
1eb30 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1eb40 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  he cursor is.** 
1eb50 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1eb60 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76  e Next, not Prev
1eb70 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1eb80 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1eb90 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47  d, SeekLt, SeekG
1eba0 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20  t, SeekLe.*/./* 
1ebb0 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 54 20 50  Opcode: SeekGT P
1ebc0 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
1ebd0 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1ebe0 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1ebf0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ec00 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1ec10 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1ec20 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1ec30 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1ec40 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1ec50 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1ec60 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ec70 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1ec80 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1ec90 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1eca0 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1ecb0 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1ecc0 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1ecd0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1ece0 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1ecf0 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1ed00 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1ed10 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73  s to the smalles
1ed20 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1ed30 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1ed40 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
1ed50 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1ed60 72 65 63 6f 72 64 73 20 67 72 65 61 74 65 72 20  records greater 
1ed70 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79  than .** the key
1ed80 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1ed90 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1eda0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  o P2..**.** This
1edb0 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
1edc0 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67  he cursor config
1edd0 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20  ured to move in 
1ede0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a  forward order,.*
1edf0 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  * from the begin
1ee00 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20  ning toward the 
1ee10 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  end.  In other w
1ee20 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
1ee30 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65   is.** configure
1ee40 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e  d to use Next, n
1ee50 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53  ot Prev..**.** S
1ee60 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
1ee70 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74  NotFound, SeekLt
1ee80 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65  , SeekGe, SeekLe
1ee90 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
1eea0 65 65 6b 4c 54 20 50 31 20 50 32 20 50 33 20 50  eekLT P1 P2 P3 P
1eeb0 34 20 2a 20 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 * .** Synopsis
1eec0 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
1eed0 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1eee0 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1eef0 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1ef00 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1ef10 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1ef20 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1ef30 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1ef40 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1ef50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1ef60 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1ef70 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1ef80 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1ef90 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1efa0 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1efb0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1efc0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1efd0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1efe0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1eff0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1f000 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 74   largest entry t
1f010 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20  hat .** is less 
1f020 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
1f030 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1f040 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65 73 73   no records less
1f050 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20 6b 65   than .** the ke
1f060 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1f070 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1f080 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  to P2..**.** Thi
1f090 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
1f0a0 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
1f0b0 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
1f0c0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a   reverse order,.
1f0d0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ** from the end 
1f0e0 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69 6e  toward the begin
1f0f0 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20  ning.  In other 
1f100 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
1f110 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
1f120 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20  ed to use Prev, 
1f130 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  not Next..**.** 
1f140 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1f150 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47   NotFound, SeekG
1f160 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1f170 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  e.*/./* Opcode: 
1f180 53 65 65 6b 4c 45 20 50 31 20 50 32 20 50 33 20  SeekLE P1 P2 P3 
1f190 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
1f1a0 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
1f1b0 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1f1c0 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1f1d0 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1f1e0 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1f1f0 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1f200 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1f210 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1f220 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1f230 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1f240 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1f250 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1f260 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1f270 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1f280 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1f290 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1f2a0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1f2b0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1f2c0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
1f2d0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1f2e0 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68  largest entry th
1f2f0 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  at .** is less t
1f300 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1f310 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49  the key value. I
1f320 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72  f there are no r
1f330 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20  ecords .** less 
1f340 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1f350 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1f360 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1f370 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1f380 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1f390 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
1f3a0 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
1f3b0 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20  move in reverse 
1f3c0 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
1f3d0 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68  he end toward th
1f3e0 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e  e beginning.  In
1f3f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1f400 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
1f410 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
1f420 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e   Prev, not Next.
1f430 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
1f440 72 73 6f 72 20 50 31 20 77 61 73 20 6f 70 65 6e  rsor P1 was open
1f450 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 46  ed using the OPF
1f460 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c 61 67 2c  LAG_SEEKEQ flag,
1f470 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70   then this.** op
1f480 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  code will always
1f490 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65 63 6f 72   land on a recor
1f4a0 64 20 74 68 61 74 20 65 71 75 61 6c 6c 79 20 65  d that equally e
1f4b0 71 75 61 6c 73 20 74 68 65 20 6b 65 79 2c 20 6f  quals the key, o
1f4c0 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d 70 20 69  r.** else jump i
1f4d0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
1f4e0 2e 20 20 57 68 65 6e 20 74 68 65 20 63 75 72 73  .  When the curs
1f4f0 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f 53 45 45  or is OPFLAG_SEE
1f500 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20 6f 70 63  KEQ, this.** opc
1f510 6f 64 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ode must be foll
1f520 6f 77 65 64 20 62 79 20 61 6e 20 49 64 78 47 45  owed by an IdxGE
1f530 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68 65   opcode with the
1f540 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 73 2e   same arguments.
1f550 0a 2a 2a 20 54 68 65 20 49 64 78 47 45 20 6f 70  .** The IdxGE op
1f560 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 6b 69  code will be ski
1f570 70 70 65 64 20 69 66 20 74 68 69 73 20 6f 70 63  pped if this opc
1f580 6f 64 65 20 73 75 63 63 65 65 64 73 2c 20 62 75  ode succeeds, bu
1f590 74 20 74 68 65 0a 2a 2a 20 49 64 78 47 45 20 6f  t the.** IdxGE o
1f5a0 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73  pcode will be us
1f5b0 65 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  ed on subsequent
1f5c0 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 73   loop iterations
1f5d0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1f5e0 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1f5f0 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47  d, SeekGt, SeekG
1f600 65 2c 20 53 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73  e, SeekLt.*/.cas
1f610 65 20 4f 50 5f 53 65 65 6b 4c 54 3a 20 20 20 20  e OP_SeekLT:    
1f620 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1f630 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1f640 6b 4c 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLE:         /* 
1f650 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1f660 65 20 4f 50 5f 53 65 65 6b 47 45 3a 20 20 20 20  e OP_SeekGE:    
1f670 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1f680 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1f690 6b 47 54 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  kGT: {       /* 
1f6a0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69  jump, in3 */.  i
1f6b0 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
1f6c0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1f6d0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  result */.  int 
1f6e0 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  oc;            /
1f6f0 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 56 64  * Opcode */.  Vd
1f700 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20  beCursor *pC;   
1f710 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
1f720 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 55 6e 70 61  o seek */.  Unpa
1f730 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 20 20 2f  ckedRecord r;  /
1f740 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 73 65 65  * The key to see
1f750 6b 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  k for */.  int n
1f760 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a  Field;        /*
1f770 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
1f780 6e 73 20 6f 72 20 66 69 65 6c 64 73 20 69 6e 20  ns or fields in 
1f790 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  the key */.  i64
1f7a0 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
1f7b0 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 77 65 20  /* The rowid we 
1f7c0 61 72 65 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  are to seek to *
1f7d0 2f 0a 20 20 69 6e 74 20 65 71 4f 6e 6c 79 3b 20  /.  int eqOnly; 
1f7e0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 69         /* Only i
1f7f0 6e 74 65 72 65 73 74 65 64 20 69 6e 20 3d 3d 20  nterested in == 
1f800 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
1f810 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1f820 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1f830 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
1f840 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  rt( pOp->p2!=0 )
1f850 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1f860 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1f870 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
1f880 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
1f890 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f8a0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
1f8b0 28 20 4f 50 5f 53 65 65 6b 4c 45 20 3d 3d 20 4f  ( OP_SeekLE == O
1f8c0 50 5f 53 65 65 6b 4c 54 2b 31 20 29 3b 0a 20 20  P_SeekLT+1 );.  
1f8d0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
1f8e0 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 32  E == OP_SeekLT+2
1f8f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1f900 5f 53 65 65 6b 47 54 20 3d 3d 20 4f 50 5f 53 65  _SeekGT == OP_Se
1f910 65 6b 4c 54 2b 33 20 29 3b 0a 20 20 61 73 73 65  ekLT+3 );.  asse
1f920 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65  rt( pC->isOrdere
1f930 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
1f940 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
1f950 20 29 3b 0a 20 20 6f 63 20 3d 20 70 4f 70 2d 3e   );.  oc = pOp->
1f960 6f 70 63 6f 64 65 3b 0a 20 20 65 71 4f 6e 6c 79  opcode;.  eqOnly
1f970 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c   = 0;.  pC->null
1f980 52 6f 77 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  Row = 0;.#ifdef 
1f990 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
1f9a0 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d  C->seekOp = pOp-
1f9b0 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  >opcode;.#endif.
1f9c0 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62  .  if( pC->isTab
1f9d0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  le ){.    /* The
1f9e0 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 66   BTREE_SEEK_EQ f
1f9f0 6c 61 67 20 69 73 20 6f 6e 6c 79 20 73 65 74 20  lag is only set 
1fa00 6f 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 73  on index cursors
1fa10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1fa20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1fa30 6f 72 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63  orHasHint(pC->uc
1fa40 2e 70 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f  .pCursor, BTREE_
1fa50 53 45 45 4b 5f 45 51 29 3d 3d 30 0a 20 20 20 20  SEEK_EQ)==0.    
1fa60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
1fa70 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20  RUPT_DB );..    
1fa80 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c  /* The input val
1fa90 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62  ue in P3 might b
1faa0 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69  e of any type: i
1fab0 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
1fac0 72 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 62 6c 6f  ring,.    ** blo
1fad0 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74  b, or NULL.  But
1fae0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1faf0 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72  an integer befor
1fb00 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20  e we can do.    
1fb10 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20  ** the seek, so 
1fb20 63 6f 6e 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20  convert it. */. 
1fb30 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b     pIn3 = &aMem[
1fb40 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 69 66  pOp->p3];.    if
1fb50 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
1fb60 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
1fb70 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45  al|MEM_Str))==ME
1fb80 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 61  M_Str ){.      a
1fb90 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
1fba0 69 74 79 28 70 49 6e 33 2c 20 30 29 3b 0a 20 20  ity(pIn3, 0);.  
1fbb0 20 20 7d 0a 20 20 20 20 69 4b 65 79 20 3d 20 73    }.    iKey = s
1fbc0 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
1fbd0 75 65 28 70 49 6e 33 29 3b 0a 0a 20 20 20 20 2f  ue(pIn3);..    /
1fbe0 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75  * If the P3 valu
1fbf0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  e could not be c
1fc00 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
1fc10 20 69 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74   integer without
1fc20 0a 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20  .    ** loss of 
1fc30 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65  information, the
1fc40 6e 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73  n special proces
1fc50 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  sing is required
1fc60 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ... */.    if( (
1fc70 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1fc80 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
1fc90 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
1fca0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d  ags & MEM_Real)=
1fcb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1fcc0 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
1fcd0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
1fce0 72 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69  rted into any ki
1fcf0 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a  nd of a number,.
1fd00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1fd10 74 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74 20  the seek is not 
1fd20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75 6d  possible, so jum
1fd30 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 20  p to P2 */.     
1fd40 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
1fd50 65 6e 28 31 2c 32 29 3b 20 67 6f 74 6f 20 6a 75  en(1,2); goto ju
1fd60 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20  mp_to_p2;.      
1fd70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fd80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1fd90 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  e approximation 
1fda0 69 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20 74  iKey is larger t
1fdb0 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  han the actual r
1fdc0 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20  eal search.     
1fdd0 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69   ** term, substi
1fde0 74 75 74 65 20 3e 3d 20 66 6f 72 20 3e 20 61 6e  tute >= for > an
1fdf0 64 20 3c 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 2e  d < for <=. e.g.
1fe00 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20 74   if the search t
1fe10 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  erm.      ** is 
1fe20 34 2e 39 20 61 6e 64 20 74 68 65 20 69 6e 74 65  4.9 and the inte
1fe30 67 65 72 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  ger approximatio
1fe40 6e 20 35 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n 5:.      **.  
1fe50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78      **        (x
1fe60 20 3e 20 20 34 2e 39 29 20 20 20 20 2d 3e 20 20   >  4.9)    ->  
1fe70 20 20 20 28 78 20 3e 3d 20 35 29 0a 20 20 20 20     (x >= 5).    
1fe80 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3c    **        (x <
1fe90 3d 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20  = 4.9)    ->    
1fea0 20 28 78 20 3c 20 20 35 29 0a 20 20 20 20 20 20   (x <  5).      
1feb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  */.      if( pIn
1fec0 33 2d 3e 75 2e 72 3c 28 64 6f 75 62 6c 65 29 69  3->u.r<(double)i
1fed0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Key ){.        a
1fee0 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45  ssert( OP_SeekGE
1fef0 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 2d 31 29 20  ==(OP_SeekGT-1) 
1ff00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ff10 74 28 20 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 4f  t( OP_SeekLT==(O
1ff20 50 5f 53 65 65 6b 4c 45 2d 31 29 20 29 3b 0a 20  P_SeekLE-1) );. 
1ff30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1ff40 4f 50 5f 53 65 65 6b 4c 45 20 26 20 30 78 30 30  OP_SeekLE & 0x00
1ff50 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20  01)==(OP_SeekGT 
1ff60 26 20 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20  & 0x0001) );.   
1ff70 20 20 20 20 20 69 66 28 20 28 6f 63 20 26 20 30       if( (oc & 0
1ff80 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
1ff90 47 54 20 26 20 30 78 30 30 30 31 29 20 29 20 6f  GT & 0x0001) ) o
1ffa0 63 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  c--;.      }..  
1ffb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70      /* If the ap
1ffc0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79  proximation iKey
1ffd0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1ffe0 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61 6c   the actual real
1fff0 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   search.      **
20000 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75 74   term, substitut
20010 65 20 3c 3d 20 66 6f 72 20 3c 20 61 6e 64 20 3e  e <= for < and >
20020 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 20   for >=.  */.   
20030 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 6e 33     else if( pIn3
20040 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c 65 29 69 4b  ->u.r>(double)iK
20050 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ey ){.        as
20060 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 3d  sert( OP_SeekLE=
20070 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b 31 29 20 29  =(OP_SeekLT+1) )
20080 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20090 28 20 4f 50 5f 53 65 65 6b 47 54 3d 3d 28 4f 50  ( OP_SeekGT==(OP
200a0 5f 53 65 65 6b 47 45 2b 31 29 20 29 3b 0a 20 20  _SeekGE+1) );.  
200b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 4f        assert( (O
200c0 50 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30 30  P_SeekLT & 0x000
200d0 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 20 26  1)==(OP_SeekGE &
200e0 20 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20   0x0001) );.    
200f0 20 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 78      if( (oc & 0x
20100 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 4c  0001)==(OP_SeekL
20110 54 20 26 20 30 78 30 30 30 31 29 20 29 20 6f 63  T & 0x0001) ) oc
20120 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
20130 7d 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  } .    rc = sqli
20140 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
20150 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
20160 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69  ursor, 0, (u64)i
20170 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  Key, 0, &res);. 
20180 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
20190 67 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20  get = iKey;  /* 
201a0 55 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74  Used by OP_Delet
201b0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21  e */.    if( rc!
201c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
201d0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
201e0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
201f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
20200 2f 2a 20 46 6f 72 20 61 20 63 75 72 73 6f 72 20  /* For a cursor 
20210 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f 53  with the BTREE_S
20220 45 45 4b 5f 45 51 20 68 69 6e 74 2c 20 6f 6e 6c  EEK_EQ hint, onl
20230 79 20 74 68 65 20 4f 50 5f 53 65 65 6b 47 45 20  y the OP_SeekGE 
20240 61 6e 64 0a 20 20 20 20 2a 2a 20 4f 50 5f 53 65  and.    ** OP_Se
20250 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20 61 72 65  ekLE opcodes are
20260 20 61 6c 6c 6f 77 65 64 2c 20 61 6e 64 20 74 68   allowed, and th
20270 65 73 65 20 6d 75 73 74 20 62 65 20 69 6d 6d 65  ese must be imme
20280 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64  diately followed
20290 0a 20 20 20 20 2a 2a 20 62 79 20 61 6e 20 4f 50  .    ** by an OP
202a0 5f 49 64 78 47 54 20 6f 72 20 4f 50 5f 49 64 78  _IdxGT or OP_Idx
202b0 4c 54 20 6f 70 63 6f 64 65 2c 20 72 65 73 70 65  LT opcode, respe
202c0 63 74 69 76 65 6c 79 2c 20 77 69 74 68 20 74 68  ctively, with th
202d0 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20 20 20 20  e same key..    
202e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
202f0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
20300 48 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  Hint(pC->uc.pCur
20310 73 6f 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f  sor, BTREE_SEEK_
20320 45 51 29 20 29 7b 0a 20 20 20 20 20 20 65 71 4f  EQ) ){.      eqO
20330 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  nly = 1;.      a
20340 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
20350 64 65 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c  de==OP_SeekGE ||
20360 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20370 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20  _SeekLE );.     
20380 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
20390 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54  opcode==OP_IdxLT
203a0 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64   || pOp[1].opcod
203b0 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  e==OP_IdxGT );. 
203c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
203d0 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b 30 5d 2e 70  [1].p1==pOp[0].p
203e0 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
203f0 74 28 20 70 4f 70 5b 31 5d 2e 70 32 3d 3d 70 4f  t( pOp[1].p2==pO
20400 70 5b 30 5d 2e 70 32 20 29 3b 0a 20 20 20 20 20  p[0].p2 );.     
20410 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
20420 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33 20 29 3b  p3==pOp[0].p3 );
20430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20440 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b  Op[1].p4.i==pOp[
20450 30 5d 2e 70 34 2e 69 20 29 3b 0a 20 20 20 20 7d  0].p4.i );.    }
20460 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70  ..    nField = p
20470 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 61 73  Op->p4.i;.    as
20480 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
20490 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
204a0 20 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c     assert( nFiel
204b0 64 3e 30 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65  d>0 );.    r.pKe
204c0 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79  yInfo = pC->pKey
204d0 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65  Info;.    r.nFie
204e0 6c 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64  ld = (u16)nField
204f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
20500 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20  xt line of code 
20510 63 6f 6d 70 75 74 65 73 20 61 73 20 66 6f 6c 6c  computes as foll
20520 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72  ows, only faster
20530 3a 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20 6f  :.    **   if( o
20540 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20  c==OP_SeekGT || 
20550 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 7b  oc==OP_SeekLE ){
20560 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 64 65  .    **     r.de
20570 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20  fault_rc = -1;. 
20580 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20     **   }else{. 
20590 20 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61     **     r.defa
205a0 75 6c 74 5f 72 63 20 3d 20 2b 31 3b 0a 20 20 20  ult_rc = +1;.   
205b0 20 2a 2a 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20   **   }.    */. 
205c0 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20     r.default_rc 
205d0 3d 20 28 28 31 20 26 20 28 6f 63 20 2d 20 4f 50  = ((1 & (oc - OP
205e0 5f 53 65 65 6b 4c 54 29 29 20 3f 20 2d 31 20 3a  _SeekLT)) ? -1 :
205f0 20 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74   +1);.    assert
20600 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 54 20  ( oc!=OP_SeekGT 
20610 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d  || r.default_rc=
20620 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =-1 );.    asser
20630 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 45  t( oc!=OP_SeekLE
20640 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63   || r.default_rc
20650 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ==-1 );.    asse
20660 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47  rt( oc!=OP_SeekG
20670 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72  E || r.default_r
20680 63 3d 3d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  c==+1 );.    ass
20690 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b  ert( oc!=OP_Seek
206a0 4c 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f  LT || r.default_
206b0 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20 20 20 20 72  rc==+1 );..    r
206c0 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
206d0 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53  p->p3];.#ifdef S
206e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
206f0 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
20700 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
20710 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
20720 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
20730 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
20740 20 20 72 2e 65 71 53 65 65 6e 20 3d 20 30 3b 0a    r.eqSeen = 0;.
20750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20760 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
20770 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ked(pC->uc.pCurs
20780 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72  or, &r, 0, 0, &r
20790 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  es);.    if( rc!
207a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
207b0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
207c0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
207d0 20 7d 0a 20 20 20 20 69 66 28 20 65 71 4f 6e 6c   }.    if( eqOnl
207e0 79 20 26 26 20 72 2e 65 71 53 65 65 6e 3d 3d 30  y && r.eqSeen==0
207f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20800 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20  ( res!=0 );.    
20810 20 20 67 6f 74 6f 20 73 65 65 6b 5f 6e 6f 74 5f    goto seek_not_
20820 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  found;.    }.  }
20830 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
20840 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d  oveto = 0;.  pC-
20850 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
20860 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64  ACHE_STALE;.#ifd
20870 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
20880 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
20890 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
208a0 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65    if( oc>=OP_See
208b0 6b 47 45 20 29 7b 20 20 61 73 73 65 72 74 28 20  kGE ){  assert( 
208c0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c  oc==OP_SeekGE ||
208d0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29   oc==OP_SeekGT )
208e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
208f0 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63  || (res==0 && oc
20900 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20 29 7b 0a  ==OP_SeekGT) ){.
20910 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
20920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20930 33 42 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 75  3BtreeNext(pC->u
20940 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  c.pCursor, &res)
20950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20960 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20970 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
20980 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ror;.    }else{.
20990 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
209a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
209b0 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50    assert( oc==OP
209c0 5f 53 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f  _SeekLT || oc==O
209d0 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20  P_SeekLE );.    
209e0 69 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65  if( res>0 || (re
209f0 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
20a00 65 65 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20  eekLT) ){.      
20a10 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  res = 0;.      r
20a20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20a30 50 72 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e  Previous(pC->uc.
20a40 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
20a50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20a60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
20a70 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
20a80 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
20a90 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74      /* res might
20aa0 20 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63   be negative bec
20ab0 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  ause the table i
20ac0 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20  s empty.  Check 
20ad0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
20ae0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
20af0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
20b00 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
20b10 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 75 63  3BtreeEof(pC->uc
20b20 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  .pCursor);.    }
20b30 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f  .  }.seek_not_fo
20b40 75 6e 64 3a 0a 20 20 61 73 73 65 72 74 28 20 70  und:.  assert( p
20b50 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64  Op->p2>0 );.  Vd
20b60 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
20b70 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72  s!=0,2);.  if( r
20b80 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a  es ){.    goto j
20b90 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c  ump_to_p2;.  }el
20ba0 73 65 20 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b  se if( eqOnly ){
20bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
20bc0 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  [1].opcode==OP_I
20bd0 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f  dxLT || pOp[1].o
20be0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20  pcode==OP_IdxGT 
20bf0 29 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a  );.    pOp++; /*
20c00 20 53 6b 69 70 20 74 68 65 20 4f 50 5f 49 64 78   Skip the OP_Idx
20c10 4c 74 20 6f 72 20 4f 50 5f 49 64 78 47 54 20 74  Lt or OP_IdxGT t
20c20 68 61 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20  hat follows */. 
20c30 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
20c40 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20  * Opcode: Found 
20c50 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
20c60 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
20c70 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66  [P3@P4].**.** If
20c80 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69   P4==0 then regi
20c90 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20  ster P3 holds a 
20ca0 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64  blob constructed
20cb0 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20   by MakeRecord. 
20cc0 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e   If.** P4>0 then
20cd0 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
20ce0 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20  the first of P4 
20cf0 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66  registers that f
20d00 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a  orm an unpacked.
20d10 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  ** record..**.**
20d20 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
20d30 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
20d40 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
20d50 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
20d60 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20   and P4.** is a 
20d70 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e  prefix of any en
20d80 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61  try in P1 then a
20d90 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
20da0 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73   P2 and.** P1 is
20db0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
20dc0 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  t the matching e
20dd0 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
20de0 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65   operation leave
20df0 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
20e00 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
20e10 20 63 61 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e   can be.** advan
20e20 63 65 64 20 69 6e 20 74 68 65 20 66 6f 72 77 61  ced in the forwa
20e30 72 64 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 54  rd direction.  T
20e40 68 65 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  he Next instruct
20e50 69 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a  ion will work,.*
20e60 2a 20 62 75 74 20 6e 6f 74 20 74 68 65 20 50 72  * but not the Pr
20e70 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ev instruction..
20e80 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
20e90 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66  NotFound, NoConf
20ea0 6c 69 63 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e  lict, NotExists.
20eb0 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70   SeekGe.*/./* Op
20ec0 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50  code: NotFound P
20ed0 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
20ee0 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
20ef0 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
20f00 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73  P4==0 then regis
20f10 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
20f20 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
20f30 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
20f40 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20  If.** P4>0 then 
20f50 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  register P3 is t
20f60 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72  he first of P4 r
20f70 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f  egisters that fo
20f80 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a  rm an unpacked.*
20f90 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a  * record..** .**
20fa0 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
20fb0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
20fc0 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
20fd0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
20fe0 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f   and P4.** is no
20ff0 74 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  t the prefix of 
21000 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20  any entry in P1 
21010 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d  then a jump is m
21020 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50  ade to P2.  If P
21030 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61  1 .** does conta
21040 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73  in an entry whos
21050 65 20 70 72 65 66 69 78 20 6d 61 74 63 68 65 73  e prefix matches
21060 20 74 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72   the P3/P4 recor
21070 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a  d then control.*
21080 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20  * falls through 
21090 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
210a0 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69  ruction and P1 i
210b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
210c0 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69  at the.** matchi
210d0 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
210e0 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c  This operation l
210f0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
21100 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
21110 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  e it cannot be.*
21120 2a 20 61 64 76 61 6e 63 65 64 20 69 6e 20 65 69  * advanced in ei
21130 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
21140 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
21150 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
21160 65 76 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f  ev.** opcodes do
21170 20 6e 6f 74 20 77 6f 72 6b 20 61 66 74 65 72 20   not work after 
21180 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
21190 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
211a0 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73  Found, NotExists
211b0 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a  , NoConflict.*/.
211c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e  /* Opcode: NoCon
211d0 66 6c 69 63 74 20 50 31 20 50 32 20 50 33 20 50  flict P1 P2 P3 P
211e0 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
211f0 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
21200 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65  .** If P4==0 the
21210 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f  n register P3 ho
21220 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74  lds a blob const
21230 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65  ructed by MakeRe
21240 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e  cord.  If.** P4>
21250 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
21260 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
21270 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
21280 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70  that form an unp
21290 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e  acked.** record.
212a0 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50  .** .** Cursor P
212b0 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  1 is on an index
212c0 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
212d0 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65  record identifie
212e0 64 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a  d by P3 and P4.*
212f0 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  * contains any N
21300 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20  ULL value, jump 
21310 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
21320 32 2e 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73  2.  If all terms
21330 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72   of the.** recor
21340 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74  d are not-NULL t
21350 68 65 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64  hen a check is d
21360 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  one to determine
21370 20 69 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74   if any row in t
21380 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62  he.** P1 index b
21390 74 72 65 65 20 68 61 73 20 61 20 6d 61 74 63 68  tree has a match
213a0 69 6e 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20  ing key prefix. 
213b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
213c0 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a   matches, jump.*
213d0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  * immediately to
213e0 20 50 32 2e 20 20 49 66 20 74 68 65 72 65 20 69   P2.  If there i
213f0 73 20 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20  s a match, fall 
21400 74 68 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76  through and leav
21410 65 20 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73  e the P1.** curs
21420 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
21430 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e  he matching row.
21440 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
21450 64 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  de is similar to
21460 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74   OP_NotFound wit
21470 68 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73  h the exceptions
21480 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61   that the.** bra
21490 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61  nch is always ta
214a0 6b 65 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20  ken if any part 
214b0 6f 66 20 74 68 65 20 73 65 61 72 63 68 20 6b 65  of the search ke
214c0 79 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  y input is NULL.
214d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72  .**.** This oper
214e0 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65  ation leaves the
214f0 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
21500 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
21510 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65  ot be.** advance
21520 64 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  d in either dire
21530 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
21540 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
21550 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63   and Prev.** opc
21560 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b  odes do not work
21570 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72   after this oper
21580 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ation..**.** See
21590 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c   also: NotFound,
215a0 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74   Found, NotExist
215b0 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43  s.*/.case OP_NoC
215c0 6f 6e 66 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20  onflict:     /* 
215d0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
215e0 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20  e OP_NotFound:  
215f0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
21600 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75  3 */.case OP_Fou
21610 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  nd: {        /* 
21620 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69  jump, in3 */.  i
21630 6e 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  nt alreadyExists
21640 3b 0a 20 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70  ;.  int takeJump
21650 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 56 64  ;.  int ii;.  Vd
21660 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
21670 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63  int res;.  Unpac
21680 6b 65 64 52 65 63 6f 72 64 20 2a 70 46 72 65 65  kedRecord *pFree
21690 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
216a0 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55  rd *pIdxKey;.  U
216b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
216c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
216d0 54 45 53 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e  TEST.  if( pOp->
216e0 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e  opcode!=OP_NoCon
216f0 66 6c 69 63 74 20 29 20 73 71 6c 69 74 65 33 5f  flict ) sqlite3_
21700 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  found_count++;.#
21710 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
21720 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
21730 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
21740 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21750 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
21760 4e 54 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70  NT32 );.  pC = p
21770 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
21780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
21790 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
217a0 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73  TE_DEBUG.  pC->s
217b0 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63  eekOp = pOp->opc
217c0 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49  ode;.#endif.  pI
217d0 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
217e0 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p3];.  assert( p
217f0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
21800 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
21810 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
21820 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
21830 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
21840 6c 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  le==0 );.  if( p
21850 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20  Op->p4.i>0 ){.  
21860 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
21870 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
21880 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
21890 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20  )pOp->p4.i;.    
218a0 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23  r.aMem = pIn3;.#
218b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
218c0 55 47 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  UG.    for(ii=0;
218d0 20 69 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69   ii<r.nField; ii
218e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
218f0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
21900 2e 61 4d 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20  .aMem[ii]) );.  
21910 20 20 20 20 61 73 73 65 72 74 28 20 28 72 2e 61      assert( (r.a
21920 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20  Mem[ii].flags & 
21930 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
21940 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20  r.aMem[ii].n==0 
21950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 69 20  );.      if( ii 
21960 29 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45  ) REGISTER_TRACE
21970 28 70 4f 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e  (pOp->p3+ii, &r.
21980 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d  aMem[ii]);.    }
21990 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 64 78  .#endif.    pIdx
219a0 4b 65 79 20 3d 20 26 72 3b 0a 20 20 20 20 70 46  Key = &r;.    pF
219b0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
219c0 7b 0a 20 20 20 20 70 46 72 65 65 20 3d 20 70 49  {.    pFree = pI
219d0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
219e0 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
219f0 52 65 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49  Record(pC->pKeyI
21a00 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49  nfo);.    if( pI
21a10 64 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  dxKey==0 ) goto 
21a20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65  no_mem;.    asse
21a30 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  rt( pIn3->flags 
21a40 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
21a50 20 20 28 76 6f 69 64 29 45 78 70 61 6e 64 42 6c    (void)ExpandBl
21a60 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 73 71  ob(pIn3);.    sq
21a70 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
21a80 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e  npack(pC->pKeyIn
21a90 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e  fo, pIn3->n, pIn
21aa0 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a  3->z, pIdxKey);.
21ab0 20 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64    }.  pIdxKey->d
21ac0 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20  efault_rc = 0;. 
21ad0 20 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20   takeJump = 0;. 
21ae0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
21af0 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20  ==OP_NoConflict 
21b00 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68  ){.    /* For th
21b10 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20  e OP_NoConflict 
21b20 6f 70 63 6f 64 65 2c 20 74 61 6b 65 20 74 68 65  opcode, take the
21b30 20 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f 66 20   jump if any of 
21b40 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74  the.    ** input
21b50 20 66 69 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c   fields are NULL
21b60 2c 20 73 69 6e 63 65 20 61 6e 79 20 6b 65 79 20  , since any key 
21b70 77 69 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c  with a NULL will
21b80 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66   not.    ** conf
21b90 6c 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lict */.    for(
21ba0 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65 79  ii=0; ii<pIdxKey
21bb0 2d 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b  ->nField; ii++){
21bc0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b  .      if( pIdxK
21bd0 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61  ey->aMem[ii].fla
21be0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
21bf0 0a 20 20 20 20 20 20 20 20 74 61 6b 65 4a 75 6d  .        takeJum
21c00 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  p = 1;.        b
21c10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21c20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73    }.  }.  rc = s
21c30 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
21c40 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
21c50 2e 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65  .pCursor, pIdxKe
21c60 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a  y, 0, 0, &res);.
21c70 20 20 69 66 28 20 70 46 72 65 65 20 29 20 73 71    if( pFree ) sq
21c80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21c90 70 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63  pFree);.  if( rc
21ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21cb0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
21cc0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
21cd0 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
21ce0 20 3d 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64   = res;.  alread
21cf0 79 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d  yExists = (res==
21d00 30 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  0);.  pC->nullRo
21d10 77 20 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69  w = 1-alreadyExi
21d20 73 74 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  sts;.  pC->defer
21d30 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
21d40 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
21d50 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
21d60 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
21d70 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20  e==OP_Found ){. 
21d80 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
21d90 65 6e 28 61 6c 72 65 61 64 79 45 78 69 73 74 73  en(alreadyExists
21da0 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20  !=0,2);.    if( 
21db0 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20  alreadyExists ) 
21dc0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
21dd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
21de0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61  beBranchTaken(ta
21df0 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45  keJump||alreadyE
21e00 78 69 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20  xists==0,2);.   
21e10 20 69 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c   if( takeJump ||
21e20 20 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20   !alreadyExists 
21e30 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
21e40 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
21e50 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
21e60 65 6b 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ekRowid P1 P2 P3
21e70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
21e80 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a  : intkey=r[P3].*
21e90 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
21ea0 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72  ndex of a cursor
21eb0 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20   open on an SQL 
21ec0 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74  table btree (wit
21ed0 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  h integer.** key
21ee0 73 29 2e 20 20 49 66 20 72 65 67 69 73 74 65 72  s).  If register
21ef0 20 50 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   P3 does not con
21f00 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  tain an integer 
21f10 6f 72 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f  or if P1 does no
21f20 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72  t.** contain a r
21f30 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64  ecord with rowid
21f40 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
21f50 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
21f60 20 20 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20    .** Or, if P2 
21f70 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53  is 0, raise an S
21f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
21f90 72 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20  ror. If P1 does 
21fa0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63  contain.** a rec
21fb0 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50  ord with rowid P
21fc0 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65  3 then .** leave
21fd0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
21fe0 74 69 6e 67 20 61 74 20 74 68 61 74 20 72 65 63  ting at that rec
21ff0 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72  ord and fall thr
22000 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
22010 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
22020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f  .**.** The OP_No
22030 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70  tExists opcode p
22040 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65  erforms the same
22050 20 6f 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20   operation, but 
22060 77 69 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74  with OP_NotExist
22070 73 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69  s.** the P3 regi
22080 73 74 65 72 20 6d 75 73 74 20 62 65 20 67 75 61  ster must be gua
22090 72 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61  ranteed to conta
220a0 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  in an integer va
220b0 6c 75 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a  lue.  With this.
220c0 2a 2a 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73  ** opcode, regis
220d0 74 65 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74  ter P3 might not
220e0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
220f0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ger..**.** The O
22100 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64  P_NotFound opcod
22110 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73  e performs the s
22120 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ame operation on
22130 20 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a   index btrees.**
22140 20 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79   (with arbitrary
22150 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79   multi-value key
22160 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  s)..**.** This o
22170 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
22180 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
22190 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
221a0 6f 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a  ot be advanced.*
221b0 2a 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  * in either dire
221c0 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
221d0 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
221e0 20 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65   and Prev opcode
221f0 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
22200 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  rk following thi
22210 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  s opcode..**.** 
22220 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
22230 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e   NotFound, NoCon
22240 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64  flict, SeekRowid
22250 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
22260 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50  otExists P1 P2 P
22270 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
22280 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a  s: intkey=r[P3].
22290 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
222a0 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f  index of a curso
222b0 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c  r open on an SQL
222c0 20 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69   table btree (wi
222d0 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  th integer.** ke
222e0 79 73 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69  ys).  P3 is an i
222f0 6e 74 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49  nteger rowid.  I
22300 66 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f  f P1 does not co
22310 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
22320 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20  ith.** rowid P3 
22330 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
22340 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72  ately to P2.  Or
22350 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20 72 61  , if P2 is 0, ra
22360 69 73 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ise an.** SQLITE
22370 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
22380 49 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61  If P1 does conta
22390 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  in a record with
223a0 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a   rowid P3 then .
223b0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75 72  ** leave the cur
223c0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  sor pointing at 
223d0 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20  that record and 
223e0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
223f0 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74  the next.** inst
22400 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
22410 68 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20  he OP_SeekRowid 
22420 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
22430 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
22440 6f 6e 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f  on but also allo
22450 77 73 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67  ws the.** P3 reg
22460 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
22470 20 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76   a non-integer v
22480 61 6c 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63  alue, in which c
22490 61 73 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a  ase the jump is.
224a0 2a 2a 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e  ** always taken.
224b0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65    This opcode re
224c0 71 75 69 72 65 73 20 74 68 61 74 20 50 33 20 61  quires that P3 a
224d0 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e  lways contain an
224e0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
224f0 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  The OP_NotFound 
22500 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
22510 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
22520 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65  on on index btre
22530 65 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69  es.** (with arbi
22540 74 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75  trary multi-valu
22550 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  e keys)..**.** T
22560 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
22570 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
22580 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
22590 20 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e   cannot be advan
225a0 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72  ced.** in either
225b0 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
225c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
225d0 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f   Next and Prev o
225e0 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  pcodes will.** n
225f0 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e  ot work followin
22600 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
22610 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
22620 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
22630 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b  NoConflict, Seek
22640 52 6f 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50  Rowid.*/.case OP
22650 5f 53 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20  _SeekRowid: {   
22660 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
22670 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  3 */.  VdbeCurso
22680 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
22690 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
226a0 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b  res;.  u64 iKey;
226b0 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ..  pIn3 = &aMem
226c0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
226d0 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
226e0 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
226f0 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
22700 28 70 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46  (pIn3, SQLITE_AF
22710 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64  F_NUMERIC, encod
22720 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ing);.    if( (p
22730 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
22740 5f 49 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20  _Int)==0 ) goto 
22750 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
22760 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
22770 68 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69  h into OP_NotExi
22780 73 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  sts */.case OP_N
22790 6f 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20  otExists:       
227a0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
227b0 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  */.  pIn3 = &aMe
227c0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
227d0 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
227e0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
227f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
22800 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
22810 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
22820 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
22830 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
22840 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66   pC!=0 );.#ifdef
22850 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
22860 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a  pC->seekOp = 0;.
22870 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
22880 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
22890 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
228a0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
228b0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72  BTREE );.  pCrsr
228c0 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
228d0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  r;.  assert( pCr
228e0 73 72 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d  sr!=0 );.  res =
228f0 20 30 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e   0;.  iKey = pIn
22900 33 2d 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73  3->u.i;.  rc = s
22910 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
22920 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c  oUnpacked(pCrsr,
22930 20 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65   0, iKey, 0, &re
22940 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  s);.  assert( rc
22950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
22960 65 73 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d  es==0 );.  pC->m
22970 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b  ovetoTarget = iK
22980 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20  ey;  /* Used by 
22990 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70  OP_Delete */.  p
229a0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
229b0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
229c0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
229d0 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
229e0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62  oveto = 0;.  Vdb
229f0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
22a00 21 3d 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65  !=0,2);.  pC->se
22a10 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
22a20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a    if( res!=0 ){.
22a30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
22a40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
22a50 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20   if( pOp->p2==0 
22a60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22a70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22a80 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
22a90 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
22aa0 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _p2;.    }.  }. 
22ab0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
22ac0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
22ad0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
22ae0 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e  * Opcode: Sequen
22af0 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ce P1 P2 * * *.*
22b00 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
22b10 5d 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ]=cursor[P1].ctr
22b20 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  ++.**.** Find th
22b30 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  e next available
22b40 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
22b50 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a   for cursor P1..
22b60 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71  ** Write the seq
22b70 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74  uence number int
22b80 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
22b90 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e  * The sequence n
22ba0 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72  umber on the cur
22bb0 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  sor is increment
22bc0 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a  ed after this.**
22bd0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a   instruction.  .
22be0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65  */.case OP_Seque
22bf0 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
22c00 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
22c10 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
22c20 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
22c30 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
22c40 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  rt( p->apCsr[pOp
22c50 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73  ->p1]!=0 );.  as
22c60 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
22c70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70  Op->p1]->eCurTyp
22c80 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e!=CURTYPE_VTAB 
22c90 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
22ca0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
22cb0 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
22cc0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
22cd0 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b  p1]->seqCount++;
22ce0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
22cf0 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69   Opcode: NewRowi
22d00 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
22d10 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
22d20 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65  ]=rowid.**.** Ge
22d30 74 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20  t a new integer 
22d40 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61  record number (a
22d50 2e 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73  .k.a "rowid") us
22d60 65 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f  ed as the key to
22d70 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65   a table..** The
22d80 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
22d90 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
22da0 20 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69   used as a key i
22db0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
22dc0 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72  * table that cur
22dd0 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f  sor P1 points to
22de0 2e 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72  .  The new recor
22df0 64 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74  d number is writ
22e00 74 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  ten.** written t
22e10 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
22e20 2a 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65  *.** If P3>0 the
22e30 6e 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74  n P3 is a regist
22e40 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
22e50 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42  rame of this VDB
22e60 45 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a  E that holds .**
22e70 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65   the largest pre
22e80 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
22e90 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  d record number.
22ea0 20 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e   No new record n
22eb0 75 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c  umbers are.** al
22ec0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73  lowed to be less
22ed0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
22ee0 2e 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75  . When this valu
22ef0 65 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61  e reaches its ma
22f00 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51  ximum, .** an SQ
22f10 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
22f20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68  is generated. Th
22f30 65 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73  e P3 register is
22f40 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
22f50 65 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  e '.** generated
22f60 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
22f70 54 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73  This P3 mechanis
22f80 6d 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c  m is used to hel
22f90 70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  p implement the.
22fa0 2a 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  ** AUTOINCREMENT
22fb0 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73   feature..*/.cas
22fc0 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b  e OP_NewRowid: {
22fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
22fe0 74 32 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20  t2 */.  i64 v;  
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23000 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20  * The new rowid 
23010 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23020 2a 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  *pC;        /* C
23030 75 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74  ursor of table t
23040 6f 20 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f  o get the new ro
23050 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  wid */.  int res
23060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23070 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20  /* Result of an 
23080 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
23090 28 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  () */.  int cnt;
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
230b0 2a 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d  * Counter to lim
230c0 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  it the number of
230d0 20 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d   searches */.  M
230e0 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
230f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23100 72 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73  r holding larges
23110 74 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f  t rowid for AUTO
23120 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56  INCREMENT */.  V
23130 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
23140 3b 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72  ;     /* Root fr
23150 61 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a  ame of VDBE */..
23160 20 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d    v = 0;.  res =
23170 20 30 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   0;.  pOut = out
23180 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
23190 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
231a0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
231b0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
231c0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
231d0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
231e0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
231f0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
23200 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
23210 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
23220 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
23230 72 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20  r!=0 );.  {.    
23240 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69  /* The next rowi
23250 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  d or record numb
23260 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65  er (different te
23270 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  rms for the same
23280 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69  .    ** thing) i
23290 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20  s obtained in a 
232a0 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74  two-step algorit
232b0 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  hm..    **.    *
232c0 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d  * First we attem
232d0 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  pt to find the l
232e0 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
232f0 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e  rowid and add on
23300 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74  e.    ** to that
23310 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61  .  But if the la
23320 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
23330 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20  owid is already 
23340 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20  the maximum.    
23350 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  ** positive inte
23360 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ger, we have to 
23370 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
23380 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
23390 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20  * probabilistic 
233a0 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a  algorithm.    **
233b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
233c0 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  nd algorithm is 
233d0 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69  to select a rowi
233e0 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20  d at random and 
233f0 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  see if.    ** it
23400 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
23410 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
23420 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
23430 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20  ist, we have.   
23440 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20   ** succeeded.  
23450 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f  If the random ro
23460 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20  wid does exist, 
23470 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20  we select a new 
23480 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  one.    ** and t
23490 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20  ry again, up to 
234a0 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a  100 times..    *
234b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
234c0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69  ->isTable );..#i
234d0 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49  fdef SQLITE_32BI
234e0 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69  T_ROWID.#   defi
234f0 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37  ne MAX_ROWID 0x7
23500 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20  fffffff.#else.  
23510 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c    /* Some compil
23520 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f  ers complain abo
23530 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20  ut constants of 
23540 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66  the form 0x7ffff
23550 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20  fffffffffff..   
23560 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c   ** Others compl
23570 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66  ain about 0x7fff
23580 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e  fffffffffffffLL.
23590 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
235a0 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20  macro seems.    
235b0 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ** to provide th
235c0 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65  e constant while
235d0 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70   making all comp
235e0 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20  ilers happy..   
235f0 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
23600 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28  AX_ROWID  (i64)(
23610 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66   (((u64)0x7fffff
23620 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29  ff)<<32) | (u64)
23630 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e  0xffffffff ).#en
23640 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43  dif..    if( !pC
23650 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
23660 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23670 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
23680 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
23690 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
236a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
236b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
236c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
236d0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
236e0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
236f0 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20      v = 1;   /* 
23700 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30  IMP: R-61914-480
23710 37 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  74 */.      }els
23720 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
23730 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
23740 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d  ursorIsValid(pC-
23750 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a  >uc.pCursor) );.
23760 20 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69          v = sqli
23770 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
23780 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ey(pC->uc.pCurso
23790 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
237a0 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a  v>=MAX_ROWID ){.
237b0 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73            pC->us
237c0 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31  eRandomRowid = 1
237d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
237e0 0a 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20  .          v++; 
237f0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33    /* IMP: R-2953
23800 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20  8-34987 */.     
23810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23820 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
23830 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
23840 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f  EMENT.    if( pO
23850 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f  p->p3 ){.      /
23860 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
23870 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
23880 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
23890 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
238a0 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  3>0 );.      if(
238b0 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
238c0 20 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65        for(pFrame
238d0 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
238e0 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
238f0 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
23900 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ent);.        /*
23910 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
23920 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
23930 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
23940 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
23950 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  p3<=pFrame->nMem
23960 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
23970 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
23980 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
23990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
239a0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
239b0 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
239c0 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
239d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
239e0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
239f0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
23a00 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  ;.        pMem =
23a10 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
23a20 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  .        memAbou
23a30 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65  tToChange(p, pMe
23a40 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
23a50 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
23a60 61 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  alid(pMem) );.. 
23a70 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
23a80 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65  ACE(pOp->p3, pMe
23a90 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
23aa0 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
23ab0 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  fy(pMem);.      
23ac0 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
23ad0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
23ae0 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33  =0 );  /* mem(P3
23af0 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  ) holds an integ
23b00 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
23b10 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52  pMem->u.i==MAX_R
23b20 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52  OWID || pC->useR
23b30 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20  andomRowid ){.  
23b40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23b50 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
23b60 3a 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20  : R-17817-00630 
23b70 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
23b80 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
23b90 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
23ba0 20 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e    if( v<pMem->u.
23bb0 69 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76  i+1 ){.        v
23bc0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31   = pMem->u.i + 1
23bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23be0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20  pMem->u.i = v;. 
23bf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23c00 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f  if( pC->useRando
23c10 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
23c20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
23c30 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31  N-OF: R-07677-41
23c40 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65  881 If the large
23c50 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61  st ROWID is equa
23c60 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  l to the.      *
23c70 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * largest possib
23c80 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33  le integer (9223
23c90 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
23ca0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
23cb0 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69  se.      ** engi
23cc0 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e  ne starts pickin
23cd0 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69  g positive candi
23ce0 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72  date ROWIDs at r
23cf0 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20  andom until.    
23d00 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e    ** it finds on
23d10 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72  e that is not pr
23d20 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a  eviously used. *
23d30 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
23d40 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f  pOp->p3==0 );  /
23d50 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69  * We cannot be i
23d60 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d  n random rowid m
23d70 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20  ode if this is. 
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
23da0 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
23db0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
23dc0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  cnt = 0;.      d
23dd0 6f 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o{.        sqlit
23de0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
23df0 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20  zeof(v), &v);.  
23e00 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
23e10 52 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20  ROWID>>1); v++; 
23e20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20   /* Ensure that 
23e30 76 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  v is greater tha
23e40 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n zero */.      
23e50 7d 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20  }while(  ((rc = 
23e60 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
23e70 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
23e80 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  c.pCursor, 0, (u
23e90 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20  64)v,.          
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29         0, &res))
23ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
23ee0 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73           && (res
23ef0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
23f00 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29   && (++cnt<100))
23f10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
23f20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
23f30 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
23f40 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
23f50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23f60 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
23f70 3a 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20  : R-38219-53002 
23f80 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
23f90 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
23fa0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
23fb0 20 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b    assert( v>0 );
23fc0 20 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32    /* EV: R-40812
23fd0 2d 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a  -03570 */.    }.
23fe0 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
23ff0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
24000 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
24010 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
24020 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
24030 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   v;.  break;.}..
24040 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72  /* Opcode: Inser
24050 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
24060 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e  .** Synopsis: in
24070 74 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d  tkey=r[P3] data=
24080 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74  r[P2].**.** Writ
24090 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
240a0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72  the table of cur
240b0 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65  sor P1.  A new e
240c0 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74  ntry is.** creat
240d0 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  ed if it doesn't
240e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f   already exist o
240f0 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61  r the data for a
24100 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e  n existing.** en
24110 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74  try is overwritt
24120 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73  en.  The data is
24130 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42   the value MEM_B
24140 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lob stored in re
24150 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  gister.** number
24160 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20   P2. The key is 
24170 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
24180 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d  er P3. The key m
24190 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f  ust.** be a MEM_
241a0 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Int..**.** If th
241b0 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
241c0 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73   flag of P5 is s
241d0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
241e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
241f0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  .** incremented 
24200 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
24210 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f    If the OPFLAG_
24220 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f  LASTROWID flag o
24230 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20  f P5 is set,.** 
24240 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74  then rowid is st
24250 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
24260 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68  ent return by th
24270 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73  e.** sqlite3_las
24280 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
24290 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72   function (other
242a0 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64  wise it is unmod
242b0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ified)..**.** If
242c0 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
242d0 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
242e0 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
242f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24300 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73  might.** run fas
24310 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20  ter by avoiding 
24320 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  an unnecessary s
24330 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  eek on cursor P1
24340 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  .  However,.** t
24350 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
24360 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73  KRESULT flag mus
24370 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66  t only be set if
24380 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
24390 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65   no prior.** see
243a0 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ks on the cursor
243b0 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20   or if the most 
243c0 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64  recent seek used
243d0 20 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20   a key equal to 
243e0 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
243f0 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45   OPFLAG_ISUPDATE
24400 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24410 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  en this opcode i
24420 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20  s part of an.** 
24430 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
24440 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66  .  Otherwise (if
24450 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65   the flag is cle
24460 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70  ar) then this op
24470 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20  code.** is part 
24480 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65  of an INSERT ope
24490 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66  ration.  The dif
244a0 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20  ference is only 
244b0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20  important to.** 
244c0 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e  the update hook.
244d0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
244e0 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   P4 may point to
244f0 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
24500 72 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55  re, or may be NU
24510 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a  LL. If it is .**
24520 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
24530 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
24540 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65  (sqlite3.xUpdate
24550 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76  Callback) is inv
24560 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  oked .** followi
24570 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
24580 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57  insert..**.** (W
24590 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20  ARNING/TODO: If 
245a0 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63  P1 is a pseudo-c
245b0 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
245c0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
245d0 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f  llocated, then o
245e0 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69  wnership of P2 i
245f0 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f  s transferred to
24600 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73   the pseudo-curs
24610 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74  or.** and regist
24620 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70  er P2 becomes ep
24630 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65  hemeral.  If the
24640 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67   cursor is chang
24650 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ed, the.** value
24660 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
24670 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65  will then change
24680 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
24690 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61  s does not.** ca
246a0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
246b0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  .).**.** This in
246c0 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77  struction only w
246d0 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20  orks on tables. 
246e0 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
246f0 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
24700 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50  or indices is OP
24710 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f  _IdxInsert..*/./
24720 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74  * Opcode: Insert
24730 49 6e 74 20 50 31 20 50 32 20 50 33 20 50 34 20  Int P1 P2 P3 P4 
24740 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
24750 69 6e 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72  intkey=P3 data=r
24760 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  [P2].**.** This 
24770 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69  works exactly li
24780 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63  ke OP_Insert exc
24790 65 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79  ept that the key
247a0 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67   is the.** integ
247b0 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74  er value P3, not
247c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
247d0 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64  e integer stored
247e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
247f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  .*/.case OP_Inse
24800 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73  rt: .case OP_Ins
24810 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20  ertInt: {.  Mem 
24820 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a  *pData;       /*
24830 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e   MEM cell holdin
24840 67 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  g data for the r
24850 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
24860 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rted */.  Mem *p
24870 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  Key;        /* M
24880 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20  EM cell holding 
24890 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63  key  for the rec
248a0 6f 72 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ord */.  VdbeCur
248b0 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75  sor *pC;   /* Cu
248c0 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e  rsor to table in
248d0 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20  to which insert 
248e0 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  is written */.  
248f0 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20  int seekResult; 
24900 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70    /* Result of p
24910 72 69 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69  rior seek or 0 i
24920 66 20 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55  f no USESEEKRESU
24930 4c 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e  LT flag */.  con
24940 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f  st char *zDb;  /
24950 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
24960 2d 20 75 73 65 64 20 62 79 20 74 68 65 20 75 70  - used by the up
24970 64 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54  date hook */.  T
24980 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
24990 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
249a0 75 72 65 20 2d 20 75 73 65 64 20 62 79 20 75 70  ure - used by up
249b0 64 61 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64  date and pre-upd
249c0 61 74 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69  ate hooks */.  i
249d0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
249e0 20 2f 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 75   /* Opcode for u
249f0 70 64 61 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49  pdate hook: SQLI
24a00 54 45 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c  TE_UPDATE or SQL
24a10 49 54 45 5f 49 4e 53 45 52 54 20 2a 2f 0a 20 20  ITE_INSERT */.  
24a20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 20  BtreePayload x; 
24a30 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20    /* Payload to 
24a40 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  be inserted */..
24a50 20 20 6f 70 20 3d 20 30 3b 0a 20 20 70 44 61 74    op = 0;.  pDat
24a60 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  a = &aMem[pOp->p
24a70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
24a80 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
24a90 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
24aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ;.  assert( memI
24ab0 73 56 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b  sValid(pData) );
24ac0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
24ad0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
24ae0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
24af0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
24b00 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
24b10 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
24b20 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
24b30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24b40 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
24b50 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d  G_ISNOOP) || pC-
24b60 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73  >isTable );.  as
24b70 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
24b80 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70  e==P4_TABLE || p
24b90 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53  Op->p4type>=P4_S
24ba0 54 41 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53  TATIC );.  REGIS
24bb0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
24bc0 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66  2, pData);..  if
24bd0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
24be0 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  P_Insert ){.    
24bf0 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pKey = &aMem[pOp
24c00 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72  ->p3];.    asser
24c10 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26  t( pKey->flags &
24c20 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
24c30 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
24c40 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  id(pKey) );.    
24c50 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
24c60 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20  Op->p3, pKey);. 
24c70 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79     x.nKey = pKey
24c80 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->u.i;.  }else{.
24c90 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
24ca0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
24cb0 72 74 49 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e  rtInt );.    x.n
24cc0 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  Key = pOp->p3;. 
24cd0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   }..  if( pOp->p
24ce0 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
24cf0 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f  && HAS_UPDATE_HO
24d00 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73  OK(db) ){.    as
24d10 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30  sert( pC->iDb>=0
24d20 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62   );.    zDb = db
24d30 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a  ->aDb[pC->iDb].z
24d40 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61  DbSName;.    pTa
24d50 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  b = pOp->p4.pTab
24d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
24d70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
24d80 49 53 4e 4f 4f 50 29 20 7c 7c 20 48 61 73 52 6f  ISNOOP) || HasRo
24d90 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20 20 20  wid(pTab) );.   
24da0 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20   op = ((pOp->p5 
24db0 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
24dc0 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
24dd0 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
24de0 52 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RT);.  }else{.  
24df0 20 20 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e    pTab = 0; /* N
24e00 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65  ot needed.  Sile
24e10 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77  nce a compiler w
24e20 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a  arning. */.    z
24e30 44 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  Db = 0;  /* Not 
24e40 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65  needed.  Silence
24e50 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e   a compiler warn
24e60 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66  ing. */.  }..#if
24e70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
24e80 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
24e90 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
24ea0 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
24eb0 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66  , if any */.  if
24ec0 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
24ed0 43 61 6c 6c 62 61 63 6b 20 0a 20 20 20 26 26 20  Callback .   && 
24ee0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
24ef0 54 41 42 4c 45 0a 20 20 20 26 26 20 21 28 70 4f  TABLE.   && !(pO
24f00 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
24f10 53 55 50 44 41 54 45 29 0a 20 20 29 7b 0a 20 20  SUPDATE).  ){.  
24f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65    sqlite3VdbePre
24f30 55 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43  UpdateHook(p, pC
24f40 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
24f50 20 7a 44 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b   zDb, pTab, x.nK
24f60 65 79 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  ey, pOp->p2);.  
24f70 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  }.  if( pOp->p5 
24f80 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
24f90 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ) break;.#endif.
24fa0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
24fb0 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
24fc0 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a  ) p->nChange++;.
24fd0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
24fe0 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44  OPFLAG_LASTROWID
24ff0 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   ) db->lastRowid
25000 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 69 66 28   = x.nKey;.  if(
25010 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
25020 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
25030 78 2e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  x.pData = 0;.   
25040 20 78 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20   x.nData = 0;.  
25050 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
25060 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20  t( pData->flags 
25070 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  & (MEM_Blob|MEM_
25080 53 74 72 29 20 29 3b 0a 20 20 20 20 78 2e 70 44  Str) );.    x.pD
25090 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a 3b 0a  ata = pData->z;.
250a0 20 20 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44      x.nData = pD
250b0 61 74 61 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 73 65  ata->n;.  }.  se
250c0 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70  ekResult = ((pOp
250d0 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
250e0 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
250f0 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
25100 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d  0);.  if( pData-
25110 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
25120 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f  o ){.    x.nZero
25130 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72   = pData->u.nZer
25140 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
25150 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  x.nZero = 0;.  }
25160 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30 3b 0a 20  .  x.pKey = 0;. 
25170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25180 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e  eeInsert(pC->uc.
25190 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20  pCursor, &x,.   
251a0 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
251b0 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46  PFLAG_APPEND|OPF
251c0 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
251d0 29 29 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20  )), seekResult. 
251e0 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72   );.  pC->deferr
251f0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
25200 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
25210 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
25220 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
25230 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
25240 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
25250 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
25260 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
25270 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
25280 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 6f 70 20  eCallback && op 
25290 29 7b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61  ){.    db->xUpda
252a0 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
252b0 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a  UpdateArg, op, z
252c0 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Db, pTab->zName,
252d0 20 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20   x.nKey);.  }.  
252e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
252f0 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50  ode: Delete P1 P
25300 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
25310 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f   Delete the reco
25320 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20  rd at which the 
25330 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72  P1 cursor is cur
25340 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
25350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
25360 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
25370 4e 20 62 69 74 20 6f 66 20 74 68 65 20 50 35 20  N bit of the P5 
25380 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
25390 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
253a0 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66  rsor will be lef
253b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65  t pointing at  e
253c0 69 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f  ither the next o
253d0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  r the previous.*
253e0 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * record in the 
253f0 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20  table. If it is 
25400 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25410 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
25420 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  , then.** the ne
25430 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  xt Next instruct
25440 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ion will be a no
25450 2d 6f 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74  -op. As a result
25460 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  , in this case.*
25470 2a 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65  * it is ok to de
25480 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72  lete a record fr
25490 6f 6d 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74  om within a Next
254a0 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50   loop. If .** OP
254b0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
254c0 4e 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 63  N bit of P5 is c
254d0 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
254e0 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a  ursor will be.**
254f0 20 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65   left in an unde
25500 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  fined state..**.
25510 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
25520 5f 41 55 58 44 45 4c 45 54 45 20 62 69 74 20 69  _AUXDELETE bit i
25530 73 20 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61  s set on P5, tha
25540 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
25550 20 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20   this.** delete 
25560 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61  one of several a
25570 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
25580 65 6c 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20  eleting a table 
25590 72 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a  row and all its.
255a0 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ** associated in
255b0 64 65 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78  dex entries.  Ex
255c0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f  actly one of tho
255d0 73 65 20 64 65 6c 65 74 65 73 20 69 73 20 74 68  se deletes is th
255e0 65 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64  e "primary".** d
255f0 65 6c 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65  elete.  The othe
25600 72 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50  rs are all on OP
25610 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63  FLAG_FORDELETE c
25620 75 72 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61  ursors or else a
25630 72 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74  re.** marked wit
25640 68 20 74 68 65 20 41 55 58 44 45 4c 45 54 45 20  h the AUXDELETE 
25650 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  flag..**.** If t
25660 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
25670 45 20 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42  E flag of P2 (NB
25680 3a 20 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20  : P2 not P5) is 
25690 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
256a0 77 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e  w.** change coun
256b0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
256c0 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
256d0 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20  ..**.** P1 must 
256e0 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61  not be pseudo-ta
256f0 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20  ble.  It has to 
25700 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20  be a real table 
25710 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65  with.** multiple
25720 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   rows..**.** If 
25730 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  P4 is not NULL t
25740 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hen it points to
25750 20 61 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e   a Table object.
25760 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69   In this case ei
25770 74 68 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64  ther .** the upd
25780 61 74 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74  ate or pre-updat
25790 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c  e hook, or both,
257a0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e   may be invoked.
257b0 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
257c0 75 73 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ust.** have been
257d0 20 70 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e   positioned usin
257e0 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72  g OP_NotFound pr
257f0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
25800 74 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a  this opcode in .
25810 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 53 70  ** this case. Sp
25820 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f  ecifically, if o
25830 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
25840 2c 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  , the pre-update
25850 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76   hook is .** inv
25860 6f 6b 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f  oked if P4 is no
25870 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61  t NULL. The upda
25880 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te-hook is invok
25890 65 64 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e  ed if one is con
258a0 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20  figured, .** P4 
258b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
258c0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
258d0 4e 47 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  NGE flag is set 
258e0 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  in P2..**.** If 
258f0 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
25900 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ATE flag is set 
25910 69 6e 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63  in P2, then P3 c
25920 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
25930 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65  ess.** of the me
25940 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
25950 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
25960 65 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  e that the rowid
25970 20 6f 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c   of the row will
25980 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79  .** be set to by
25990 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a   the update..*/.
259a0 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20  case OP_Delete: 
259b0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
259c0 70 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pC;.  const char
259d0 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a   *zDb;.  Table *
259e0 70 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c  pTab;.  int opfl
259f0 61 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20  ags;..  opflags 
25a00 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
25a10 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
25a20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
25a30 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
25a40 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
25a50 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
25a60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25a70 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
25a80 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
25a90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
25aa0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
25ab0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
25ac0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
25ad0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25ae0 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d  DEBUG.  if( pOp-
25af0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
25b00 45 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f  E && HasRowid(pO
25b10 70 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70  p->p4.pTab) && p
25b20 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20  Op->p5==0 ){.   
25b30 20 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72   /* If p5 is zer
25b40 6f 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72  o, the seek oper
25b50 61 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74  ation that posit
25b60 69 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72  ioned the cursor
25b70 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
25b80 20 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20   OP_Delete will 
25b90 68 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68  have also set th
25ba0 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  e pC->movetoTarg
25bb0 65 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  et field to the 
25bc0 72 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20  rowid of.    ** 
25bd0 74 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  the row that is 
25be0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
25bf0 0a 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20  .    i64 iKey = 
25c00 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
25c10 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
25c20 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65  ursor);.    asse
25c30 72 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  rt( pC->movetoTa
25c40 72 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20  rget==iKey );.  
25c50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
25c60 66 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  f the update-hoo
25c70 6b 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d  k or pre-update-
25c80 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76  hook will be inv
25c90 6f 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f  oked, set zDb to
25ca0 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
25cb0 66 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73  f the db to pass
25cc0 20 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20   as to it. Also 
25cd0 73 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74  set local pTab t
25ce0 6f 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66  o a copy.  ** of
25cf0 20 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c   p4.pTab. Finall
25d00 79 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65  y, if p5 is true
25d10 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
25d20 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  t this cursor wa
25d30 73 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65  s.  ** last move
25d40 64 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f  d with OP_Next o
25d50 72 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53  r OP_Prev, not S
25d60 65 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c  eek or NotFound,
25d70 20 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43   set .  ** VdbeC
25d80 75 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67  ursor.movetoTarg
25d90 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
25da0 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69  t rowid.  */.  i
25db0 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
25dc0 50 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f  P4_TABLE && HAS_
25dd0 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20  UPDATE_HOOK(db) 
25de0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25df0 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  C->iDb>=0 );.   
25e00 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
25e10 2e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  .pTab!=0 );.    
25e20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43  zDb = db->aDb[pC
25e30 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  ->iDb].zDbSName;
25e40 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d  .    pTab = pOp-
25e50 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66  >p4.pTab;.    if
25e60 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
25e70 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
25e80 29 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61  )!=0 && pC->isTa
25e90 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d  ble ){.      pC-
25ea0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20  >movetoTarget = 
25eb0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
25ec0 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
25ed0 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
25ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
25ef0 20 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65   0;   /* Not nee
25f00 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
25f10 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
25f20 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  . */.    pTab = 
25f30 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  0;  /* Not neede
25f40 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f  d.  Silence a co
25f50 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20  mpiler warning. 
25f60 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  */.  }..#ifdef S
25f70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
25f80 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a  UPDATE_HOOK.  /*
25f90 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
25fa0 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
25fb0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
25fc0 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
25fd0 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
25fe0 3e 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20  >p4.pTab ){.    
25ff0 61 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67  assert( !(opflag
26000 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  s & OPFLAG_ISUPD
26010 41 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ATE) .         |
26020 7c 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  | HasRowid(pTab)
26030 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
26040 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e   (aMem[pOp->p3].
26050 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
26060 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c   .    );.    sql
26070 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
26080 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20  eHook(p, pC,.   
26090 20 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20       (opflags & 
260a0 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
260b0 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
260c0 20 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45   : SQLITE_DELETE
260d0 2c 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20  , .        zDb, 
260e0 70 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f  pTab, pC->moveto
260f0 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  Target,.        
26100 70 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20  pOp->p3.    );. 
26110 20 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73   }.  if( opflags
26120 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50   & OPFLAG_ISNOOP
26130 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66   ) break;.#endif
26140 0a 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61  . .  /* Only fla
26150 67 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  gs that can be s
26160 65 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54  et are SAVEPOIST
26170 49 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54  ION and AUXDELET
26180 45 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20  E */ .  assert( 
26190 28 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46  (pOp->p5 & ~(OPF
261a0 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
261b0 7c 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54  |OPFLAG_AUXDELET
261c0 45 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  E))==0 );.  asse
261d0 72 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  rt( OPFLAG_SAVEP
261e0 4f 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53  OSITION==BTREE_S
261f0 41 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20  AVEPOSITION );. 
26200 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
26210 41 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45  AUXDELETE==BTREE
26220 5f 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23  _AUXDELETE );..#
26230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26240 55 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  UG.  if( p->pFra
26250 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
26260 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c   pC->isEphemeral
26270 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
26280 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
26290 5f 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20  _AUXDELETE)==0. 
262a0 20 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77         && (pC->w
262b0 72 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46  rFlag & OPFLAG_F
262c0 4f 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20  ORDELETE)==0.   
262d0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74     ){.      nExt
262e0 72 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20  raDelete++;.    
262f0 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  }.    if( pOp->p
26300 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  2 & OPFLAG_NCHAN
26310 47 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  GE ){.      nExt
26320 72 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20  raDelete--;.    
26330 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26340 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
26350 65 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70  eDelete(pC->uc.p
26360 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29  Cursor, pOp->p5)
26370 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
26380 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
26390 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73  E;.  pC->seekRes
263a0 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ult = 0;.  if( r
263b0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
263c0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
263d0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
263e0 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
263f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
26400 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
26410 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
26420 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
26430 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
26440 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73  eCallback && Has
26450 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
26460 20 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65       db->xUpdate
26470 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
26480 64 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f  dateArg, SQLITE_
26490 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61  DELETE, zDb, pTa
264a0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
264b0 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61      pC->movetoTa
264c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
264d0 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
264e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
264f0 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f  break;.}./* Opco
26500 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a  de: ResetCount *
26510 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
26520 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
26530 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
26540 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
26550 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
26560 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
26570 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73  r (returned by s
26580 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
26590 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  to sqlite3_chang
265a0 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74  es())..** Then t
265b0 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20  he VMs internal 
265c0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72  change counter r
265d0 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54  esets to 0..** T
265e0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
265f0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
26600 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
26610 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69  tCount: {.  sqli
26620 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
26630 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
26640 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  );.  p->nChange 
26650 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
26660 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
26670 65 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  erCompare P1 P2 
26680 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69  P3 P4.** Synopsi
26690 73 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74  s: if key(P1)!=t
266a0 72 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f  rim(r[P3],P4) go
266b0 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69  to P2.**.** P1 i
266c0 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
266d0 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
266e0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70  ion compares a p
266f0 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
26700 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72  record blob in r
26710 65 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e  egister P3 again
26720 73 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  st a prefix of t
26730 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  he entry that .*
26740 2a 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  * the sorter cur
26750 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
26760 69 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74  ints to.  Only t
26770 68 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c  he first P4 fiel
26780 64 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61  ds.** of r[P3] a
26790 6e 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  nd the sorter re
267a0 63 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65  cord are compare
267b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  d..**.** If eith
267c0 65 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72  er P3 or the sor
267d0 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  ter contains a N
267e0 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  ULL in one of th
267f0 65 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  eir significant.
26800 2a 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63  ** fields (not c
26810 6f 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66  ounting the P4 f
26820 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
26830 20 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72   which are ignor
26840 65 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed) then.** the 
26850 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  comparison is as
26860 73 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61  sumed to be equa
26870 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68  l..**.** Fall th
26880 72 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e  rough to next in
26890 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65  struction if the
268a0 20 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d   two records com
268b0 70 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a  pare equal to.**
268c0 20 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75   each other.  Ju
268d0 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79  mp to P2 if they
268e0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a   are different..
268f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
26900 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64  rCompare: {.  Vd
26910 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
26920 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
26930 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20  KeyCol;..  pC = 
26940 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
26950 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
26960 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61  orter(pC) );.  a
26970 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
26980 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
26990 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
269a0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43  Op->p3];.  nKeyC
269b0 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ol = pOp->p4.i;.
269c0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
269d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
269e0 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70  terCompare(pC, p
269f0 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72  In3, nKeyCol, &r
26a00 65 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  es);.  VdbeBranc
26a10 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
26a20 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
26a30 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
26a40 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20  rror;.  if( res 
26a50 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
26a60 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a  2;.  break;.};..
26a70 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
26a80 72 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a  rData P1 P2 P3 *
26a90 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
26aa0 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a  r[P2]=data.**.**
26ab0 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
26ac0 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72  ster P2 the curr
26ad0 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20  ent sorter data 
26ae0 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f  for sorter curso
26af0 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c  r P1..** Then cl
26b00 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  ear the column h
26b10 65 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63  eader cache on c
26b20 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ursor P3..**.** 
26b30 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  This opcode is n
26b40 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d  ormally use to m
26b50 6f 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74  ove a record out
26b60 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61   of the sorter a
26b70 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67  nd into.** a reg
26b80 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68  ister that is th
26b90 65 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70  e source for a p
26ba0 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73  seudo-table curs
26bb0 6f 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  or created using
26bc0 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20  .** OpenPseudo. 
26bd0 20 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62   That pseudo-tab
26be0 6c 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  le cursor is the
26bf0 20 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65   one that is ide
26c00 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
26c10 72 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65  rameter P3.  Cle
26c20 61 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c  aring the P3 col
26c30 75 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72  umn cache as par
26c40 74 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  t of this opcode
26c50 20 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f   saves.** us fro
26c60 6d 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75  m having to issu
26c70 65 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c  e a separate Nul
26c80 6c 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  lRow instruction
26c90 20 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63   to clear that c
26ca0 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ache..*/.case OP
26cb0 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20  _SorterData: {. 
26cc0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
26cd0 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ..  pOut = &aMem
26ce0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20  [pOp->p2];.  pC 
26cf0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
26d00 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69  p1];.  assert( i
26d10 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20  sSorter(pC) );. 
26d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
26d30 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43  eSorterRowkey(pC
26d40 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72  , pOut);.  asser
26d50 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
26d60 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73   || (pOut->flags
26d70 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a   & MEM_Blob) );.
26d80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
26d90 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
26da0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
26db0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
26dc0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
26dd0 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  ;.  p->apCsr[pOp
26de0 2d 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74  ->p3]->cacheStat
26df0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
26e00 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
26e10 20 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61   Opcode: RowData
26e20 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
26e30 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
26e40 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74  =data.**.** Writ
26e50 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
26e60 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  P2 the complete 
26e70 72 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  row content for 
26e80 74 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77  the row at .** w
26e90 68 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69  hich cursor P1 i
26ea0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
26eb0 74 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69  ting..** There i
26ec0 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
26ed0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
26ee0 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74    .** It is just
26ef0 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
26f00 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61   P2 register exa
26f10 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
26f20 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
26f30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
26f40 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
26f50 20 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   is an index, th
26f60 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  en the content i
26f70 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
26f80 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73   row..** If curs
26f90 6f 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65  or P2 is a table
26fa0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
26fb0 6e 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20  nt extracted is 
26fc0 74 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  the data..**.** 
26fd0 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  If the P1 cursor
26fe0 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
26ff0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
27000 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77   (not a NULL row
27010 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74  ).** of a real t
27020 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
27030 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  do-table..**.** 
27040 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68  If P3!=0 then th
27050 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c  is opcode is all
27060 6f 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20  owed to make an 
27070 65 70 68 65 72 6d 65 72 61 6c 20 70 6f 69 6e 74  ephermeral point
27080 65 72 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64  er.** into the d
27090 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
270a0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
270b0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
270c0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69  e output.** regi
270d0 73 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76  ster will be inv
270e0 61 6c 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e  alidated as soon
270f0 20 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d   as the cursor m
27100 6f 76 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67  oves - including
27110 0a 2a 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64  .** moves caused
27120 20 62 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72   by other cursor
27130 73 20 74 68 61 74 20 22 73 61 76 65 22 20 74 68  s that "save" th
27140 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
27150 72 73 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f  rsors.** positio
27160 6e 20 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20  n in order that 
27170 74 68 65 79 20 63 61 6e 20 77 72 69 74 65 20 74  they can write t
27180 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
27190 2e 20 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74  .  If P3==0.** t
271a0 68 65 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  hen a copy of th
271b0 65 20 64 61 74 61 20 69 73 20 6d 61 64 65 20 69  e data is made i
271c0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21  nto memory.  P3!
271d0 3d 30 20 69 73 20 66 61 73 74 65 72 2c 20 62 75  =0 is faster, bu
271e0 74 0a 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61  t.** P3==0 is sa
271f0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33  fer..**.** If P3
27200 21 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  !=0 then the con
27210 74 65 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72  tent of the P2 r
27220 65 67 69 73 74 65 72 20 69 73 20 75 6e 73 75 69  egister is unsui
27230 74 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  table for use.**
27240 20 69 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e   in OP_Result an
27250 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20  d any OP_Result 
27260 77 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20  will invalidate 
27270 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  the P2 register 
27280 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  content..** The 
27290 50 32 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  P2 register cont
272a0 65 6e 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74  ent is invalidat
272b0 65 64 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69  ed by opcodes li
272c0 6b 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  ke OP_Function o
272d0 72 0a 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20  r.** by any use 
272e0 6f 66 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f  of another curso
272f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
27300 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f  e same table..*/
27310 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61  .case OP_RowData
27320 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
27330 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
27340 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e   *pCrsr;.  u32 n
27350 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
27360 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
27370 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
27380 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27390 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
273a0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
273b0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
273c0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
273d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
273e0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
273f0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
27400 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d  t( isSorter(pC)=
27410 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27420 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29  pC->nullRow==0 )
27430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
27440 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
27450 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
27460 63 2e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  c.pCursor;..  /*
27470 20 54 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20   The OP_RowData 
27480 6f 70 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66  opcodes always f
27490 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73  ollow OP_NotExis
274a0 74 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65  ts or.  ** OP_Se
274b0 65 6b 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65  ekRowid or OP_Re
274c0 77 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74  wind/Op_Next wit
274d0 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67  h no intervening
274e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
274f0 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e  ** that might in
27500 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
27510 73 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69  sor..  ** If thi
27520 73 20 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20  s where not the 
27530 63 61 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20  case, on of the 
27540 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
27550 28 29 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66  ()s.  ** would f
27560 61 69 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69  ail.  Should thi
27570 73 20 65 76 65 72 20 63 68 61 6e 67 65 20 28 62  s ever change (b
27580 65 63 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65  ecause of change
27590 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20  s in the code.  
275a0 2a 2a 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68  ** generator) th
275b0 65 6e 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64  en the fix would
275c0 20 62 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20   be to insert a 
275d0 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
275e0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
275f0 76 65 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  veto()..  */.  a
27600 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
27610 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
27620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27630 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
27640 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69  lid(pCrsr) );.#i
27650 66 20 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75  f 0  /* Not requ
27660 69 72 65 64 20 64 75 65 20 74 6f 20 74 68 65 20  ired due to the 
27670 70 72 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65  previous to asse
27680 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
27690 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
276a0 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
276b0 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21  o(pC);.  if( rc!
276c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
276d0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
276e0 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rror;.#endif..  
276f0 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
27700 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73  PayloadSize(pCrs
27710 72 29 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32  r);.  if( n>(u32
27720 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  )db->aLimit[SQLI
27730 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
27740 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
27750 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74  _big;.  }.  test
27760 63 61 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20  case( n==0 );.  
27770 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
27780 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72  MemFromBtree(pCr
27790 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b  sr, 0, n, pOut);
277a0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
277b0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
277c0 72 6f 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d  ror;.  if( !pOp-
277d0 3e 70 33 20 29 20 44 65 65 70 68 65 6d 65 72 61  >p3 ) Deephemera
277e0 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50  lize(pOut);.  UP
277f0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
27800 45 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53  E(pOut);.  REGIS
27810 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
27820 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  2, pOut);.  brea
27830 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
27840 20 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a   Rowid P1 P2 * *
27850 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
27860 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
27870 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73  * Store in regis
27880 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65  ter P2 an intege
27890 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6b  r which is the k
278a0 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ey of the table 
278b0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31  entry that.** P1
278c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
278d0 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31  int to..**.** P1
278e0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
278f0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
27900 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
27910 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73 65 64  ble.  There used
27920 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61   to.** be a sepa
27930 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f  rate OP_VRowid o
27940 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69  pcode for use wi
27950 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
27960 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f  s, but this.** o
27970 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f  ne opcode now wo
27980 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62  rks for both tab
27990 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73  le types..*/.cas
279a0 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20  e OP_Rowid: {   
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43   out2 */.  VdbeC
279d0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34  ursor *pC;.  i64
279e0 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   v;.  sqlite3_vt
279f0 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e  ab *pVtab;.  con
27a00 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
27a10 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70  e *pModule;..  p
27a20 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
27a30 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
27a40 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
27a50 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
27a60 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
27a70 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
27a80 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
27a90 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
27aa0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  t( pC->eCurType!
27ab0 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
27ac0 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  || pC->nullRow )
27ad0 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c  ;.  if( pC->null
27ae0 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  Row ){.    pOut-
27af0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
27b00 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l;.    break;.  
27b10 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65  }else if( pC->de
27b20 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
27b30 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65      v = pC->move
27b40 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  toTarget;.#ifnde
27b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
27b60 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c  RTUALTABLE.  }el
27b70 73 65 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  se if( pC->eCurT
27b80 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41  ype==CURTYPE_VTA
27b90 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
27ba0 20 70 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30   pC->uc.pVCur!=0
27bb0 20 29 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20   );.    pVtab = 
27bc0 70 43 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56  pC->uc.pVCur->pV
27bd0 74 61 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  tab;.    pModule
27be0 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
27bf0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
27c00 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29  Module->xRowid )
27c10 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75  ;.    rc = pModu
27c20 6c 65 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75  le->xRowid(pC->u
27c30 63 2e 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20  c.pVCur, &v);.  
27c40 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
27c50 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
27c60 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ab);.    if( rc 
27c70 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
27c80 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69  _to_error;.#endi
27c90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
27ca0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
27cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
27cc0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
27cd0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
27ce0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
27cf0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
27d00 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
27d10 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
27d20 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20  Restore(pC);.   
27d30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
27d40 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
27d50 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e  r;.    if( pC->n
27d60 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
27d70 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
27d80 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
27d90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  eak;.    }.    v
27da0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
27db0 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63  ntegerKey(pC->uc
27dc0 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  .pCursor);.  }. 
27dd0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pOut->u.i = v;.
27de0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27df0 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50  pcode: NullRow P
27e00 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
27e10 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27e20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  P1 to a null row
27e30 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e  .  Any OP_Column
27e40 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74   operations.** t
27e50 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20  hat occur while 
27e60 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  the cursor is on
27e70 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69   the null row wi
27e80 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69  ll always.** wri
27e90 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  te a NULL..*/.ca
27ea0 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b  se OP_NullRow: {
27eb0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
27ec0 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
27ed0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
27ee0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
27ef0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
27f00 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
27f10 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
27f20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
27f30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
27f40 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
27f50 45 3b 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75  E;.  if( pC->eCu
27f60 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
27f70 54 52 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65  TREE ){.    asse
27f80 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
27f90 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  or!=0 );.    sql
27fa0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
27fb0 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72  rsor(pC->uc.pCur
27fc0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  sor);.  }.  brea
27fd0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
27fe0 20 4c 61 73 74 20 50 31 20 50 32 20 50 33 20 2a   Last P1 P2 P3 *
27ff0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78   *.**.** The nex
28000 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77  t use of the Row
28010 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20  id or Column or 
28020 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e  Prev instruction
28030 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c   for P1 .** will
28040 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61   refer to the la
28050 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
28060 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
28070 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74  r index..** If t
28080 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
28090 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50  x is empty and P
280a0 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  2>0, then jump i
280b0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
280c0 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20  ..** If P2 is 0 
280d0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
280e0 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  or index is not 
280f0 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f  empty, fall thro
28100 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
28110 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
28120 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
28130 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
28140 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
28150 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72  red to move in r
28160 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a  everse order,.**
28170 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f   from the end to
28180 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69  ward the beginni
28190 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ng.  In other wo
281a0 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
281b0 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
281c0 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f   to use Prev, no
281d0 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t Next..**.** If
281e0 20 50 33 20 69 73 20 2d 31 2c 20 74 68 65 6e 20   P3 is -1, then 
281f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
28200 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
28210 65 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65 65  end of the btree
28220 0a 2a 2a 20 66 6f 72 20 74 68 65 20 70 75 72 70  .** for the purp
28230 6f 73 65 20 6f 66 20 61 70 70 65 6e 64 69 6e 67  ose of appending
28240 20 61 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e 74   a new entry ont
28250 6f 20 74 68 65 20 62 74 72 65 65 2e 20 20 49 6e  o the btree.  In
28260 20 74 68 61 74 0a 2a 2a 20 63 61 73 65 20 50 32   that.** case P2
28270 20 6d 75 73 74 20 62 65 20 30 2e 20 20 49 74 20   must be 0.  It 
28280 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
28290 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  the cursor is us
282a0 65 64 20 6f 6e 6c 79 20 66 6f 72 0a 2a 2a 20 61  ed only for.** a
282b0 70 70 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f 20  ppending and so 
282c0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
282d0 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65   valid, then the
282e0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 72   cursor must alr
282f0 65 61 64 79 0a 2a 2a 20 62 65 20 70 6f 69 6e 74  eady.** be point
28300 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ing at the end o
28310 66 20 74 68 65 20 62 74 72 65 65 20 61 6e 64 20  f the btree and 
28320 73 6f 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  so no changes ar
28330 65 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 74 68 65  e made to.** the
28340 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 63 61 73 65   cursor..*/.case
28350 20 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20   OP_Last: {     
28360 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
28370 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
28380 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
28390 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
283a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
283b0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
283c0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
283d0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
283e0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
283f0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
28400 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
28410 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
28420 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
28430 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72  >uc.pCursor;.  r
28440 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  es = 0;.  assert
28450 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20  ( pCrsr!=0 );.  
28460 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
28470 20 70 4f 70 2d 3e 70 33 3b 0a 23 69 66 64 65 66   pOp->p3;.#ifdef
28480 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28490 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f  pC->seekOp = OP_
284a0 4c 61 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Last;.#endif.  i
284b0 66 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c  f( pOp->p3==0 ||
284c0 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   !sqlite3BtreeCu
284d0 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 70 43  rsorIsValidNN(pC
284e0 72 73 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  rsr) ){.    rc =
284f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
28500 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
28510 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
28520 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 20 20 70  = (u8)res;.    p
28530 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
28540 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
28550 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
28560 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 69 66  HE_STALE;.    if
28570 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
28580 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
28590 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
285a0 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42  0 ){.      VdbeB
285b0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
285c0 30 2c 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0,2);.      if( 
285d0 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  res ) goto jump_
285e0 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  to_p2;.    }.  }
285f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
28600 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a  ( pOp->p2==0 );.
28610 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
28620 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 53 6d 61  /* Opcode: IfSma
28630 6c 6c 65 72 20 50 31 20 50 32 20 50 33 20 2a 20  ller P1 P2 P3 * 
28640 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  *.**.** Estimate
28650 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
28660 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
28670 20 50 31 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32   P1.  Jump to P2
28680 20 69 66 20 74 68 61 74 0a 2a 2a 20 65 73 74 69   if that.** esti
28690 6d 61 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  mate is less tha
286a0 6e 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  n approximately 
286b0 32 2a 2a 28 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a  2**(0.1*P3)..*/.
286c0 63 61 73 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65  case OP_IfSmalle
286d0 72 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  r: {        /* j
286e0 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
286f0 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
28700 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
28710 74 20 72 65 73 3b 0a 20 20 69 36 34 20 73 7a 3b  t res;.  i64 sz;
28720 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
28730 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
28740 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
28750 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
28760 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
28770 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
28780 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
28790 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
287a0 20 70 43 72 73 72 20 29 3b 0a 20 20 72 63 20 3d   pCrsr );.  rc =
287b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
287c0 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
287d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
287e0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
287f0 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  ror;.  if( res==
28800 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 73 71  0 ){.    sz = sq
28810 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
28820 6e 74 45 73 74 28 70 43 72 73 72 29 3b 0a 20 20  ntEst(pCrsr);.  
28830 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 7a 3e    if( ALWAYS(sz>
28840 3d 30 29 20 26 26 20 73 71 6c 69 74 65 33 4c 6f  =0) && sqlite3Lo
28850 67 45 73 74 28 28 75 36 34 29 73 7a 29 3c 70 4f  gEst((u64)sz)<pO
28860 70 2d 3e 70 33 20 29 20 72 65 73 20 3d 20 31 3b  p->p3 ) res = 1;
28870 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63  .  }.  VdbeBranc
28880 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
28890 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f  ;.  if( res ) go
288a0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
288b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
288c0 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 53 6f 72  pcode: SorterSor
288d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
288e0 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 72 65  .** After all re
288f0 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20  cords have been 
28900 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
28910 65 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a  e Sorter object.
28920 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
28930 20 50 31 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73   P1, invoke this
28940 20 6f 70 63 6f 64 65 20 74 6f 20 61 63 74 75 61   opcode to actua
28950 6c 6c 79 20 64 6f 20 74 68 65 20 73 6f 72 74 69  lly do the sorti
28960 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  ng..** Jump to P
28970 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  2 if there are n
28980 6f 20 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20  o records to be 
28990 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  sorted..**.** Th
289a0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6e 20  is opcode is an 
289b0 61 6c 69 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72  alias for OP_Sor
289c0 74 20 61 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20  t and OP_Rewind 
289d0 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  that is used.** 
289e0 66 6f 72 20 53 6f 72 74 65 72 20 6f 62 6a 65 63  for Sorter objec
289f0 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ts..*/./* Opcode
28a00 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a  : Sort P1 P2 * *
28a10 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
28a20 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c  code does exactl
28a30 79 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  y the same thing
28a40 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78   as OP_Rewind ex
28a50 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20  cept that.** it 
28a60 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e  increments an un
28a70 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61  documented globa
28a80 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  l variable used 
28a90 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a  for testing..**.
28aa0 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63  ** Sorting is ac
28ab0 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72  complished by wr
28ac0 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  iting records in
28ad0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
28ae0 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69  ex,.** then rewi
28af0 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  nding that index
28b00 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20   and playing it 
28b10 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e  back from beginn
28b20 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20  ing to.** end.  
28b30 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f  We use the OP_So
28b40 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61  rt opcode instea
28b50 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74  d of OP_Rewind t
28b60 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69  o do the.** rewi
28b70 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68  nding so that th
28b80 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
28b90 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d  e will be increm
28ba0 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67  ented and.** reg
28bb0 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61  ression tests ca
28bc0 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  n determine whet
28bd0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f  her or not the o
28be0 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63  ptimizer is.** c
28bf0 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a  orrectly optimiz
28c00 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a  ing out sorts..*
28c10 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
28c20 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Sort:    /* jump
28c30 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74   */.case OP_Sort
28c40 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
28c50 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
28c60 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
28c70 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
28c80 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
28c90 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
28ca0 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
28cb0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
28cc0 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20  S_SORT]++;.  /* 
28cd0 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
28ce0 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d  o OP_Rewind */.}
28cf0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69  ./* Opcode: Rewi
28d00 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nd P1 P2 * * *.*
28d10 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
28d20 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f  e of the Rowid o
28d30 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
28d40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
28d50 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
28d60 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
28d70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
28d80 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
28d90 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
28da0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
28db0 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d  s empty, jump im
28dc0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
28dd0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
28de0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
28df0 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
28e00 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ough to the foll
28e10 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75  owing .** instru
28e20 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ction..**.** Thi
28e30 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
28e40 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
28e50 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
28e60 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
28e70 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
28e80 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
28e90 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
28ea0 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
28eb0 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
28ec0 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
28ed0 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73  not Prev..*/.cas
28ee0 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
28ef0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
28f00 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
28f10 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
28f20 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
28f30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
28f40 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
28f50 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
28f60 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
28f70 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
28f80 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
28f90 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
28fa0 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
28fb0 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  e==OP_SorterSort
28fc0 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a  ) );.  res = 1;.
28fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28fe0 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
28ff0 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 23 65   = OP_Rewind;.#e
29000 6e 64 69 66 0a 20 20 69 66 28 20 69 73 53 6f 72  ndif.  if( isSor
29010 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 72  ter(pC) ){.    r
29020 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
29030 6f 72 74 65 72 52 65 77 69 6e 64 28 70 43 2c 20  orterRewind(pC, 
29040 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  &res);.  }else{.
29050 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
29060 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
29070 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 70  E_BTREE );.    p
29080 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
29090 75 72 73 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  ursor;.    asser
290a0 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20  t( pCrsr );.    
290b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
290c0 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72  eFirst(pCrsr, &r
290d0 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  es);.    pC->def
290e0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
290f0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
29100 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
29110 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  LE;.  }.  if( rc
29120 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
29130 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43  e_to_error;.  pC
29140 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
29150 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  res;.  assert( p
29160 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
29170 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
29180 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
29190 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
291a0 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70   res ) goto jump
291b0 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
291c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
291d0 65 78 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ext P1 P2 P3 P4 
291e0 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  P5.**.** Advance
291f0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
29200 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
29210 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74  the next key/dat
29220 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a  a pair in its.**
29230 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
29240 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
29250 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65  o more key/value
29260 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
29270 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
29280 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
29290 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
292a0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76  f the cursor adv
292b0 61 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73  ance was success
292c0 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d  ful,.** jump imm
292d0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
292e0 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65 78 74 20 6f  **.** The Next o
292f0 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61  pcode is only va
29300 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  lid following an
29310 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
29320 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65 77 69 6e 64   or.** OP_Rewind
29330 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20   opcode used to 
29340 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
29350 73 6f 72 2e 20 20 4e 65 78 74 20 69 73 20 6e 6f  sor.  Next is no
29360 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  t allowed.** to 
29370 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c 20 53  follow SeekLT, S
29380 65 65 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c 61 73  eekLE, or OP_Las
29390 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20  t..**.** The P1 
293a0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66  cursor must be f
293b0 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  or a real table,
293c0 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
293d0 62 6c 65 2e 20 20 50 31 20 6d 75 73 74 20 68 61  ble.  P1 must ha
293e0 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 70 65 6e 65  ve.** been opene
293f0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
29400 6f 70 63 6f 64 65 20 6f 72 20 74 68 65 20 70 72  opcode or the pr
29410 6f 67 72 61 6d 20 77 69 6c 6c 20 73 65 67 66 61  ogram will segfa
29420 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ult..**.** The P
29430 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e  3 value is a hin
29440 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  t to the btree i
29450 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49  mplementation. I
29460 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a  f P3==1, that.**
29470 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20   means P1 is an 
29480 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
29490 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  at this instruct
294a0 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
294b0 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69  een.** omitted i
294c0 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 61 64  f that index had
294d0 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50   been unique.  P
294e0 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20  3 is usually 0. 
294f0 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73   P3 is.** always
29500 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
29510 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
29520 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
29530 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
29540 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
29550 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
29560 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a  BtreeNext()..**.
29570 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73 69  ** If P5 is posi
29580 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d  tive and the jum
29590 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e  p is taken, then
295a0 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a   event counter.*
295b0 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e  * number P5-1 in
295c0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
295d0 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65  atement is incre
295e0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  mented..**.** Se
295f0 65 20 61 6c 73 6f 3a 20 50 72 65 76 2c 20 4e 65  e also: Prev, Ne
29600 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f  xtIfOpen.*/./* O
29610 70 63 6f 64 65 3a 20 4e 65 78 74 49 66 4f 70 65  pcode: NextIfOpe
29620 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
29630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
29640 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
29650 6b 65 20 4e 65 78 74 20 65 78 63 65 70 74 20 74  ke Next except t
29660 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
29670 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
29680 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
29690 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
296a0 3a 20 50 72 65 76 20 50 31 20 50 32 20 50 33 20  : Prev P1 P2 P3 
296b0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b  P4 P5.**.** Back
296c0 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f   up cursor P1 so
296d0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
296e0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
296f0 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e  key/data pair in
29700 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   its.** table or
29710 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72   index.  If ther
29720 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73  e is no previous
29730 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
29740 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
29750 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
29760 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
29770 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  on.  But if the 
29780 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61  cursor backup wa
29790 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
297a0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
297b0 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a  y to P2..**.**.*
297c0 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64  * The Prev opcod
297d0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
297e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
297f0 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 0a  kLT, SeekLE, or.
29800 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f 64  ** OP_Last opcod
29810 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
29820 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  on the cursor.  
29830 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  Prev is not allo
29840 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77  wed.** to follow
29850 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c   SeekGT, SeekGE,
29860 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a   or OP_Rewind..*
29870 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
29880 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
29890 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
298a0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
298b0 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e 6f    If P1 is.** no
298c0 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68 65 20  t open then the 
298d0 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65  behavior is unde
298e0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fined..**.** The
298f0 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20 68   P3 value is a h
29900 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65 65  int to the btree
29910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
29920 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a   If P3==1, that.
29930 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61  ** means P1 is a
29940 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
29950 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72 75  that this instru
29960 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ction could have
29970 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64   been.** omitted
29980 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20 68   if that index h
29990 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20  ad been unique. 
299a0 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30   P3 is usually 0
299b0 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61  .  P3 is.** alwa
299c0 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 31  ys either 0 or 1
299d0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c  ..**.** P4 is al
299e0 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f  ways of type P4_
299f0 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e  ADVANCE. The fun
29a00 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f  ction pointer po
29a10 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  ints to.** sqlit
29a20 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
29a30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  )..**.** If P5 i
29a40 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
29a50 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
29a60 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
29a70 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
29a80 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
29a90 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
29aa0 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
29ab0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76  ./* Opcode: Prev
29ac0 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20  IfOpen P1 P2 P3 
29ad0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
29ae0 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75   opcode works ju
29af0 73 74 20 6c 69 6b 65 20 50 72 65 76 20 65 78 63  st like Prev exc
29b00 65 70 74 20 74 68 61 74 20 69 66 20 63 75 72 73  ept that if curs
29b10 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  or P1 is not.** 
29b20 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 73 20  open it behaves 
29b30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f  a no-op..*/./* O
29b40 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4e 65 78  pcode: SorterNex
29b50 74 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a  t P1 P2 * * P5.*
29b60 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
29b70 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
29b80 20 4f 50 5f 4e 65 78 74 20 65 78 63 65 70 74 20   OP_Next except 
29b90 74 68 61 74 20 50 31 20 6d 75 73 74 20 62 65 20  that P1 must be 
29ba0 61 0a 2a 2a 20 73 6f 72 74 65 72 20 6f 62 6a 65  a.** sorter obje
29bb0 63 74 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ct for which the
29bc0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 20 6f   OP_SorterSort o
29bd0 70 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a  pcode has been.*
29be0 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 69 73  * invoked.  This
29bf0 20 6f 70 63 6f 64 65 20 61 64 76 61 6e 63 65 73   opcode advances
29c00 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29c10 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a  he next sorted.*
29c20 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 6a 75 6d  * record, or jum
29c30 70 73 20 74 6f 20 50 32 20 69 66 20 74 68 65 72  ps to P2 if ther
29c40 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 73 6f  e are no more so
29c50 72 74 65 64 20 72 65 63 6f 72 64 73 2e 0a 2a 2f  rted records..*/
29c60 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e  .case OP_SorterN
29c70 65 78 74 3a 20 7b 20 20 2f 2a 20 6a 75 6d 70 20  ext: {  /* jump 
29c80 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
29c90 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
29ca0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
29cb0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
29cc0 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
29cd0 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  ) );.  res = 0;.
29ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
29cf0 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
29d00 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 67 6f   pC, &res);.  go
29d10 74 6f 20 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61  to next_tail;.ca
29d20 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
29d30 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a  :    /* jump */.
29d40 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
29d50 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  en:    /* jump *
29d60 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  /.  if( p->apCsr
29d70 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30 20 29 20 62  [pOp->p1]==0 ) b
29d80 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  reak;.  /* Fall 
29d90 74 68 72 6f 75 67 68 20 2a 2f 0a 63 61 73 65 20  through */.case 
29da0 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20 20  OP_Prev:        
29db0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
29dc0 65 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20 20 20  e OP_Next:      
29dd0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
29de0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
29df0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
29e00 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
29e10 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41  ssert( pOp->p5<A
29e20 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75  rraySize(p->aCou
29e30 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20  nter) );.  pC = 
29e40 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
29e50 5d 3b 0a 20 20 72 65 73 20 3d 20 70 4f 70 2d 3e  ];.  res = pOp->
29e60 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  p3;.  assert( pC
29e70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
29e80 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
29e90 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
29ea0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
29eb0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
29ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 65 73  );.  assert( res
29ed0 3d 3d 30 20 7c 7c 20 28 72 65 73 3d 3d 31 20 26  ==0 || (res==1 &
29ee0 26 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  & pC->isTable==0
29ef0 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
29f00 20 72 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73   res==1 );.  ass
29f10 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
29f20 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70  !=OP_Next || pOp
29f30 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
29f40 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 20  qlite3BtreeNext 
29f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
29f60 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
29f70 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64  v || pOp->p4.xAd
29f80 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74  vance==sqlite3Bt
29f90 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b 0a 20  reePrevious );. 
29fa0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
29fb0 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f  code!=OP_NextIfO
29fc0 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78  pen || pOp->p4.x
29fd0 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33  Advance==sqlite3
29fe0 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20 61  BtreeNext );.  a
29ff0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2a000 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65  de!=OP_PrevIfOpe
2a010 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64  n || pOp->p4.xAd
2a020 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74  vance==sqlite3Bt
2a030 72 65 65 50 72 65 76 69 6f 75 73 29 3b 0a 0a 20  reePrevious);.. 
2a040 20 2f 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63   /* The Next opc
2a050 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ode is only used
2a060 20 61 66 74 65 72 20 53 65 65 6b 47 54 2c 20 53   after SeekGT, S
2a070 65 65 6b 47 45 2c 20 61 6e 64 20 52 65 77 69 6e  eekGE, and Rewin
2a080 64 2e 0a 20 20 2a 2a 20 54 68 65 20 50 72 65 76  d..  ** The Prev
2a090 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
2a0a0 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b 4c  used after SeekL
2a0b0 54 2c 20 53 65 65 6b 4c 45 2c 20 61 6e 64 20 4c  T, SeekLE, and L
2a0c0 61 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ast. */.  assert
2a0d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
2a0e0 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 6f  P_Next || pOp->o
2a0f0 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66  pcode!=OP_NextIf
2a100 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70  Open.       || p
2a110 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
2a120 65 6b 47 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  ekGT || pC->seek
2a130 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a 20 20  Op==OP_SeekGE.  
2a140 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
2a150 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 7c 7c  Op==OP_Rewind ||
2a160 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
2a170 46 6f 75 6e 64 29 3b 0a 20 20 61 73 73 65 72 74  Found);.  assert
2a180 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
2a190 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 6f  P_Prev || pOp->o
2a1a0 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49 66  pcode!=OP_PrevIf
2a1b0 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70  Open.       || p
2a1c0 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
2a1d0 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  ekLT || pC->seek
2a1e0 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20 20  Op==OP_SeekLE.  
2a1f0 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
2a200 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 0a  Op==OP_Last );..
2a210 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 78    rc = pOp->p4.x
2a220 41 64 76 61 6e 63 65 28 70 43 2d 3e 75 63 2e 70  Advance(pC->uc.p
2a230 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 6e  Cursor, &res);.n
2a240 65 78 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d 3e  ext_tail:.  pC->
2a250 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
2a260 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64 62  CHE_STALE;.  Vdb
2a270 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
2a280 3d 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  ==0,2);.  if( rc
2a290 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2a2a0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
2a2b0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
2a2c0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
2a2d0 0a 20 20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72  .    p->aCounter
2a2e0 5b 70 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a 23 69 66  [pOp->p5]++;.#if
2a2f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2a300 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
2a310 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
2a320 69 66 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  if.    goto jump
2a330 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b  _to_p2_and_check
2a340 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a  _for_interrupt;.
2a350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 2d    }else{.    pC-
2a360 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
2a370 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  }.  goto check_f
2a380 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
2a390 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49  ./* Opcode: IdxI
2a3a0 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50  nsert P1 P2 P3 P
2a3b0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2a3c0 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a  : key=r[P2].**.*
2a3d0 2a 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f  * Register P2 ho
2a3e0 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  lds an SQL index
2a3f0 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20   key made using 
2a400 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72  the.** MakeRecor
2a410 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  d instructions. 
2a420 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69   This opcode wri
2a430 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20  tes that key.** 
2a440 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50  into the index P
2a450 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65  1.  Data for the
2a460 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a   entry is nil..*
2a470 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
2a480 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  t zero, then it 
2a490 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a4a0 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 75   values in the u
2a4b0 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f  npacked.** key o
2a4c0 66 20 72 65 67 28 50 32 29 2e 20 20 49 6e 20 74  f reg(P2).  In t
2a4d0 68 61 74 20 63 61 73 65 2c 20 50 33 20 69 73 20  hat case, P3 is 
2a4e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2a4f0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 0a   first register.
2a500 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e 70 61 63  ** for the unpac
2a510 6b 65 64 20 6b 65 79 2e 20 20 54 68 65 20 61 76  ked key.  The av
2a520 61 69 6c 61 62 69 6c 69 74 79 20 6f 66 20 74 68  ailability of th
2a530 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 63  e unpacked key c
2a540 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  an sometimes.** 
2a550 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  be an optimizati
2a560 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  on..**.** If P5 
2a570 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 41  has the OPFLAG_A
2a580 50 50 45 4e 44 20 62 69 74 20 73 65 74 2c 20 74  PPEND bit set, t
2a590 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
2a5a0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
2a5b0 72 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  r.** that this i
2a5c0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
2a5d0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
2a5e0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73  .**.** If P5 has
2a5f0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
2a600 4e 47 45 20 62 69 74 20 73 65 74 2c 20 74 68 65  NGE bit set, the
2a610 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  n the change cou
2a620 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65  nter is.** incre
2a630 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 69  mented by this i
2a640 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
2a650 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
2a660 47 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c  GE bit is clear,
2a670 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61  .** then the cha
2a680 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75  nge counter is u
2a690 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
2a6a0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
2a6b0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
2a6c0 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74   of P5 is set, t
2a6d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2a6e0 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66  n might.** run f
2a6f0 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
2a700 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  g an unnecessary
2a710 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20   seek on cursor 
2a720 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  P1.  However,.**
2a730 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
2a740 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d  EEKRESULT flag m
2a750 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  ust only be set 
2a760 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
2a770 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73  en no prior.** s
2a780 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73  eeks on the curs
2a790 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73  or or if the mos
2a7a0 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73  t recent seek us
2a7b0 65 64 20 61 20 6b 65 79 20 65 71 75 69 76 61 6c  ed a key equival
2a7c0 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a  ent.** to P2. .*
2a7d0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
2a7e0 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
2a7f0 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54   for indices.  T
2a800 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
2a810 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
2a820 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e   tables is OP_In
2a830 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sert..*/./* Opco
2a840 64 65 3a 20 53 6f 72 74 65 72 49 6e 73 65 72 74  de: SorterInsert
2a850 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2a860 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2a870 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  P2].**.** Regist
2a880 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53  er P2 holds an S
2a890 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64  QL index key mad
2a8a0 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d  e using the.** M
2a8b0 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
2a8c0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70  ctions.  This op
2a8d0 63 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74  code writes that
2a8e0 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65   key.** into the
2a8f0 20 73 6f 72 74 65 72 20 50 31 2e 20 20 44 61 74   sorter P1.  Dat
2a900 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  a for the entry 
2a910 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20  is nil..*/.case 
2a920 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
2a930 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
2a940 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65  .case OP_IdxInse
2a950 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
2a960 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in2 */.  VdbeCur
2a970 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 72 65 65  sor *pC;.  Btree
2a980 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20 20 61 73  Payload x;..  as
2a990 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2a9a0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2a9b0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2a9c0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2a9d0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2a9e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2a9f0 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 28   isSorter(pC)==(
2aa00 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2aa10 53 6f 72 74 65 72 49 6e 73 65 72 74 29 20 29 3b  SorterInsert) );
2aa20 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
2aa30 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
2aa40 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20  rt( pIn2->flags 
2aa50 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
2aa60 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
2aa70 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
2aa80 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 61  ->nChange++;.  a
2aa90 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2aaa0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2aab0 45 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  EE || pOp->opcod
2aac0 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2aad0 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rt );.  assert( 
2aae0 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
2aaf0 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42  ;.  rc = ExpandB
2ab00 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 69 66 28  lob(pIn2);.  if(
2ab10 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2ab20 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2ab30 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2ab40 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  ==OP_SorterInser
2ab50 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
2ab60 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57  lite3VdbeSorterW
2ab70 72 69 74 65 28 70 43 2c 20 70 49 6e 32 29 3b 0a  rite(pC, pIn2);.
2ab80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e    }else{.    x.n
2ab90 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20  Key = pIn2->n;. 
2aba0 20 20 20 78 2e 70 4b 65 79 20 3d 20 70 49 6e 32     x.pKey = pIn2
2abb0 2d 3e 7a 3b 0a 20 20 20 20 78 2e 61 4d 65 6d 20  ->z;.    x.aMem 
2abc0 3d 20 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33  = aMem + pOp->p3
2abd0 3b 0a 20 20 20 20 78 2e 6e 4d 65 6d 20 3d 20 28  ;.    x.nMem = (
2abe0 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
2abf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ac00 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75  treeInsert(pC->u
2ac10 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20  c.pCursor, &x,. 
2ac20 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35          (pOp->p5
2ac30 20 26 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e   & (OPFLAG_APPEN
2ac40 44 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  D|OPFLAG_SAVEPOS
2ac50 49 54 49 4f 4e 29 29 2c 20 0a 20 20 20 20 20 20  ITION)), .      
2ac60 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
2ac70 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
2ac80 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
2ac90 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
2aca0 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
2acb0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2acc0 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43  eto==0 );.    pC
2acd0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
2ace0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
2acf0 0a 20 20 69 66 28 20 72 63 29 20 67 6f 74 6f 20  .  if( rc) goto 
2ad00 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2ad10 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
2ad20 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65  /* Opcode: IdxDe
2ad30 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 2a 20  lete P1 P2 P3 * 
2ad40 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
2ad50 65 79 3d 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a  ey=r[P2@P3].**.*
2ad60 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2ad70 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
2ad80 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
2ad90 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
2ada0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2adb0 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
2adc0 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
2add0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
2ade0 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
2adf0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
2ae00 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
2ae10 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
2ae20 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
2ae30 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
2ae40 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
2ae50 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
2ae60 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
2ae70 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ae80 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
2ae90 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
2aea0 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
2aeb0 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
2aec0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2aed0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2aee0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2aef0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2af00 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2af10 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2af20 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2af30 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73  _BTREE );.  pCrs
2af40 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
2af50 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  or;.  assert( pC
2af60 72 73 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rsr!=0 );.  asse
2af70 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29  rt( pOp->p5==0 )
2af80 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d  ;.  r.pKeyInfo =
2af90 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
2afa0 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
2afb0 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65  )pOp->p3;.  r.de
2afc0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
2afd0 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  r.aMem = &aMem[p
2afe0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20  Op->p2];.  rc = 
2aff0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2b000 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72  toUnpacked(pCrsr
2b010 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73  , &r, 0, 0, &res
2b020 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2b030 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2b040 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2b050 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2b060 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2b070 74 65 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f  te(pCrsr, BTREE_
2b080 41 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20  AUXDELETE);.    
2b090 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2b0a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2b0b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2b0c0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
2b0d0 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63  to==0 );.  pC->c
2b0e0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2b0f0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e  HE_STALE;.  pC->
2b100 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a  seekResult = 0;.
2b110 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2b120 70 63 6f 64 65 3a 20 53 65 65 6b 20 50 31 20 2a  pcode: Seek P1 *
2b130 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
2b140 70 73 69 73 3a 20 4d 6f 76 65 20 50 33 20 74 6f  psis: Move P3 to
2b150 20 50 31 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20   P1.rowid.**.** 
2b160 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e  P1 is an open in
2b170 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50  dex cursor and P
2b180 33 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e  3 is a cursor on
2b190 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2b1a0 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ng.** table.  Th
2b1b0 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61  is opcode does a
2b1c0 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
2b1d0 66 20 74 68 65 20 50 33 20 74 61 62 6c 65 20 63  f the P3 table c
2b1e0 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20  ursor.** to the 
2b1f0 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65 73 70  row that corresp
2b200 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75 72 72  onds to the curr
2b210 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a  ent row of P1..*
2b220 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
2b230 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e  eferred seek.  N
2b240 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20  othing actually 
2b250 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a  happens until.**
2b260 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   the cursor is u
2b270 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72 65  sed to read a re
2b280 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c  cord.  That way,
2b290 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20   if no reads.** 
2b2a0 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65  occur, no unnece
2b2b0 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e  ssary I/O happen
2b2c0 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20  s..**.** P4 may 
2b2d0 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  be an array of i
2b2e0 6e 74 65 67 65 72 73 20 28 74 79 70 65 20 50 34  ntegers (type P4
2b2f0 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61  _INTARRAY) conta
2b300 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74  ining.** one ent
2b310 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ry for each colu
2b320 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74 61 62  mn in the P3 tab
2b330 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e  le.  If array en
2b340 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e  try a(i).** is n
2b350 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65  on-zero, then re
2b360 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69  ading column a(i
2b370 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20  )-1 from cursor 
2b380 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61  P3 is .** equiva
2b390 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69  lent to performi
2b3a0 6e 67 20 74 68 65 20 64 65 66 65 72 72 65 64 20  ng the deferred 
2b3b0 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65  seek and then re
2b3c0 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a  ading column i .
2b3d0 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69  ** from P1.  Thi
2b3e0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2b3f0 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e   stored in P3 an
2b400 64 20 75 73 65 64 20 74 6f 20 72 65 64 69 72 65  d used to redire
2b410 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69  ct.** reads agai
2b420 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50  nst P3 over to P
2b430 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79  1, thus possibly
2b440 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65   avoiding the ne
2b450 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e  ed to.** seek an
2b460 64 20 72 65 61 64 20 63 75 72 73 6f 72 20 50 33  d read cursor P3
2b470 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2b480 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a  IdxRowid P1 P2 *
2b490 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
2b4a0 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a  : r[P2]=rowid.**
2b4b0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
2b4c0 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
2b4d0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
2b4e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2b4f0 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
2b500 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
2b510 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
2b520 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
2b530 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
2b540 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
2b550 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2b560 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
2b570 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
2b580 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
2b590 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
2b5a0 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
2b5b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
2b5c0 3a 0a 63 61 73 65 20 4f 50 5f 49 64 78 52 6f 77  :.case OP_IdxRow
2b5d0 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  id: {           
2b5e0 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
2b5f0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b610 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78 20 63  * The P1 index c
2b620 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 43  ursor */.  VdbeC
2b630 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72 3b 20  ursor *pTabCur; 
2b640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b650 20 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f 72   P2 table cursor
2b660 20 28 4f 50 5f 53 65 65 6b 20 6f 6e 6c 79 29 20   (OP_Seek only) 
2b670 2a 2f 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 20  */.  i64 rowid; 
2b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b690 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 68 61      /* Rowid tha
2b6a0 74 20 50 31 20 63 75 72 72 65 6e 74 20 70 6f 69  t P1 current poi
2b6b0 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  nts to */..  ass
2b6c0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2b6d0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
2b6e0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
2b6f0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2b700 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2b710 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b720 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2b730 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2b740 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
2b750 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
2b760 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
2b770 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ble==0 );.  asse
2b780 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
2b790 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61  Moveto==0 );.  a
2b7a0 73 73 65 72 74 28 20 21 70 43 2d 3e 6e 75 6c 6c  ssert( !pC->null
2b7b0 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  Row || pOp->opco
2b7c0 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69 64 20  de==OP_IdxRowid 
2b7d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 49 64 78  );..  /* The Idx
2b7e0 52 6f 77 69 64 20 61 6e 64 20 53 65 65 6b 20 6f  Rowid and Seek o
2b7f0 70 63 6f 64 65 73 20 61 72 65 20 63 6f 6d 62 69  pcodes are combi
2b800 6e 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 74  ned because of t
2b810 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 79 0a 20  he commonality. 
2b820 20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33 56 64   ** of sqlite3Vd
2b830 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
2b840 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  ) and sqlite3Vdb
2b850 65 49 64 78 52 6f 77 69 64 28 29 2e 20 2a 2f 0a  eIdxRowid(). */.
2b860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2b870 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
2b880 70 43 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  pC);..  /* sqlit
2b890 65 33 56 62 65 43 75 72 73 6f 72 52 65 73 74 6f  e3VbeCursorResto
2b8a0 72 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61  re() can only fa
2b8b0 69 6c 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  il if the record
2b8c0 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
2b8d0 64 0a 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20  d.  ** out from 
2b8e0 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
2b8f0 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 6e 65 76  .  That will nev
2b900 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61  er happens for a
2b910 6e 20 49 64 78 52 6f 77 69 64 0a 20 20 2a 2a 20  n IdxRowid.  ** 
2b920 6f 72 20 53 65 65 6b 20 6f 70 63 6f 64 65 20 2a  or Seek opcode *
2b930 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63  /.  if( NEVER(rc
2b940 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67  !=SQLITE_OK) ) g
2b950 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b960 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 21  _error;..  if( !
2b970 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  pC->nullRow ){. 
2b980 20 20 20 72 6f 77 69 64 20 3d 20 30 3b 20 20 2f     rowid = 0;  /
2b990 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f  * Not needed.  O
2b9a0 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c 65  nly used to sile
2b9b0 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a  nce a warning. *
2b9c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b9d0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 64  e3VdbeIdxRowid(d
2b9e0 62 2c 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  b, pC->uc.pCurso
2b9f0 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20  r, &rowid);.    
2ba00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ba10 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2ba20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2ba30 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
2ba40 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2ba50 50 5f 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20  P_Seek ){.      
2ba60 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
2ba70 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d  =0 && pOp->p3<p-
2ba80 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >nCursor );.    
2ba90 20 20 70 54 61 62 43 75 72 20 3d 20 70 2d 3e 61    pTabCur = p->a
2baa0 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  pCsr[pOp->p3];. 
2bab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2bac0 62 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  bCur!=0 );.     
2bad0 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2bae0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2baf0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  YPE_BTREE );.   
2bb00 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43     assert( pTabC
2bb10 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  ur->uc.pCursor!=
2bb20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2bb30 74 28 20 70 54 61 62 43 75 72 2d 3e 69 73 54 61  t( pTabCur->isTa
2bb40 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ble );.      pTa
2bb50 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  bCur->nullRow = 
2bb60 30 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  0;.      pTabCur
2bb70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d  ->movetoTarget =
2bb80 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70 54   rowid;.      pT
2bb90 61 62 43 75 72 2d 3e 64 65 66 65 72 72 65 64 4d  abCur->deferredM
2bba0 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20 20 20 20  oveto = 1;.     
2bbb0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
2bbc0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41  type==P4_INTARRA
2bbd0 59 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 61 69 3d  Y || pOp->p4.ai=
2bbe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
2bbf0 43 75 72 2d 3e 61 41 6c 74 4d 61 70 20 3d 20 70  Cur->aAltMap = p
2bc00 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
2bc10 20 70 54 61 62 43 75 72 2d 3e 70 41 6c 74 43 75   pTabCur->pAltCu
2bc20 72 73 6f 72 20 3d 20 70 43 3b 0a 20 20 20 20 7d  rsor = pC;.    }
2bc30 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 75 74  else{.      pOut
2bc40 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
2bc50 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  e(p, pOp);.     
2bc60 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77   pOut->u.i = row
2bc70 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  id;.    }.  }els
2bc80 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2bc90 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2bca0 64 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 73  dxRowid );.    s
2bcb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2bcc0 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Null(&aMem[pOp->
2bcd0 70 32 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  p2]);.  }.  brea
2bce0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2bcf0 20 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20   IdxGE P1 P2 P3 
2bd00 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
2bd10 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
2bd20 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
2bd30 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
2bd40 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
2bd50 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
2bd60 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
2bd70 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49  at omits the PRI
2bd80 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61  MARY KEY.  Compa
2bd90 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2bda0 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  e against the in
2bdb0 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20  dex .** that P1 
2bdc0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2bdd0 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2bde0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2bdf0 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20  EY or ROWID .** 
2be00 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e  fields at the en
2be10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2be20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2be30 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
2be40 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
2be50 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e  ey value.** then
2be60 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74   jump to P2.  Ot
2be70 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2be80 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2be90 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2bea0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47  ./* Opcode: IdxG
2beb0 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  T P1 P2 P3 P4 P5
2bec0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2bed0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2bee0 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2bef0 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2bf00 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2bf10 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2bf20 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2bf30 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2bf40 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68  KEY.  Compare th
2bf50 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61  is key value aga
2bf60 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a  inst the index .
2bf70 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ** that P1 is cu
2bf80 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2bf90 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2bfa0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2bfb0 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64   ROWID .** field
2bfc0 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  s at the end..**
2bfd0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2bfe0 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65  dex entry is gre
2bff0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65  ater than the ke
2c000 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20  y value.** then 
2c010 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68  jump to P2.  Oth
2c020 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2c030 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2c040 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2c050 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54  /* Opcode: IdxLT
2c060 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2c070 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2c080 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2c090 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2c0a0 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2c0b0 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2c0c0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2c0d0 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2c0e0 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2c0f0 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2c100 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2c110 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2c120 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2c130 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2c140 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2c150 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2c160 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2c170 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2c180 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2c190 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2c1a0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b   less than the k
2c1b0 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75  ey value then ju
2c1c0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68  mp to P2..** Oth
2c1d0 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2c1e0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2c1f0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2c200 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 45  /* Opcode: IdxLE
2c210 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2c220 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2c230 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2c240 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2c250 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2c260 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2c270 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2c280 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2c290 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2c2a0 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f  EY or ROWID.  Co
2c2b0 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
2c2c0 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20  alue against.** 
2c2d0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 50  the index that P
2c2e0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2c2f0 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2c300 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2c310 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44   KEY or.** ROWID
2c320 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78   on the P1 index
2c330 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2c340 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2c350 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2c360 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
2c370 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 0a 2a  alue then jump.*
2c380 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69  * to P2. Otherwi
2c390 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2c3a0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2c3b0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
2c3c0 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20 20 20   OP_IdxLE:      
2c3d0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2c3e0 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20 20 20  ase OP_IdxGT:   
2c3f0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2c400 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a  /.case OP_IdxLT:
2c410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
2c420 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  p */.case OP_Idx
2c430 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f 2a 20  GE:  {       /* 
2c440 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
2c450 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
2c460 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  res;.  UnpackedR
2c470 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65  ecord r;..  asse
2c480 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2c490 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2c4a0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2c4b0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2c4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2c4d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c4e0 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a  C->isOrdered );.
2c4f0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2c500 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2c510 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
2c520 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
2c530 72 21 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  r!=0);.  assert(
2c540 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2c550 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
2c560 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
2c570 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
2c580 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2c590 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
2c5a0 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  );.  r.pKeyInfo 
2c5b0 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
2c5c0 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31    r.nField = (u1
2c5d0 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 69  6)pOp->p4.i;.  i
2c5e0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f  f( pOp->opcode<O
2c5f0 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 61  P_IdxLT ){.    a
2c600 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2c610 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20  de==OP_IdxLE || 
2c620 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c630 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 2e 64  IdxGT );.    r.d
2c640 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a  efault_rc = -1;.
2c650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2c660 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2c670 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f  ==OP_IdxGE || pO
2c680 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2c690 78 4c 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66  xLT );.    r.def
2c6a0 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 7d  ault_rc = 0;.  }
2c6b0 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65  .  r.aMem = &aMe
2c6c0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
2c6d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2c6e0 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
2c6f0 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
2c700 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
2c710 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
2c720 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
2c730 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4e    res = 0;  /* N
2c740 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79  ot needed.  Only
2c750 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65   used to silence
2c760 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
2c770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2c780 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 64  eIdxKeyCompare(d
2c790 62 2c 20 70 43 2c 20 26 72 2c 20 26 72 65 73 29  b, pC, &r, &res)
2c7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f  ;.  assert( (OP_
2c7b0 49 64 78 4c 45 26 31 29 3d 3d 28 4f 50 5f 49 64  IdxLE&1)==(OP_Id
2c7c0 78 4c 54 26 31 29 20 26 26 20 28 4f 50 5f 49 64  xLT&1) && (OP_Id
2c7d0 78 47 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 47  xGE&1)==(OP_IdxG
2c7e0 54 26 31 29 20 29 3b 0a 20 20 69 66 28 20 28 70  T&1) );.  if( (p
2c7f0 4f 70 2d 3e 6f 70 63 6f 64 65 26 31 29 3d 3d 28  Op->opcode&1)==(
2c800 4f 50 5f 49 64 78 4c 54 26 31 29 20 29 7b 0a 20  OP_IdxLT&1) ){. 
2c810 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2c820 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45  opcode==OP_IdxLE
2c830 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2c840 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
2c850 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 7d   res = -res;.  }
2c860 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2c870 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2c880 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxGE || pOp->
2c890 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54  opcode==OP_IdxGT
2c8a0 20 29 3b 0a 20 20 20 20 72 65 73 2b 2b 3b 0a 20   );.    res++;. 
2c8b0 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54   }.  VdbeBranchT
2c8c0 61 6b 65 6e 28 72 65 73 3e 30 2c 32 29 3b 0a 20  aken(res>0,2);. 
2c8d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2c8e0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2c8f0 72 3b 0a 20 20 69 66 28 20 72 65 73 3e 30 20 29  r;.  if( res>0 )
2c900 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
2c910 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2c920 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 6f 79   Opcode: Destroy
2c930 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2c940 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
2c950 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61  tire database ta
2c960 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
2c970 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  se root page in 
2c980 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
2c990 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
2c9a0 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   P1..**.** The t
2c9b0 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73 74 72  able being destr
2c9c0 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65 20 6d  oyed is in the m
2c9d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2c9e0 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a  e if P3==0.  If.
2c9f0 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 74 68  ** P3==1 then th
2ca00 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c  e table to be cl
2ca10 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75  ear is in the au
2ca20 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ca30 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73   file.** that is
2ca40 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2ca50 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69  ables create usi
2ca60 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52  ng CREATE TEMPOR
2ca70 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  ARY TABLE..**.**
2ca80 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2ca90 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 69  s enabled then i
2caa0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2cab0 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20  at another root 
2cac0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  page.** might be
2cad0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
2cae0 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20 72 6f  newly deleted ro
2caf0 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  ot page in order
2cb00 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20   to keep all.** 
2cb10 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e 74 69  root pages conti
2cb20 67 75 6f 75 73 20 61 74 20 74 68 65 20 62 65 67  guous at the beg
2cb30 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
2cb40 74 61 62 61 73 65 2e 20 20 54 68 65 20 66 6f 72  tabase.  The for
2cb50 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  mer.** value of 
2cb60 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 74 68  the root page th
2cb70 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 20 76  at moved - its v
2cb80 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20  alue before the 
2cb90 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20 2d 0a  move occurred -.
2cba0 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
2cbb0 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66  register P2.  If
2cbc0 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d 6f 76   no page .** mov
2cbd0 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69 72  ement was requir
2cbe0 65 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20  ed (because the 
2cbf0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2cc00 70 65 64 20 77 61 73 20 61 6c 72 65 61 64 79 20  ped was already 
2cc10 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f 6e 65  .** the last one
2cc20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cc30 29 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73  ) then a zero is
2cc40 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2cc50 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20 41 55  ter P2..** If AU
2cc60 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73 61  TOVACUUM is disa
2cc70 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72 6f  bled then a zero
2cc80 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
2cc90 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
2cca0 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72   See also: Clear
2ccb0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73 74  .*/.case OP_Dest
2ccc0 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75  roy: {     /* ou
2ccd0 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76  t2 */.  int iMov
2cce0 65 64 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  ed;.  int iDb;..
2ccf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2cd00 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
2cd10 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 31 20  sert( pOp->p1>1 
2cd20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
2cd30 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2cd40 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  p);.  pOut->flag
2cd50 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2cd60 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  if( db->nVdbeRea
2cd70 64 20 3e 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f  d > db->nVDestro
2cd80 79 2b 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  y+1 ){.    rc = 
2cd90 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2cda0 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
2cdb0 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
2cdc0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
2cdd0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c  _to_error;.  }el
2cde0 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f  se{.    iDb = pO
2cdf0 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72  p->p3;.    asser
2ce00 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2ce10 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
2ce20 20 29 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20 3d   );.    iMoved =
2ce30 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
2ce40 65 64 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c  ed.  Only to sil
2ce50 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2ce60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2ce70 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2ce80 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  e(db->aDb[iDb].p
2ce90 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d  Bt, pOp->p1, &iM
2cea0 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d  oved);.    pOut-
2ceb0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
2cec0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
2ced0 3d 20 69 4d 6f 76 65 64 3b 0a 20 20 20 20 69 66  = iMoved;.    if
2cee0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2cef0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2cf00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cf10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2cf20 20 20 20 69 66 28 20 69 4d 6f 76 65 64 21 3d 30     if( iMoved!=0
2cf30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cf40 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64  3RootPageMoved(d
2cf50 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20  b, iDb, iMoved, 
2cf60 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20  pOp->p1);.      
2cf70 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  /* All OP_Destro
2cf80 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  y operations occ
2cf90 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  ur on the same b
2cfa0 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  tree */.      as
2cfb0 73 65 72 74 28 20 72 65 73 65 74 53 63 68 65 6d  sert( resetSchem
2cfc0 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72  aOnFault==0 || r
2cfd0 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
2cfe0 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20  t==iDb+1 );.    
2cff0 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46    resetSchemaOnF
2d000 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20  ault = iDb+1;.  
2d010 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
2d020 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2d030 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50  code: Clear P1 P
2d040 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  2 P3.**.** Delet
2d050 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  e all contents o
2d060 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2d070 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
2d080 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ose root page.**
2d090 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2d0a0 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
2d0b0 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69  y P1.  But, unli
2d0c0 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e  ke Destroy, do n
2d0d0 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  ot.** remove the
2d0e0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2d0f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2d100 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2d110 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
2d120 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ear is in the ma
2d130 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2d140 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a   if P2==0.  If.*
2d150 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65  * P2==1 then the
2d160 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65   table to be cle
2d170 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78  ar is in the aux
2d180 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2d190 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  file.** that is 
2d1a0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61  used to store ta
2d1b0 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e  bles create usin
2d1c0 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
2d1d0 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  RY TABLE..**.** 
2d1e0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
2d1f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2d200 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  n the table refe
2d210 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20  rred to must be 
2d220 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  an.** intkey tab
2d230 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65  le (an SQL table
2d240 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e  , not an index).
2d250 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2d260 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a  e row change .**
2d270 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d   count is increm
2d280 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
2d290 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2d2a0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2d2b0 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50  leared. .** If P
2d2c0 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
2d2d0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
2d2e0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2d2f0 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a   register P3 is.
2d300 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e  ** also incremen
2d310 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2d320 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2d330 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
2d340 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ared..**.** See 
2d350 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f  also: Destroy.*/
2d360 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20  .case OP_Clear: 
2d370 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b  {.  int nChange;
2d380 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30  . .  nChange = 0
2d390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
2d3a0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
2d3b0 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
2d3c0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
2d3d0 20 70 4f 70 2d 3e 70 32 29 20 29 3b 0a 20 20 72   pOp->p2) );.  r
2d3e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d3f0 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20  ClearTable(.    
2d400 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70    db->aDb[pOp->p
2d410 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  2].pBt, pOp->p1,
2d420 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68   (pOp->p3 ? &nCh
2d430 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20  ange : 0).  );. 
2d440 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a   if( pOp->p3 ){.
2d450 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b      p->nChange +
2d460 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69  = nChange;.    i
2d470 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a  f( pOp->p3>0 ){.
2d480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
2d490 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
2d4a0 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20  Op->p3]) );.    
2d4b0 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
2d4c0 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
2d4d0 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65  >p3]);.      aMe
2d4e0 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b  m[pOp->p3].u.i +
2d4f0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  = nChange;.    }
2d500 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
2d510 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2d520 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
2d530 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2d540 52 65 73 65 74 53 6f 72 74 65 72 20 50 31 20 2a  ResetSorter P1 *
2d550 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c   * * *.**.** Del
2d560 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
2d570 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65   from the epheme
2d580 72 61 6c 20 74 61 62 6c 65 20 6f 72 20 73 6f 72  ral table or sor
2d590 74 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6f  ter.** that is o
2d5a0 70 65 6e 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  pen on cursor P1
2d5b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
2d5c0 6f 64 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  ode only works f
2d5d0 6f 72 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  or cursors used 
2d5e0 66 6f 72 20 73 6f 72 74 69 6e 67 20 61 6e 64 0a  for sorting and.
2d5f0 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20 4f  ** opened with O
2d600 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2d610 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  or OP_SorterOpen
2d620 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73  ..*/.case OP_Res
2d630 65 74 53 6f 72 74 65 72 3a 20 7b 0a 20 20 56 64  etSorter: {.  Vd
2d640 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 0a  beCursor *pC;. .
2d650 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2d660 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2d670 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2d680 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
2d690 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2d6a0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pC!=0 );.  if(
2d6b0 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
2d6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d6d0 53 6f 72 74 65 72 52 65 73 65 74 28 64 62 2c 20  SorterReset(db, 
2d6e0 70 43 2d 3e 75 63 2e 70 53 6f 72 74 65 72 29 3b  pC->uc.pSorter);
2d6f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2d700 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2d710 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2d720 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
2d730 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c   pC->isEphemeral
2d740 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2d750 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2d760 62 6c 65 4f 66 43 75 72 73 6f 72 28 70 43 2d 3e  bleOfCursor(pC->
2d770 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
2d780 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2d790 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2d7a0 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  r;.  }.  break;.
2d7b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72  }../* Opcode: Cr
2d7c0 65 61 74 65 54 61 62 6c 65 20 50 31 20 50 32 20  eateTable P1 P2 
2d7d0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
2d7e0 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20 69 44  s: r[P2]=root iD
2d7f0 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63  b=P1.**.** Alloc
2d800 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ate a new table 
2d810 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2d820 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
2d830 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
2d840 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2d850 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
2d860 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
2d870 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
2d880 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74  * P1>1.  Write t
2d890 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
2d8a0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
2d8b0 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  able into.** reg
2d8c0 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54  ister P2.**.** T
2d8d0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2d8e0 74 77 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e  tween a table an
2d8f0 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68  d an index is th
2d900 69 73 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73  is:  A table mus
2d910 74 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79  t.** have a 4-by
2d920 74 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61  te integer key a
2d930 6e 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69  nd can have arbi
2d940 74 72 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20  trary data.  An 
2d950 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20  index.** has an 
2d960 61 72 62 69 74 72 61 72 79 20 6b 65 79 20 62 75  arbitrary key bu
2d970 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  t no data..**.**
2d980 20 53 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74   See also: Creat
2d990 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63  eIndex.*/./* Opc
2d9a0 6f 64 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78  ode: CreateIndex
2d9b0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2d9c0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2d9d0 72 6f 6f 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a  root iDb=P1.**.*
2d9e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2d9f0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61   index in the ma
2da00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2da10 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
2da20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
2da30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2da40 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
2da50 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
2da60 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
2da70 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
2da80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2da90 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
2daa0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e  .** register P2.
2dab0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d  .**.** See docum
2dac0 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43  entation on OP_C
2dad0 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61  reateTable for a
2dae0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2daf0 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
2db00 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20  P_CreateIndex:  
2db10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
2db20 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65  2 */.case OP_Cre
2db30 61 74 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20  ateTable: {     
2db40 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2db50 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e    int pgno;.  in
2db60 74 20 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70  t flags;.  Db *p
2db70 44 62 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75  Db;..  pOut = ou
2db80 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
2db90 70 4f 70 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30  pOp);.  pgno = 0
2dba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2dbb0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2dbc0 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
2dbd0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
2dbe0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
2dbf0 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73  pOp->p1) );.  as
2dc00 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2dc10 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  y==0 );.  pDb = 
2dc20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
2dc30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
2dc40 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->pBt!=0 );.  if
2dc50 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2dc60 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 7b  P_CreateTable ){
2dc70 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20  .    /* flags = 
2dc80 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f  BTREE_INTKEY; */
2dc90 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52  .    flags = BTR
2dca0 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c  EE_INTKEY;.  }el
2dcb0 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  se{.    flags = 
2dcc0 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20  BTREE_BLOBKEY;. 
2dcd0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2dce0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
2dcf0 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pDb->pBt, &pgn
2dd00 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  o, flags);.  if(
2dd10 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2dd20 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2dd30 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e   pOut->u.i = pgn
2dd40 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  o;.  break;.}../
2dd50 2a 20 4f 70 63 6f 64 65 3a 20 53 71 6c 45 78 65  * Opcode: SqlExe
2dd60 63 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a  c * * * P4 *.**.
2dd70 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
2dd80 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74  tatement or stat
2dd90 65 6d 65 6e 74 73 20 73 70 65 63 69 66 69 65 64  ements specified
2dda0 20 69 6e 20 74 68 65 20 50 34 20 73 74 72 69 6e   in the P4 strin
2ddb0 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 71  g..*/.case OP_Sq
2ddc0 6c 45 78 65 63 3a 20 7b 0a 20 20 64 62 2d 3e 6e  lExec: {.  db->n
2ddd0 53 71 6c 45 78 65 63 2b 2b 3b 0a 20 20 72 63 20  SqlExec++;.  rc 
2dde0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
2ddf0 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 30 2c  b, pOp->p4.z, 0,
2de00 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 53   0, 0);.  db->nS
2de10 71 6c 45 78 65 63 2d 2d 3b 0a 20 20 69 66 28 20  qlExec--;.  if( 
2de20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2de30 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2de40 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2de50 6f 64 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61  ode: ParseSchema
2de60 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2de70 2a 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73  ** Read and pars
2de80 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72  e all entries fr
2de90 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  om the SQLITE_MA
2dea0 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61  STER table of da
2deb0 74 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61  tabase P1.** tha
2dec0 74 20 6d 61 74 63 68 20 74 68 65 20 57 48 45 52  t match the WHER
2ded0 45 20 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a  E clause P4. .**
2dee0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2def0 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73  invokes the pars
2df00 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
2df10 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ew virtual machi
2df20 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73  ne,.** then runs
2df30 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c   the new virtual
2df40 20 6d 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73   machine.  It is
2df50 20 74 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61   thus a re-entra
2df60 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61  nt opcode..*/.ca
2df70 73 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  se OP_ParseSchem
2df80 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  a: {.  int iDb;.
2df90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2dfa0 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  aster;.  char *z
2dfb0 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20  Sql;.  InitData 
2dfc0 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20  initData;..  /* 
2dfd0 41 6e 79 20 70 72 65 70 61 72 65 64 20 73 74 61  Any prepared sta
2dfe0 74 65 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f  tement that invo
2dff0 6b 65 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20  kes this opcode 
2e000 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65  will hold mutexe
2e010 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20  s.  ** on every 
2e020 62 74 72 65 65 2e 20 20 54 68 69 73 20 69 73 20  btree.  This is 
2e030 61 20 70 72 65 72 65 71 75 69 73 69 74 65 20 66  a prerequisite f
2e040 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a  or invoking .  *
2e050 2a 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  * sqlite3InitCal
2e060 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69  lback()..  */.#i
2e070 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2e080 47 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69  G.  for(iDb=0; i
2e090 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
2e0a0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2e0b0 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65  iDb==1 || sqlite
2e0c0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2e0d0 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
2e0e0 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  t) );.  }.#endif
2e0f0 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70  ..  iDb = pOp->p
2e100 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  1;.  assert( iDb
2e110 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
2e120 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
2e130 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
2e140 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
2e150 4c 6f 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20  Loaded) );.  /* 
2e160 55 73 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e  Used to be a con
2e170 64 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20  ditional */ {.  
2e180 20 20 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54    zMaster = MAST
2e190 45 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69  ER_NAME;.    ini
2e1a0 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20  tData.db = db;. 
2e1b0 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20     initData.iDb 
2e1c0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69  = pOp->p1;.    i
2e1d0 6e 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67  nitData.pzErrMsg
2e1e0 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a   = &p->zErrMsg;.
2e1f0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2e200 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20  e3MPrintf(db,.  
2e210 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2e220 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
2e230 20 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48   FROM '%q'.%s WH
2e240 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20  ERE %s ORDER BY 
2e250 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64  rowid",.       d
2e260 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
2e270 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  Name, zMaster, p
2e280 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69  Op->p4.z);.    i
2e290 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2e2a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e2b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2e2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2e2d0 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
2e2e0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64  sy==0 );.      d
2e2f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31  b->init.busy = 1
2e300 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74 61  ;.      initData
2e310 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  .rc = SQLITE_OK;
2e320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e330 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e340 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2e350 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2e360 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69  zSql, sqlite3Ini
2e370 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74  tCallback, &init
2e380 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20  Data, 0);.      
2e390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e3a0 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74  K ) rc = initDat
2e3b0 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  a.rc;.      sqli
2e3c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2e3d0 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ql);.      db->i
2e3e0 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20  nit.busy = 0;.  
2e3f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2e400 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2e410 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
2e420 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
2e430 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e440 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
2e450 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
2e460 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62     }.    goto ab
2e470 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2e480 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20  ;.  }.  break;  
2e490 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
2e4a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
2e4b0 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a  LYZE)./* Opcode:
2e4c0 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31   LoadAnalysis P1
2e4d0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52   * * * *.**.** R
2e4e0 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ead the sqlite_s
2e4f0 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64  tat1 table for d
2e500 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c  atabase P1 and l
2e510 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  oad the content.
2e520 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
2e530 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e   into the intern
2e540 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  al index hash ta
2e550 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ble.  This will 
2e560 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61  cause.** the ana
2e570 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64  lysis to be used
2e580 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
2e590 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71  all subsequent q
2e5a0 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  ueries..*/.case 
2e5b0 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a  OP_LoadAnalysis:
2e5c0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
2e5d0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2e5e0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2e5f0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c  rc = sqlite3Anal
2e600 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70  ysisLoad(db, pOp
2e610 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20  ->p1);.  if( rc 
2e620 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2e630 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
2e640 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  ak;  .}.#endif /
2e650 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2e660 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20  E_OMIT_ANALYZE) 
2e670 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  */../* Opcode: D
2e680 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20  ropTable P1 * * 
2e690 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
2e6a0 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
2e6b0 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
2e6c0 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
2e6d0 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
2e6e0 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69  table named P4 i
2e6f0 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
2e700 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
2e710 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20  fter a table.** 
2e720 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
2e730 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
2e740 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
2e750 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
2e760 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
2e770 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
2e780 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
2e790 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
2e7a0 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
2e7b0 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
2e7c0 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c  opTable: {.  sql
2e7d0 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2e7e0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70  eteTable(db, pOp
2e7f0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
2e800 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2e810 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64   Opcode: DropInd
2e820 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  ex P1 * * P4 *.*
2e830 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2e840 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
2e850 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
2e860 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
2e870 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  be.** the index 
2e880 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61  named P4 in data
2e890 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69  base P1.  This i
2e8a0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
2e8b0 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72  n index.** is dr
2e8c0 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20  opped from disk 
2e8d0 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72  (using the Destr
2e8e0 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e  oy opcode).** in
2e8f0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
2e900 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2e910 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2e920 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2e930 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2e940 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2e950 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65  case OP_DropInde
2e960 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e  x: {.  sqlite3Un
2e970 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2e980 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ex(db, pOp->p1, 
2e990 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
2e9a0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2e9b0 65 3a 20 44 72 6f 70 54 72 69 67 67 65 72 20 50  e: DropTrigger P
2e9c0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2e9d0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
2e9e0 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
2e9f0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2ea00 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
2ea10 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  * the trigger na
2ea20 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
2ea30 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
2ea40 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74  called after a t
2ea50 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f  rigger.** is dro
2ea60 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28  pped from disk (
2ea70 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f  using the Destro
2ea80 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64  y opcode) in ord
2ea90 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74  er to keep .** t
2eaa0 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2eab0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2eac0 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2ead0 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2eae0 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2eaf0 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69 67  case OP_DropTrig
2eb00 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ger: {.  sqlite3
2eb10 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
2eb20 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e  rigger(db, pOp->
2eb30 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2eb40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
2eb50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2eb60 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2eb70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
2eb80 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50 33  grityCk P1 P2 P3
2eb90 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20   P4 P5.**.** Do 
2eba0 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  an analysis of t
2ebb0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
2ebc0 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f  n database.  Sto
2ebd0 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  re in.** registe
2ebe0 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66  r P1 the text of
2ebf0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2ec00 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79  e describing any
2ec10 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66   problems..** If
2ec20 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65   no problems are
2ec30 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20   found, store a 
2ec40 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72  NULL in register
2ec50 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   P1..**.** The r
2ec60 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
2ec70 69 6e 73 20 6f 6e 65 20 6c 65 73 73 20 74 68 61  ins one less tha
2ec80 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  n the maximum nu
2ec90 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20  mber of allowed 
2eca0 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f  errors..** At mo
2ecb0 73 74 20 72 65 67 28 50 33 29 20 65 72 72 6f 72  st reg(P3) error
2ecc0 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
2ecd0 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  ed..** In other 
2ece0 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79  words, the analy
2ecf0 73 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f  sis stops as soo
2ed00 6e 20 61 73 20 72 65 67 28 50 31 29 20 65 72 72  n as reg(P1) err
2ed10 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e  ors are .** seen
2ed20 2e 20 20 52 65 67 28 50 31 29 20 69 73 20 75 70  .  Reg(P1) is up
2ed30 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  dated with the n
2ed40 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2ed50 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  remaining..**.**
2ed60 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
2ed70 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61  umbers of all ta
2ed80 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  bles in the data
2ed90 62 61 73 65 20 61 72 65 20 69 6e 74 65 67 65 72  base are integer
2eda0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50  s.** stored in P
2edb0 34 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75 6d  4_INTARRAY argum
2edc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  ent..**.** If P5
2edd0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
2ede0 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20  e check is done 
2edf0 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  on the auxiliary
2ee00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2ee10 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20  e, not the main 
2ee20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2ee30 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2ee40 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
2ee50 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72  ement the integr
2ee60 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61  ity_check pragma
2ee70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74  ..*/.case OP_Int
2ee80 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e  egrityCk: {.  in
2ee90 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a  t nRoot;      /*
2eea0 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   Number of table
2eeb0 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75  s to check.  (Nu
2eec0 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67  mber of root pag
2eed0 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  es.) */.  int *a
2eee0 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72  Root;     /* Arr
2eef0 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e  ay of rootpage n
2ef00 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65  umbers for table
2ef10 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20  s to be checked 
2ef20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20  */.  int nErr;  
2ef30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ef40 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65  f errors reporte
2ef50 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  d */.  char *z; 
2ef60 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2ef70 66 20 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f  f the error repo
2ef80 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45  rt */.  Mem *pnE
2ef90 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  rr;     /* Regis
2efa0 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63  ter keeping trac
2efb0 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61  k of errors rema
2efc0 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  ining */..  asse
2efd0 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
2efe0 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f   );.  nRoot = pO
2eff0 70 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20 3d  p->p2;.  aRoot =
2f000 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 61   pOp->p4.ai;.  a
2f010 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29  ssert( nRoot>0 )
2f020 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f 6f  ;.  assert( aRoo
2f030 74 5b 6e 52 6f 6f 74 5d 3d 3d 30 20 29 3b 0a 20  t[nRoot]==0 );. 
2f040 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2f050 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
2f060 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
2f070 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45  Cursor) );.  pnE
2f080 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  rr = &aMem[pOp->
2f090 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p3];.  assert( (
2f0a0 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d  pnErr->flags & M
2f0b0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
2f0c0 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e  assert( (pnErr->
2f0d0 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
2f0e0 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29  |MEM_Blob))==0 )
2f0f0 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
2f100 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2f110 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d  ert( pOp->p5<db-
2f120 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
2f130 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2f140 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2f150 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  p5) );.  z = sql
2f160 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
2f170 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b  tyCheck(db->aDb[
2f180 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52  pOp->p5].pBt, aR
2f190 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20  oot, nRoot,.    
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2f1c0 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2b 31 2c 20  t)pnErr->u.i+1, 
2f1d0 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &nErr);.  sqlite
2f1e0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2f1f0 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72  pIn1);.  if( nEr
2f200 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  r==0 ){.    asse
2f210 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65  rt( z==0 );.  }e
2f220 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  lse if( z==0 ){.
2f230 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
2f240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 6e  .  }else{.    pn
2f250 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72  Err->u.i -= nErr
2f260 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -1;.    sqlite3V
2f270 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e  dbeMemSetStr(pIn
2f280 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
2f290 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
2f2a0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  ree);.  }.  UPDA
2f2b0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
2f2c0 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
2f2d0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
2f2e0 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  ng(pIn1, encodin
2f2f0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
2f300 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2f310 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2f320 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  HECK */../* Opco
2f330 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31  de: RowSetAdd P1
2f340 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
2f350 6f 70 73 69 73 3a 20 72 6f 77 73 65 74 28 50 31  opsis: rowset(P1
2f360 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e  )=r[P2].**.** In
2f370 73 65 72 74 20 74 68 65 20 69 6e 74 65 67 65 72  sert the integer
2f380 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72   value held by r
2f390 65 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20  egister P2 into 
2f3a0 61 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 0a  a boolean index.
2f3b0 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73  ** held in regis
2f3c0 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ter P1..**.** An
2f3d0 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
2f3e0 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e   if P2 is not an
2f3f0 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73   integer..*/.cas
2f400 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20  e OP_RowSetAdd: 
2f410 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20  {       /* in1, 
2f420 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in2 */.  pIn1 = 
2f430 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2f440 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
2f450 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
2f460 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20  t( (pIn2->flags 
2f470 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
2f480 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
2f490 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
2f4a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
2f4b0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
2f4c0 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
2f4d0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
2f4e0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
2f4f0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
2f500 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77    }.  sqlite3Row
2f510 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
2f520 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d  u.pRowSet, pIn2-
2f530 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  >u.i);.  break;.
2f540 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
2f550 77 53 65 74 52 65 61 64 20 50 31 20 50 32 20 50  wSetRead P1 P2 P
2f560 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
2f570 73 3a 20 72 5b 50 33 5d 3d 72 6f 77 73 65 74 28  s: r[P3]=rowset(
2f580 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63  P1).**.** Extrac
2f590 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76  t the smallest v
2f5a0 61 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c 65 61  alue from boolea
2f5b0 6e 20 69 6e 64 65 78 20 50 31 20 61 6e 64 20 70  n index P1 and p
2f5c0 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  ut that value in
2f5d0 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  to.** register P
2f5e0 33 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f 6c 65  3.  Or, if boole
2f5f0 61 6e 20 69 6e 64 65 78 20 50 31 20 69 73 20 69  an index P1 is i
2f600 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20  nitially empty, 
2f610 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68  leave P3.** unch
2f620 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74  anged and jump t
2f630 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
2f640 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77  ..*/.case OP_Row
2f650 53 65 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20  SetRead: {      
2f660 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f   /* jump, in1, o
2f670 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c  ut3 */.  i64 val
2f680 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
2f690 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
2f6a0 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
2f6b0 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
2f6c0 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f  .   || sqlite3Ro
2f6d0 77 53 65 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75  wSetNext(pIn1->u
2f6e0 2e 70 52 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d  .pRowSet, &val)=
2f6f0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  =0.  ){.    /* T
2f700 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78  he boolean index
2f710 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20   is empty */.   
2f720 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2f730 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20  etNull(pIn1);.  
2f740 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
2f750 6e 28 31 2c 32 29 3b 0a 20 20 20 20 67 6f 74 6f  n(1,2);.    goto
2f760 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f   jump_to_p2_and_
2f770 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72  check_for_interr
2f780 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  upt;.  }else{.  
2f790 20 20 2f 2a 20 41 20 76 61 6c 75 65 20 77 61 73    /* A value was
2f7a0 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
2f7b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 56 64   index */.    Vd
2f7c0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c  beBranchTaken(0,
2f7d0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
2f7e0 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26  dbeMemSetInt64(&
2f7f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76  aMem[pOp->p3], v
2f800 61 6c 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  al);.  }.  goto 
2f810 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72  check_for_interr
2f820 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  upt;.}../* Opcod
2f830 65 3a 20 52 6f 77 53 65 74 54 65 73 74 20 50 31  e: RowSetTest P1
2f840 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e   P2 P3 P4.** Syn
2f850 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 20  opsis: if r[P3] 
2f860 69 6e 20 72 6f 77 73 65 74 28 50 31 29 20 67 6f  in rowset(P1) go
2f870 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69  to P2.**.** Regi
2f880 73 74 65 72 20 50 33 20 69 73 20 61 73 73 75 6d  ster P3 is assum
2f890 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d  ed to hold a 64-
2f8a0 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
2f8b0 65 2e 20 49 66 20 72 65 67 69 73 74 65 72 20 50  e. If register P
2f8c0 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  1.** contains a 
2f8d0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e  RowSet object an
2f8e0 64 20 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62  d that RowSet ob
2f8f0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ject contains.**
2f900 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20   the value held 
2f910 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72  in P3, jump to r
2f920 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65  egister P2. Othe
2f930 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68  rwise, insert th
2f940 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20  e.** integer in 
2f950 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  P3 into the RowS
2f960 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  et and continue 
2f970 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78  on to the.** nex
2f980 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  t opcode..**.** 
2f990 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  The RowSet objec
2f9a0 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  t is optimized f
2f9b0 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
2f9c0 65 20 73 75 63 63 65 73 73 69 76 65 20 73 65 74  e successive set
2f9d0 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73  s.** of integers
2f9e0 2c 20 77 68 65 72 65 20 65 61 63 68 20 73 65 74  , where each set
2f9f0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70   contains no dup
2fa00 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20 73 65  licates. Each se
2fa10 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20 69  t.** of values i
2fa20 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2fa30 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75  a unique P4 valu
2fa40 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65 74  e. The first set
2fa50 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34  .** must have P4
2fa60 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73  ==0, the final s
2fa70 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d 75  et P4=-1.  P4 mu
2fa80 73 74 20 62 65 20 65 69 74 68 65 72 20 2d 31 20  st be either -1 
2fa90 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74 69  or.** non-negati
2faa0 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65 67  ve.  For non-neg
2fab0 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f 66 20  ative values of 
2fac0 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77 65  P4 only the lowe
2fad0 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72 65 20  r 4.** bits are 
2fae0 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a  significant..**.
2faf0 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f  ** This allows o
2fb00 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61  ptimizations: (a
2fb10 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65  ) when P4==0 the
2fb20 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2fb30 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f 77   test.** the row
2fb40 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50  set object for P
2fb50 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61 72  3, as it is guar
2fb60 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f  anteed not to co
2fb70 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29  ntain it,.** (b)
2fb80 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65   when P4==-1 the
2fb90 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2fba0 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75   insert the valu
2fbb0 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a  e, as it will.**
2fbc0 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65 64   never be tested
2fbd0 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68   for, and (c) wh
2fbe0 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  en a value that 
2fbf0 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  is part of set X
2fc00 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c   is.** inserted,
2fc10 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2fc20 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73  d to search to s
2fc30 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20 76  ee if the same v
2fc40 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  alue was.** prev
2fc50 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20  iously inserted 
2fc60 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  as part of set X
2fc70 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73   (only if it was
2fc80 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69   previously.** i
2fc90 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20  nserted as part 
2fca0 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65  of some other se
2fcb0 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  t)..*/.case OP_R
2fcc0 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20  owSetTest: {    
2fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fce0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69   /* jump, in1, i
2fcf0 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74  n3 */.  int iSet
2fd00 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a  ;.  int exists;.
2fd10 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
2fd20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
2fd30 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
2fd40 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d  ];.  iSet = pOp-
2fd50 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28  >p4.i;.  assert(
2fd60 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
2fd70 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  _Int );..  /* If
2fd80 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
2fd90 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
2fda0 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e  rowset object in
2fdb0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c   memory cell P1,
2fdc0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20  .  ** delete it 
2fdd0 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  now and initiali
2fde0 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d  ze P1 with an em
2fdf0 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a  pty rowset.  */.
2fe00 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
2fe10 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
2fe20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2fe30 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53  e3VdbeMemSetRowS
2fe40 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66  et(pIn1);.    if
2fe50 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
2fe60 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
2fe70 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
2fe80 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
2fe90 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
2fea0 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
2feb0 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53 65   iSet==-1 || iSe
2fec0 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53  t>=0 );.  if( iS
2fed0 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74 73  et ){.    exists
2fee0 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74   = sqlite3RowSet
2fef0 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Test(pIn1->u.pRo
2ff00 77 53 65 74 2c 20 69 53 65 74 2c 20 70 49 6e 33  wSet, iSet, pIn3
2ff10 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 56 64 62 65  ->u.i);.    Vdbe
2ff20 42 72 61 6e 63 68 54 61 6b 65 6e 28 65 78 69 73  BranchTaken(exis
2ff30 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66  ts!=0,2);.    if
2ff40 28 20 65 78 69 73 74 73 20 29 20 67 6f 74 6f 20  ( exists ) goto 
2ff50 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
2ff60 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b    if( iSet>=0 ){
2ff70 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53  .    sqlite3RowS
2ff80 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75  etInsert(pIn1->u
2ff90 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d 3e  .pRowSet, pIn3->
2ffa0 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  u.i);.  }.  brea
2ffb0 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
2ffc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
2ffd0 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  ER../* Opcode: P
2ffe0 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33 20  rogram P1 P2 P3 
2fff0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63  P4 P5.**.** Exec
30000 75 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20  ute the trigger 
30010 70 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20 61  program passed a
30020 73 20 50 34 20 28 74 79 70 65 20 50 34 5f 53 55  s P4 (type P4_SU
30030 42 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a  BPROGRAM). .**.*
30040 2a 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74 68  * P1 contains th
30050 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
30060 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
30070 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
30080 69 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  irst memory .** 
30090 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
300a0 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20   of values used 
300b0 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  as arguments to 
300c0 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e  the sub-program.
300d0 20 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73   P2 .** contains
300e0 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f 20   the address to 
300f0 6a 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20 73  jump to if the s
30100 75 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f 77  ub-program throw
30110 73 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20  s an IGNORE .** 
30120 65 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67 20  exception using 
30130 74 68 65 20 52 41 49 53 45 28 29 20 66 75 6e 63  the RAISE() func
30140 74 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20 50  tion. Register P
30150 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  3 contains the a
30160 64 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20  ddress .** of a 
30170 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
30180 68 69 73 20 28 74 68 65 20 70 61 72 65 6e 74 29  his (the parent)
30190 20 56 4d 20 74 68 61 74 20 69 73 20 75 73 65 64   VM that is used
301a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
301b0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75   .** memory requ
301c0 69 72 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  ired by the sub-
301d0 76 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65 2e  vdbe at runtime.
301e0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
301f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 4d  ointer to the VM
30200 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
30210 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
30220 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
30230 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72  non-zero, then r
30240 65 63 75 72 73 69 76 65 20 70 72 6f 67 72 61 6d  ecursive program
30250 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73 20 65   invocation is e
30260 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  nabled..*/.case 
30270 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20  OP_Program: {   
30280 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
30290 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
302a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
302b0 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  ber of memory re
302c0 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d  gisters for sub-
302d0 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
302e0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
302f0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
30300 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72   runtime space r
30310 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d  equired for sub-
30320 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d  program */.  Mem
30330 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20 20   *pRt;          
30340 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
30350 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e   to allocate run
30360 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  time space */.  
30370 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20  Mem *pMem;      
30380 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
30390 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
303a0 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  gh memory cells 
303b0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20  */.  Mem *pEnd; 
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
303d0 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  Last memory cell
303e0 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f   in new array */
303f0 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
30400 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65  rame;      /* Ne
30410 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20  w vdbe frame to 
30420 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20  execute in */.  
30430 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f  SubProgram *pPro
30440 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70  gram;   /* Sub-p
30450 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
30460 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20  e */.  void *t; 
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30480 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79  * Token identify
30490 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  ing trigger */..
304a0 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70    pProgram = pOp
304b0 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
304c0 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70   pRt = &aMem[pOp
304d0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
304e0 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30   pProgram->nOp>0
304f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74   );.  .  /* If t
30500 68 65 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c  he p5 flag is cl
30510 65 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73  ear, then recurs
30520 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ive invocation o
30530 66 20 74 72 69 67 67 65 72 73 20 69 73 20 0a 20  f triggers is . 
30540 20 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72   ** disabled for
30550 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
30560 74 69 62 69 6c 69 74 79 20 28 70 35 20 69 73 20  tibility (p5 is 
30570 73 65 74 20 69 66 20 74 68 69 73 20 73 75 62 2d  set if this sub-
30580 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20  program.  ** is 
30590 72 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72  really a trigger
305a0 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20  , not a foreign 
305b0 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20  key action, and 
305c0 74 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a  the flag set.  *
305d0 2a 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  * and cleared by
305e0 20 74 68 65 20 22 50 52 41 47 4d 41 20 72 65 63   the "PRAGMA rec
305f0 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22  ursive_triggers"
30600 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61   command is clea
30610 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  r)..  ** .  ** I
30620 74 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  t is recursive i
30630 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
30640 67 67 65 72 73 2c 20 61 74 20 74 68 65 20 53 51  ggers, at the SQ
30650 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73  L level, that is
30660 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e   .  ** disabled.
30670 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61   In some cases a
30680 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
30690 6d 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72  may generate mor
306a0 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a  e than one .  **
306b0 20 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20   SubProgram (if 
306c0 74 68 65 20 74 72 69 67 67 65 72 20 6d 61 79 20  the trigger may 
306d0 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
306e0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
306f0 69 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f  ifferent .  ** O
30700 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72  N CONFLICT algor
30710 69 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61  ithm). SubProgra
30720 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  m structures ass
30730 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 0a 20  ociated with a. 
30740 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67   ** single trigg
30750 65 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20  er all have the 
30760 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74  same value for t
30770 68 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f  he SubProgram.to
30780 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62  ken .  ** variab
30790 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  le.  */.  if( pO
307a0 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d  p->p5 ){.    t =
307b0 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e   pProgram->token
307c0 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
307d0 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
307e0 6d 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f  me && pFrame->to
307f0 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70  ken!=t; pFrame=p
30800 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
30810 0a 20 20 20 20 69 66 28 20 70 46 72 61 6d 65 20  .    if( pFrame 
30820 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
30830 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64  if( p->nFrame>=d
30840 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
30850 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
30860 45 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20  EPTH] ){.    rc 
30870 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
30880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
30890 72 72 6f 72 28 70 2c 20 22 74 6f 6f 20 6d 61 6e  rror(p, "too man
308a0 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67  y levels of trig
308b0 67 65 72 20 72 65 63 75 72 73 69 6f 6e 22 29 3b  ger recursion");
308c0 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
308d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
308e0 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
308f0 20 70 52 74 20 69 73 20 75 73 65 64 20 74 6f 20   pRt is used to 
30900 73 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  store the memory
30910 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61 76   required to sav
30920 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
30930 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
30940 70 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68 65  program, and the
30950 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
30960 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 65   at runtime to e
30970 78 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65 20  xecute.  ** the 
30980 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
30990 20 49 66 20 74 68 69 73 20 74 72 69 67 67 65 72   If this trigger
309a0 20 68 61 73 20 62 65 65 6e 20 66 69 72 65 64 20   has been fired 
309b0 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52 74  before, then pRt
309c0 20 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64   .  ** is alread
309d0 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74 68  y allocated. Oth
309e0 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20  erwise, it must 
309f0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
30a00 20 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d 3e   */.  if( (pRt->
30a10 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65 29  flags&MEM_Frame)
30a20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 75  ==0 ){.    /* Su
30a30 62 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69 73  bProgram.nMem is
30a40 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
30a50 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
30a60 6c 73 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  ls used by the .
30a70 20 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20 73      ** program s
30a80 74 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f 67  tored in SubProg
30a90 72 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c 6c  ram.aOp. As well
30aa0 20 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20 6d   as these, one m
30ab0 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65 6c  emory.    ** cel
30ac0 6c 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  l is required fo
30ad0 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 75 73  r each cursor us
30ae0 65 64 20 62 79 20 74 68 65 20 70 72 6f 67 72 61  ed by the progra
30af0 6d 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20 20  m. Set local.   
30b00 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d 65   ** variable nMe
30b10 6d 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56 64  m (and later, Vd
30b20 62 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d 65  beFrame.nChildMe
30b30 6d 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  m) to this value
30b40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d 65  ..    */.    nMe
30b50 6d 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d  m = pProgram->nM
30b60 65 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  em + pProgram->n
30b70 43 73 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Csr;.    assert(
30b80 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 69   nMem>0 );.    i
30b90 66 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  f( pProgram->nCs
30ba0 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b 2b 3b 0a 20  r==0 ) nMem++;. 
30bb0 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
30bc0 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61  8(sizeof(VdbeFra
30bd0 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  me)).           
30be0 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65     + nMem * size
30bf0 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20  of(Mem).        
30c00 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d        + pProgram
30c10 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28  ->nCsr * sizeof(
30c20 56 64 62 65 43 75 72 73 6f 72 20 2a 29 3b 0a 20  VdbeCursor *);. 
30c30 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69     pFrame = sqli
30c40 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
30c50 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
30c60 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20  if( !pFrame ){. 
30c70 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
30c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
30c90 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
30ca0 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d  e(pRt);.    pRt-
30cb0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61  >flags = MEM_Fra
30cc0 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70  me;.    pRt->u.p
30cd0 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
30ce0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d  .    pFrame->v =
30cf0 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e   p;.    pFrame->
30d00 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d  nChildMem = nMem
30d10 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
30d20 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72  hildCsr = pProgr
30d30 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46  am->nCsr;.    pF
30d40 72 61 6d 65 2d 3e 70 63 20 3d 20 28 69 6e 74 29  rame->pc = (int)
30d50 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
30d60 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20   pFrame->aMem = 
30d70 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->aMem;.    pFr
30d80 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e  ame->nMem = p->n
30d90 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
30da0 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73  >apCsr = p->apCs
30db0 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  r;.    pFrame->n
30dc0 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72  Cursor = p->nCur
30dd0 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  sor;.    pFrame-
30de0 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  >aOp = p->aOp;. 
30df0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d     pFrame->nOp =
30e00 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72   p->nOp;.    pFr
30e10 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72  ame->token = pPr
30e20 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69  ogram->token;.#i
30e30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30e40 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
30e50 55 53 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  US.    pFrame->a
30e60 6e 45 78 65 63 20 3d 20 70 2d 3e 61 6e 45 78 65  nExec = p->anExe
30e70 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70  c;.#endif..    p
30e80 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65  End = &VdbeFrame
30e90 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61  Mem(pFrame)[pFra
30ea0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  me->nChildMem];.
30eb0 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62      for(pMem=Vdb
30ec0 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
30ed0 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70  ); pMem!=pEnd; p
30ee0 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d  Mem++){.      pM
30ef0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
30f00 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20  Undefined;.     
30f10 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a   pMem->db = db;.
30f20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
30f30 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d     pFrame = pRt-
30f40 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61  >u.pFrame;.    a
30f50 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
30f60 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e  >nMem+pProgram->
30f70 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43  nCsr==pFrame->nC
30f80 68 69 6c 64 4d 65 6d 20 0a 20 20 20 20 20 20 20  hildMem .       
30f90 20 7c 7c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e   || (pProgram->n
30fa0 43 73 72 3d 3d 30 20 26 26 20 70 50 72 6f 67 72  Csr==0 && pProgr
30fb0 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61  am->nMem+1==pFra
30fc0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 20 29  me->nChildMem) )
30fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30fe0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46  rogram->nCsr==pF
30ff0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20  rame->nChildCsr 
31000 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
31010 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3d  int)(pOp - aOp)=
31020 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a 20  =pFrame->pc );. 
31030 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 2b   }..  p->nFrame+
31040 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  +;.  pFrame->pPa
31050 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d 65  rent = p->pFrame
31060 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  ;.  pFrame->last
31070 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
31080 52 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d  Rowid;.  pFrame-
31090 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43  >nChange = p->nC
310a0 68 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d 65 2d  hange;.  pFrame-
310b0 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20 70 2d 3e  >nDbChange = p->
310c0 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 61  db->nChange;.  a
310d0 73 73 65 72 74 28 20 70 46 72 61 6d 65 2d 3e 70  ssert( pFrame->p
310e0 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  AuxData==0 );.  
310f0 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
31100 20 3d 20 70 2d 3e 70 41 75 78 44 61 74 61 3b 0a   = p->pAuxData;.
31110 20 20 70 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    p->pAuxData = 
31120 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  0;.  p->nChange 
31130 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d 65  = 0;.  p->pFrame
31140 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d 3e   = pFrame;.  p->
31150 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 56 64  aMem = aMem = Vd
31160 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d  beFrameMem(pFram
31170 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  e);.  p->nMem = 
31180 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
31190 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  m;.  p->nCursor 
311a0 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e  = (u16)pFrame->n
311b0 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61  ChildCsr;.  p->a
311c0 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
311d0 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
311e0 4d 65 6d 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  Mem];.  p->aOp =
311f0 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d   aOp = pProgram-
31200 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d  >aOp;.  p->nOp =
31210 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a   pProgram->nOp;.
31220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
31230 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
31240 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63  ATUS.  p->anExec
31250 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
31260 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a 0a  Op = &aOp[-1];..
31270 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
31280 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20  pcode: Param P1 
31290 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
312a0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  his opcode is on
312b0 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20  ly ever present 
312c0 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  in sub-programs 
312d0 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a  called via the .
312e0 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ** OP_Program in
312f0 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20  struction. Copy 
31300 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  a value currentl
31310 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65  y stored in a me
31320 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66  mory .** cell of
31330 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61   the calling (pa
31340 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63  rent) frame to c
31350 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75  ell P2 in the cu
31360 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a  rrent frames .**
31370 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
31380 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
31390 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
313a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e   to access the n
313b0 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64  ew.* .** and old
313c0 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  .* values..**.**
313d0 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
313e0 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
313f0 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20  parent frame is 
31400 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64  determined by ad
31410 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ding.** the valu
31420 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
31430 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75  ment to the valu
31440 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
31450 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ment to the.** c
31460 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
31470 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  m instruction..*
31480 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a  /.case OP_Param:
31490 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
314a0 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 46 72  out2 */.  VdbeFr
314b0 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d  ame *pFrame;.  M
314c0 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74 20  em *pIn;.  pOut 
314d0 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
314e0 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72 61  (p, pOp);.  pFra
314f0 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
31500 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d    pIn = &pFrame-
31510 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20  >aMem[pOp->p1 + 
31520 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61  pFrame->aOp[pFra
31530 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a  me->pc].p1];   .
31540 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
31550 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
31560 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d  , pIn, MEM_Ephem
31570 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  );.  break;.}..#
31580 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
31590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
315a0 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GGER */..#ifndef
315b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
315c0 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f  EIGN_KEY./* Opco
315d0 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31  de: FkCounter P1
315e0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
315f0 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b 50 31 5d  opsis: fkctr[P1]
31600 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  +=P2.**.** Incre
31610 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69  ment a "constrai
31620 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50  nt counter" by P
31630 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67  2 (P2 may be neg
31640 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76  ative or positiv
31650 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  e)..** If P1 is 
31660 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61  non-zero, the da
31670 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
31680 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
31690 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65  remented .** (de
316a0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
316b0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e  ey constraints).
316c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50   Otherwise, if P
316d0 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a  1 is zero, the .
316e0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75  ** statement cou
316f0 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
31700 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ted (immediate f
31710 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
31720 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65  raints)..*/.case
31730 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b   OP_FkCounter: {
31740 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
31750 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46   & SQLITE_DeferF
31760 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  Ks ){.    db->nD
31770 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 2b  eferredImmCons +
31780 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c  = pOp->p2;.  }el
31790 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  se if( pOp->p1 )
317a0 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
317b0 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e  redCons += pOp->
317c0 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p2;.  }else{.   
317d0 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
317e0 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  t += pOp->p2;.  
317f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
31800 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72   Opcode: FkIfZer
31810 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  o P1 P2 * * *.**
31820 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 66 6b   Synopsis: if fk
31830 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f 20  ctr[P1]==0 goto 
31840 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P2.**.** This op
31850 63 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20  code tests if a 
31860 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
31870 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
31880 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f  s currently zero
31890 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70  ..** If so, jump
318a0 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
318b0 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  P2. Otherwise, f
318c0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
318d0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74  he next .** inst
318e0 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ruction..**.** I
318f0 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
31900 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20  , then the jump 
31910 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
31920 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
31930 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69  int-counter.** i
31940 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20  s zero (the one 
31950 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65  that counts defe
31960 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
31970 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20  violations). If 
31980 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74  P1 is.** zero, t
31990 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
319a0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
319b0 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75  t constraint-cou
319c0 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  nter is zero.** 
319d0 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
319e0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
319f0 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a  t violations)..*
31a00 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65  /.case OP_FkIfZe
31a10 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  ro: {         /*
31a20 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70   jump */.  if( p
31a30 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56 64  Op->p1 ){.    Vd
31a40 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 64 62  beBranchTaken(db
31a50 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d  ->nDeferredCons=
31a60 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  =0 && db->nDefer
31a70 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32  redImmCons==0, 2
31a80 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  );.    if( db->n
31a90 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20  DeferredCons==0 
31aa0 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
31ab0 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
31ac0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
31ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
31ae0 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e 46  ranchTaken(p->nF
31af0 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26  kConstraint==0 &
31b00 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
31b10 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20  mmCons==0, 2);. 
31b20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e     if( p->nFkCon
31b30 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62  straint==0 && db
31b40 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
31b50 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  ns==0 ) goto jum
31b60 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
31b70 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
31b80 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
31b90 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
31ba0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
31bb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
31bc0 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64  CREMENT./* Opcod
31bd0 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20  e: MemMax P1 P2 
31be0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
31bf0 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b 50  s: r[P1]=max(r[P
31c00 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  1],r[P2]).**.** 
31c10 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P1 is a register
31c20 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
31c30 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74  me of this VM (t
31c40 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73  he root frame is
31c50 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72  .** different fr
31c60 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  om the current f
31c70 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73  rame if this ins
31c80 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  truction is bein
31c90 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69  g executed.** wi
31ca0 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72  thin a sub-progr
31cb0 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c  am). Set the val
31cc0 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
31cd0 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  1 to the maximum
31ce0 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72   of .** its curr
31cf0 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ent value and th
31d00 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
31d10 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
31d20 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
31d30 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
31d40 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
31d50 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
31d60 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
31d70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
31d80 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
31d90 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46 72   in2 */.  VdbeFr
31da0 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
31db0 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
31dc0 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
31dd0 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
31de0 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
31df0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
31e00 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  t);.    pIn1 = &
31e10 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
31e20 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->p1];.  }else{.
31e30 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d      pIn1 = &aMem
31e40 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20  [pOp->p1];.  }. 
31e50 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
31e60 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73  lid(pIn1) );.  s
31e70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
31e80 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
31e90 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
31ea0 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
31eb0 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
31ec0 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20  fy(pIn2);.  if( 
31ed0 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e  pIn1->u.i<pIn2->
31ee0 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e  u.i){.    pIn1->
31ef0 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b  u.i = pIn2->u.i;
31f00 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
31f10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31f20 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
31f30 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ENT */../* Opcod
31f40 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 50  e: IfPos P1 P2 P
31f50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
31f60 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68  s: if r[P1]>0 th
31f70 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f  en r[P1]-=P3, go
31f80 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69  to P2.**.** Regi
31f90 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
31fa0 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
31fb0 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
31fc0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
31fd0 69 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c  is 1 or greater,
31fe0 20 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f   subtract P3 fro
31ff0 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  m the.** value i
32000 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70 20 74 6f  n P1 and jump to
32010 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
32020 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
32030 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
32040 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74  s less than 1, t
32050 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  hen the.** value
32060 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
32070 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65 73  d control passes
32080 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
32090 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
320a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50  ..*/.case OP_IfP
320b0 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  os: {        /* 
320c0 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
320d0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
320e0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
320f0 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
32100 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61  Int );.  VdbeBra
32110 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d 3e  nchTaken( pIn1->
32120 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66 28  u.i>0, 2);.  if(
32130 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a   pIn1->u.i>0 ){.
32140 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d      pIn1->u.i -=
32150 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f   pOp->p3;.    go
32160 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
32170 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
32180 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74  * Opcode: Offset
32190 4c 69 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a  Limit P1 P2 P3 *
321a0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
321b0 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20  if r[P1]>0 then 
321c0 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28  r[P2]=r[P1]+max(
321d0 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20 72 5b  0,r[P3]) else r[
321e0 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54  P2]=(-1).**.** T
321f0 68 69 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  his opcode perfo
32200 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75  rms a commonly u
32210 73 65 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  sed computation 
32220 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
32230 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ** LIMIT and OFF
32240 53 45 54 20 70 72 6f 63 65 73 73 2e 20 20 72 5b  SET process.  r[
32250 50 31 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c 69  P1] holds the li
32260 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20 20 72 5b  mit counter.  r[
32270 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65  P3].** holds the
32280 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 2e   offset counter.
32290 20 20 54 68 65 20 6f 70 63 6f 64 65 20 63 6f 6d    The opcode com
322a0 70 75 74 65 73 20 74 68 65 20 63 6f 6d 62 69 6e  putes the combin
322b0 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  ed value.** of t
322c0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
322d0 53 45 54 20 61 6e 64 20 73 74 6f 72 65 73 20 74  SET and stores t
322e0 68 61 74 20 76 61 6c 75 65 20 69 6e 20 72 5b 50  hat value in r[P
322f0 32 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a 2a  2].  The r[P2].*
32300 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75 74 65 64  * value computed
32310 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
32320 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
32330 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
32340 65 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 6e 20  e.** visited in 
32350 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
32360 65 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a  e the query..**.
32370 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69 73 20 7a  ** If r[P3] is z
32380 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
32390 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
323a0 65 20 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a 2a  e is no OFFSET.*
323b0 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73  * and r[P2] is s
323c0 65 74 20 74 6f 20 62 65 20 74 68 65 20 76 61 6c  et to be the val
323d0 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 2c  ue of the LIMIT,
323e0 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66   r[P1]..**.** if
323f0 20 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20 6f   r[P1] is zero o
32400 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74  r negative, that
32410 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
32420 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64 20  no LIMIT.** and 
32430 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20  r[P2] is set to 
32440 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -1. .**.** Other
32450 77 69 73 65 2c 20 72 5b 50 32 5d 20 69 73 20 73  wise, r[P2] is s
32460 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
32470 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33 5d   r[P1] and r[P3]
32480 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66  ..*/.case OP_Off
32490 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20 2f  setLimit: {    /
324a0 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e 33  * in1, out2, in3
324b0 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20 70   */.  i64 x;.  p
324c0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
324d0 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
324e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
324f0 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
32500 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
32510 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
32520 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
32530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
32540 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
32550 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e 31  nt );.  x = pIn1
32560 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c 3d  ->u.i;.  if( x<=
32570 30 20 7c 7c 20 73 71 6c 69 74 65 33 41 64 64 49  0 || sqlite3AddI
32580 6e 74 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e 75  nt64(&x, pIn3->u
32590 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30  .i>0?pIn3->u.i:0
325a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
325b0 68 65 20 4c 49 4d 49 54 20 69 73 20 6c 65 73 73  he LIMIT is less
325c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
325d0 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72  o zero, loop for
325e0 65 76 65 72 2e 20 20 54 68 69 73 0a 20 20 20 20  ever.  This.    
325f0 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74 65 64  ** is documented
32600 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20 69 66 20  .  But also, if 
32610 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  the LIMIT+OFFSET
32620 20 65 78 63 65 65 64 73 20 32 5e 36 33 20 74 68   exceeds 2^63 th
32630 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6c  en.    ** also l
32640 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68  oop forever.  Th
32650 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  is is undocument
32660 65 64 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f 6e  ed.  In fact, on
32670 65 20 63 6f 75 6c 64 20 61 72 67 75 65 0a 20 20  e could argue.  
32680 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 6f    ** that the lo
32690 6f 70 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e  op should termin
326a0 61 74 65 2e 20 20 42 75 74 20 61 73 73 75 6d 69  ate.  But assumi
326b0 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74 65  ng 1 billion ite
326c0 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 70  rations.    ** p
326d0 65 72 20 73 65 63 6f 6e 64 20 28 66 61 72 20 65  er second (far e
326e0 78 63 65 65 64 69 6e 67 20 74 68 65 20 63 61 70  xceeding the cap
326f0 61 62 69 6c 69 74 69 65 73 20 6f 66 20 61 6e 79  abilities of any
32700 20 63 75 72 72 65 6e 74 20 68 61 72 64 77 61 72   current hardwar
32710 65 29 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  e).    ** it wou
32720 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c 79 20 33  ld take nearly 3
32730 30 30 20 79 65 61 72 73 20 74 6f 20 61 63 74 75  00 years to actu
32740 61 6c 6c 79 20 72 65 61 63 68 20 74 68 65 20 6c  ally reach the l
32750 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  imit.  So.    **
32760 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65 72   looping forever
32770 20 69 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65   is a reasonable
32780 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e 20   approximation. 
32790 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  */.    pOut->u.i
327a0 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
327b0 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
327c0 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  x;.  }.  break;.
327d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
327e0 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20 2a 20  NotZero P1 P2 * 
327f0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
32800 20 69 66 20 72 5b 50 31 5d 21 3d 30 20 74 68 65   if r[P1]!=0 the
32810 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20  n r[P1]--, goto 
32820 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P2.**.** Registe
32830 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69  r P1 must contai
32840 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  n an integer.  I
32850 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
32860 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 0a   register P1 is.
32870 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67 72 65  ** initially gre
32880 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
32890 74 68 65 6e 20 64 65 63 72 65 6d 65 6e 74 20 74  then decrement t
328a0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
328b0 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20 69  ster P1..** If i
328c0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  t is non-zero (n
328d0 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
328e0 69 76 65 29 20 61 6e 64 20 74 68 65 6e 20 61 6c  ive) and then al
328f0 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  so jump to P2.  
32900 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
32910 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
32920 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69 74 20 75  zero, leave it u
32930 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 66 61 6c  nchanged and fal
32940 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61  l through..*/.ca
32950 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a  se OP_IfNotZero:
32960 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
32970 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
32980 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
32990 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
329a0 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
329b0 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
329c0 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c  Taken(pIn1->u.i<
329d0 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  0, 2);.  if( pIn
329e0 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 69  1->u.i ){.     i
329f0 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29  f( pIn1->u.i>0 )
32a00 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20   pIn1->u.i--;.  
32a10 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
32a20 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
32a30 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
32a40 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20 50  ecrJumpZero P1 P
32a50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
32a60 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31 5d  sis: if (--r[P1]
32a70 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  )==0 goto P2.**.
32a80 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 6d  ** Register P1 m
32a90 75 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74 65  ust hold an inte
32aa0 67 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74 20  ger.  Decrement 
32ab0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50 31 0a  the value in P1.
32ac0 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50  ** and jump to P
32ad0 32 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c  2 if the new val
32ae0 75 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65  ue is exactly ze
32af0 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ro..*/.case OP_D
32b00 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20  ecrJumpZero: {  
32b10 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
32b20 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
32b30 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
32b40 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
32b50 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  gs&MEM_Int );.  
32b60 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d  if( pIn1->u.i>SM
32b70 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 70  ALLEST_INT64 ) p
32b80 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64  In1->u.i--;.  Vd
32b90 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49  beBranchTaken(pI
32ba0 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a  n1->u.i==0, 2);.
32bb0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d    if( pIn1->u.i=
32bc0 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  =0 ) goto jump_t
32bd0 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
32be0 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  .../* Opcode: Ag
32bf0 67 53 74 65 70 30 20 2a 20 50 32 20 50 33 20 50  gStep0 * P2 P3 P
32c00 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
32c10 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74  : accum=r[P3] st
32c20 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a  ep(r[P2@P5]).**.
32c30 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  ** Execute the s
32c40 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  tep function for
32c50 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
32c60 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  The.** function 
32c70 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73  has P5 arguments
32c80 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .   P4 is a poin
32c90 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
32ca0 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ef.** structure 
32cb0 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74  that specifies t
32cc0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  he function.  Re
32cd0 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
32ce0 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  .** accumulator.
32cf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
32d00 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
32d10 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
32d20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
32d30 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20  ccessors..*/./* 
32d40 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20  Opcode: AggStep 
32d50 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  * P2 P3 P4 P5.**
32d60 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d   Synopsis: accum
32d70 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32  =r[P3] step(r[P2
32d80 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63  @P5]).**.** Exec
32d90 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
32da0 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
32db0 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
32dc0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20  function has P5 
32dd0 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20  arguments.   P4 
32de0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
32df0 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  an sqlite3_conte
32e00 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  xt.** object tha
32e10 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 75 6e  t is used to run
32e20 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
32e30 52 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  Register P3 is.*
32e40 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c  * as the accumul
32e50 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
32e60 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
32e70 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
32e80 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
32e90 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
32ea0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
32eb0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f   is initially co
32ec0 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74 65  ded as OP_AggSte
32ed0 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 76  p0.  On first ev
32ee0 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  aluation,.** the
32ef0 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64 20   FuncDef stored 
32f00 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72 74  in P4 is convert
32f10 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  ed into an sqlit
32f20 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a  e3_context and.*
32f30 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  * the opcode is 
32f40 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 69  changed.  In thi
32f50 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74 69  s way, the initi
32f60 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
32f70 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  .** sqlite3_cont
32f80 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ext only happens
32f90 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 6f   once, instead o
32fa0 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 74  f on each call t
32fb0 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 75  o the.** step fu
32fc0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  nction..*/.case 
32fd0 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a 20  OP_AggStep0: {. 
32fe0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
32ff0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
33000 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
33010 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
33020 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70  DEF );.  n = pOp
33030 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
33040 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
33050 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
33060 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
33070 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ;.  assert( n==0
33080 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
33090 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d  & pOp->p2+n<=(p-
330a0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
330b0 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73  rsor)+1) );.  as
330c0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
330d0 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
330e0 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
330f0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
33100 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
33110 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b   sizeof(*pCtx) +
33120 20 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71   (n-1)*sizeof(sq
33130 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a  lite3_value*));.
33140 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20    if( pCtx==0 ) 
33150 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
33160 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20  Ctx->pMem = 0;. 
33170 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70   pCtx->pFunc = p
33180 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
33190 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74  pCtx->iOp = (int
331a0 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
331b0 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b  pCtx->pVdbe = p;
331c0 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20  .  pCtx->argc = 
331d0 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  n;.  pOp->p4type
331e0 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20   = P4_FUNCCTX;. 
331f0 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20   pOp->p4.pCtx = 
33200 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  pCtx;.  pOp->opc
33210 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74 65 70  ode = OP_AggStep
33220 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ;.  /* Fall thro
33230 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53  ugh into OP_AggS
33240 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50  tep */.}.case OP
33250 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e  _AggStep: {.  in
33260 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  t i;.  sqlite3_c
33270 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
33280 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d  Mem *pMem;.  Mem
33290 20 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   t;..  assert( p
332a0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46  Op->p4type==P4_F
332b0 55 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74 78  UNCCTX );.  pCtx
332c0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b   = pOp->p4.pCtx;
332d0 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  .  pMem = &aMem[
332e0 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20  pOp->p3];..  /* 
332f0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
33300 20 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20   is inside of a 
33310 74 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67  trigger, the reg
33320 69 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61  ister array in a
33330 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74  Mem[].  ** might
33340 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65   change from one
33350 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74   evaluation to t
33360 68 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65  he next.  The ne
33370 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
33380 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20  .  ** checks to 
33390 73 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73  see if the regis
333a0 74 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68  ter array has ch
333b0 61 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anged, and if so
333c0 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69   it.  ** reiniti
333d0 61 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76  alizes the relav
333e0 61 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65  ant parts of the
333f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
33400 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28   object */.  if(
33410 20 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70   pCtx->pMem != p
33420 4d 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  Mem ){.    pCtx-
33430 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20  >pMem = pMem;.  
33440 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72    for(i=pCtx->ar
33450 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  gc-1; i>=0; i--)
33460 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d   pCtx->argv[i] =
33470 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69   &aMem[pOp->p2+i
33480 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  ];.  }..#ifdef S
33490 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
334a0 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61  r(i=0; i<pCtx->a
334b0 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  rgc; i++){.    a
334c0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
334d0 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29  d(pCtx->argv[i])
334e0 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
334f0 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69  _TRACE(pOp->p2+i
33500 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29  , pCtx->argv[i])
33510 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
33520 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73 71 6c  pMem->n++;.  sql
33530 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
33540 26 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  &t, db, MEM_Null
33550 29 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20  );.  pCtx->pOut 
33560 3d 20 26 74 3b 0a 20 20 70 43 74 78 2d 3e 66 45  = &t;.  pCtx->fE
33570 72 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20  rrorOrAux = 0;. 
33580 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20   pCtx->skipFlag 
33590 3d 20 30 3b 0a 20 20 28 70 43 74 78 2d 3e 70 46  = 0;.  (pCtx->pF
335a0 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74  unc->xSFunc)(pCt
335b0 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74  x,pCtx->argc,pCt
335c0 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d 50  x->argv); /* IMP
335d0 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
335e0 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66  */.  if( pCtx->f
335f0 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20  ErrorOrAux ){.  
33600 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72    if( pCtx->isEr
33610 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ror ){.      sql
33620 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
33630 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
33640 61 6c 75 65 5f 74 65 78 74 28 26 74 29 29 3b 0a  alue_text(&t));.
33650 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d        rc = pCtx-
33660 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  >isError;.    }.
33670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
33680 65 6d 52 65 6c 65 61 73 65 28 26 74 29 3b 0a 20  emRelease(&t);. 
33690 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
336a0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
336b0 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
336c0 20 20 61 73 73 65 72 74 28 20 74 2e 66 6c 61 67    assert( t.flag
336d0 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20  s==MEM_Null );. 
336e0 20 7d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 73   }.  if( pCtx->s
336f0 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61  kipFlag ){.    a
33700 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
33710 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65  pcode==OP_CollSe
33720 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70  q );.    i = pOp
33730 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28  [-1].p1;.    if(
33740 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   i ) sqlite3Vdbe
33750 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65  MemSetInt64(&aMe
33760 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  m[i], 1);.  }.  
33770 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
33780 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31  ode: AggFinal P1
33790 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
337a0 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b  nopsis: accum=r[
337b0 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45  P1] N=P2.**.** E
337c0 78 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c  xecute the final
337d0 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  izer function fo
337e0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  r an aggregate. 
337f0 20 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65   P1 is.** the me
33800 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68  mory location th
33810 61 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75  at is the accumu
33820 6c 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67  lator for the ag
33830 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50  gregate..**.** P
33840 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
33850 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  of arguments tha
33860 74 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  t the step funct
33870 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a  ion takes and.**
33880 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
33890 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20   to the FuncDef 
338a0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
338b0 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72  n.  The P2.** ar
338c0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73  gument is not us
338d0 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
338e0 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74  e.  It is only t
338f0 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67  here to disambig
33900 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  uate.** function
33910 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20  s that can take 
33920 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20  varying numbers 
33930 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  of arguments.  T
33940 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e  he.** P4 argumen
33950 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  t is only needed
33960 20 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72   for the degener
33970 61 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ate case where.*
33980 2a 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  * the step funct
33990 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76  ion was not prev
339a0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a  iously called..*
339b0 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e  /.case OP_AggFin
339c0 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65  al: {.  Mem *pMe
339d0 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  m;.  assert( pOp
339e0 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
339f0 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  1<=(p->nMem+1 - 
33a00 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
33a10 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f   pMem = &aMem[pO
33a20 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
33a30 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
33a40 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f   ~(MEM_Null|MEM_
33a50 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63  Agg))==0 );.  rc
33a60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
33a70 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20  mFinalize(pMem, 
33a80 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a  pOp->p4.pFunc);.
33a90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
33aa0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
33ab0 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  (p, "%s", sqlite
33ac0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65  3_value_text(pMe
33ad0 6d 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  m));.    goto ab
33ae0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
33af0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
33b00 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
33b10 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67  g(pMem, encoding
33b20 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
33b30 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a  BLOBSIZE(pMem);.
33b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
33b50 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29  eMemTooBig(pMem)
33b60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
33b70 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61  _big;.  }.  brea
33b80 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
33b90 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
33ba0 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f   Opcode: Checkpo
33bb0 69 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  int P1 P2 P3 * *
33bc0 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  .**.** Checkpoin
33bd0 74 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54  t database P1. T
33be0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
33bf0 66 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72  f P1 is not curr
33c00 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20  ently in.** WAL 
33c10 6d 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20  mode. Parameter 
33c20 50 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  P2 is one of SQL
33c30 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
33c40 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a  ASSIVE, FULL,.**
33c50 20 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55   RESTART, or TRU
33c60 4e 43 41 54 45 2e 20 20 57 72 69 74 65 20 31 20  NCATE.  Write 1 
33c70 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33  or 0 into mem[P3
33c80 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  ] if the checkpo
33c90 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  int returns.** S
33ca0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f  QLITE_BUSY or no
33cb0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
33cc0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
33cd0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
33ce0 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20  he.** WAL after 
33cf0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
33d00 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e  nto mem[P3+1] an
33d10 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
33d20 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  pages.** in the 
33d30 57 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65  WAL that have be
33d40 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  en checkpointed 
33d50 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70  after the checkp
33d60 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  oint.** complete
33d70 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d  s into mem[P3+2]
33d80 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e  .  However on an
33d90 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31   error, mem[P3+1
33da0 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b  ] and.** mem[P3+
33db0 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  2] are initializ
33dc0 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73  ed to -1..*/.cas
33dd0 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
33de0 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20   {.  int i;     
33df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33e10 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52  nter */.  int aR
33e20 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  es[3];          
33e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
33e40 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ults */.  Mem *p
33e50 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
33e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
33e70 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
33e80 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
33e90 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
33ea0 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20    aRes[0] = 0;. 
33eb0 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b   aRes[1] = aRes[
33ec0 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72  2] = -1;.  asser
33ed0 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  t( pOp->p2==SQLI
33ee0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
33ef0 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20  SSIVE.       || 
33f00 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
33f10 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a  CHECKPOINT_FULL.
33f20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
33f30 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
33f40 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20  OINT_RESTART.   
33f50 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d      || pOp->p2==
33f60 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
33f70 54 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a  T_TRUNCATE.  );.
33f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
33f90 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70  eckpoint(db, pOp
33fa0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26  ->p1, pOp->p2, &
33fb0 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32  aRes[1], &aRes[2
33fc0 5d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ]);.  if( rc ){.
33fd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33fe0 54 45 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61  TE_BUSY ) goto a
33ff0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
34000 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
34010 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b  TE_OK;.    aRes[
34020 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  0] = 1;.  }.  fo
34030 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61  r(i=0, pMem = &a
34040 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c  Mem[pOp->p3]; i<
34050 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  3; i++, pMem++){
34060 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34070 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d  MemSetInt64(pMem
34080 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b  , (i64)aRes[i]);
34090 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b  .  }    .  break
340a0 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23  ;.};  .#endif..#
340b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
340c0 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63  IT_PRAGMA./* Opc
340d0 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65  ode: JournalMode
340e0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
340f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a  .** Change the j
34100 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64  ournal mode of d
34110 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33  atabase P1 to P3
34120 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65  . P3 must be one
34130 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52   of the.** PAGER
34140 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58  _JOURNALMODE_XXX
34150 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e   values. If chan
34160 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  ging between the
34170 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63   various rollbac
34180 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65  k.** modes (dele
34190 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65  te, truncate, pe
341a0 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d  rsist, off and m
341b0 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20  emory), this is 
341c0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72  a simple.** oper
341d0 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20  ation. No IO is 
341e0 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
341f0 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f  If changing into
34200 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d   or out of WAL m
34210 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72  ode the procedur
34220 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  e is more compli
34230 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  cated..**.** Wri
34240 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  te a string cont
34250 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  aining the final
34260 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f   journal-mode to
34270 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
34280 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c  .case OP_Journal
34290 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75  Mode: {    /* ou
342a0 74 32 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  t2 */.  Btree *p
342b0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
342c0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
342d0 20 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e   to change journ
342e0 61 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20  al mode of */.  
342f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
34300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34310 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
34320 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
34330 20 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20    int eNew;     
34340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34350 20 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c    /* New journal
34360 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   mode */.  int e
34370 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
34380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
34390 65 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e old journal mo
343a0 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  de */.#ifndef SQ
343b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
343c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
343d0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
343e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
343f0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61  ase file for pPa
34400 67 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ger */.#endif.. 
34410 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
34420 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
34430 20 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33    eNew = pOp->p3
34440 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77  ;.  assert( eNew
34450 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34460 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
34470 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
34480 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
34490 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c  UNCATE .       |
344a0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
344b0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
344c0 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  T .       || eNe
344d0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
344e0 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20  MODE_OFF.       
344f0 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
34500 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
34510 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  Y.       || eNew
34520 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34530 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c  ODE_WAL.       |
34540 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
34550 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
34560 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
34570 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
34580 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
34590 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
345a0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70  dOnly==0 );..  p
345b0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
345c0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61  ->p1].pBt;.  pPa
345d0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
345e0 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
345f0 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61  eOld = sqlite3Pa
34600 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerGetJournalMod
34610 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
34620 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34630 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29  RNALMODE_QUERY )
34640 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20   eNew = eOld;.  
34650 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65  if( !sqlite3Page
34660 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e  rOkToChangeJourn
34670 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29  alMode(pPager) )
34680 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23   eNew = eOld;..#
34690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
346a0 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61  IT_WAL.  zFilena
346b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  me = sqlite3Page
346c0 72 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72  rFilename(pPager
346d0 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  , 1);..  /* Do n
346e0 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73  ot allow a trans
346f0 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  ition to journal
34700 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20  _mode=WAL for a 
34710 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e  database.  ** in
34720 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
34730 67 65 20 6f 72 20 69 66 20 74 68 65 20 56 46 53  ge or if the VFS
34740 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
34750 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  t shared memory 
34760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77  .  */.  if( eNew
34770 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34780 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73  ODE_WAL.   && (s
34790 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
347a0 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20  Filename)==0    
347b0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66         /* Temp f
347c0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  ile */.       ||
347d0 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61   !sqlite3PagerWa
347e0 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65  lSupported(pPage
347f0 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72  r))   /* No shar
34800 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72  ed-memory suppor
34810 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e  t */.  ){.    eN
34820 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a  ew = eOld;.  }..
34830 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c    if( (eNew!=eOl
34840 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d  d).   && (eOld==
34850 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34860 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50  E_WAL || eNew==P
34870 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34880 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69  _WAL).  ){.    i
34890 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
348a0 69 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52  it || db->nVdbeR
348b0 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ead>1 ){.      r
348c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
348d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
348e0 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20  dbeError(p,.    
348f0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
34900 61 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65  ange %s wal mode
34910 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74   from within a t
34920 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
34930 20 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41         (eNew==PA
34940 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34950 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22  WAL ? "into" : "
34960 6f 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29  out of").      )
34970 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  ;.      goto abo
34980 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
34990 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20  .    }else{. .  
349a0 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41      if( eOld==PA
349b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
349c0 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  WAL ){.        /
349d0 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c  * If leaving WAL
349e0 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65   mode, close the
349f0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
34a00 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61  ccessful, the ca
34a10 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ll.        ** to
34a20 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29   PagerCloseWal()
34a30 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64   checkpoints and
34a40 20 64 65 6c 65 74 65 73 20 74 68 65 20 77 72 69   deletes the wri
34a50 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20  te-ahead-log .  
34a60 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41        ** file. A
34a70 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
34a80 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65   may still be he
34a90 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
34aa0 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20  se file .       
34ab0 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63 63   ** after a succ
34ac0 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a  essful return. .
34ad0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34ae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34af0 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61  agerCloseWal(pPa
34b00 67 65 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20  ger, db);.      
34b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
34b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
34b40 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
34b50 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20  er, eNew);.     
34b60 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
34b70 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52   if( eOld==PAGER
34b80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
34b90 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ORY ){.        /
34ba0 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74  * Cannot transit
34bb0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ion directly fro
34bc0 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e  m MEMORY to WAL.
34bd0 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20    Use mode OFF. 
34be0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20         ** as an 
34bf0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a  intermediate */.
34c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
34c10 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
34c20 64 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52  de(pPager, PAGER
34c30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
34c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
34c50 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72      /* Open a tr
34c60 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
34c70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34c80 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
34c90 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
34ca0 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72  ** mode, this tr
34cb0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73  ansaction always
34cc0 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b   uses a rollback
34cd0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
34ce0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
34cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
34d00 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29  nTrans(pBt)==0 )
34d10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
34d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34d40 33 42 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e  3BtreeSetVersion
34d50 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47  (pBt, (eNew==PAG
34d60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
34d70 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20  AL ? 2 : 1));.  
34d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
34d90 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
34da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
34db0 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20   */..  if( rc ) 
34dc0 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65  eNew = eOld;.  e
34dd0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67  New = sqlite3Pag
34de0 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
34df0 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a  (pPager, eNew);.
34e00 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
34e10 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
34e20 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
34e30 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pOut->z = (char 
34e40 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  *)sqlite3Journal
34e50 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a  Modename(eNew);.
34e60 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69    pOut->n = sqli
34e70 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74  te3Strlen30(pOut
34e80 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->z);.  pOut->en
34e90 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
34ea0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
34eb0 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75  angeEncoding(pOu
34ec0 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  t, encoding);.  
34ed0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
34ee0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
34ef0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65  ;.  break;.};.#e
34f00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
34f10 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23  MIT_PRAGMA */..#
34f20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
34f30 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
34f40 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
34f50 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a  TE_OMIT_ATTACH).
34f60 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75  /* Opcode: Vacuu
34f70 6d 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  m P1 * * * *.**.
34f80 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e  ** Vacuum the en
34f90 74 69 72 65 20 64 61 74 61 62 61 73 65 20 50 31  tire database P1
34fa0 2e 20 20 50 31 20 69 73 20 30 20 66 6f 72 20 22  .  P1 is 0 for "
34fb0 6d 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20  main", and 2 or 
34fc0 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61  more.** for an a
34fd0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
34fe0 2e 20 20 54 68 65 20 22 74 65 6d 70 22 20 64 61  .  The "temp" da
34ff0 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62  tabase may not b
35000 65 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63  e vacuumed..*/.c
35010 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b  ase OP_Vacuum: {
35020 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
35030 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72  adOnly==0 );.  r
35040 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61  c = sqlite3RunVa
35050 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67  cuum(&p->zErrMsg
35060 2c 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a  , db, pOp->p1);.
35070 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
35080 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
35090 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
350a0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
350b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
350c0 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f  AUTOVACUUM)./* O
350d0 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75  pcode: IncrVacuu
350e0 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
350f0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
35100 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65  ngle step of the
35110 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
35120 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e  uum procedure on
35130 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61 62  .** the P1 datab
35140 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63 75  ase. If the vacu
35150 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c  um has finished,
35160 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
35170 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65  tion.** P2. Othe
35180 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f  rwise, fall thro
35190 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
351a0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
351b0 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75  case OP_IncrVacu
351c0 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  um: {        /* 
351d0 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20  jump */.  Btree 
351e0 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
351f0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
35200 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
35210 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
35220 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
35230 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b  ask, pOp->p1) );
35240 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
35250 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70  adOnly==0 );.  p
35260 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
35270 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20  ->p1].pBt;.  rc 
35280 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
35290 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20  crVacuum(pBt);. 
352a0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
352b0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
352c0 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ,2);.  if( rc ){
352d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
352e0 49 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20  ITE_DONE ) goto 
352f0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
35300 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  or;.    rc = SQL
35310 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
35320 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
35330 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
35340 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45  if../* Opcode: E
35350 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a  xpire P1 * * * *
35360 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65  .**.** Cause pre
35370 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
35380 6e 74 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20  nts to expire.  
35390 57 68 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20  When an expired 
353a0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
353b0 65 78 65 63 75 74 65 64 20 75 73 69 6e 67 20 73  executed using s
353c0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 74  qlite3_step() it
353d0 20 77 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74   will either aut
353e0 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65  omatically.** re
353f0 70 72 65 70 61 72 65 20 69 74 73 65 6c 66 20 28  prepare itself (
35400 69 66 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  if it was origin
35410 61 6c 6c 79 20 63 72 65 61 74 65 64 20 75 73 69  ally created usi
35420 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ng sqlite3_prepa
35430 72 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69  re_v2()).** or i
35440 74 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  t will fail with
35450 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a   SQLITE_SCHEMA..
35460 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  ** .** If P1 is 
35470 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20  0, then all SQL 
35480 73 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d  statements becom
35490 65 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31  e expired. If P1
354a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a   is non-zero,.**
354b0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63   then only the c
354c0 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69  urrently executi
354d0 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ng statement is 
354e0 65 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65  expired..*/.case
354f0 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20   OP_Expire: {.  
35500 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a  if( !pOp->p1 ){.
35510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
35520 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
35530 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65  nts(db);.  }else
35540 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
35550 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
35560 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
35570 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
35580 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65  _CACHE./* Opcode
35590 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50  : TableLock P1 P
355a0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
355b0 6f 70 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f  opsis: iDb=P1 ro
355c0 6f 74 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a  ot=P2 write=P3.*
355d0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
355e0 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ck on a particul
355f0 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69  ar table. This i
35600 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e  nstruction is on
35610 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  ly used when.** 
35620 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
35630 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
35640 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69  led. .**.** P1 i
35650 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
35660 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 73  he database in s
35670 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20  qlite3.aDb[] of 
35680 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
35690 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63  on which the loc
356a0 6b 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 20  k is acquired.  
356b0 41 20 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62  A readlock is ob
356c0 74 61 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20  tained if P3==0 
356d0 6f 72 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  or.** a write lo
356e0 63 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a  ck if P3==1..**.
356f0 2a 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74  ** P2 contains t
35700 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  he root-page of 
35710 74 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63  the table to loc
35720 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74  k..**.** P4 cont
35730 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
35740 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  o the name of th
35750 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f  e table being lo
35760 63 6b 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e  cked. This is on
35770 6c 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65  ly.** used to ge
35780 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
35790 6d 65 73 73 61 67 65 20 69 66 20 74 68 65 20 6c  message if the l
357a0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
357b0 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  tained..*/.case 
357c0 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a  OP_TableLock: {.
357d0 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b    u8 isWriteLock
357e0 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a   = (u8)pOp->p3;.
357f0 20 20 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63    if( isWriteLoc
35800 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  k || 0==(db->fla
35810 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
35820 63 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a 20 20  committed) ){.  
35830 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e    int p1 = pOp->
35840 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28  p1; .    assert(
35850 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64 62 2d   p1>=0 && p1<db-
35860 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
35870 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
35880 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 31 29  ->btreeMask, p1)
35890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
358a0 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c  isWriteLock==0 |
358b0 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31  | isWriteLock==1
358c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
358d0 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
358e0 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70  le(db->aDb[p1].p
358f0 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57  Bt, pOp->p2, isW
35900 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  riteLock);.    i
35910 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
35920 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  f( (rc&0xFF)==SQ
35930 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
35940 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
35950 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
35960 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35970 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 64  3VdbeError(p, "d
35980 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
35990 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29   locked: %s", z)
359a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
359b0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
359c0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
359d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
359e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
359f0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
35a00 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
35a10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
35a20 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
35a30 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34   VBegin * * * P4
35a40 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20   *.**.** P4 may 
35a50 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
35a60 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
35a70 73 74 72 75 63 74 75 72 65 2e 20 49 66 20 73 6f  structure. If so
35a80 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78  , call the .** x
35a90 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72  Begin method for
35aa0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a   that table..**.
35ab0 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65 72  ** Also, whether
35ac0 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73 65   or not P4 is se
35ad0 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
35ae0 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  is is not being 
35af0 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77  called from.** w
35b00 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  ithin a callback
35b10 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
35b20 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68  ble xSync() meth
35b30 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68  od. If it is, th
35b40 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
35b50 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 53  will be set to S
35b60 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f  QLITE_LOCKED..*/
35b70 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a  .case OP_VBegin:
35b80 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54   {.  VTable *pVT
35b90 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70 4f  ab;.  pVTab = pO
35ba0 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 72  p->p4.pVtab;.  r
35bb0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 42  c = sqlite3VtabB
35bc0 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29 3b  egin(db, pVTab);
35bd0 0a 20 20 69 66 28 20 70 56 54 61 62 20 29 20 73  .  if( pVTab ) s
35be0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
35bf0 45 72 72 6d 73 67 28 70 2c 20 70 56 54 61 62 2d  Errmsg(p, pVTab-
35c00 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72  >pVtab);.  if( r
35c10 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
35c20 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
35c30 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
35c40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
35c50 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
35c60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35c70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
35c80 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65 61  /* Opcode: VCrea
35c90 74 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  te P1 P2 * * *.*
35ca0 2a 0a 2a 2a 20 50 32 20 69 73 20 61 20 72 65 67  *.** P2 is a reg
35cb0 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
35cc0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
35cd0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
35ce0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 50 31 2e  database .** P1.
35cf0 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74   Call the xCreat
35d00 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61  e method for tha
35d10 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  t table..*/.case
35d20 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20   OP_VCreate: {. 
35d30 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20   Mem sMem;      
35d40 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69      /* For stori
35d50 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  ng the record be
35d60 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
35d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
35d80 62 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  b;  /* Name of t
35d90 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
35da0 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73   */..  memset(&s
35db0 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Mem, 0, sizeof(s
35dc0 4d 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e 64 62  Mem));.  sMem.db
35dd0 20 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65 63 61   = db;.  /* Beca
35de0 75 73 65 20 50 32 20 69 73 20 61 6c 77 61 79 73  use P2 is always
35df0 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
35e00 2c 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  , it is impossib
35e10 6c 65 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  le for the.  ** 
35e20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
35e30 70 79 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a  py() to fail */.
35e40 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d 5b    assert( (aMem[
35e50 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26  pOp->p2].flags &
35e60 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29 3b 0a   MEM_Str)!=0 );.
35e70 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d 5b    assert( (aMem[
35e80 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26  pOp->p2].flags &
35e90 20 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d 30 20   MEM_Static)!=0 
35ea0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
35eb0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 26 73 4d  3VdbeMemCopy(&sM
35ec0 65 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  em, &aMem[pOp->p
35ed0 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  2]);.  assert( r
35ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
35ef0 20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20    zTab = (const 
35f00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
35f10 6c 75 65 5f 74 65 78 74 28 26 73 4d 65 6d 29 3b  lue_text(&sMem);
35f20 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 20  .  assert( zTab 
35f30 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
35f40 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 54 61  led );.  if( zTa
35f50 62 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  b ){.    rc = sq
35f60 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65  lite3VtabCallCre
35f70 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ate(db, pOp->p1,
35f80 20 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72 72 4d   zTab, &p->zErrM
35f90 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
35fa0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
35fb0 28 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28 20 72  (&sMem);.  if( r
35fc0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
35fd0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
35fe0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
35ff0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
36000 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
36010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36020 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
36030 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73 74  /* Opcode: VDest
36040 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  roy P1 * * P4 *.
36050 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20  **.** P4 is the 
36060 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61  name of a virtua
36070 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62  l table in datab
36080 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74 68  ase P1.  Call th
36090 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  e xDestroy metho
360a0 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  d.** of that tab
360b0 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  le..*/.case OP_V
360c0 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64 62 2d  Destroy: {.  db-
360d0 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a 20 20  >nVDestroy++;.  
360e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
360f0 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20  CallDestroy(db, 
36100 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
36110 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44 65 73  .z);.  db->nVDes
36120 74 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20 72 63  troy--;.  if( rc
36130 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
36140 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  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 4f 70 65 6e 20  * Opcode: VOpen 
361b0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
361c0 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
361d0 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
361e0 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
361f0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
36200 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73  ucture..** P1 is
36210 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
36220 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f  .  This opcode o
36230 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f  pens a cursor to
36240 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
36250 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73  table and stores
36260 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20   that cursor in 
36270 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  P1..*/.case OP_V
36280 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75  Open: {.  VdbeCu
36290 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 71  rsor *pCur;.  sq
362a0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
362b0 72 20 2a 70 56 43 75 72 3b 0a 20 20 73 71 6c 69  r *pVCur;.  sqli
362c0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
362d0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
362e0 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
362f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
36300 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 70  bIsReader );.  p
36310 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 43 75 72  Cur = 0;.  pVCur
36320 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d 20   = 0;.  pVtab = 
36330 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
36340 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56 74 61  Vtab;.  if( pVta
36350 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 56  b==0 || NEVER(pV
36360 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29  tab->pModule==0)
36370 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
36380 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
36390 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
363a0 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  o_error;.  }.  p
363b0 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
363c0 70 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20 3d 20  pModule;.  rc = 
363d0 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70  pModule->xOpen(p
363e0 56 74 61 62 2c 20 26 70 56 43 75 72 29 3b 0a 20  Vtab, &pVCur);. 
363f0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
36400 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
36410 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
36420 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36430 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e  _error;..  /* In
36440 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33  itialize sqlite3
36450 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
36460 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70 56 43  e class */.  pVC
36470 75 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74 61  ur->pVtab = pVta
36480 62 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  b;..  /* Initial
36490 69 7a 65 20 76 64 62 65 20 63 75 72 73 6f 72 20  ize vdbe cursor 
364a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43 75 72  object */.  pCur
364b0 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
364c0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c  r(p, pOp->p1, 0,
364d0 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 56 54 41   -1, CURTYPE_VTA
364e0 42 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20 29  B);.  if( pCur )
364f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 75 63 2e 70  {.    pCur->uc.p
36500 56 43 75 72 20 3d 20 70 56 43 75 72 3b 0a 20 20  VCur = pVCur;.  
36510 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b 2b 3b    pVtab->nRef++;
36520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
36530 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
36540 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4d  Failed );.    pM
36550 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
36560 43 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e  Cur);.    goto n
36570 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65  o_mem;.  }.  bre
36580 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
36590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
365a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
365b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
365c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
365d0 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65 72   Opcode: VFilter
365e0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
365f0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 70 6c 61  * Synopsis: ipla
36600 6e 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d 27 50  n=r[P3] zplan='P
36610 34 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  4'.**.** P1 is a
36620 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75   cursor opened u
36630 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32 20  sing VOpen.  P2 
36640 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f  is an address to
36650 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20 74   jump to if.** t
36660 68 65 20 66 69 6c 74 65 72 65 64 20 72 65 73 75  he filtered resu
36670 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74 79 2e  lt set is empty.
36680 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69 74  .**.** P4 is eit
36690 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73 74  her NULL or a st
366a0 72 69 6e 67 20 74 68 61 74 20 77 61 73 20 67 65  ring that was ge
366b0 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 78  nerated by the x
366c0 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65 74  BestIndex.** met
366d0 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  hod of the modul
366e0 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72 65  e.  The interpre
366f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 34  tation of the P4
36700 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74 0a   string is left.
36710 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65  ** to the module
36720 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
36730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
36740 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  de invokes the x
36750 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f 6e  Filter method on
36760 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
36770 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  le specified.** 
36780 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74 65  by P1.  The inte
36790 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20 70  ger query plan p
367a0 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69 6c  arameter to xFil
367b0 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ter is stored in
367c0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33 2e   register.** P3.
367d0 20 52 65 67 69 73 74 65 72 20 50 33 2b 31 20 73   Register P3+1 s
367e0 74 6f 72 65 73 20 74 68 65 20 61 72 67 63 20 70  tores the argc p
367f0 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20 70  arameter to be p
36800 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  assed to the.** 
36810 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20  xFilter method. 
36820 52 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e 2e  Registers P3+2..
36830 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74 68  P3+1+argc are th
36840 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74 69  e argc.** additi
36850 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73 20  onal parameters 
36860 77 68 69 63 68 20 61 72 65 20 70 61 73 73 65 64  which are passed
36870 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20 61   to.** xFilter a
36880 73 20 61 72 67 76 2e 20 52 65 67 69 73 74 65 72  s argv. Register
36890 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61 72   P3+2 becomes ar
368a0 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73 65  gv[0] when passe
368b0 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a 2a  d to xFilter..**
368c0 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d 61  .** A jump is ma
368d0 64 65 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  de to P2 if the 
368e0 72 65 73 75 6c 74 20 73 65 74 20 61 66 74 65 72  result set after
368f0 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c 64   filtering would
36900 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61   be empty..*/.ca
36910 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b  se OP_VFilter: {
36920 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
36930 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20  int nArg;.  int 
36940 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74 20  iQuery;.  const 
36950 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
36960 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a  pModule;.  Mem *
36970 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a 70  pQuery;.  Mem *p
36980 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Argc;.  sqlite3_
36990 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43  vtab_cursor *pVC
369a0 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ur;.  sqlite3_vt
369b0 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64 62  ab *pVtab;.  Vdb
369c0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
369d0 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
369e0 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67  i;.  Mem **apArg
369f0 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26 61  ;..  pQuery = &a
36a00 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
36a10 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79 5b  pArgc = &pQuery[
36a20 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e  1];.  pCur = p->
36a30 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
36a40 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
36a50 61 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b 0a  alid(pQuery) );.
36a60 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
36a70 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72 79  (pOp->p3, pQuery
36a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
36a90 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
36aa0 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70  TYPE_VTAB );.  p
36ab0 56 43 75 72 20 3d 20 70 43 75 72 2d 3e 75 63 2e  VCur = pCur->uc.
36ac0 70 56 43 75 72 3b 0a 20 20 70 56 74 61 62 20 3d  pVCur;.  pVtab =
36ad0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20   pVCur->pVtab;. 
36ae0 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62   pModule = pVtab
36af0 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a  ->pModule;..  /*
36b00 20 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20   Grab the index 
36b10 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20  number and argc 
36b20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
36b30 61 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d  assert( (pQuery-
36b40 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21  >flags&MEM_Int)!
36b50 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61  =0 && pArgc->fla
36b60 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  gs==MEM_Int );. 
36b70 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72   nArg = (int)pAr
36b80 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72  gc->u.i;.  iQuer
36b90 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d  y = (int)pQuery-
36ba0 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  >u.i;..  /* Invo
36bb0 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d  ke the xFilter m
36bc0 65 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73 20 3d  ethod */.  res =
36bd0 20 30 3b 0a 20 20 61 70 41 72 67 20 3d 20 70 2d   0;.  apArg = p-
36be0 3e 61 70 41 72 67 3b 0a 20 20 66 6f 72 28 69 20  >apArg;.  for(i 
36bf0 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  = 0; i<nArg; i++
36c00 29 7b 0a 20 20 20 20 61 70 41 72 67 5b 69 5d 20  ){.    apArg[i] 
36c10 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20  = &pArgc[i+1];. 
36c20 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c   }.  rc = pModul
36c30 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 43 75 72  e->xFilter(pVCur
36c40 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70  , iQuery, pOp->p
36c50 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72 67  4.z, nArg, apArg
36c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
36c70 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20  ImportErrmsg(p, 
36c80 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63  pVtab);.  if( rc
36c90 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
36ca0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65  e_to_error;.  re
36cb0 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f  s = pModule->xEo
36cc0 66 28 70 56 43 75 72 29 3b 0a 20 20 70 43 75 72  f(pVCur);.  pCur
36cd0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
36ce0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
36cf0 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66  (res!=0,2);.  if
36d00 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d  ( res ) goto jum
36d10 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
36d20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
36d30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36d40 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
36d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36d60 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
36d70 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50  pcode: VColumn P
36d80 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
36d90 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 76  ynopsis: r[P3]=v
36da0 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a  column(P2).**.**
36db0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
36dc0 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f   of the P2-th co
36dd0 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
36de0 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ow of the virtua
36df0 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  l-table that the
36e00 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20 69   .** P1 cursor i
36e10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e  s pointing to in
36e20 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  to register P3..
36e30 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75  */.case OP_VColu
36e40 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  mn: {.  sqlite3_
36e50 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
36e60 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
36e70 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
36e80 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73 71  Mem *pDest;.  sq
36e90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73 43  lite3_context sC
36ea0 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65 43  ontext;..  VdbeC
36eb0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d  ursor *pCur = p-
36ec0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
36ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
36ee0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
36ef0 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73  PE_VTAB );.  ass
36f00 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
36f10 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
36f20 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
36f30 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  or) );.  pDest =
36f40 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
36f50 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
36f60 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
36f70 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52   if( pCur->nullR
36f80 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ow ){.    sqlite
36f90 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
36fa0 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
36fb0 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d  k;.  }.  pVtab =
36fc0 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 2d   pCur->uc.pVCur-
36fd0 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
36fe0 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
36ff0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  le;.  assert( pM
37000 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29  odule->xColumn )
37010 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e  ;.  memset(&sCon
37020 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  text, 0, sizeof(
37030 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 73 43  sContext));.  sC
37040 6f 6e 74 65 78 74 2e 70 4f 75 74 20 3d 20 70 44  ontext.pOut = pD
37050 65 73 74 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70  est;.  MemSetTyp
37060 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d 45 4d  eFlag(pDest, MEM
37070 5f 4e 75 6c 6c 29 3b 0a 20 20 72 63 20 3d 20 70  _Null);.  rc = p
37080 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28  Module->xColumn(
37090 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 2c 20  pCur->uc.pVCur, 
370a0 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d 3e  &sContext, pOp->
370b0 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  p2);.  sqlite3Vt
370c0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70  abImportErrmsg(p
370d0 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
370e0 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72  sContext.isError
370f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 43 6f   ){.    rc = sCo
37100 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a 20  ntext.isError;. 
37110 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
37120 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
37130 44 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  Dest, encoding);
37140 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
37150 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74  E(pOp->p3, pDest
37160 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
37170 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b  BLOBSIZE(pDest);
37180 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ..  if( sqlite3V
37190 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65  dbeMemTooBig(pDe
371a0 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  st) ){.    goto 
371b0 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69  too_big;.  }.  i
371c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
371d0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
371e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
371f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
37200 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
37210 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
37220 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
37230 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
37240 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Next P1 P2 * * *
37250 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76  .**.** Advance v
37260 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50 31 20  irtual table P1 
37270 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  to the next row 
37280 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20 73 65  in its result se
37290 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f  t and.** jump to
372a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
372b0 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76 69 72    Or, if the vir
372c0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73 20 72  tual table has r
372d0 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e  eached.** the en
372e0 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c 74 20  d of its result 
372f0 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  set, then fall t
37300 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
37310 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
37320 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65 78 74  */.case OP_VNext
37330 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  : {   /* jump */
37340 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
37350 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
37360 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
37370 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72  pModule;.  int r
37380 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  es;.  VdbeCursor
37390 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d   *pCur;..  res =
373a0 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e   0;.  pCur = p->
373b0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
373c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
373d0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
373e0 45 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20  E_VTAB );.  if( 
373f0 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  pCur->nullRow ){
37400 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
37410 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e    pVtab = pCur->
37420 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b  uc.pVCur->pVtab;
37430 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  .  pModule = pVt
37440 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61  ab->pModule;.  a
37450 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e  ssert( pModule->
37460 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  xNext );..  /* I
37470 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 28  nvoke the xNext(
37480 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
37490 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69 73  module. There is
374a0 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65 0a   no way for the.
374b0 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20    ** underlying 
374c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
374d0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
374e0 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73 20  r if one occurs 
374f0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78  during.  ** xNex
37500 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  t(). Instead, if
37510 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
37520 2c 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e  , true is return
37530 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74  ed (indicating t
37540 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20 69  hat .  ** data i
37550 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e 64  s available) and
37560 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
37570 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78 43  returned when xC
37580 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f  olumn or.  ** so
37590 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 20  me other method 
375a0 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20  is next invoked 
375b0 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69 72 74  on the save virt
375c0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
375d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 4d  ..  */.  rc = pM
375e0 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75  odule->xNext(pCu
375f0 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20 20  r->uc.pVCur);.  
37600 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
37610 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
37620 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
37630 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
37640 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20 70  error;.  res = p
37650 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 43 75  Module->xEof(pCu
37660 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20 20  r->uc.pVCur);.  
37670 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
37680 21 72 65 73 2c 32 29 3b 0a 20 20 69 66 28 20 21  !res,2);.  if( !
37690 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
376a0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20   there is data, 
376b0 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20  jump to P2 */.  
376c0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
376d0 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
376e0 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20  interrupt;.  }. 
376f0 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f   goto check_for_
37700 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23 65 6e  interrupt;.}.#en
37710 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37720 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
37730 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
37740 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
37750 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
37760 56 52 65 6e 61 6d 65 20 50 31 20 2a 20 2a 20 50  VRename P1 * * P
37770 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
37780 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76  a pointer to a v
37790 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
377a0 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f  ect, an sqlite3_
377b0 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a  vtab structure..
377c0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
377d0 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65  nvokes the corre
377e0 73 70 6f 6e 64 69 6e 67 20 78 52 65 6e 61 6d 65  sponding xRename
377f0 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 76 61 6c   method. The val
37800 75 65 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ue.** in registe
37810 72 20 50 31 20 69 73 20 70 61 73 73 65 64 20 61  r P1 is passed a
37820 73 20 74 68 65 20 7a 4e 61 6d 65 20 61 72 67 75  s the zName argu
37830 6d 65 6e 74 20 74 6f 20 74 68 65 20 78 52 65 6e  ment to the xRen
37840 61 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63  ame method..*/.c
37850 61 73 65 20 4f 50 5f 56 52 65 6e 61 6d 65 3a 20  ase OP_VRename: 
37860 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
37870 20 2a 70 56 74 61 62 3b 0a 20 20 4d 65 6d 20 2a   *pVtab;.  Mem *
37880 70 4e 61 6d 65 3b 0a 0a 20 20 70 56 74 61 62 20  pName;..  pVtab 
37890 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
378a0 3e 70 56 74 61 62 3b 0a 20 20 70 4e 61 6d 65 20  >pVtab;.  pName 
378b0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
378c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 74 61  ;.  assert( pVta
378d0 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e  b->pModule->xRen
378e0 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
378f0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4e 61 6d   memIsValid(pNam
37900 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
37910 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
37920 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
37930 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d  CE(pOp->p1, pNam
37940 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  e);.  assert( pN
37950 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ame->flags & MEM
37960 5f 53 74 72 20 29 3b 0a 20 20 74 65 73 74 63 61  _Str );.  testca
37970 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d  se( pName->enc==
37980 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
37990 20 74 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65   testcase( pName
379a0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
379b0 46 31 36 42 45 20 29 3b 0a 20 20 74 65 73 74 63  F16BE );.  testc
379c0 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d  ase( pName->enc=
379d0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
379e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
379f0 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
37a00 69 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c 49 54  ing(pName, SQLIT
37a10 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 72  E_UTF8);.  if( r
37a20 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
37a30 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72  ue_to_error;.  r
37a40 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
37a50 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56 74 61  le->xRename(pVta
37a60 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  b, pName->z);.  
37a70 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
37a80 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
37a90 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
37aa0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = 0;.  if( rc ) 
37ab0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
37ac0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
37ad0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
37ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37af0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
37b00 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74 65 20  Opcode: VUpdate 
37b10 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
37b20 2a 20 53 79 6e 6f 70 73 69 73 3a 20 64 61 74 61  * Synopsis: data
37b30 3d 72 5b 50 33 40 50 32 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P2].**.** 
37b40 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
37b50 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
37b60 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71  le object, an sq
37b70 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
37b80 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  ture..** This op
37b90 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
37ba0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78   corresponding x
37bb0 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20 50  Update method. P
37bc0 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  2 values.** are 
37bd0 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72  contiguous memor
37be0 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  y cells starting
37bf0 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20 74   at P3 to pass t
37c00 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a 2a  o the xUpdate .*
37c10 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54 68  * invocation. Th
37c20 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
37c30 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63 6f  ter (P3+P2-1) co
37c40 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
37c50 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65 6e   .** p2th elemen
37c60 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61 72  t of the argv ar
37c70 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78 55  ray passed to xU
37c80 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pdate..**.** The
37c90 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
37ca0 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54 45  will do a DELETE
37cb0 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   or an INSERT or
37cc0 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61 72   both..** The ar
37cd0 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28 77  gv[0] element (w
37ce0 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73  hich corresponds
37cf0 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   to memory cell 
37d00 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72 6f  P3).** is the ro
37d10 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  wid of a row to 
37d20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67 76  delete.  If argv
37d30 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  [0] is NULL then
37d40 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e   no .** deletion
37d50 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61 72   occurs.  The ar
37d60 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69 73  gv[1] element is
37d70 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
37d80 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20 20  e new .** row.  
37d90 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  This can be NULL
37da0 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69 72   to have the vir
37db0 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65 63  tual table selec
37dc0 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f  t the new .** ro
37dd0 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e 20  wid for itself. 
37de0 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
37df0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
37e00 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74 68  array are .** th
37e10 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  e values of colu
37e20 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72  mns in the new r
37e30 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d  ow..**.** If P2=
37e40 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65 72  =1 then no inser
37e50 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  t is performed. 
37e60 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20   argv[0] is the 
37e70 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72 6f  rowid of.** a ro
37e80 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a  w to delete..**.
37e90 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c 65  ** P1 is a boole
37ea0 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20 69  an flag. If it i
37eb0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 6e  s set to true an
37ec0 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63 61  d the xUpdate ca
37ed0 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ll.** is success
37ee0 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ful, then the va
37ef0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
37f00 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
37f10 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a 20  ert_rowid() .** 
37f20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
37f30 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  lue of the rowid
37f40 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75 73   for the row jus
37f50 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  t inserted..**.*
37f60 2a 20 50 35 20 69 73 20 74 68 65 20 65 72 72 6f  * P5 is the erro
37f70 72 20 61 63 74 69 6f 6e 73 20 28 4f 45 5f 52 65  r actions (OE_Re
37f80 70 6c 61 63 65 2c 20 4f 45 5f 46 61 69 6c 2c 20  place, OE_Fail, 
37f90 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20  OE_Ignore, etc) 
37fa0 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 69 6e 20 74  to.** apply in t
37fb0 68 65 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6e  he case of a con
37fc0 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72 65 20  straint failure 
37fd0 6f 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f 72 20  on an insert or 
37fe0 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20  update..*/.case 
37ff0 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20  OP_VUpdate: {.  
38000 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
38010 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
38020 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
38030 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67  dule;.  int nArg
38040 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  ;.  int i;.  sql
38050 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b  ite_int64 rowid;
38060 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a  .  Mem **apArg;.
38070 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61 73    Mem *pX;..  as
38080 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 31  sert( pOp->p2==1
38090 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e          || pOp->
380a0 70 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c 7c  p5==OE_Fail   ||
380b0 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c   pOp->p5==OE_Rol
380c0 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c  lback .       ||
380d0 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f   pOp->p5==OE_Abo
380e0 72 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f  rt || pOp->p5==O
380f0 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d  E_Ignore || pOp-
38100 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 0a  >p5==OE_Replace.
38110 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
38120 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
38130 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
38140 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
38150 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20  .  if( pVtab==0 
38160 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e  || NEVER(pVtab->
38170 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20  pModule==0) ){. 
38180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
38190 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20  OCKED;.    goto 
381a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
381b0 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75 6c  or;.  }.  pModul
381c0 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
381d0 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70  le;.  nArg = pOp
381e0 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
381f0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
38200 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c  VTAB );.  if( AL
38210 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55  WAYS(pModule->xU
38220 70 64 61 74 65 29 20 29 7b 0a 20 20 20 20 75 38  pdate) ){.    u8
38230 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20   vtabOnConflict 
38240 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66  = db->vtabOnConf
38250 6c 69 63 74 3b 0a 20 20 20 20 61 70 41 72 67 20  lict;.    apArg 
38260 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20  = p->apArg;.    
38270 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  pX = &aMem[pOp->
38280 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p3];.    for(i=0
38290 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
382a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
382b0 6d 49 73 56 61 6c 69 64 28 70 58 29 20 29 3b 0a  mIsValid(pX) );.
382c0 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
382d0 43 68 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20  Change(p, pX);. 
382e0 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20       ap