/ Hex Artifact Content
Login

Artifact 8bf71f7ba91a208c5e0a8bcf5da03889bc858041:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 5f 76 6d 22 20 61 73 20 69  "sqlite_vm" as i
01e0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  t is known to th
01f0: 65 20 6f 75 74 73 69 64 65 20 77 6f 72 6c 64 2e  e outside world.
0200: 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 6f 20 76  )  Prior.** to v
0210: 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c 20 61 6c  ersion 2.8.7, al
0220: 6c 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  l this code was 
0230: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0240: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
0250: 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 74 68 61  file..** But tha
0260: 74 20 66 69 6c 65 20 77 61 73 20 67 65 74 74 69  t file was getti
0270: 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f 20 74 68  ng too big so th
0280: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  is subroutines w
0290: 65 72 65 20 73 70 6c 69 74 20 6f 75 74 2e 0a 2a  ere split out..*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
02e0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65  .../*.** When de
0300: 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65  bugging the code
0310: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20   generator in a 
0320: 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65  symbolic debugge
0330: 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65  r, one can.** se
0340: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 64  t the sqlite3_vd
0350: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 74  be_addop_trace t
0360: 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f  o 1 and all opco
0370: 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e  des will be prin
0380: 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61  ted.** as they a
0390: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
03a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65  instruction stre
03b0: 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  am..*/.#ifndef N
03c0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
03d0: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
03e0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0400: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
0410: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0420: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0430: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 20 2a  eCreate(sqlite *
0440: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
0450: 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c    p = sqliteMall
0460: 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29  oc( sizeof(Vdbe)
0470: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
0480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
0490: 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64  db = db;.  if( d
04a0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
04b0: 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76  db->pVdbe->pPrev
04c0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70   = p;.  }.  p->p
04d0: 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65  Next = db->pVdbe
04e0: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
04f0: 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20  ;.  db->pVdbe = 
0500: 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  p;.  p->magic = 
0510: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
0520: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0530: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69  /*.** Turn traci
0540: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a  ng on or off.*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46  Trace(Vdbe *p, F
0570: 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70  ILE *trace){.  p
0580: 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b  ->trace = trace;
0590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
05a0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
05b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
05c0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
05d0: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
05e0: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
05f0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0600: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0610: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0630: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0640: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0650: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0660: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0670: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0680: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0690: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
06a0: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
06b0: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
06c0: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
06d0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
06e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
06f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0700: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0710: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0720: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0730: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0740: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0750: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0770: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0780: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0790: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
07a0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
07b0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
07c0: 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20  p;.  p->nOp++;. 
07d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
07e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
07f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
0800: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20  ->nOpAlloc ){.  
0810: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0820: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
0830: 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70   Op *aNew;.    p
0840: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
0850: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30  nOpAlloc*2 + 100
0860: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
0870: 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f  iteRealloc(p->aO
0880: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73  p, p->nOpAlloc*s
0890: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
08a0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
08b0: 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63       p->nOpAlloc
08c0: 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20   = oldSize;.    
08d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
08e0: 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61  }.    p->aOp = a
08f0: 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  New;.    memset(
0900: 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d  &p->aOp[oldSize]
0910: 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  , 0, (p->nOpAllo
0920: 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f  c-oldSize)*sizeo
0930: 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 70 4f  f(Op));.  }.  pO
0940: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
0950: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
0960: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  op;.  pOp->p1 = 
0970: 70 31 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26  p1;.  if( p2<0 &
0980: 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61  & (-1-p2)<p->nLa
0990: 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  bel && p->aLabel
09a0: 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20  [-1-p2]>=0 ){.  
09b0: 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c    p2 = p->aLabel
09c0: 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70  [-1-p2];.  }.  p
09d0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
09e0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f  Op->p3 = 0;.  pO
09f0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
0a00: 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20  OTUSED;.#ifndef 
0a10: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
0a20: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
0a30: 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56  trace ) sqlite3V
0a40: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0a50: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65   &p->aOp[i]);.#e
0a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
0a80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
0a90: 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c  ludes the p3 val
0aa0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0ab0: 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a  e3VdbeOp3(Vdbe *
0ac0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0ad0: 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74  1, int p2, const
0ae0: 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20   char *zP3, int 
0af0: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
0b00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
0b10: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
0b20: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
0b30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
0b40: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
0b50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
0b60: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
0b70: 6d 75 6c 74 69 70 6c 65 20 6f 70 63 6f 64 65 73  multiple opcodes
0b80: 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
0b90: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
0ba0: 6f 70 63 6f 64 65 20 6f 66 20 30 2e 0a 2a 2f 0a  opcode of 0..*/.
0bb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
0bc0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 2e 2e 2e  ode(Vdbe *p, ...
0bd0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
0be0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
0bf0: 6e 74 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 70  nt opcode, p1, p
0c00: 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
0c10: 2c 20 70 29 3b 0a 20 20 61 64 64 72 20 3d 20 70  , p);.  addr = p
0c20: 2d 3e 6e 4f 70 3b 0a 20 20 77 68 69 6c 65 28 20  ->nOp;.  while( 
0c30: 28 6f 70 63 6f 64 65 20 3d 20 76 61 5f 61 72 67  (opcode = va_arg
0c40: 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 7b 0a  (ap,int))!=0 ){.
0c50: 20 20 20 20 70 31 20 3d 20 76 61 5f 61 72 67 28      p1 = va_arg(
0c60: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 70 32 20  ap,int);.    p2 
0c70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
0c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0c90: 65 41 64 64 4f 70 28 70 2c 20 6f 70 63 6f 64 65  eAddOp(p, opcode
0ca0: 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 7d 0a 20  , p1, p2);.  }. 
0cb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
0cc0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 0a  eturn addr;.}...
0cd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0ce0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
0cf0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
0d00: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
0d10: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
0d20: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
0d30: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
0d40: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
0d50: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
0d60: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
0d70: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
0d80: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
0d90: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
0da0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
0db0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
0dc0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
0dd0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
0de0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
0df0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
0e00: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
0e10: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
0e20: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
0e30: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
0e40: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
0e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
0e60: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
0e70: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0e80: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
0e90: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
0ea0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
0eb0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
0ec0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
0ed0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
0ee0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
0ef0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
0f00: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
0f10: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69  e resolved..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
0f30: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
0f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
0f50: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
0f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0f80: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
0f90: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
0fa0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
0fb0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fc0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fd0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 61  oc*2 + 10;.    a
0fe0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0ff0: 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65 6c 2c 20  loc( p->aLabel, 
1000: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
1010: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1020: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
1030: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
1040: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
1050: 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bel);.    }.    
1060: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 61 4e 65 77  p->aLabel = aNew
1070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
1080: 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Label==0 ){.    
1090: 70 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  p->nLabel = 0;. 
10a0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
10b0: 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  c = 0;.    retur
10c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c  n 0;.  }.  p->aL
10d0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
10e0: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
10f0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1100: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1110: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1120: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1130: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1140: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1150: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1160: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1170: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1180: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1190: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
11a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
11d0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
11e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
11f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1200: 0a 20 20 69 66 28 20 78 3c 30 20 26 26 20 28 2d  .  if( x<0 && (-
1210: 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65 6c 20 26 26  x)<=p->nLabel &&
1220: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 69   p->aOp ){.    i
1230: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d  f( p->aLabel[-1-
1240: 78 5d 3d 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74  x]==p->nOp ) ret
1250: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
1260: 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d   p->aLabel[-1-x]
1270: 3c 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4c 61  <0 );.    p->aLa
1280: 62 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e  bel[-1-x] = p->n
1290: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  Op;.    for(j=0;
12a0: 20 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b   j<p->nOp; j++){
12b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  .      if( p->aO
12c0: 70 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e  p[j].p2==x ) p->
12d0: 61 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e  aOp[j].p2 = p->n
12e0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Op;.    }.  }.}.
12f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1300: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1310: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1320: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
1330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1350: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
1360: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1370: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1380: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
13a0: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
13b0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
13c0: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
13d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
13e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
13f0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
1400: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
1410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
1420: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
1430: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
1440: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
1450: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
1460: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1470: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1480: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
1490: 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  Op >= p->nOpAllo
14a0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
14b0: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
14c0: 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77  oc;.    Op *aNew
14d0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
14e0: 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c = p->nOpAlloc*
14f0: 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20  2 + nOp + 10;.  
1500: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
1510: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70  ealloc(p->aOp, p
1520: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
1530: 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  f(Op));.    if( 
1540: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
1550: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f   p->nOpAlloc = o
1560: 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 65  ldSize;.      re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1580: 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b    p->aOp = aNew;
1590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  .    memset(&p->
15a0: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
15b0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
15c0: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
15d0: 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  ));.  }.  addr =
15e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
15f0: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
1600: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
1610: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
1620: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
1630: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
1640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
1650: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
1660: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
1670: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
1680: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
1690: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
16a0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
16b0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
16c0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
16d0: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
16e0: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
16f0: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
1700: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
1710: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
1720: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
1730: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
1740: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
1760: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
1770: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1780: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1790: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
17a0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
17b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
17c0: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
17d0: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
17e0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
17f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1800: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
1810: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1820: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1840: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1850: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1860: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1870: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1880: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1890: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
18a0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
18b0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
18c0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
18d0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
18e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
18f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1900: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1910: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1920: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1930: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
1940: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
1950: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
1960: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
1970: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
1980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
1990: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
19a0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
19b0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
19c0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
19d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
19e0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
19f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
1a00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1a10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
1a20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1a30: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1a40: 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b  ssert( val>=0 );
1a50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1a60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1a70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
1a80: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
1a90: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
1aa0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
1ab0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
1ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1ad0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1ae0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
1af0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b20: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1b30: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1b40: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1b50: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1b60: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1b70: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
1b80: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
1b90: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
1ba0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
1bb0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
1bc0: 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70  0 then the P3 op
1bd0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
1be0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
1bf0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
1c00: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
1c10: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1c20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1c30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
1c40: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
1c50: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
1c60: 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP3 up to and in
1c70: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
1c80: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
1c90: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
1ca0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
1cb0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P3..**.** If n==
1cc0: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
1cd0: 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20  ans that zP3 is 
1ce0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
1cf0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
1d00: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
1d10: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
1d20: 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e 3d 3d 50  e pointer.  n==P
1d30: 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61 6e 73 20  3_POINTER means 
1d40: 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e  zP3 is.** a poin
1d50: 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f 62 6a 65  ter to some obje
1d60: 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ct other than a 
1d70: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  string..**.** If
1d80: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
1d90: 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f  nge P3 on the mo
1da0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
1db0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
1dc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dd0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
1de0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33   const char *zP3
1e00: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
1e10: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
1e20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1e30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1e40: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  ( p==0 || p->aOp
1e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e60: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
1e70: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
1e80: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
1e90: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
1ea0: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
1eb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
1ec0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70  p[addr];.  if( p
1ed0: 4f 70 2d 3e 70 33 20 26 26 20 70 4f 70 2d 3e 70  Op->p3 && pOp->p
1ee0: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49  3type==P3_DYNAMI
1ef0: 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  C ){.    sqliteF
1f00: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  ree(pOp->p3);.  
1f10: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
1f20: 20 7d 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20   }.  if( zP3==0 
1f30: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
1f40: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74   0;.    pOp->p3t
1f50: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
1f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
1f70: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
1f80: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
1f90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
1fa0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   n;.  }else{.   
1fb0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
1fc0: 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50 33  ng(&pOp->p3, zP3
1fd0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f 70  , n, 0);.    pOp
1fe0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
1ff0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
2000: 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70  .** If the P3 op
2010: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65  erand to the spe
2020: 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69  cified instructi
2030: 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f  on appears.** to
2040: 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72   be a quoted str
2050: 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  ing token, then 
2060: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  this procedure r
2070: 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71  emoves .** the q
2080: 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uotes..**.** The
2090: 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f   quoting operato
20a0: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
20b0: 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28  a grave ascent (
20c0: 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f  ASCII 0x27).** o
20d0: 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  r a double quote
20e0: 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49   character (ASCI
20f0: 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75  I 0x22).  Two qu
2100: 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a  otes in a row.**
2110: 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61   resolve to be a
2120: 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71   single actual q
2130: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
2140: 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67  ithin the string
2150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2160: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  3VdbeDequoteP3(V
2170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2180: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
2190: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
21a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
21b0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
21c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
21d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
21e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
21f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
2200: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
2210: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
2220: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
2230: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20  Op[addr];.  if( 
2240: 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
2250: 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65  p->p3[0]==0 ) re
2260: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d  turn;.  if( pOp-
2270: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
2280: 54 45 52 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  TER ) return;.  
2290: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21  if( pOp->p3type!
22a0: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
22b0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c     pOp->p3 = sql
22c0: 69 74 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70  iteStrDup(pOp->p
22d0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  3);.    pOp->p3t
22e0: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
22f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
2300: 65 71 75 6f 74 65 28 70 4f 70 2d 3e 70 33 29 3b  equote(pOp->p3);
2310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65  .}../*.** On the
2320: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P3 argument of 
2330: 74 68 65 20 67 69 76 65 6e 20 69 6e 73 74 72 75  the given instru
2340: 63 74 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61 6c  ction, change al
2350: 6c 0a 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66 20  l.** strings of 
2360: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
2370: 63 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  cters into a sin
2380: 67 6c 65 20 73 70 61 63 65 20 61 6e 64 0a 2a 2a  gle space and.**
2390: 20 64 65 6c 65 74 65 20 6c 65 61 64 69 6e 67 20   delete leading 
23a0: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
23b0: 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64  tespace..*/.void
23c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
23d0: 72 65 73 73 53 70 61 63 65 28 56 64 62 65 20 2a  ressSpace(Vdbe *
23e0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2400: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2410: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
2420: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2430: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2440: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2450: 7c 7c 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  || addr<0 || add
2460: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75  r>=p->nOp ) retu
2470: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
2480: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
2490: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
24a0: 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
24b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
24c0: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21 3d 50  ( pOp->p3type!=P
24d0: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
24e0: 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74   pOp->p3 = sqlit
24f0: 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29  eStrDup(pOp->p3)
2500: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2510: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
2520: 20 20 7d 0a 20 20 7a 20 3d 20 28 75 6e 73 69 67    }.  z = (unsig
2530: 6e 65 64 20 63 68 61 72 2a 29 70 4f 70 2d 3e 70  ned char*)pOp->p
2540: 33 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  3;.  if( z==0 ) 
2550: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 6a 20  return;.  i = j 
2560: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
2570: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
2580: 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ++; }.  while( z
2590: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 69  [i] ){.    if( i
25a0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
25b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
25c0: 20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ';.      while(
25d0: 20 69 73 73 70 61 63 65 28 7a 5b 2b 2b 69 5d 29   isspace(z[++i])
25e0: 20 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ){}.    }else{.
25f0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
2600: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2610: 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26  .  while( j>0 &&
2620: 20 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   isspace(z[j-1])
2630: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a   ){ j--; }.  z[j
2640: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2650: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  Search for the c
2660: 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 20 66  urrent program f
2670: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 6f 70 63  or the given opc
2680: 6f 64 65 20 61 6e 64 20 50 32 0a 2a 2a 20 76 61  ode and P2.** va
2690: 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  lue.  Return the
26a0: 20 61 64 64 72 65 73 73 20 70 6c 75 73 20 31 20   address plus 1 
26b0: 69 66 20 66 6f 75 6e 64 20 61 6e 64 20 30 20 69  if found and 0 i
26c0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
26d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
26e0: 69 6e 64 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  indOp(Vdbe *p, i
26f0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 32 29 7b 0a  nt op, int p2){.
2700: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
2710: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2720: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2740: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nOp; i++){.    i
2750: 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  f( p->aOp[i].opc
2760: 6f 64 65 3d 3d 6f 70 20 26 26 20 70 2d 3e 61 4f  ode==op && p->aO
2770: 70 5b 69 5d 2e 70 32 3d 3d 70 32 20 29 20 72 65  p[i].p2==p2 ) re
2780: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20  turn i+1;.  }.  
2790: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
27b0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
27c0: 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62   address..*/.Vdb
27d0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
27e0: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
27f0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
2800: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2810: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2820: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
2830: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
2840: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 26 70  p );.  return &p
2850: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a  ->aOp[addr];.}..
2860: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2870: 69 6e 67 20 67 72 6f 75 70 20 6f 72 20 72 6f 75  ing group or rou
2880: 74 69 6e 65 73 20 61 72 65 20 65 6d 70 6c 6f 79  tines are employ
2890: 65 64 20 62 79 20 69 6e 73 74 61 6c 6c 61 62 6c  ed by installabl
28a0: 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  e functions.** t
28b0: 6f 20 72 65 74 75 72 6e 20 74 68 65 69 72 20 72  o return their r
28c0: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  esults..**.** Th
28d0: 65 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  e sqlite3_set_re
28e0: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 72 6f  sult_string() ro
28f0: 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
2900: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 74  d to return a st
2910: 72 69 6e 67 0a 2a 2a 20 76 61 6c 75 65 20 6f 72  ring.** value or
2920: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 4e 55 4c   to return a NUL
2930: 4c 2e 20 20 54 6f 20 72 65 74 75 72 6e 20 61 20  L.  To return a 
2940: 4e 55 4c 4c 2c 20 70 61 73 73 20 69 6e 20 4e 55  NULL, pass in NU
2950: 4c 4c 20 66 6f 72 20 7a 52 65 73 75 6c 74 2e 0a  LL for zResult..
2960: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
2970: 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  e of the string 
2980: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
2990: 69 6e 65 20 72 65 74 75 72 6e 73 20 73 6f 20 69  ine returns so i
29a0: 74 20 69 73 20 73 61 66 65 0a 2a 2a 20 74 6f 20  t is safe.** to 
29b0: 70 61 73 73 20 69 6e 20 61 6e 20 65 70 68 65 6d  pass in an ephem
29c0: 65 72 61 6c 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  eral string..**.
29d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72  ** sqlite3_set_r
29e0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20 77 6f  esult_error() wo
29f0: 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  rks like sqlite3
2a00: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
2a10: 6e 67 28 29 20 65 78 63 65 70 74 0a 2a 2a 20 74  ng() except.** t
2a20: 68 61 74 20 69 74 20 73 69 67 6e 61 6c 73 20 61  hat it signals a
2a30: 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20 54   fatal error.  T
2a40: 68 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  he string argume
2a50: 6e 74 2c 20 69 66 20 61 6e 79 2c 20 69 73 20 74  nt, if any, is t
2a60: 68 65 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  he.** error mess
2a70: 61 67 65 2e 20 20 49 66 20 74 68 65 20 61 72 67  age.  If the arg
2a80: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 20 61 20  ument is NULL a 
2a90: 67 65 6e 65 72 69 63 20 73 75 62 73 74 69 74 75  generic substitu
2aa0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ab0: 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  .** is used..**.
2ac0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  ** The sqlite3_s
2ad0: 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 29 20  et_result_int() 
2ae0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  and sqlite3_set_
2af0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 29 20  result_double() 
2b00: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 0a 2a  set the return.*
2b10: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 75  * value of the u
2b20: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ser function to 
2b30: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20  an integer or a 
2b40: 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  double..**.** Th
2b50: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
2b60: 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e   defined here in
2b70: 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20   vdbe.c because 
2b80: 74 68 65 79 20 64 65 70 65 6e 64 20 6f 6e 20 6b  they depend on k
2b90: 6e 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e  nowing.** the in
2ba0: 74 65 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73  ternals of the s
2bb0: 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63  qlite_func struc
2bc0: 74 75 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e  ture which is on
2bd0: 6c 79 20 64 65 66 69 6e 65 64 20 69 6e 20 0a 2a  ly defined in .*
2be0: 2a 20 74 68 69 73 20 73 6f 75 72 63 65 20 66 69  * this source fi
2bf0: 6c 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  le..*/.char *sql
2c00: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2c10: 73 74 72 69 6e 67 28 73 71 6c 69 74 65 5f 66 75  string(sqlite_fu
2c20: 6e 63 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  nc *p, const cha
2c30: 72 20 2a 7a 52 65 73 75 6c 74 2c 20 69 6e 74 20  r *zResult, int 
2c40: 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 70  n){.  assert( !p
2c50: 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20 69 66  ->isStep );.  if
2c60: 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26 20 4d  ( p->s.flags & M
2c70: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 73 71  EM_Dyn ){.    sq
2c80: 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e 7a 29  liteFree(p->s.z)
2c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 73  ;.  }.  if( zRes
2ca0: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ult==0 ){.    p-
2cb0: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  >s.flags = MEM_N
2cc0: 75 6c 6c 3b 0a 20 20 20 20 6e 20 3d 20 30 3b 0a  ull;.    n = 0;.
2cd0: 20 20 20 20 70 2d 3e 73 2e 7a 20 3d 20 30 3b 0a      p->s.z = 0;.
2ce0: 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20 30 3b 0a      p->s.n = 0;.
2cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2d00: 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65   n<0 ) n = strle
2d10: 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  n(zResult);.    
2d20: 69 66 28 20 6e 3c 4e 42 46 53 2d 31 20 29 7b 0a  if( n<NBFS-1 ){.
2d30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
2d40: 73 2e 7a 53 68 6f 72 74 2c 20 7a 52 65 73 75 6c  s.zShort, zResul
2d50: 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  t, n);.      p->
2d60: 73 2e 7a 53 68 6f 72 74 5b 6e 5d 20 3d 20 30 3b  s.zShort[n] = 0;
2d70: 0a 20 20 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67  .      p->s.flag
2d80: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
2d90: 4d 5f 53 68 6f 72 74 3b 0a 20 20 20 20 20 20 70  M_Short;.      p
2da0: 2d 3e 73 2e 7a 20 3d 20 70 2d 3e 73 2e 7a 53 68  ->s.z = p->s.zSh
2db0: 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ort;.    }else{.
2dc0: 20 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d 20 73        p->s.z = s
2dd0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2de0: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  n+1 );.      if(
2df0: 20 70 2d 3e 73 2e 7a 20 29 7b 0a 20 20 20 20 20   p->s.z ){.     
2e00: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 73 2e 7a     memcpy(p->s.z
2e10: 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a 20  , zResult, n);. 
2e20: 20 20 20 20 20 20 20 70 2d 3e 73 2e 7a 5b 6e 5d         p->s.z[n]
2e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2e40: 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20 3d      p->s.flags =
2e50: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 44   MEM_Str | MEM_D
2e60: 79 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  yn;.    }.    p-
2e70: 3e 73 2e 6e 20 3d 20 6e 2b 31 3b 0a 20 20 7d 0a  >s.n = n+1;.  }.
2e80: 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 2e 7a 3b    return p->s.z;
2e90: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  .}.void sqlite3_
2ea0: 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 73  set_result_int(s
2eb0: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 69  qlite_func *p, i
2ec0: 6e 74 20 69 52 65 73 75 6c 74 29 7b 0a 20 20 61  nt iResult){.  a
2ed0: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2ee0: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2ef0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2f10: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2f20: 20 70 2d 3e 73 2e 69 20 3d 20 69 52 65 73 75 6c   p->s.i = iResul
2f30: 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20  t;.  p->s.flags 
2f40: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 7d 0a 76 6f 69  = MEM_Int;.}.voi
2f50: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  d sqlite3_set_re
2f60: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 73 71 6c 69  sult_double(sqli
2f70: 74 65 5f 66 75 6e 63 20 2a 70 2c 20 64 6f 75 62  te_func *p, doub
2f80: 6c 65 20 72 52 65 73 75 6c 74 29 7b 0a 20 20 61  le rResult){.  a
2f90: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2fa0: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2fb0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2fd0: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2fe0: 20 70 2d 3e 73 2e 72 20 3d 20 72 52 65 73 75 6c   p->s.r = rResul
2ff0: 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20  t;.  p->s.flags 
3000: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a 76 6f  = MEM_Real;.}.vo
3010: 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72  id sqlite3_set_r
3020: 65 73 75 6c 74 5f 65 72 72 6f 72 28 73 71 6c 69  esult_error(sqli
3030: 74 65 5f 66 75 6e 63 20 2a 70 2c 20 63 6f 6e 73  te_func *p, cons
3040: 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c 20 69 6e  t char *zMsg, in
3050: 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t n){.  assert( 
3060: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
3070: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
3080: 6c 74 5f 73 74 72 69 6e 67 28 70 2c 20 7a 4d 73  lt_string(p, zMs
3090: 67 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 45 72  g, n);.  p->isEr
30a0: 72 6f 72 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ror = 1;.}../*.*
30b0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 75 73  * Extract the us
30c0: 65 72 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73  er data from a s
30d0: 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63  qlite_func struc
30e0: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
30f0: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
3100: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  it..*/.void *sql
3110: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 73  ite3_user_data(s
3120: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b 0a  qlite_func *p){.
3130: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
3140: 2d 3e 70 46 75 6e 63 20 29 3b 0a 20 20 72 65 74  ->pFunc );.  ret
3150: 75 72 6e 20 70 2d 3e 70 46 75 6e 63 2d 3e 70 55  urn p->pFunc->pU
3160: 73 65 72 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  serData;.}../*.*
3170: 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 72 65  * Allocate or re
3180: 74 75 72 6e 20 74 68 65 20 61 67 67 72 65 67 61  turn the aggrega
3190: 74 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 61  te context for a
31a0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20   user function. 
31b0: 20 41 20 6e 65 77 0a 2a 2a 20 63 6f 6e 74 65 78   A new.** contex
31c0: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t is allocated o
31d0: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
31e0: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  .  Subsequent ca
31f0: 6c 6c 73 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  lls return the.*
3200: 2a 20 73 61 6d 65 20 63 6f 6e 74 65 78 74 20 74  * same context t
3210: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
3220: 20 6f 6e 20 70 72 69 6f 72 20 63 61 6c 6c 73 2e   on prior calls.
3230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3240: 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20 68  ine is defined h
3250: 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65  ere in vdbe.c be
3260: 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64 73  cause it depends
3270: 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74   on knowing.** t
3280: 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20  he internals of 
3290: 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20  the sqlite_func 
32a0: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
32b0: 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20  is only defined 
32c0: 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  in.** this sourc
32d0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
32e0: 2a 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  *sqlite3_aggrega
32f0: 74 65 5f 63 6f 6e 74 65 78 74 28 73 71 6c 69 74  te_context(sqlit
3300: 65 5f 66 75 6e 63 20 2a 70 2c 20 69 6e 74 20 6e  e_func *p, int n
3310: 42 79 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Byte){.  assert(
3320: 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20 26   p && p->pFunc &
3330: 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65  & p->pFunc->xSte
3340: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 41  p );.  if( p->pA
3350: 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  gg==0 ){.    if(
3360: 20 6e 42 79 74 65 3c 3d 4e 42 46 53 20 29 7b 0a   nByte<=NBFS ){.
3370: 20 20 20 20 20 20 70 2d 3e 70 41 67 67 20 3d 20        p->pAgg = 
3380: 28 76 6f 69 64 2a 29 70 2d 3e 73 2e 7a 3b 0a 20  (void*)p->s.z;. 
3390: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70       memset(p->p
33a0: 41 67 67 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Agg, 0, nByte);.
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 70 2d 3e 70 41 67 67 20 3d 20 73 71 6c 69 74   p->pAgg = sqlit
33d0: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
33e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
33f0: 74 75 72 6e 20 70 2d 3e 70 41 67 67 3b 0a 7d 0a  turn p->pAgg;.}.
3400: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3410: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
3420: 73 20 74 68 65 20 53 74 65 70 20 66 75 6e 63 74  s the Step funct
3430: 69 6f 6e 20 6f 66 20 61 20 61 67 67 72 65 67 61  ion of a aggrega
3440: 74 65 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a 20  te has been .** 
3450: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
3470: 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20 76 64  fined here in vd
3480: 62 65 2e 63 20 62 65 63 61 75 73 65 20 69 74 20  be.c because it 
3490: 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f 77 69  depends on knowi
34a0: 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  ng.** the intern
34b0: 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  als of the sqlit
34c0: 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72 65  e_func structure
34d0: 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20 64   which is only d
34e0: 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69  efined in.** thi
34f0: 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a  s source file..*
3500: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 67  /.int sqlite3_ag
3510: 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 73 71  gregate_count(sq
3520: 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b 0a 20  lite_func *p){. 
3530: 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
3540: 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46 75  >pFunc && p->pFu
3550: 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20 72  nc->xStep );.  r
3560: 65 74 75 72 6e 20 70 2d 3e 63 6e 74 3b 0a 7d 0a  eturn p->cnt;.}.
3570: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
3580: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
3590: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 2f  (VDBE_PROFILE)./
35a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
35b0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
35c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
35d0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
35e0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
35f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
3600: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
3610: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
3620: 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68   char *zP3;.  ch
3630: 61 72 20 7a 50 74 72 5b 34 30 5d 3b 0a 20 20 69  ar zPtr[40];.  i
3640: 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d  f( pOp->p3type==
3650: 50 33 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  P3_POINTER ){.  
3660: 20 20 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20    sprintf(zPtr, 
3670: 22 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74  "ptr(%#x)", (int
3680: 29 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7a  )pOp->p3);.    z
3690: 50 33 20 3d 20 7a 50 74 72 3b 0a 20 20 7d 65 6c  P3 = zPtr;.  }el
36a0: 73 65 7b 0a 20 20 20 20 7a 50 33 20 3d 20 70 4f  se{.    zP3 = pO
36b0: 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28  p->p3;.  }.  if(
36c0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
36d0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 66 70 72 69  = stdout;.  fpri
36e0: 6e 74 66 28 70 4f 75 74 2c 22 25 34 64 20 25 2d  ntf(pOut,"%4d %-
36f0: 31 32 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e  12s %4d %4d %s\n
3700: 22 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c  ",.      pc, sql
3710: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b  ite3OpcodeNames[
3720: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f  pOp->opcode], pO
3730: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
3740: 7a 50 33 20 3f 20 7a 50 33 20 3a 20 22 22 29 3b  zP3 ? zP3 : "");
3750: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
3760: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3770: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
3780: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
3790: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
37a0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
37b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
37c0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
37d0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
37e0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
37f0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
3800: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
3810: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
3820: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
3830: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
3840: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
3850: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
3860: 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IN"..*/.int sqli
3870: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
3880: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
3890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
38a0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
38b0: 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  ite *db = p->db;
38c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
38d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
38e0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
38f0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 5d 20 3d  zColumnNames[] =
3900: 20 7b 0a 20 20 20 20 20 22 61 64 64 72 22 2c 20   {.     "addr", 
3910: 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
3920: 20 22 70 32 22 2c 20 20 22 70 33 22 2c 20 0a 20   "p2",  "p3", . 
3930: 20 20 20 20 22 69 6e 74 22 2c 20 20 22 74 65 78      "int",  "tex
3940: 74 22 2c 20 20 20 22 69 6e 74 22 2c 20 22 69 6e  t",   "int", "in
3950: 74 22 2c 20 22 74 65 78 74 22 2c 0a 20 20 20 20  t", "text",.    
3960: 20 30 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72   0.  };..  asser
3970: 74 28 20 70 2d 3e 70 6f 70 53 74 61 63 6b 3d 3d  t( p->popStack==
3980: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3990: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 70  ->explain );.  p
39a0: 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 61 7a  ->azColName = az
39b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 3b 0a 20 20 70  ColumnNames;.  p
39c0: 2d 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  ->azResColumn = 
39d0: 70 2d 3e 7a 41 72 67 76 3b 0a 20 20 66 6f 72 28  p->zArgv;.  for(
39e0: 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 20 70  i=0; i<5; i++) p
39f0: 2d 3e 7a 41 72 67 76 5b 69 5d 20 3d 20 70 2d 3e  ->zArgv[i] = p->
3a00: 61 53 74 61 63 6b 5b 69 5d 2e 7a 53 68 6f 72 74  aStack[i].zShort
3a10: 3b 0a 20 20 69 20 3d 20 70 2d 3e 70 63 3b 0a 20  ;.  i = p->pc;. 
3a20: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
3a30: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
3a40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
3a50: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
3a60: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66   }else if( db->f
3a70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3a80: 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 64  terrupt ){.    d
3a90: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3aa0: 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20  ITE_Interrupt;. 
3ab0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63     if( db->magic
3ac0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  !=SQLITE_MAGIC_B
3ad0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  USY ){.      p->
3ae0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
3af0: 53 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SE;.    }else{. 
3b00: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
3b10: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
3b20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51     }.    rc = SQ
3b30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3b40: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
3b50: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71  (&p->zErrMsg, sq
3b60: 6c 69 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69  lite3_error_stri
3b70: 6e 67 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72  ng(p->rc), (char
3b80: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
3b90: 20 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41     sprintf(p->zA
3ba0: 72 67 76 5b 30 5d 2c 22 25 64 22 2c 69 29 3b 0a  rgv[0],"%d",i);.
3bb0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a      sprintf(p->z
3bc0: 41 72 67 76 5b 32 5d 2c 22 25 64 22 2c 20 70 2d  Argv[2],"%d", p-
3bd0: 3e 61 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20  >aOp[i].p1);.   
3be0: 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41 72 67   sprintf(p->zArg
3bf0: 76 5b 33 5d 2c 22 25 64 22 2c 20 70 2d 3e 61 4f  v[3],"%d", p->aO
3c00: 70 5b 69 5d 2e 70 32 29 3b 0a 20 20 20 20 69 66  p[i].p2);.    if
3c10: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79  ( p->aOp[i].p3ty
3c20: 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29  pe==P3_POINTER )
3c30: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
3c40: 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a 53 68  p->aStack[4].zSh
3c50: 6f 72 74 2c 20 22 70 74 72 28 25 23 78 29 22 2c  ort, "ptr(%#x)",
3c60: 20 28 69 6e 74 29 70 2d 3e 61 4f 70 5b 69 5d 2e   (int)p->aOp[i].
3c70: 70 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 41  p3);.      p->zA
3c80: 72 67 76 5b 34 5d 20 3d 20 70 2d 3e 61 53 74 61  rgv[4] = p->aSta
3c90: 63 6b 5b 34 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20  ck[4].zShort;.  
3ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3cb0: 2d 3e 7a 41 72 67 76 5b 34 5d 20 3d 20 70 2d 3e  ->zArgv[4] = p->
3cc0: 61 4f 70 5b 69 5d 2e 70 33 3b 0a 20 20 20 20 7d  aOp[i].p3;.    }
3cd0: 0a 20 20 20 20 70 2d 3e 7a 41 72 67 76 5b 31 5d  .    p->zArgv[1]
3ce0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
3cf0: 4e 61 6d 65 73 5b 70 2d 3e 61 4f 70 5b 69 5d 2e  Names[p->aOp[i].
3d00: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 70 2d 3e  opcode];.    p->
3d10: 70 63 20 3d 20 69 2b 31 3b 0a 20 20 20 20 70 2d  pc = i+1;.    p-
3d20: 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70  >azResColumn = p
3d30: 2d 3e 7a 41 72 67 76 3b 0a 20 20 20 20 70 2d 3e  ->zArgv;.    p->
3d40: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 3b 0a  nResColumn = 5;.
3d50: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
3d60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
3d70: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
3d80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3d90: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
3da0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
3db0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
3dc0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
3dd0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
3de0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
3df0: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
3e00: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
3e10: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
3e20: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
3e30: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
3e40: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
3e50: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
3e60: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
3e70: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
3e80: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
3e90: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
3ea0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
3ed0: 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20    int nVar,     
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f   /* Number of '?
3f00: 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c  ' see in the SQL
3f10: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3f20: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f40: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
3f50: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
3f60: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
3f70: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65    int n;..  asse
3f80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3f90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3fa0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fb0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 20 48  );..  /* Add a H
3fc0: 41 4c 54 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ALT instruction 
3fd0: 74 6f 20 74 68 65 20 76 65 72 79 20 65 6e 64 20  to the very end 
3fe0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  of the program..
3ff0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4f    */.  if( p->nO
4000: 70 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61 4f 70 20  p==0 || (p->aOp 
4010: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
4020: 2d 31 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 48  -1].opcode!=OP_H
4030: 61 6c 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  alt) ){.    sqli
4040: 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c 20  te3VdbeAddOp(p, 
4050: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
4060: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73    }..  /* No ins
4070: 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75  truction ever pu
4080: 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  shes more than a
4090: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20   single element 
40a0: 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74  onto the.  ** st
40b0: 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74  ack.  And the st
40c0: 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20  ack never grows 
40d0: 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78  on successive ex
40e0: 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ecutions of the.
40f0: 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20    ** same loop. 
4100: 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   So the total nu
4110: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
4120: 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72  ions is an upper
4130: 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74   bound.  ** on t
4140: 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b  he maximum stack
4150: 20 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e   depth required.
4160: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  **.  ** Alloc
4170: 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74  ation all the st
4180: 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c  ack space we wil
4190: 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a  l ever need..  *
41a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  /.  if( p->aStac
41b0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  k==0 ){.    p->n
41c0: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
41d0: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
41e0: 29 3b 0a 20 20 20 20 6e 20 3d 20 69 73 45 78 70  );.    n = isExp
41f0: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 70 2d 3e 6e  lain ? 10 : p->n
4200: 4f 70 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63  Op;.    p->aStac
4210: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
4220: 28 0a 20 20 20 20 20 20 6e 2a 28 73 69 7a 65 6f  (.      n*(sizeo
4230: 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20  f(p->aStack[0]) 
4240: 2b 20 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  + 2*sizeof(char*
4250: 29 29 20 20 20 20 20 2f 2a 20 61 53 74 61 63 6b  ))     /* aStack
4260: 20 61 6e 64 20 7a 41 72 67 76 20 2a 2f 0a 20 20   and zArgv */.  
4270: 20 20 20 20 20 20 2b 20 70 2d 3e 6e 56 61 72 2a        + p->nVar*
4280: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 73  (sizeof(char*)+s
4290: 69 7a 65 6f 66 28 69 6e 74 29 2b 31 29 20 20 20  izeof(int)+1)   
42a0: 20 2f 2a 20 61 7a 56 61 72 2c 20 61 6e 56 61 72   /* azVar, anVar
42b0: 2c 20 61 62 56 61 72 20 2a 2f 0a 20 20 20 20 29  , abVar */.    )
42c0: 3b 0a 20 20 20 20 70 2d 3e 7a 41 72 67 76 20 3d  ;.    p->zArgv =
42d0: 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 53 74   (char**)&p->aSt
42e0: 61 63 6b 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61  ack[n];.    p->a
42f0: 7a 43 6f 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  zColName = (char
4300: 2a 2a 29 26 70 2d 3e 7a 41 72 67 76 5b 6e 5d 3b  **)&p->zArgv[n];
4310: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
4320: 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 7a 43 6f  (char**)&p->azCo
4330: 6c 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 20 20 70 2d  lName[n];.    p-
4340: 3e 61 6e 56 61 72 20 3d 20 28 69 6e 74 2a 29 26  >anVar = (int*)&
4350: 70 2d 3e 61 7a 56 61 72 5b 70 2d 3e 6e 56 61 72  p->azVar[p->nVar
4360: 5d 3b 0a 20 20 20 20 70 2d 3e 61 62 56 61 72 20  ];.    p->abVar 
4370: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 6e 56 61 72  = (u8*)&p->anVar
4380: 5b 70 2d 3e 6e 56 61 72 5d 3b 0a 20 20 7d 0a 0a  [p->nVar];.  }..
4390: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
43a0: 74 28 26 70 2d 3e 61 67 67 2e 68 61 73 68 2c 20  t(&p->agg.hash, 
43b0: 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41  SQLITE_HASH_BINA
43c0: 52 59 2c 20 30 29 3b 0a 20 20 70 2d 3e 61 67 67  RY, 0);.  p->agg
43d0: 2e 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 23 69  .pSearch = 0;.#i
43e0: 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  fdef MEMORY_DEBU
43f0: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  G.  if( sqlite3O
4400: 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62  sFileExists("vdb
4410: 65 5f 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20  e_trace") ){.   
4420: 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f   p->trace = stdo
4430: 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ut;.  }.#endif. 
4440: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
4450: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e  Stack[-1];.  p->
4460: 70 63 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 63 20  pc = 0;.  p->rc 
4470: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
4480: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
4490: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
44a0: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
44b0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
44c0: 72 74 3b 0a 20 20 70 2d 3e 75 6e 64 6f 54 72 61  rt;.  p->undoTra
44d0: 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20  nsOnError = 0;. 
44e0: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
44f0: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
4500: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
4510: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
4520: 4d 41 47 49 43 5f 52 55 4e 3b 0a 23 69 66 64 65  MAGIC_RUN;.#ifde
4530: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4540: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
4550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4560: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
4570: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
4580: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
4590: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
45a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
45b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  .}.../*.** Remov
45c0: 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74  e any elements t
45d0: 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68  hat remain on th
45e0: 65 20 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65  e sorter for the
45f0: 20 56 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a   VDBE given..*/.
4600: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4610: 53 6f 72 74 65 72 52 65 73 65 74 28 56 64 62 65  SorterReset(Vdbe
4620: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
4630: 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 53  ->pSort ){.    S
4640: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d  orter *pSorter =
4650: 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70   p->pSort;.    p
4660: 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f 72 74 65  ->pSort = pSorte
4670: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  r->pNext;.    sq
4680: 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72  liteFree(pSorter
4690: 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->zKey);.    sql
46a0: 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d  iteFree(pSorter-
46b0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
46c0: 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 29  iteFree(pSorter)
46d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
46e0: 65 73 65 74 20 61 6e 20 41 67 67 20 73 74 72 75  eset an Agg stru
46f0: 63 74 75 72 65 2e 20 20 44 65 6c 65 74 65 20 61  cture.  Delete a
4700: 6c 6c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  ll its contents.
4710: 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73 74   .**.** For inst
4720: 61 6c 6c 61 62 6c 65 20 61 67 67 72 65 67 61 74  allable aggregat
4730: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 69 66 20  e functions, if 
4740: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
4750: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 63 61  n has been.** ca
4760: 6c 6c 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  lled, make sure 
4770: 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75  the finalizer fu
4780: 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 73 6f 20  nction has also 
4790: 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20 54 68  been called.  Th
47a0: 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 72 20 6d  e.** finalizer m
47b0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 66 72 65  ight need to fre
47c0: 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  e memory that wa
47d0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70  s allocated as p
47e0: 61 72 74 20 6f 66 20 69 74 73 0a 2a 2a 20 70 72  art of its.** pr
47f0: 69 76 61 74 65 20 63 6f 6e 74 65 78 74 2e 20 20  ivate context.  
4800: 49 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  If the finalizer
4810: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61   has not been ca
4820: 6c 6c 65 64 20 79 65 74 2c 20 63 61 6c 6c 20 69  lled yet, call i
4830: 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2f 0a 76 6f 69  t.** now..*/.voi
4840: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67  d sqlite3VdbeAgg
4850: 52 65 73 65 74 28 41 67 67 20 2a 70 41 67 67 29  Reset(Agg *pAgg)
4860: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73  {.  int i;.  Has
4870: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 66 6f 72 28  hElem *p;.  for(
4880: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  p = sqliteHashFi
4890: 72 73 74 28 26 70 41 67 67 2d 3e 68 61 73 68 29  rst(&pAgg->hash)
48a0: 3b 20 70 3b 20 70 20 3d 20 73 71 6c 69 74 65 48  ; p; p = sqliteH
48b0: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
48c0: 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 20   AggElem *pElem 
48d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
48e0: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
48f0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 21 3d 30   pAgg->apFunc!=0
4900: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
4910: 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69   i<pAgg->nMem; i
4920: 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
4930: 70 4d 65 6d 20 3d 20 26 70 45 6c 65 6d 2d 3e 61  pMem = &pElem->a
4940: 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
4950: 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69  ( pAgg->apFunc[i
4960: 5d 20 26 26 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ] && (pMem->flag
4970: 73 20 26 20 4d 45 4d 5f 41 67 67 43 74 78 29 21  s & MEM_AggCtx)!
4980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
4990: 6c 69 74 65 5f 66 75 6e 63 20 63 74 78 3b 0a 20  lite_func ctx;. 
49a0: 20 20 20 20 20 20 20 63 74 78 2e 70 46 75 6e 63         ctx.pFunc
49b0: 20 3d 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b   = pAgg->apFunc[
49c0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e  i];.        ctx.
49d0: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  s.flags = MEM_Nu
49e0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e  ll;.        ctx.
49f0: 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a  pAgg = pMem->z;.
4a00: 20 20 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20          ctx.cnt 
4a10: 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 20  = pMem->i;.     
4a20: 20 20 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20     ctx.isStep = 
4a30: 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 69  0;.        ctx.i
4a40: 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  sError = 0;.    
4a50: 20 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75      (*pAgg->apFu
4a60: 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65  nc[i]->xFinalize
4a70: 29 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20  )(&ctx);.       
4a80: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20   if( pMem->z!=0 
4a90: 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d  && pMem->z!=pMem
4aa0: 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20  ->zShort ){.    
4ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4ac0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
4ad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
4ae0: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 26 20 4d   ctx.s.flags & M
4af0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4b00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 63      sqliteFree(c
4b10: 74 78 2e 73 2e 7a 29 3b 0a 20 20 20 20 20 20 20  tx.s.z);.       
4b20: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
4b30: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4b40: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
4b50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4b60: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d  Mem->z);.      }
4b70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4b80: 65 46 72 65 65 28 70 45 6c 65 6d 29 3b 0a 20 20  eFree(pElem);.  
4b90: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
4ba0: 6c 65 61 72 28 26 70 41 67 67 2d 3e 68 61 73 68  lear(&pAgg->hash
4bb0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4bc0: 70 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20  pAgg->apFunc);. 
4bd0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20   pAgg->apFunc = 
4be0: 30 3b 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72  0;.  pAgg->pCurr
4bf0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d  ent = 0;.  pAgg-
4c00: 3e 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20  >pSearch = 0;.  
4c10: 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  pAgg->nMem = 0;.
4c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4c30: 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69  a keylist.*/.voi
4c40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79  d sqlite3VdbeKey
4c50: 6c 69 73 74 46 72 65 65 28 4b 65 79 6c 69 73 74  listFree(Keylist
4c60: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
4c70: 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74 20   ){.    Keylist 
4c80: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
4c90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  t;.    sqliteFre
4ca0: 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  e(p);.    p = pN
4cb0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
4cc0: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
4cd0: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
4ce0: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
4cf0: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
4d00: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
4d10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4d20: 62 65 43 6c 65 61 6e 75 70 43 75 72 73 6f 72 28  beCleanupCursor(
4d30: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
4d40: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
4d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
4d60: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
4d70: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
4d80: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
4d90: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
4da0: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
4db0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pBt);.  }.  sqli
4dc0: 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74  teFree(pCx->pDat
4dd0: 61 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 78  a);.  memset(pCx
4de0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 75 72 73  , 0, sizeof(Curs
4df0: 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  or));.}../*.** C
4e00: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
4e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e20: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
4e30: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
4e40: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e50: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
4e60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4e70: 65 43 6c 65 61 6e 75 70 43 75 72 73 6f 72 28 26  eCleanupCursor(&
4e80: 70 2d 3e 61 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  p->aCsr[i]);.  }
4e90: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
4ea0: 3e 61 43 73 72 29 3b 0a 20 20 70 2d 3e 61 43 73  >aCsr);.  p->aCs
4eb0: 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 75 72  r = 0;.  p->nCur
4ec0: 73 6f 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sor = 0;.}../*.*
4ed0: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
4ee0: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
4ef0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
4f00: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
4f10: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
4f20: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
4f30: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
4f40: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
4f50: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
4f60: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
4f70: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
4f80: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 7a 56  ables in the azV
4f90: 61 72 69 61 62 6c 65 5b 5d 20 61 72 72 61 79 2e  ariable[] array.
4fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4fb0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
4fc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4fd0: 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20   p->aStack ){.  
4fe0: 20 20 4d 65 6d 20 2a 70 54 6f 73 20 3d 20 70 2d    Mem *pTos = p-
4ff0: 3e 70 54 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65  >pTos;.    while
5000: 28 20 70 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 63  ( pTos>=p->aStac
5010: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  k ){.      if( p
5020: 54 6f 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Tos->flags & MEM
5030: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
5040: 73 71 6c 69 74 65 46 72 65 65 28 70 54 6f 73 2d  sqliteFree(pTos-
5050: 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >z);.      }.   
5060: 20 20 20 70 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d     pTos--;.    }
5070: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70  .    p->pTos = p
5080: 54 6f 73 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  Tos;.  }.  close
5090: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
50a0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
50b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
50c0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
50d0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b      if( p->aMem[
50e0: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  i].flags & MEM_D
50f0: 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  yn ){.        sq
5100: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d  liteFree(p->aMem
5110: 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  [i].z);.      }.
5120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5130: 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b  teFree(p->aMem);
5140: 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a  .  p->aMem = 0;.
5150: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20    p->nMem = 0;. 
5160: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
5170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5180: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70  KeylistFree(p->p
5190: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  List);.    p->pL
51a0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ist = 0;.  }.  s
51b0: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
51c0: 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20  Reset(p);.  if( 
51d0: 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  p->pFile ){.    
51e0: 69 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74  if( p->pFile!=st
51f0: 64 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e  din ) fclose(p->
5200: 70 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70  pFile);.    p->p
5210: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
5220: 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29  if( p->azField )
5230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5240: 28 70 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20  (p->azField);.  
5250: 20 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30    p->azField = 0
5260: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c  ;.  }.  p->nFiel
5270: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  d = 0;.  if( p->
5280: 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  zLine ){.    sql
5290: 69 74 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65  iteFree(p->zLine
52a0: 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20  );.    p->zLine 
52b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c  = 0;.  }.  p->nL
52c0: 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ineAlloc = 0;.  
52d0: 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65  sqlite3VdbeAggRe
52e0: 73 65 74 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20  set(&p->agg);.  
52f0: 69 66 28 20 70 2d 3e 61 53 65 74 20 29 7b 0a 20  if( p->aSet ){. 
5300: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5310: 3e 6e 53 65 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSet; i++){.   
5320: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
5330: 65 61 72 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e  ear(&p->aSet[i].
5340: 68 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hash);.    }.  }
5350: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
5360: 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e 61 53 65  >aSet);.  p->aSe
5370: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53 65 74  t = 0;.  p->nSet
5380: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6b   = 0;.  if( p->k
5390: 65 79 6c 69 73 74 53 74 61 63 6b 20 29 7b 0a 20  eylistStack ){. 
53a0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
53b0: 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20  or(ii = 0; ii < 
53c0: 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44  p->keylistStackD
53d0: 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  epth; ii++){.   
53e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65     sqlite3VdbeKe
53f0: 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 6b 65 79  ylistFree(p->key
5400: 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d 29 3b 0a  listStack[ii]);.
5410: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5420: 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53  Free(p->keylistS
5430: 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65  tack);.    p->ke
5440: 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20  ylistStackDepth 
5450: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c  = 0;.    p->keyl
5460: 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  istStack = 0;.  
5470: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
5480: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b  ->contextStack);
5490: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
54a0: 63 6b 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ck = 0;.  sqlite
54b0: 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29  Free(p->zErrMsg)
54c0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
54d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
54e0: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
54f0: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
5500: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
5510: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
5520: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
5530: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
5540: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
5550: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
5560: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
5570: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
5580: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
5590: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
55a0: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
55b0: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74  ** again..*/.int
55c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
55d0: 74 28 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20  t(Vdbe *p, char 
55e0: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73  **pzErrMsg){.  s
55f0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64  qlite *db = p->d
5600: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  b;.  int i;..  i
5610: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
5620: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
5630: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
5640: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
5650: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
5660: 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  (pzErrMsg, sqlit
5670: 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  e3_error_string(
5680: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c 20  SQLITE_MISUSE), 
5690: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
56a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
56b0: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  USE;.  }.  if( p
56c0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
56d0: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 26 26   if( pzErrMsg &&
56e0: 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b   *pzErrMsg==0 ){
56f0: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  .      *pzErrMsg
5700: 20 3d 20 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20   = p->zErrMsg;. 
5710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5720: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45  sqliteFree(p->zE
5730: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
5740: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
5750: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5760: 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >rc ){.    sqlit
5770: 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  e3SetString(pzEr
5780: 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
5790: 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72 63  ror_string(p->rc
57a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
57b0: 7d 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  }.  Cleanup(p);.
57c0: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
57d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77  ITE_OK ){.    sw
57e0: 69 74 63 68 28 20 70 2d 3e 65 72 72 6f 72 41 63  itch( p->errorAc
57f0: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 63 61  tion ){.      ca
5800: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 7b 0a 20  se OE_Abort: {. 
5810: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 75         if( !p->u
5820: 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20  ndoTransOnError 
5830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
5840: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
5850: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5860: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
5870: 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ].pBt ){.       
5880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
5890: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
58a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
58b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
58c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
58d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
58f0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   Fall through to
5900: 20 52 4f 4c 4c 42 41 43 4b 20 2a 2f 0a 20 20 20   ROLLBACK */.   
5910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5920: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20  OE_Rollback: {. 
5930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
5940: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
5950: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
5960: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
5970: 61 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  ans;.        db-
5980: 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65  >onError = OE_De
5990: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 62  fault;.        b
59a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
59b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
59c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75 6e         if( p->un
59d0: 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29  doTransOnError )
59e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
59f0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
5a00: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
5a10: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
5a20: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20  TE_InTrans;.    
5a30: 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f        db->onErro
5a40: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
5a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5a60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5a70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5a80: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
5a90: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
5aa0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
5ab0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5ac0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
5ad0: 5d 2e 70 42 74 20 26 26 20 64 62 2d 3e 61 44 62  ].pBt && db->aDb
5ae0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 3d 3d 32 20 29  [i].inTrans==2 )
5af0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
5b00: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 64  treeCommitStmt(d
5b10: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
5b20: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
5b30: 2e 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20  .inTrans = 1;.  
5b40: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5b50: 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53  ( p->pTos<&p->aS
5b60: 74 61 63 6b 5b 70 2d 3e 70 63 5d 20 7c 7c 20 73  tack[p->pc] || s
5b70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
5b80: 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65  iled==1 );.#ifde
5b90: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
5ba0: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
5bb0: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
5bc0: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
5bd0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
5be0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
5bf0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5c00: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
5c10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5c20: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
5c30: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
5c40: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
5c50: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
5c60: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
5c70: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
5c80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5c90: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5ca0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5cb0: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
5cc0: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
5cd0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
5ce0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
5cf0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
5d00: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
5d10: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
5d20: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
5d30: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
5d40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
5d50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5d60: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
5d70: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
5d80: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
5d90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5da0: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
5db0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
5dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
5dd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
5de0: 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
5df0: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
5e00: 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
5e10: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
5e20: 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
5e30: 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
5e40: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
5e50: 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
5e60: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
5e70: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5e80: 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a  Vdbe *p, char **
5e90: 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74  pzErrMsg){.  int
5ea0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   rc;.  sqlite *d
5eb0: 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  b;..  if( p->mag
5ec0: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
5ed0: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d  UN && p->magic!=
5ee0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
5ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
5f00: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
5f10: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72 5f  , sqlite3_error_
5f20: 73 74 72 69 6e 67 28 53 51 4c 49 54 45 5f 4d 49  string(SQLITE_MI
5f30: 53 55 53 45 29 2c 20 28 63 68 61 72 2a 29 30 29  SUSE), (char*)0)
5f40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5f50: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
5f60: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5f70: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
5f80: 52 65 73 65 74 28 70 2c 20 70 7a 45 72 72 4d 73  Reset(p, pzErrMs
5f90: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  g);.  sqlite3Vdb
5fa0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 69 66  eDelete(p);.  if
5fb0: 28 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c  ( db->want_to_cl
5fc0: 6f 73 65 20 26 26 20 64 62 2d 3e 70 56 64 62 65  ose && db->pVdbe
5fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5fe0: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
5ff0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6000: 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20  TE_SCHEMA ){.   
6010: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
6020: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
6030: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
6040: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
6050: 74 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  t the values of 
6060: 61 6c 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20  all variables.  
6070: 56 61 72 69 61 62 6c 65 20 24 31 20 69 6e 20 74  Variable $1 in t
6080: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
6090: 77 69 6c 6c 0a 2a 2a 20 62 65 20 74 68 65 20 73  will.** be the s
60a0: 74 72 69 6e 67 20 61 7a 56 61 6c 75 65 5b 30 5d  tring azValue[0]
60b0: 2e 20 20 24 32 20 77 69 6c 6c 20 68 61 76 65 20  .  $2 will have 
60c0: 74 68 65 20 76 61 6c 75 65 20 61 7a 56 61 6c 75  the value azValu
60d0: 65 5b 31 5d 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f  e[1].  And.** so
60e0: 20 66 6f 72 74 68 2e 20 20 49 66 20 61 20 76 61   forth.  If a va
60f0: 6c 75 65 20 69 73 20 6f 75 74 20 6f 66 20 72 61  lue is out of ra
6100: 6e 67 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  nge (for example
6110: 20 24 33 20 77 68 65 6e 20 6e 56 61 6c 75 65 3d   $3 when nValue=
6120: 3d 32 29 0a 2a 2a 20 74 68 65 6e 20 69 74 73 20  =2).** then its 
6130: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 4e 55  value will be NU
6140: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
6150: 6f 75 74 69 6e 65 20 6f 76 65 72 72 69 64 65 73  outine overrides
6160: 20 61 6e 79 20 70 72 69 6f 72 20 63 61 6c 6c 2e   any prior call.
6170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6180: 62 69 6e 64 28 73 71 6c 69 74 65 5f 76 6d 20 2a  bind(sqlite_vm *
6190: 70 56 6d 2c 20 69 6e 74 20 69 2c 20 63 6f 6e 73  pVm, int i, cons
61a0: 74 20 63 68 61 72 20 2a 7a 56 61 6c 2c 20 69 6e  t char *zVal, in
61b0: 74 20 6c 65 6e 2c 20 69 6e 74 20 63 6f 70 79 29  t len, int copy)
61c0: 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28 56  {.  Vdbe *p = (V
61d0: 64 62 65 2a 29 70 56 6d 3b 0a 20 20 69 66 28 20  dbe*)pVm;.  if( 
61e0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
61f0: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 70  AGIC_RUN || p->p
6200: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6210: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6220: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 31 20  ;.  }.  if( i<1 
6230: 7c 7c 20 69 3e 70 2d 3e 6e 56 61 72 20 29 7b 0a  || i>p->nVar ){.
6240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6250: 45 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 20 20 69  E_RANGE;.  }.  i
6260: 2d 2d 3b 0a 20 20 69 66 28 20 70 2d 3e 61 62 56  --;.  if( p->abV
6270: 61 72 5b 69 5d 20 29 7b 0a 20 20 20 20 73 71 6c  ar[i] ){.    sql
6280: 69 74 65 46 72 65 65 28 70 2d 3e 61 7a 56 61 72  iteFree(p->azVar
6290: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
62a0: 7a 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 63  zVal==0 ){.    c
62b0: 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 6c 65 6e  opy = 0;.    len
62c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
62d0: 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 6c 65 6e  len<0 ){.    len
62e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 6c 29 2b   = strlen(zVal)+
62f0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 70  1;.  }.  if( cop
6300: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  y ){.    p->azVa
6310: 72 5b 69 5d 20 3d 20 73 71 6c 69 74 65 4d 61 6c  r[i] = sqliteMal
6320: 6c 6f 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20  loc( len );.    
6330: 69 66 28 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 20  if( p->azVar[i] 
6340: 29 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61  ) memcpy(p->azVa
6350: 72 5b 69 5d 2c 20 7a 56 61 6c 2c 20 6c 65 6e 29  r[i], zVal, len)
6360: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6370: 2d 3e 61 7a 56 61 72 5b 69 5d 20 3d 20 28 63 68  ->azVar[i] = (ch
6380: 61 72 2a 29 7a 56 61 6c 3b 0a 20 20 7d 0a 20 20  ar*)zVal;.  }.  
6390: 70 2d 3e 61 62 56 61 72 5b 69 5d 20 3d 20 63 6f  p->abVar[i] = co
63a0: 70 79 3b 0a 20 20 70 2d 3e 61 6e 56 61 72 5b 69  py;.  p->anVar[i
63b0: 5d 20 3d 20 6c 65 6e 3b 0a 20 20 72 65 74 75 72  ] = len;.  retur
63c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
63d0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
63e0: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6400: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
6410: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
6420: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
6430: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
6440: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
6450: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
6460: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
6470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6480: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
6490: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
64a0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
64b0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
64c0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
64d0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
64e0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
64f0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70   p->pPrev = p->p
6500: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Next = 0;.  if( 
6510: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29  p->nOpAlloc==0 )
6520: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 30  {.    p->aOp = 0
6530: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 3d 20 30  ;.    p->nOp = 0
6540: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
6550: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
6560: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b  .    if( p->aOp[
6570: 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59  i].p3type==P3_DY
6580: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
6590: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70  qliteFree(p->aOp
65a0: 5b 69 5d 2e 70 33 29 3b 0a 20 20 20 20 7d 0a 20  [i].p3);.    }. 
65b0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
65c0: 70 2d 3e 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  p->nVar; i++){. 
65d0: 20 20 20 69 66 28 20 70 2d 3e 61 62 56 61 72 5b     if( p->abVar[
65e0: 69 5d 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  i] ) sqliteFree(
65f0: 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
6600: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
6610: 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->aOp);.  sqlite
6620: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
6630: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
6640: 3e 61 53 74 61 63 6b 29 3b 0a 20 20 70 2d 3e 6d  >aStack);.  p->m
6650: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
6660: 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65  C_DEAD;.  sqlite
6670: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
6680: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74  * Convert an int
6690: 65 67 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20  eger in between 
66a0: 74 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65 67  the native integ
66b0: 65 72 20 66 6f 72 6d 61 74 20 61 6e 64 0a 2a 2a  er format and.**
66c0: 20 74 68 65 20 62 69 67 45 6e 64 69 61 6e 20 66   the bigEndian f
66d0: 6f 72 6d 61 74 20 75 73 65 64 20 61 73 20 74 68  ormat used as th
66e0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
66f0: 66 6f 72 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  for tables..**.*
6700: 2a 20 54 68 65 20 62 69 67 45 6e 64 69 61 6e 20  * The bigEndian 
6710: 66 6f 72 6d 61 74 20 28 6d 6f 73 74 20 73 69 67  format (most sig
6720: 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 66 69  nificant byte fi
6730: 72 73 74 29 20 69 73 20 75 73 65 64 20 66 6f 72  rst) is used for
6740: 0a 2a 2a 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  .** record numbe
6750: 72 73 20 73 6f 20 74 68 61 74 20 72 65 63 6f 72  rs so that recor
6760: 64 73 20 77 69 6c 6c 20 73 6f 72 74 20 69 6e 74  ds will sort int
6770: 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  o the correct or
6780: 64 65 72 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  der.** even thou
6790: 67 68 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75  gh memcmp() is u
67a0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
67b0: 68 65 20 6b 65 79 73 2e 20 20 4f 6e 20 6d 61 63  he keys.  On mac
67c0: 68 69 6e 65 73 0a 2a 2a 20 77 68 6f 73 65 20 6e  hines.** whose n
67d0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 66 6f  ative integer fo
67e0: 72 6d 61 74 20 69 73 20 6c 69 74 74 6c 65 20 65  rmat is little e
67f0: 6e 64 69 61 6e 20 28 65 78 3a 20 69 34 38 36 29  ndian (ex: i486)
6800: 20 74 68 65 0a 2a 2a 20 6f 72 64 65 72 20 6f 66   the.** order of
6810: 20 62 79 74 65 73 20 69 73 20 72 65 76 65 72 73   bytes is revers
6820: 65 64 2e 20 20 4f 6e 20 6e 61 74 69 76 65 20 62  ed.  On native b
6830: 69 67 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e  ig-endian machin
6840: 65 73 0a 2a 2a 20 28 65 78 3a 20 41 6c 70 68 61  es.** (ex: Alpha
6850: 2c 20 53 70 61 72 63 2c 20 4d 6f 74 6f 72 6f 6c  , Sparc, Motorol
6860: 61 29 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  a) the byte orde
6870: 72 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a  r is the same..*
6880: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6890: 6f 6e 20 69 73 20 69 74 73 20 6f 77 6e 20 69 6e  on is its own in
68a0: 76 65 72 73 65 2e 20 20 49 6e 20 6f 74 68 65 72  verse.  In other
68b0: 20 77 6f 72 64 73 0a 2a 2a 0a 2a 2a 20 20 20 20   words.**.**    
68c0: 20 20 20 20 20 58 20 3d 3d 20 62 79 74 65 53 77       X == byteSw
68d0: 61 70 28 62 79 74 65 53 77 61 70 28 58 29 29 0a  ap(byteSwap(X)).
68e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
68f0: 62 65 42 79 74 65 53 77 61 70 28 69 6e 74 20 78  beByteSwap(int x
6900: 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
6910: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
6920: 6f 66 28 69 6e 74 29 5d 3b 0a 20 20 20 20 20 69  of(int)];.     i
6930: 6e 74 20 69 3b 0a 20 20 7d 20 75 78 3b 0a 20 20  nt i;.  } ux;.  
6940: 75 78 2e 7a 42 75 66 5b 33 5d 20 3d 20 78 26 30  ux.zBuf[3] = x&0
6950: 78 66 66 3b 0a 20 20 75 78 2e 7a 42 75 66 5b 32  xff;.  ux.zBuf[2
6960: 5d 20 3d 20 28 78 3e 3e 38 29 26 30 78 66 66 3b  ] = (x>>8)&0xff;
6970: 0a 20 20 75 78 2e 7a 42 75 66 5b 31 5d 20 3d 20  .  ux.zBuf[1] = 
6980: 28 78 3e 3e 31 36 29 26 30 78 66 66 3b 0a 20 20  (x>>16)&0xff;.  
6990: 75 78 2e 7a 42 75 66 5b 30 5d 20 3d 20 28 78 3e  ux.zBuf[0] = (x>
69a0: 3e 32 34 29 26 30 78 66 66 3b 0a 20 20 72 65 74  >24)&0xff;.  ret
69b0: 75 72 6e 20 75 78 2e 69 3b 0a 7d 0a 0a 2f 2a 0a  urn ux.i;.}../*.
69c0: 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
69d0: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
69e0: 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
69f0: 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
6a00: 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
6a10: 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  now.  Return an 
6a20: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
6a30: 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e  no MoveTo is pen
6a40: 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ding, this.** ro
6a50: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69  utine does nothi
6a60: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  ng and returns S
6a70: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
6a80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
6a90: 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20  orMoveto(Cursor 
6aa0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
6ab0: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
6ac0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
6ad0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
6ae0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
6af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
6b00: 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 69  >intKey );.    i
6b10: 66 28 20 70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  f( p->intKey ){.
6b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6b30: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
6b40: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
6b50: 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a  oTarget, &res);.
6b60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6b70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
6b80: 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28  eto(p->pCursor,(
6b90: 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f  char*)&p->moveto
6ba0: 54 61 72 67 65 74 2c 73 69 7a 65 6f 66 28 69 36  Target,sizeof(i6
6bb0: 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a  4),&res);.    }.
6bc0: 20 20 20 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f      p->lastRecno
6bd0: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
6be0: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
6bf0: 20 20 70 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69    p->recnoIsVali
6c00: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20  d = res==0;.    
6c10: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
6c20: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e     sqlite3BtreeN
6c30: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
6c40: 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &res);.    }.   
6c50: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
6c60: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e  count++;.    p->
6c70: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
6c80: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6c90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6ca0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 0a 2a 2a 0a 2a  *.** FIX ME.**.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 69 6e 63 6c 75 64 65 64 20 74 65 6d 70  is included temp
6cd0: 6f 72 61 72 69 6c 79 20 73 6f 20 74 68 61 74 20  orarily so that 
6ce0: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
6cf0: 20 68 61 76 65 0a 2a 2a 20 61 20 63 68 61 6e 63   have.** a chanc
6d00: 65 20 6f 66 20 70 61 73 73 69 6e 67 2e 20 49 74  e of passing. It
6d10: 20 61 6c 77 61 79 73 20 75 73 65 73 20 6d 65 6d   always uses mem
6d20: 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cmp()..*/.int sq
6d30: 6c 69 74 65 32 42 74 72 65 65 4b 65 79 43 6f 6d  lite2BtreeKeyCom
6d40: 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72  pare(.  BtCursor
6d50: 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 2f 2a   *pCur,       /*
6d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 72   Pointer to entr
6d70: 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  y to compare aga
6d80: 69 6e 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  inst */.  const 
6d90: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
6da0: 2f 2a 20 4b 65 79 20 74 6f 20 63 6f 6d 70 61 72  /* Key to compar
6db0: 65 20 61 67 61 69 6e 73 74 20 65 6e 74 72 79 20  e against entry 
6dc0: 74 68 61 74 20 70 43 75 72 20 70 6f 69 6e 74 73  that pCur points
6dd0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65   to */.  int nKe
6de0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y,             /
6df0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
6e00: 73 20 69 6e 20 70 4b 65 79 20 2a 2f 0a 20 20 69  s in pKey */.  i
6e10: 6e 74 20 6e 49 67 6e 6f 72 65 2c 20 20 20 20 20  nt nIgnore,     
6e20: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74       /* Ignore t
6e30: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61  his many bytes a
6e40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 43 75  t the end of pCu
6e50: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  r */.  int *pRes
6e60: 75 6c 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ult          /* 
6e70: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
6e80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   here */.){.  co
6e90: 6e 73 74 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b  nst void *pCellK
6ea0: 65 79 3b 0a 20 20 76 6f 69 64 20 2a 70 4d 61 6c  ey;.  void *pMal
6eb0: 6c 6f 63 65 64 4b 65 79 3b 0a 20 20 75 36 34 20  locedKey;.  u64 
6ec0: 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20  nCellKey;.  int 
6ed0: 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  rc;..  sqlite3Bt
6ee0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
6ef0: 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 6e   &nCellKey);.  n
6f00: 43 65 6c 6c 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  CellKey = nCellK
6f10: 65 79 20 2d 20 6e 49 67 6e 6f 72 65 3b 0a 20 20  ey - nIgnore;.  
6f20: 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
6f30: 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20  ){.    *pResult 
6f40: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
6f50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
6f60: 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
6f70: 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
6f80: 68 28 70 43 75 72 2c 20 6e 43 65 6c 6c 4b 65 79  h(pCur, nCellKey
6f90: 29 3b 0a 20 20 69 66 28 20 70 43 65 6c 6c 4b 65  );.  if( pCellKe
6fa0: 79 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c  y ){.    *pResul
6fb0: 74 20 3d 20 6d 65 6d 63 6d 70 28 70 43 65 6c 6c  t = memcmp(pCell
6fc0: 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 3e  Key, pKey, nKey>
6fd0: 6e 43 65 6c 6c 4b 65 79 3f 6e 43 65 6c 6c 4b 65  nCellKey?nCellKe
6fe0: 79 3a 6e 4b 65 79 29 3b 0a 20 20 20 20 72 65 74  y:nKey);.    ret
6ff0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7000: 20 7d 0a 0a 20 20 70 4d 61 6c 6c 6f 63 65 64 4b   }..  pMallocedK
7010: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
7020: 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  c( nCellKey );. 
7030: 20 69 66 28 20 70 4d 61 6c 6c 6f 63 65 64 4b 65   if( pMallocedKe
7040: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
7050: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
7060: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7070: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
7080: 6c 6c 4b 65 79 2c 20 70 4d 61 6c 6c 6f 63 65 64  llKey, pMalloced
7090: 4b 65 79 29 3b 0a 20 20 2a 70 52 65 73 75 6c 74  Key);.  *pResult
70a0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4d 61 6c 6c 6f   = memcmp(pMallo
70b0: 63 65 64 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b  cedKey, pKey, nK
70c0: 65 79 3e 6e 43 65 6c 6c 4b 65 79 3f 6e 43 65 6c  ey>nCellKey?nCel
70d0: 6c 4b 65 79 3a 6e 4b 65 79 29 3b 0a 20 20 73 71  lKey:nKey);.  sq
70e0: 6c 69 74 65 46 72 65 65 28 70 4d 61 6c 6c 6f 63  liteFree(pMalloc
70f0: 65 64 4b 65 79 29 3b 0a 0a 20 20 72 65 74 75 72  edKey);..  retur
7100: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
7110: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
7120: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
7130: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
7140: 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
7150: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
7160: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
7170: 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a  beSerialRead().*
7180: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
7190: 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
71a0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69  te3VdbeSerialWri
71b0: 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  te().**.** encap
71c0: 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
71d0: 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
71e0: 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
71f0: 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
7200: 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
7210: 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
7220: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
7230: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
7240: 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
7250: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
7260: 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
7270: 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
7280: 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
7290: 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
72a0: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
72b0: 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
72c0: 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
72d0: 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
72e0: 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
72f0: 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
7300: 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
7310: 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
7320: 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
7330: 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
7340: 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
7350: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
7360: 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
7370: 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
7380: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
7390: 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
73a0: 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
73b0: 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
73c0: 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
73d0: 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
73e0: 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
73f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7400: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
7410: 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
7420: 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
7430: 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
7440: 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
7450: 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
7460: 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
7470: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
7480: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
7490: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
74a0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 2d 20 20 20 20 20 20 20 20 20 20       -          
74d0: 20 20 4e 6f 74 20 61 20 74 79 70 65 2e 0a 2a 2a    Not a type..**
74e0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
7500: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
7510: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
7520: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
7530: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
7540: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
7550: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
7580: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
7590: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
75a0: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
75b0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
75c0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
75f0: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
7600: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
7610: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
7620: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
7630: 20 20 20 37 2e 2e 31 31 20 20 20 20 20 20 20 20     7..11        
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
7660: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
7670: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
7680: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
7690: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
76a0: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
76b0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
76c0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
76d0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
76e0: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
76f0: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
7700: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
7710: 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 56 64  */.u64 sqlite3Vd
7720: 62 65 53 65 72 69 61 6c 54 79 70 65 28 63 6f 6e  beSerialType(con
7730: 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  st Mem *pMem){. 
7740: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
7750: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69 66 28  m->flags;..  if(
7760: 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
7770: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  ){.    return 6;
7780: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
7790: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
77a0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
77b0: 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
77c0: 32 2c 20 34 20 6f 72 20 38 20 62 79 74 65 73 2e  2, 4 or 8 bytes.
77d0: 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 20 3d 20   */.    i64 i = 
77e0: 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 69 66 28  pMem->i;.    if(
77f0: 20 69 3e 3d 2d 31 32 37 20 26 26 20 69 3c 3d 31   i>=-127 && i<=1
7800: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
7810: 20 20 20 69 66 28 20 69 3e 3d 2d 33 32 37 36 37     if( i>=-32767
7820: 20 26 26 20 69 3c 3d 33 32 37 36 37 20 29 20 72   && i<=32767 ) r
7830: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
7840: 20 69 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   i>=-2147483647 
7850: 26 26 20 69 3c 3d 32 31 34 37 34 38 33 36 34 37  && i<=2147483647
7860: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
7870: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a 20   return 4;.  }. 
7880: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
7890: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
78a0: 6e 20 35 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 5;.  }.  if( f
78b0: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
78c0: 20 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d      return (pMem
78d0: 2d 3e 6e 2a 32 20 2b 20 31 33 29 3b 0a 20 20 7d  ->n*2 + 13);.  }
78e0: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
78f0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74  _Blob ){.    ret
7900: 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b  urn (pMem->n*2 +
7910: 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   12);.  }.  retu
7920: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
7930: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
7940: 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
7950: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
7960: 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
7970: 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-type..*/.int s
7980: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
7990: 54 79 70 65 4c 65 6e 28 75 36 34 20 73 65 72 69  TypeLen(u64 seri
79a0: 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
79b0: 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21  rt( serial_type!
79c0: 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 73  =0 );.  switch(s
79d0: 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 20  erial_type){.   
79e0: 20 63 61 73 65 20 36 3a 20 72 65 74 75 72 6e 20   case 6: return 
79f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7a00: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20      /* NULL */. 
7a10: 20 20 20 63 61 73 65 20 31 3a 20 72 65 74 75 72     case 1: retur
7a20: 6e 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 1;            
7a30: 20 20 20 20 20 20 2f 2a 20 31 20 62 79 74 65 20        /* 1 byte 
7a40: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
7a50: 61 73 65 20 32 3a 20 72 65 74 75 72 6e 20 32 3b  ase 2: return 2;
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 2f 2a 20 32 20 62 79 74 65 20 69 6e 74 65    /* 2 byte inte
7a80: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
7a90: 33 3a 20 72 65 74 75 72 6e 20 34 3b 20 20 20 20  3: return 4;    
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ab0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
7ac0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 34 3a 20 72  */.    case 4: r
7ad0: 65 74 75 72 6e 20 38 3b 20 20 20 20 20 20 20 20  eturn 8;        
7ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 38 20 62            /* 8 b
7af0: 79 74 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  yte integer */. 
7b00: 20 20 20 63 61 73 65 20 35 3a 20 72 65 74 75 72     case 5: retur
7b10: 6e 20 38 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 8;            
7b20: 20 20 20 20 20 20 2f 2a 20 38 20 62 79 74 65 20        /* 8 byte 
7b30: 66 6c 6f 61 74 20 2a 2f 0a 20 20 7d 0a 20 20 61  float */.  }.  a
7b40: 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
7b50: 70 65 3e 3d 31 32 20 29 3b 0a 20 20 72 65 74 75  pe>=12 );.  retu
7b60: 72 6e 20 28 28 73 65 72 69 61 6c 5f 74 79 70 65  rn ((serial_type
7b70: 2d 31 32 29 3e 3e 31 29 3b 20 20 20 20 20 20 20  -12)>>1);       
7b80: 20 2f 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   /* text or blob
7b90: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   */.}../*.** Wri
7ba0: 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
7bb0: 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
7bc0: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
7bd0: 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
7be0: 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
7bf0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
7c00: 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
7c10: 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
7c20: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
7c30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
7c40: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a  es written..*/ .
7c50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
7c60: 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65  erialPut(unsigne
7c70: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 63 6f 6e  d char *buf, con
7c80: 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  st Mem *pMem){. 
7c90: 20 75 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65   u64 serial_type
7ca0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
7cb0: 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a  rialType(pMem);.
7cc0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73    int len;..  as
7cd0: 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
7ce0: 65 21 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 4e  e!=0 );. .  /* N
7cf0: 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  ULL */.  if( ser
7d00: 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
7d10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7d20: 0a 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  . .  /* Integer 
7d30: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
7d40: 74 79 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36  type<5 ){.    i6
7d50: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20  4 i = pMem->i;. 
7d60: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
7d70: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
7d80: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
7d90: 20 20 20 20 77 68 69 6c 65 28 20 6c 65 6e 2d 2d      while( len--
7da0: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 6c 65   ){.      buf[le
7db0: 6e 5d 20 3d 20 28 69 26 30 78 46 46 29 3b 0a 20  n] = (i&0xFF);. 
7dc0: 20 20 20 20 20 69 20 3d 20 69 20 3e 3e 20 38 3b       i = i >> 8;
7dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
7de0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  n sqlite3VdbeSer
7df0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
7e00: 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20  l_type);.  }..  
7e10: 2f 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66  /* Float */.  if
7e20: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35  ( serial_type==5
7e30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
7e40: 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 3f 20   byte ordering? 
7e50: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
7e60: 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38  izeof(double)==8
7e70: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62   );.    memcpy(b
7e80: 75 66 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 38 29  uf, &pMem->r, 8)
7e90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a  ;.    return 8;.
7ea0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69    }.  .  /* Stri
7eb0: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
7ec0: 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
7ed0: 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e  ype>=12 );.  len
7ee0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
7ef0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
7f00: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63  al_type);.  memc
7f10: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
7f20: 20 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20   len);.  return 
7f30: 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  len;.}../*.** De
7f40: 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
7f50: 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
7f60: 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
7f70: 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
7f80: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
7f90: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
7fa0: 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
7fb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7fc0: 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20  s read..*/ .int 
7fd0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
7fe0: 6c 47 65 74 28 63 6f 6e 73 74 20 75 6e 73 69 67  lGet(const unsig
7ff0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
8000: 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  64 serial_type, 
8010: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e  Mem *pMem){.  in
8020: 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74  t len;..  assert
8030: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30  ( serial_type!=0
8040: 20 29 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74   );..  /* memset
8050: 28 70 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  (pMem, 0, sizeof
8060: 28 70 4d 65 6d 29 29 3b 20 2a 2f 0a 20 20 70 4d  (pMem)); */.  pM
8070: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
8080: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 0a 20   pMem->z = 0;.. 
8090: 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66   /* NULL */.  if
80a0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
80b0: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   ){.    pMem->fl
80c0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
80d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
80e0: 7d 0a 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  }. .  /* Integer
80f0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
8100: 5f 74 79 70 65 3c 35 20 29 7b 0a 20 20 20 20 69  _type<5 ){.    i
8110: 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  64 i = 0;.    in
8120: 74 20 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  t n;.    len = s
8130: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
8140: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
8150: 79 70 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  ype);..    if( b
8160: 75 66 5b 30 5d 26 30 78 38 30 20 29 7b 0a 20 20  uf[0]&0x80 ){.  
8170: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 28      for(n=0; n<(
8180: 38 2d 6c 65 6e 29 3b 20 6e 2b 2b 29 7b 0a 20 20  8-len); n++){.  
8190: 20 20 20 20 20 20 69 20 3d 20 28 69 3c 3c 38 29        i = (i<<8)
81a0: 2b 30 78 46 46 3b 0a 20 20 20 20 20 20 7d 0a 20  +0xFF;.      }. 
81b0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30     }.    for(n=0
81c0: 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20  ; n<len; n++){. 
81d0: 20 20 20 20 20 69 20 3d 20 69 20 3c 3c 20 38 3b       i = i << 8;
81e0: 0a 20 20 20 20 20 20 69 20 3d 20 69 20 2b 20 62  .      i = i + b
81f0: 75 66 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  uf[n];.    }.   
8200: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8210: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
8220: 2d 3e 69 20 3d 20 69 3b 0a 20 20 20 20 72 65 74  ->i = i;.    ret
8230: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53  urn sqlite3VdbeS
8240: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
8250: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a  ial_type);.  }..
8260: 20 20 2f 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20    /* Float */.  
8270: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
8280: 3d 35 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  =5 ){.    /* TOD
8290: 4f 3a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67  O: byte ordering
82a0: 3f 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ? */.    assert(
82b0: 20 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d   sizeof(double)=
82c0: 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  =8 );.    memcpy
82d0: 28 26 70 4d 65 6d 2d 3e 72 2c 20 62 75 66 2c 20  (&pMem->r, buf, 
82e0: 38 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  8);.    pMem->fl
82f0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
8300: 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
8310: 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67  }.  .  /* String
8320: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73   or blob */.  as
8330: 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
8340: 65 3e 3d 31 32 20 29 3b 0a 20 20 69 66 28 20 73  e>=12 );.  if( s
8350: 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
8360: 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ){.    pMem->fla
8370: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
8380: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d  }else{.    pMem-
8390: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
83a0: 62 3b 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20 73  b;.  }.  len = s
83b0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
83c0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
83d0: 79 70 65 29 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 20  ype);.  pMem->n 
83e0: 3d 20 6c 65 6e 3b 0a 20 20 69 66 28 20 6c 65 6e  = len;.  if( len
83f0: 3e 4e 42 46 53 20 29 7b 0a 20 20 20 20 70 4d 65  >NBFS ){.    pMe
8400: 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c  m->z = sqliteMal
8410: 6c 6f 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20  loc( len );.    
8420: 69 66 28 20 21 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  if( !pMem->z ){.
8430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
8440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
8450: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 44 79  >flags |= MEM_Dy
8460: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
8470: 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e  pMem->z = pMem->
8480: 7a 53 68 6f 72 74 3b 0a 20 20 20 20 70 4d 65 6d  zShort;.    pMem
8490: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
84a0: 68 6f 72 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  hort;.  }.  memc
84b0: 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 62 75 66 2c  py(pMem->z, buf,
84c0: 20 6c 65 6e 29 3b 20 0a 0a 20 20 72 65 74 75 72   len); ..  retur
84d0: 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n len;.}../*.** 
84e0: 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
84f0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
8500: 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
8510: 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
8520: 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
8530: 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
8540: 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
8550: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
8560: 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
8570: 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
8580: 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
8590: 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
85a0: 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
85b0: 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
85c0: 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
85d0: 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
85e0: 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
85f0: 20 62 79 20 6d 65 6d 63 6d 70 28 29 20 61 6e 64   by memcmp() and
8600: 0a 2a 2a 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  .** finally blob
8610: 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
8620: 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
8630: 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
8640: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
8650: 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
8660: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 63 6f 6d 70  ion..*/.int comp
8670: 61 72 65 4d 65 6d 43 65 6c 6c 73 28 4d 65 6d 20  areMemCells(Mem 
8680: 2a 70 4d 65 6d 31 2c 20 4d 65 6d 20 2a 70 4d 65  *pMem1, Mem *pMe
8690: 6d 32 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  m2){.  int rc;. 
86a0: 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
86b0: 61 67 73 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61  ags = pMem1->fla
86c0: 67 73 7c 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b  gs|pMem2->flags;
86d0: 20 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   . .  /* If one 
86e0: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
86f0: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
8700: 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
8710: 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
8720: 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
8730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
8740: 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
8750: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
8760: 72 6e 20 28 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  rn (pMem2->flags
8770: 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 70 4d  &MEM_Null) - (pM
8780: 65 6d 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e  em1->flags&MEM_N
8790: 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
87a0: 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
87b0: 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  a number and the
87c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74   other is not, t
87d0: 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  he number is les
87e0: 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
87f0: 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d  are numbers, com
8800: 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66  pare as reals if
8810: 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20   one is a real, 
8820: 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20  or as integers. 
8830: 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75   ** if both valu
8840: 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e  es are integers.
8850: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
8860: 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
8870: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
8880: 0a 20 20 20 20 69 66 28 20 21 28 70 4d 65 6d 31  .    if( !(pMem1
8890: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  ->flags&(MEM_Int
88a0: 7c 4d 45 4d 5f 52 65 61 6c 29 29 20 29 7b 0a 20  |MEM_Real)) ){. 
88b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
88c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 28 70     }.    if( !(p
88d0: 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  Mem2->flags&(MEM
88e0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20  _Int|MEM_Real)) 
88f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8900: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  -1;.    }..    i
8910: 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
8920: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
8930: 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 66      if( pMem1->f
8940: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
8950: 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 72          pMem1->r
8960: 20 3d 20 70 4d 65 6d 31 2d 3e 69 3b 0a 20 20 20   = pMem1->i;.   
8970: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
8980: 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Mem2->flags&MEM_
8990: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Int ){.        p
89a0: 4d 65 6d 32 2d 3e 72 20 3d 20 70 4d 65 6d 32 2d  Mem2->r = pMem2-
89b0: 3e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  >i;.      }.    
89c0: 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 72 20 3c    if( pMem1->r <
89d0: 20 70 4d 65 6d 32 2d 3e 72 20 29 20 72 65 74 75   pMem2->r ) retu
89e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
89f0: 20 70 4d 65 6d 31 2d 3e 72 20 3e 20 70 4d 65 6d   pMem1->r > pMem
8a00: 32 2d 3e 72 20 29 20 72 65 74 75 72 6e 20 31 3b  2->r ) return 1;
8a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
8a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
8a30: 70 4d 65 6d 31 2d 3e 69 20 3c 20 70 4d 65 6d 32  pMem1->i < pMem2
8a40: 2d 3e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ->i ) return -1;
8a50: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  .    if( pMem1->
8a60: 69 20 3e 20 70 4d 65 6d 32 2d 3e 69 20 29 20 72  i > pMem2->i ) r
8a70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
8a80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
8a90: 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
8aa0: 74 20 62 65 20 73 74 72 69 6e 67 73 20 6f 72 20  t be strings or 
8ab0: 62 6c 6f 62 73 2e 20 49 66 20 6f 6e 6c 79 20 6f  blobs. If only o
8ac0: 6e 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ne is a string, 
8ad0: 74 68 65 6e 0a 20 20 2a 2a 20 74 68 61 74 20 76  then.  ** that v
8ae0: 61 6c 75 65 20 69 73 20 6c 65 73 73 2e 20 4f 74  alue is less. Ot
8af0: 68 65 72 77 69 73 65 2c 20 63 6f 6d 70 61 72 65  herwise, compare
8b00: 20 77 69 74 68 20 6d 65 6d 63 6d 70 28 29 2e 20   with memcmp(). 
8b10: 49 66 20 6d 65 6d 63 6d 70 28 29 0a 20 20 2a 2a  If memcmp().  **
8b20: 20 72 65 74 75 72 6e 73 20 30 20 61 6e 64 20 6f   returns 0 and o
8b30: 6e 65 20 76 61 6c 75 65 20 69 73 20 6c 6f 6e 67  ne value is long
8b40: 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  er than the othe
8b50: 72 2c 20 74 68 65 6e 20 74 68 61 74 20 76 61 6c  r, then that val
8b60: 75 65 0a 20 20 2a 2a 20 69 73 20 67 72 65 61 74  ue.  ** is great
8b70: 65 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  er..  */.  rc = 
8b80: 28 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 4d 45  (pMem2->flags&ME
8b90: 4d 5f 4e 75 6c 6c 29 20 2d 20 28 70 4d 65 6d 31  M_Null) - (pMem1
8ba0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
8bb0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
8bc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8bd0: 7d 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  }.  rc = memcmp(
8be0: 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32 2d  pMem1->z, pMem2-
8bf0: 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70 4d  >z, (pMem1->n>pM
8c00: 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e 6e  em2->n)?pMem2->n
8c10: 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20 69 66  :pMem1->n);.  if
8c20: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
8c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
8c40: 28 20 70 4d 65 6d 31 2d 3e 6e 20 3c 20 70 4d 65  ( pMem1->n < pMe
8c50: 6d 32 2d 3e 6e 20 29 20 72 65 74 75 72 6e 20 2d  m2->n ) return -
8c60: 31 3b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  1;.  if( pMem1->
8c70: 6e 20 3e 20 70 4d 65 6d 32 2d 3e 6e 20 29 20 72  n > pMem2->n ) r
8c80: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
8c90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
8ca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
8cb0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
8cc0: 6e 63 74 69 6f 6e 20 66 6f 72 20 28 6e 6f 6e 2d  nction for (non-
8cd0: 69 6e 74 65 67 65 72 29 0a 2a 2a 20 6b 65 79 73  integer).** keys
8ce0: 20 69 6e 20 74 68 65 20 62 74 72 65 65 73 2e 20   in the btrees. 
8cf0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8d00: 65 74 75 72 6e 73 20 6e 65 67 61 74 69 76 65 2c  eturns negative,
8d10: 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73   zero, or.** pos
8d20: 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
8d30: 73 74 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  st key is less t
8d40: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
8d50: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  r greater than.*
8d60: 2a 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2a  * the second..**
8d70: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8d80: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 65  n assumes that e
8d90: 61 63 68 20 6b 65 79 20 63 6f 6e 73 69 73 74 73  ach key consists
8da0: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
8db0: 74 79 70 65 2f 62 6c 6f 62 0a 2a 2a 20 70 61 69  type/blob.** pai
8dc0: 72 73 2c 20 65 6e 63 6f 64 65 64 20 75 73 69 6e  rs, encoded usin
8dd0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  g the sqlite3Vdb
8de0: 65 53 65 72 69 61 6c 58 58 58 28 29 20 66 75 6e  eSerialXXX() fun
8df0: 63 74 69 6f 6e 73 20 61 62 6f 76 65 2e 20 0a 2a  ctions above. .*
8e00: 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  *.** Following t
8e10: 68 65 20 74 79 70 65 2f 62 6c 6f 62 20 70 61 69  he type/blob pai
8e20: 72 73 2c 20 65 61 63 68 20 6b 65 79 20 6d 61 79  rs, each key may
8e30: 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 30   have a single 0
8e40: 78 30 30 20 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c  x00 byte.** foll
8e50: 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 6e 74  owed by a varint
8e60: 2e 20 41 20 6b 65 79 20 6d 61 79 20 6f 6e 6c 79  . A key may only
8e70: 20 68 61 76 65 20 74 68 69 73 20 74 72 61 6c 69   have this trali
8e80: 6e 67 20 30 78 30 30 2f 76 61 72 69 6e 74 0a 2a  ng 0x00/varint.*
8e90: 2a 20 70 61 69 72 20 69 66 20 69 74 20 68 61 73  * pair if it has
8ea0: 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
8eb0: 79 20 74 79 70 65 2f 62 6c 6f 62 20 70 61 69 72  y type/blob pair
8ec0: 73 20 61 73 20 74 68 65 20 6b 65 79 20 69 74 20  s as the key it 
8ed0: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 63 6f 6d 70  is being.** comp
8ee0: 61 72 65 64 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ared to..*/.int 
8ef0: 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 43 6f  sqlite3VdbeKeyCo
8f00: 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75  mpare(.  void *u
8f10: 73 65 72 44 61 74 61 2c 20 20 20 20 20 20 20 20  serData,        
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 2f 2a 20 6e 6f 74 20 75 73 65 64 20 79 65 74   /* not used yet
8f40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c   */.  int nKey1,
8f50: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
8f60: 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32  y1, .  int nKey2
8f70: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
8f80: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 6f 66 66  ey2.){.  int off
8f90: 73 65 74 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  set1 = 0;.  int 
8fa0: 6f 66 66 73 65 74 32 20 3d 20 30 3b 0a 20 20 63  offset2 = 0;.  c
8fb0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8fc0: 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
8fd0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8fe0: 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73   *)pKey1;.  cons
8ff0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9000: 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20  *aKey2 = (const 
9010: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
9020: 70 4b 65 79 32 3b 0a 20 20 0a 20 20 77 68 69 6c  pKey2;.  .  whil
9030: 65 28 20 6f 66 66 73 65 74 31 3c 6e 4b 65 79 31  e( offset1<nKey1
9040: 20 26 26 20 6f 66 66 73 65 74 32 3c 6e 4b 65 79   && offset2<nKey
9050: 32 20 29 7b 0a 20 20 20 20 4d 65 6d 20 6d 65 6d  2 ){.    Mem mem
9060: 31 3b 0a 20 20 20 20 4d 65 6d 20 6d 65 6d 32 3b  1;.    Mem mem2;
9070: 0a 20 20 20 20 75 36 34 20 73 65 72 69 61 6c 5f  .    u64 serial_
9080: 74 79 70 65 31 3b 0a 20 20 20 20 75 36 34 20 73  type1;.    u64 s
9090: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 20 20 20  erial_type2;.   
90a0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a   int rc;..    /*
90b0: 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
90c0: 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
90d0: 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
90e0: 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
90f0: 6f 66 66 73 65 74 31 20 2b 3d 20 73 71 6c 69 74  offset1 += sqlit
9100: 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65  e3GetVarint(&aKe
9110: 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26 73 65  y1[offset1], &se
9120: 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20  rial_type1);.   
9130: 20 6f 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69   offset2 += sqli
9140: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b  te3GetVarint(&aK
9150: 65 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20 26 73  ey2[offset2], &s
9160: 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 0a 20  erial_type2);.. 
9170: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
9180: 6f 66 20 74 68 65 20 76 61 72 69 6e 74 73 20 6a  of the varints j
9190: 75 73 74 20 72 65 61 64 20 69 6e 20 61 72 65 20  ust read in are 
91a0: 30 20 28 6e 6f 74 20 61 20 74 79 70 65 29 2c 20  0 (not a type), 
91b0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  then.    ** this
91c0: 20 69 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74   is the end of t
91d0: 68 65 20 6b 65 79 73 2e 20 54 68 65 20 72 65 6d  he keys. The rem
91e0: 61 69 6e 69 6e 67 20 64 61 74 61 20 69 6e 20 65  aining data in e
91f0: 61 63 68 20 6b 65 79 20 69 73 0a 20 20 20 20 2a  ach key is.    *
9200: 2a 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f 77  * the varint row
9210: 69 64 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 73  id. Compare thes
9220: 65 20 61 73 20 73 69 67 6e 65 64 20 69 6e 74 65  e as signed inte
9230: 67 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 0a  gers and return.
9240: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
9250: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
9260: 28 20 21 73 65 72 69 61 6c 5f 74 79 70 65 31 20  ( !serial_type1 
9270: 7c 7c 20 21 73 65 72 69 61 6c 5f 74 79 70 65 32  || !serial_type2
9280: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9290: 28 20 21 73 65 72 69 61 6c 5f 74 79 70 65 31 20  ( !serial_type1 
92a0: 26 26 20 21 73 65 72 69 61 6c 5f 74 79 70 65 32  && !serial_type2
92b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
92c0: 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79  3GetVarint(&aKey
92d0: 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26 73 65 72  1[offset1], &ser
92e0: 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20  ial_type1);.    
92f0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
9300: 6e 74 28 26 61 4b 65 79 32 5b 6f 66 66 73 65 74  nt(&aKey2[offset
9310: 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65  2], &serial_type
9320: 32 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  2);.      return
9330: 20 28 20 28 69 36 34 29 73 65 72 69 61 6c 5f 74   ( (i64)serial_t
9340: 79 70 65 31 20 2d 20 28 69 36 34 29 73 65 72 69  ype1 - (i64)seri
9350: 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20  al_type2 );.    
9360: 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 65 72 74  }..    /* Assert
9370: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
9380: 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
9390: 20 69 6e 20 65 61 63 68 20 6b 65 79 20 66 6f 72   in each key for
93a0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20   the blob of.   
93b0: 20 2a 2a 20 64 61 74 61 20 74 6f 20 67 6f 20 77   ** data to go w
93c0: 69 74 68 20 74 68 65 20 73 65 72 69 61 6c 20 74  ith the serial t
93d0: 79 70 65 20 6a 75 73 74 20 72 65 61 64 2e 20 54  ype just read. T
93e0: 68 69 73 20 61 73 73 65 72 74 20 6d 61 79 20 66  his assert may f
93f0: 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ail if.    ** th
9400: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
9410: 74 65 64 2e 20 20 54 68 65 6e 20 72 65 61 64 20  ted.  Then read 
9420: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 65  the value from e
9430: 61 63 68 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d  ach key into mem
9440: 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d  1.    ** and mem
9450: 32 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  2 respectively..
9460: 20 20 20 20 2a 2f 0a 20 20 20 20 6f 66 66 73 65      */.    offse
9470: 74 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  t1 += sqlite3Vdb
9480: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
9490: 31 5b 6f 66 66 73 65 74 31 5d 2c 20 73 65 72 69  1[offset1], seri
94a0: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
94b0: 3b 0a 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d  ;.    offset2 +=
94c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
94d0: 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 6f 66 66  alGet(&aKey2[off
94e0: 73 65 74 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79  set2], serial_ty
94f0: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20  pe2, &mem2);..  
9500: 20 20 72 63 20 3d 20 63 6f 6d 70 61 72 65 4d 65    rc = compareMe
9510: 6d 43 65 6c 6c 73 28 26 6d 65 6d 31 2c 20 26 6d  mCells(&mem1, &m
9520: 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  em2);.    if( me
9530: 6d 31 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  m1.flags&MEM_Dyn
9540: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9550: 46 72 65 65 28 6d 65 6d 31 2e 7a 29 3b 0a 20 20  Free(mem1.z);.  
9560: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 32    }.    if( mem2
9570: 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29  .flags&MEM_Dyn )
9580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
9590: 65 65 28 6d 65 6d 32 2e 7a 29 3b 0a 20 20 20 20  ee(mem2.z);.    
95a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  }.    if( rc!=0 
95b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
95c0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
95d0: 20 69 66 28 20 6f 66 66 73 65 74 31 3c 6e 4b 65   if( offset1<nKe
95e0: 79 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y1 ){.    return
95f0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66   1;.  }.  if( of
9600: 66 73 65 74 32 3c 6e 4b 65 79 32 20 29 7b 0a 20  fset2<nKey2 ){. 
9610: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
9620: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9630: 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
9640: 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
9650: 6e 74 72 79 2e 20 52 65 61 64 20 74 68 65 20 72  ntry. Read the r
9660: 6f 77 69 64 20 28 76 61 72 69 6e 74 20 6f 63 63  owid (varint occ
9670: 75 72 69 6e 67 20 61 74 0a 2a 2a 20 74 68 65 20  uring at.** the 
9680: 65 6e 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79  end of the entry
9690: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
96a0: 20 2a 72 6f 77 69 64 2e 20 52 65 74 75 72 6e 20   *rowid. Return 
96b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 0a 2a 2a 20  SQLITE_OK if.** 
96c0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
96d0: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
96e0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
96f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9700: 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
9710: 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
9720: 77 69 64 29 7b 0a 20 20 69 36 34 20 73 7a 3b 0a  wid){.  i64 sz;.
9730: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
9740: 20 62 75 66 5b 39 5d 3b 0a 20 20 69 6e 74 20 6c   buf[9];.  int l
9750: 65 6e 3b 0a 20 20 75 36 34 20 72 3b 0a 0a 20 20  en;.  u64 r;..  
9760: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
9770: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
9780: 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sz);.  if( rc!=S
9790: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
97a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
97b0: 20 6c 65 6e 20 3d 20 28 28 73 7a 3e 39 29 3f 39   len = ((sz>9)?9
97c0: 3a 73 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  :sz);.  assert( 
97d0: 6c 65 6e 3e 3d 32 20 29 3b 0a 0a 20 20 72 63 20  len>=2 );..  rc 
97e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
97f0: 79 28 70 43 75 72 2c 20 73 7a 2d 6c 65 6e 2c 20  y(pCur, sz-len, 
9800: 6c 65 6e 2c 20 62 75 66 29 3b 0a 20 20 69 66 28  len, buf);.  if(
9810: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9820: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
9830: 0a 20 20 7d 0a 0a 20 20 6c 65 6e 20 3d 20 6c 65  .  }..  len = le
9840: 6e 20 2d 20 32 3b 0a 20 20 77 68 69 6c 65 28 20  n - 2;.  while( 
9850: 62 75 66 5b 6c 65 6e 5d 20 26 26 20 2d 2d 6c 65  buf[len] && --le
9860: 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  n );..  sqlite3G
9870: 65 74 56 61 72 69 6e 74 28 62 75 66 2c 20 26 72  etVarint(buf, &r
9880: 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 72 3b  );.  *rowid = r;
9890: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
98a0: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  _OK;.}..int sqli
98b0: 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
98c0: 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72  pare(.  BtCursor
98d0: 20 2a 70 43 75 72 2c 20 0a 20 20 69 6e 74 20 6e   *pCur, .  int n
98e0: 4b 65 79 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  Key, const unsig
98f0: 6e 65 64 20 63 68 61 72 20 2a 70 4b 65 79 2c 0a  ned char *pKey,.
9900: 20 20 69 6e 74 20 69 67 6e 6f 72 65 72 6f 77 69    int ignorerowi
9910: 64 2c 0a 20 20 69 6e 74 20 2a 72 65 73 0a 29 7b  d,.  int *res.){
9920: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9930: 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 75 36   *pCellKey;.  u6
9940: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
9950: 74 20 66 72 65 65 43 65 6c 6c 4b 65 79 20 3d 20  t freeCellKey = 
9960: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
9970: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 73 71 6c 69 74  nt len;..  sqlit
9980: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
9990: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
99a0: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
99b0: 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  =0 ){.    *res =
99c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
99d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
99e0: 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 75 6e 73   pCellKey = (uns
99f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
9a00: 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
9a10: 68 28 70 43 75 72 2c 20 6e 43 65 6c 6c 4b 65 79  h(pCur, nCellKey
9a20: 29 3b 0a 20 20 69 66 28 20 21 70 43 65 6c 6c 4b  );.  if( !pCellK
9a30: 65 79 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 4b  ey ){.    pCellK
9a40: 65 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ey = (unsigned c
9a50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
9a60: 6f 63 28 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  oc(nCellKey);.  
9a70: 20 20 69 66 28 20 21 70 43 65 6c 6c 4b 65 79 20    if( !pCellKey 
9a80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9a90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9aa0: 20 20 7d 0a 20 20 20 20 66 72 65 65 43 65 6c 6c    }.    freeCell
9ab0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Key = 1;.    rc 
9ac0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
9ad0: 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
9ae0: 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 29 3b 0a  Key, pCellKey);.
9af0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9b00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
9b10: 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b  qliteFree(pCellK
9b20: 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
9b30: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
9b40: 20 0a 20 20 6c 65 6e 20 3d 20 6e 43 65 6c 6c 4b   .  len = nCellK
9b50: 65 79 2d 32 3b 0a 20 20 77 68 69 6c 65 28 20 70  ey-2;.  while( p
9b60: 43 65 6c 6c 4b 65 79 5b 6c 65 6e 5d 20 26 26 20  CellKey[len] && 
9b70: 2d 2d 6c 65 6e 20 29 3b 0a 0a 20 20 69 66 28 20  --len );..  if( 
9b80: 69 67 6e 6f 72 65 72 6f 77 69 64 20 29 7b 0a 20  ignorerowid ){. 
9b90: 20 20 20 6e 4b 65 79 2d 2d 3b 0a 20 20 20 20 77     nKey--;.    w
9ba0: 68 69 6c 65 28 20 70 4b 65 79 5b 6e 4b 65 79 5d  hile( pKey[nKey]
9bb0: 20 26 26 20 2d 2d 6e 4b 65 79 20 29 3b 0a 20 20   && --nKey );.  
9bc0: 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
9bd0: 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61 72 65  e3VdbeKeyCompare
9be0: 28 30 2c 20 6c 65 6e 2c 20 70 43 65 6c 6c 4b 65  (0, len, pCellKe
9bf0: 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
9c00: 20 20 0a 20 20 69 66 28 20 66 72 65 65 43 65 6c    .  if( freeCel
9c10: 6c 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  lKey ){.    sqli
9c20: 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  teFree(pCellKey)
9c30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9c40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a     QLITE_OK;.}....