/ Hex Artifact Content
Login

Artifact 760105ceedb7bcfcd3f4dbba7a5500321612669b:


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 74 68 65 20 63 75 72 72 65  Search the curre
2660: 6e 74 20 70 72 6f 67 72 61 6d 20 73 74 61 72 74  nt program start
2670: 69 6e 67 20 61 74 20 69 6e 73 74 72 75 63 74 69  ing at instructi
2680: 6f 6e 20 61 64 64 72 20 66 6f 72 20 74 68 65 20  on addr for the 
2690: 67 69 76 65 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  given.** opcode 
26a0: 61 6e 64 20 50 32 20 76 61 6c 75 65 2e 20 20 52  and P2 value.  R
26b0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
26c0: 73 20 70 6c 75 73 20 31 20 69 66 20 66 6f 75 6e  s plus 1 if foun
26d0: 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 0a 2a  d and 0 if not.*
26e0: 2a 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  * found..*/.int 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 4f  sqlite3VdbeFindO
2700: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
2710: 64 64 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ddr, int op, int
2720: 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p2){.  int i;. 
2730: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
2740: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2750: 49 54 20 29 3b 0a 20 20 66 6f 72 28 69 3d 61 64  IT );.  for(i=ad
2760: 64 72 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  dr; i<p->nOp; i+
2770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
2780: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op[i].opcode==op
2790: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32   && p->aOp[i].p2
27a0: 3d 3d 70 32 20 29 20 72 65 74 75 72 6e 20 69 2b  ==p2 ) return i+
27b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
27c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
27d0: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
27e0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
27f0: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
2800: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
2810: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2820: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
2830: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2840: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
2850: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
2860: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
2870: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
2880: 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ddr];.}../*.** T
2890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
28a0: 75 70 20 6f 72 20 72 6f 75 74 69 6e 65 73 20 61  up or routines a
28b0: 72 65 20 65 6d 70 6c 6f 79 65 64 20 62 79 20 69  re employed by i
28c0: 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63 74  nstallable funct
28d0: 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 75 72  ions.** to retur
28e0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 73 2e  n their results.
28f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
2900: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  e3_set_result_st
2910: 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 20 63  ring() routine c
2920: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  an be used to re
2930: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 0a 2a 2a  turn a string.**
2940: 20 76 61 6c 75 65 20 6f 72 20 74 6f 20 72 65 74   value or to ret
2950: 75 72 6e 20 61 20 4e 55 4c 4c 2e 20 20 54 6f 20  urn a NULL.  To 
2960: 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2c 20 70  return a NULL, p
2970: 61 73 73 20 69 6e 20 4e 55 4c 4c 20 66 6f 72 20  ass in NULL for 
2980: 7a 52 65 73 75 6c 74 2e 0a 2a 2a 20 41 20 63 6f  zResult..** A co
2990: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
29a0: 65 20 73 74 72 69 6e 67 20 62 65 66 6f 72 65 20  e string before 
29b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29c0: 75 72 6e 73 20 73 6f 20 69 74 20 69 73 20 73 61  urns so it is sa
29d0: 66 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20 69 6e  fe.** to pass in
29e0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74   an ephemeral st
29f0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ring..**.** sqli
2a00: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
2a10: 72 72 6f 72 28 29 20 77 6f 72 6b 73 20 6c 69 6b  rror() works lik
2a20: 65 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  e sqlite3_set_re
2a30: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 65 78  sult_string() ex
2a40: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
2a50: 73 69 67 6e 61 6c 73 20 61 20 66 61 74 61 6c 20  signals a fatal 
2a60: 65 72 72 6f 72 2e 20 20 54 68 65 20 73 74 72 69  error.  The stri
2a70: 6e 67 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  ng argument, if 
2a80: 61 6e 79 2c 20 69 73 20 74 68 65 0a 2a 2a 20 65  any, is the.** e
2a90: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49  rror message.  I
2aa0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
2ab0: 73 20 4e 55 4c 4c 20 61 20 67 65 6e 65 72 69 63  s NULL a generic
2ac0: 20 73 75 62 73 74 69 74 75 74 65 20 65 72 72 6f   substitute erro
2ad0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2ae0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
2af0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
2b00: 6c 74 5f 69 6e 74 28 29 20 61 6e 64 20 73 71 6c  lt_int() and sql
2b10: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2b20: 64 6f 75 62 6c 65 28 29 20 73 65 74 20 74 68 65  double() set the
2b30: 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
2b40: 20 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e   of the user fun
2b50: 63 74 69 6f 6e 20 74 6f 20 61 6e 20 69 6e 74 65  ction to an inte
2b60: 67 65 72 20 6f 72 20 61 20 64 6f 75 62 6c 65 2e  ger or a double.
2b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
2b80: 74 69 6e 65 73 20 61 72 65 20 64 65 66 69 6e 65  tines are define
2b90: 64 20 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63  d here in vdbe.c
2ba0: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 64 65   because they de
2bb0: 70 65 6e 64 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a  pend on knowing.
2bc0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73  ** the internals
2bd0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 66   of the sqlite_f
2be0: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 68  unc structure wh
2bf0: 69 63 68 20 69 73 20 6f 6e 6c 79 20 64 65 66 69  ich is only defi
2c00: 6e 65 64 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20  ned in .** this 
2c10: 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a  source file..*/.
2c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 65  char *sqlite3_se
2c30: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
2c40: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20  sqlite_func *p, 
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 73  const char *zRes
2c60: 75 6c 74 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61  ult, int n){.  a
2c70: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2c80: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2c90: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2ca0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2cb0: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2cc0: 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20   if( zResult==0 
2cd0: 29 7b 0a 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67  ){.    p->s.flag
2ce0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2cf0: 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e    n = 0;.    p->
2d00: 73 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  s.z = 0;.    p->
2d10: 73 2e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  s.n = 0;.  }else
2d20: 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  {.    if( n<0 ) 
2d30: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75  n = strlen(zResu
2d40: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 4e  lt);.    if( n<N
2d50: 42 46 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  BFS-1 ){.      m
2d60: 65 6d 63 70 79 28 70 2d 3e 73 2e 7a 53 68 6f 72  emcpy(p->s.zShor
2d70: 74 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a  t, zResult, n);.
2d80: 20 20 20 20 20 20 70 2d 3e 73 2e 7a 53 68 6f 72        p->s.zShor
2d90: 74 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[n] = 0;.      
2da0: 70 2d 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  p->s.flags = MEM
2db0: 5f 53 74 72 20 7c 20 4d 45 4d 5f 53 68 6f 72 74  _Str | MEM_Short
2dc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d  ;.      p->s.z =
2dd0: 20 70 2d 3e 73 2e 7a 53 68 6f 72 74 3b 0a 20 20   p->s.zShort;.  
2de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2df0: 2d 3e 73 2e 7a 20 3d 20 73 71 6c 69 74 65 4d 61  ->s.z = sqliteMa
2e00: 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a  llocRaw( n+1 );.
2e10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 2e 7a        if( p->s.z
2e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2e30: 70 79 28 70 2d 3e 73 2e 7a 2c 20 7a 52 65 73 75  py(p->s.z, zResu
2e40: 6c 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  lt, n);.        
2e50: 70 2d 3e 73 2e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20  p->s.z[n] = 0;. 
2e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
2e70: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  s.flags = MEM_St
2e80: 72 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  r | MEM_Dyn;.   
2e90: 20 7d 0a 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20   }.    p->s.n = 
2ea0: 6e 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n+1;.  }.  retur
2eb0: 6e 20 70 2d 3e 73 2e 7a 3b 0a 7d 0a 76 6f 69 64  n p->s.z;.}.void
2ec0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
2ed0: 75 6c 74 5f 69 6e 74 28 73 71 6c 69 74 65 5f 66  ult_int(sqlite_f
2ee0: 75 6e 63 20 2a 70 2c 20 69 6e 74 20 69 52 65 73  unc *p, int iRes
2ef0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2f00: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2f10: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2f20: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2f30: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
2f40: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 69  z);.  }.  p->s.i
2f50: 20 3d 20 69 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = iResult;.  p-
2f60: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  >s.flags = MEM_I
2f70: 6e 74 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  nt;.}.void sqlit
2f80: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f  e3_set_result_do
2f90: 75 62 6c 65 28 73 71 6c 69 74 65 5f 66 75 6e 63  uble(sqlite_func
2fa0: 20 2a 70 2c 20 64 6f 75 62 6c 65 20 72 52 65 73   *p, double rRes
2fb0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2fc0: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2fd0: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2fe0: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2ff0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
3000: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 72  z);.  }.  p->s.r
3010: 20 3d 20 72 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = rResult;.  p-
3020: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  >s.flags = MEM_R
3030: 65 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  eal;.}.void sqli
3040: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
3050: 72 72 6f 72 28 73 71 6c 69 74 65 5f 66 75 6e 63  rror(sqlite_func
3060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3070: 2a 7a 4d 73 67 2c 20 69 6e 74 20 6e 29 7b 0a 20  *zMsg, int n){. 
3080: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53   assert( !p->isS
3090: 74 65 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  tep );.  sqlite3
30a0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
30b0: 6e 67 28 70 2c 20 7a 4d 73 67 2c 20 6e 29 3b 0a  ng(p, zMsg, n);.
30c0: 20 20 70 2d 3e 69 73 45 72 72 6f 72 20 3d 20 31    p->isError = 1
30d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  ;.}../*.** Extra
30e0: 63 74 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ct the user data
30f0: 20 66 72 6f 6d 20 61 20 73 71 6c 69 74 65 5f 66   from a sqlite_f
3100: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 61 6e  unc structure an
3110: 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
3120: 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 2a 2f 0a  inter to it..*/.
3130: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 73  void *sqlite3_us
3140: 65 72 5f 64 61 74 61 28 73 71 6c 69 74 65 5f 66  er_data(sqlite_f
3150: 75 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  unc *p){.  asser
3160: 74 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63  t( p && p->pFunc
3170: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
3180: 70 46 75 6e 63 2d 3e 70 55 73 65 72 44 61 74 61  pFunc->pUserData
3190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
31a0: 61 74 65 20 6f 72 20 72 65 74 75 72 6e 20 74 68  ate or return th
31b0: 65 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  e aggregate cont
31c0: 65 78 74 20 66 6f 72 20 61 20 75 73 65 72 20 66  ext for a user f
31d0: 75 6e 63 74 69 6f 6e 2e 20 20 41 20 6e 65 77 0a  unction.  A new.
31e0: 2a 2a 20 63 6f 6e 74 65 78 74 20 69 73 20 61 6c  ** context is al
31f0: 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 66  located on the f
3200: 69 72 73 74 20 63 61 6c 6c 2e 20 20 53 75 62 73  irst call.  Subs
3210: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 72 65 74  equent calls ret
3220: 75 72 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  urn the.** same 
3230: 63 6f 6e 74 65 78 74 20 74 68 61 74 20 77 61 73  context that was
3240: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 70 72 69   returned on pri
3250: 6f 72 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  or calls..**.** 
3260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3270: 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20  defined here in 
3280: 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20 69  vdbe.c because i
3290: 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f  t depends on kno
32a0: 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65  wing.** the inte
32b0: 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c  rnals of the sql
32c0: 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75  ite_func structu
32d0: 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  re which is only
32e0: 20 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74   defined in.** t
32f0: 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  his source file.
3300: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
3310: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3320: 65 78 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ext(sqlite_func 
3330: 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *p, int nByte){.
3340: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
3350: 2d 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46  ->pFunc && p->pF
3360: 75 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20  unc->xStep );.  
3370: 69 66 28 20 70 2d 3e 70 41 67 67 3d 3d 30 20 29  if( p->pAgg==0 )
3380: 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  {.    if( nByte<
3390: 3d 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20 70  =NBFS ){.      p
33a0: 2d 3e 70 41 67 67 20 3d 20 28 76 6f 69 64 2a 29  ->pAgg = (void*)
33b0: 70 2d 3e 73 2e 7a 3b 0a 20 20 20 20 20 20 6d 65  p->s.z;.      me
33c0: 6d 73 65 74 28 70 2d 3e 70 41 67 67 2c 20 30 2c  mset(p->pAgg, 0,
33d0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 65 6c   nByte);.    }el
33e0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 70 41 67  se{.      p->pAg
33f0: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
3400: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 7d  ( nByte );.    }
3410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
3420: 3e 70 41 67 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pAgg;.}../*.** 
3430: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3440: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65 20 53  r of times the S
3450: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  tep function of 
3460: 61 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  a aggregate has 
3470: 62 65 65 6e 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e  been .** called.
3480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3490: 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20 68  ine is defined h
34a0: 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65  ere in vdbe.c be
34b0: 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64 73  cause it depends
34c0: 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74   on knowing.** t
34d0: 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20  he internals of 
34e0: 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20  the sqlite_func 
34f0: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
3500: 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20  is only defined 
3510: 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  in.** this sourc
3520: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e file..*/.int s
3530: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3540: 5f 63 6f 75 6e 74 28 73 71 6c 69 74 65 5f 66 75  _count(sqlite_fu
3550: 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  nc *p){.  assert
3560: 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20  ( p && p->pFunc 
3570: 26 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74  && p->pFunc->xSt
3580: 65 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ep );.  return p
3590: 2d 3e 63 6e 74 3b 0a 7d 0a 0a 23 69 66 20 21 64  ->cnt;.}..#if !d
35a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
35b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
35c0: 52 4f 46 49 4c 45 29 0a 2f 2a 0a 2a 2a 20 50 72  ROFILE)./*.** Pr
35d0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
35e0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
35f0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3600: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3610: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3620: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3630: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3640: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3650: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3660: 5b 34 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  [40];.  if( pOp-
3670: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
3680: 54 45 52 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  TER ){.    sprin
3690: 74 66 28 7a 50 74 72 2c 20 22 70 74 72 28 25 23  tf(zPtr, "ptr(%#
36a0: 78 29 22 2c 20 28 69 6e 74 29 70 4f 70 2d 3e 70  x)", (int)pOp->p
36b0: 33 29 3b 0a 20 20 20 20 7a 50 33 20 3d 20 7a 50  3);.    zP3 = zP
36c0: 74 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  tr;.  }else{.   
36d0: 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   zP3 = pOp->p3;.
36e0: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d    }.  if( pOut==
36f0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
3700: 74 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  t;.  fprintf(pOu
3710: 74 2c 22 25 34 64 20 25 2d 31 32 73 20 25 34 64  t,"%4d %-12s %4d
3720: 20 25 34 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %4d %s\n",.    
3730: 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63    pc, sqlite3Opc
3740: 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70  odeNames[pOp->op
3750: 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20  code], pOp->p1, 
3760: 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 20 3f 20 7a  pOp->p2, zP3 ? z
3770: 50 33 20 3a 20 22 22 29 3b 0a 20 20 66 66 6c 75  P3 : "");.  fflu
3780: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
3790: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  if../*.** Give a
37a0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
37b0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
37c0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
37d0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
37e0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
37f0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
3800: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
3810: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
3820: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
3830: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
3840: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
3850: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3860: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
3870: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3880: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
3890: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
38a0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
38d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
38e0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
38f0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
3900: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
3910: 63 20 63 68 61 72 20 2a 61 7a 43 6f 6c 75 6d 6e  c char *azColumn
3920: 4e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Names[] = {.    
3930: 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
3940: 22 2c 20 22 70 31 22 2c 20 20 22 70 32 22 2c 20  ", "p1",  "p2", 
3950: 20 22 70 33 22 2c 20 0a 20 20 20 20 20 22 69 6e   "p3", .     "in
3960: 74 22 2c 20 20 22 74 65 78 74 22 2c 20 20 20 22  t",  "text",   "
3970: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 74 65  int", "int", "te
3980: 78 74 22 2c 0a 20 20 20 20 20 30 0a 20 20 7d 3b  xt",.     0.  };
3990: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
39a0: 6f 70 53 74 61 63 6b 3d 3d 30 20 29 3b 0a 20 20  opStack==0 );.  
39b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
39c0: 69 6e 20 29 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c  in );.  p->azCol
39d0: 4e 61 6d 65 20 3d 20 61 7a 43 6f 6c 75 6d 6e 4e  Name = azColumnN
39e0: 61 6d 65 73 3b 0a 20 20 70 2d 3e 61 7a 52 65 73  ames;.  p->azRes
39f0: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67  Column = p->zArg
3a00: 76 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  v;.  for(i=0; i<
3a10: 35 3b 20 69 2b 2b 29 20 70 2d 3e 7a 41 72 67 76  5; i++) p->zArgv
3a20: 5b 69 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  [i] = p->aStack[
3a30: 69 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20 69 20 3d  i].zShort;.  i =
3a40: 20 70 2d 3e 70 63 3b 0a 20 20 69 66 28 20 69 3e   p->pc;.  if( i>
3a50: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
3a60: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
3a70: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3a80: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
3a90: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
3aa0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
3ab0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
3ac0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3ad0: 65 72 72 75 70 74 3b 0a 20 20 20 20 69 66 28 20  errupt;.    if( 
3ae0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
3af0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a  E_MAGIC_BUSY ){.
3b00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
3b10: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
3b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3b30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
3b40: 45 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ERRUPT;.    }.  
3b50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3b60: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
3b70: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
3b80: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
3b90: 72 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72  rror_string(p->r
3ba0: 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
3bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
3bc0: 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 30 5d 2c  ntf(p->zArgv[0],
3bd0: 22 25 64 22 2c 69 29 3b 0a 20 20 20 20 73 70 72  "%d",i);.    spr
3be0: 69 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 32 5d  intf(p->zArgv[2]
3bf0: 2c 22 25 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  ,"%d", p->aOp[i]
3c00: 2e 70 31 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  .p1);.    sprint
3c10: 66 28 70 2d 3e 7a 41 72 67 76 5b 33 5d 2c 22 25  f(p->zArgv[3],"%
3c20: 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32  d", p->aOp[i].p2
3c30: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  );.    if( p->aO
3c40: 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33 5f  p[i].p3type==P3_
3c50: 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
3c60: 20 73 70 72 69 6e 74 66 28 70 2d 3e 61 53 74 61   sprintf(p->aSta
3c70: 63 6b 5b 34 5d 2e 7a 53 68 6f 72 74 2c 20 22 70  ck[4].zShort, "p
3c80: 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 70  tr(%#x)", (int)p
3c90: 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20  ->aOp[i].p3);.  
3ca0: 20 20 20 20 70 2d 3e 7a 41 72 67 76 5b 34 5d 20      p->zArgv[4] 
3cb0: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a  = p->aStack[4].z
3cc0: 53 68 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  Short;.    }else
3cd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 41 72 67 76  {.      p->zArgv
3ce0: 5b 34 5d 20 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e  [4] = p->aOp[i].
3cf0: 70 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  p3;.    }.    p-
3d00: 3e 7a 41 72 67 76 5b 31 5d 20 3d 20 73 71 6c 69  >zArgv[1] = sqli
3d10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
3d20: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 5d  ->aOp[i].opcode]
3d30: 3b 0a 20 20 20 20 70 2d 3e 70 63 20 3d 20 69 2b  ;.    p->pc = i+
3d40: 31 3b 0a 20 20 20 20 70 2d 3e 61 7a 52 65 73 43  1;.    p->azResC
3d50: 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67 76  olumn = p->zArgv
3d60: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ;.    p->nResCol
3d70: 75 6d 6e 20 3d 20 35 3b 0a 20 20 20 20 70 2d 3e  umn = 5;.    p->
3d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3d90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3da0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
3db0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3dc0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
3dd0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
3de0: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
3df0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
3e00: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
3e10: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
3e20: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
3e30: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
3e40: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
3e50: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
3e60: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
3e70: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
3e80: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
3e90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
3ea0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2f 0a 76 6f  eExec().  .*/.vo
3eb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
3ec0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
3ed0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
3ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3ef0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
3f00: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f20: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
3f30: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
3f40: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ent */.  int isE
3f50: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f70: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
3f80: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
3f90: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
3fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
3fb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3fc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3fd0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
3fe0: 2a 20 41 64 64 20 61 20 48 41 4c 54 20 69 6e 73  * Add a HALT ins
3ff0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
4000: 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65 20  very end of the 
4010: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
4020: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 7c 7c  if( p->nOp==0 ||
4030: 20 28 70 2d 3e 61 4f 70 20 26 26 20 70 2d 3e 61   (p->aOp && p->a
4040: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
4050: 6f 64 65 21 3d 4f 50 5f 48 61 6c 74 29 20 29 7b  ode!=OP_Halt) ){
4060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4070: 41 64 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74  AddOp(p, OP_Halt
4080: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
4090: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f  /* No instructio
40a0: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f  n ever pushes mo
40b0: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  re than a single
40c0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68   element onto th
40d0: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41  e.  ** stack.  A
40e0: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76  nd the stack nev
40f0: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63  er grows on succ
4100: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e  essive execution
4110: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61  s of the.  ** sa
4120: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65  me loop.  So the
4130: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73   instructions is
4150: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a   an upper bound.
4160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69    ** on the maxi
4170: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
4180: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
4190: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61   ** Allocation a
41a0: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61  ll the stack spa
41b0: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20  ce we will ever 
41c0: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  need..  */.  if(
41d0: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b   p->aStack==0 ){
41e0: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e  .    p->nVar = n
41f0: 56 61 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Var;.    assert(
4200: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
4210: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20  n = isExplain ? 
4220: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  10 : p->nOp;.   
4230: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
4240: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
4250: 20 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53   n*(sizeof(p->aS
4260: 74 61 63 6b 5b 30 5d 29 20 2b 20 32 2a 73 69 7a  tack[0]) + 2*siz
4270: 65 6f 66 28 63 68 61 72 2a 29 29 20 20 20 20 20  eof(char*))     
4280: 2f 2a 20 61 53 74 61 63 6b 20 61 6e 64 20 7a 41  /* aStack and zA
4290: 72 67 76 20 2a 2f 0a 20 20 20 20 20 20 20 20 2b  rgv */.        +
42a0: 20 70 2d 3e 6e 56 61 72 2a 28 73 69 7a 65 6f 66   p->nVar*(sizeof
42b0: 28 63 68 61 72 2a 29 2b 73 69 7a 65 6f 66 28 69  (char*)+sizeof(i
42c0: 6e 74 29 2b 31 29 20 20 20 20 2f 2a 20 61 7a 56  nt)+1)    /* azV
42d0: 61 72 2c 20 61 6e 56 61 72 2c 20 61 62 56 61 72  ar, anVar, abVar
42e0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 70   */.    );.    p
42f0: 2d 3e 7a 41 72 67 76 20 3d 20 28 63 68 61 72 2a  ->zArgv = (char*
4300: 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d 3b  *)&p->aStack[n];
4310: 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d  .    p->azColNam
4320: 65 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  e = (char**)&p->
4330: 7a 41 72 67 76 5b 6e 5d 3b 0a 20 20 20 20 70 2d  zArgv[n];.    p-
4340: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
4350: 29 26 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 6e  )&p->azColName[n
4360: 5d 3b 0a 20 20 20 20 70 2d 3e 61 6e 56 61 72 20  ];.    p->anVar 
4370: 3d 20 28 69 6e 74 2a 29 26 70 2d 3e 61 7a 56 61  = (int*)&p->azVa
4380: 72 5b 70 2d 3e 6e 56 61 72 5d 3b 0a 20 20 20 20  r[p->nVar];.    
4390: 70 2d 3e 61 62 56 61 72 20 3d 20 28 75 38 2a 29  p->abVar = (u8*)
43a0: 26 70 2d 3e 61 6e 56 61 72 5b 70 2d 3e 6e 56 61  &p->anVar[p->nVa
43b0: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  r];.  }..  sqlit
43c0: 65 33 48 61 73 68 49 6e 69 74 28 26 70 2d 3e 61  e3HashInit(&p->a
43d0: 67 67 2e 68 61 73 68 2c 20 53 51 4c 49 54 45 5f  gg.hash, SQLITE_
43e0: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 29 3b  HASH_BINARY, 0);
43f0: 0a 20 20 70 2d 3e 61 67 67 2e 70 53 65 61 72 63  .  p->agg.pSearc
4400: 68 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 4d 45  h = 0;.#ifdef ME
4410: 4d 4f 52 59 5f 44 45 42 55 47 0a 20 20 69 66 28  MORY_DEBUG.  if(
4420: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
4430: 69 73 74 73 28 22 76 64 62 65 5f 74 72 61 63 65  ists("vdbe_trace
4440: 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61  ") ){.    p->tra
4450: 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d  ce = stdout;.  }
4460: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 54 6f  .#endif.  p->pTo
4470: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
4480: 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 30 3b  1];.  p->pc = 0;
4490: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
44a0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
44b0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72  eCnt = 0;.  p->r
44c0: 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a  eturnDepth = 0;.
44d0: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
44e0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
44f0: 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72  ->undoTransOnErr
4500: 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 6f 70  or = 0;.  p->pop
4510: 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d  Stack =  0;.  p-
4520: 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78  >explain |= isEx
4530: 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69  plain;.  p->magi
4540: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
4550: 55 4e 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f  UN;.#ifdef VDBE_
4560: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
4570: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4580: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
4590: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
45a0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
45b0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
45c0: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
45d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a   }.#endif.}.../*
45e0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65  .** Remove any e
45f0: 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65 6d  lements that rem
4600: 61 69 6e 20 6f 6e 20 74 68 65 20 73 6f 72 74 65  ain on the sorte
4610: 72 20 66 6f 72 20 74 68 65 20 56 44 42 45 20 67  r for the VDBE g
4620: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
4630: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
4640: 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
4650: 20 77 68 69 6c 65 28 20 70 2d 3e 70 53 6f 72 74   while( p->pSort
4660: 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72 20 2a   ){.    Sorter *
4670: 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e 70 53 6f  pSorter = p->pSo
4680: 72 74 3b 0a 20 20 20 20 70 2d 3e 70 53 6f 72 74  rt;.    p->pSort
4690: 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 4e 65 78   = pSorter->pNex
46a0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  t;.    sqliteFre
46b0: 65 28 70 53 6f 72 74 65 72 2d 3e 7a 4b 65 79 29  e(pSorter->zKey)
46c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
46d0: 28 70 53 6f 72 74 65 72 2d 3e 70 44 61 74 61 29  (pSorter->pData)
46e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
46f0: 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 7d  (pSorter);.  }.}
4700: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 6e  ../*.** Reset an
4710: 20 41 67 67 20 73 74 72 75 63 74 75 72 65 2e 20   Agg structure. 
4720: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 74 73 20   Delete all its 
4730: 63 6f 6e 74 65 6e 74 73 2e 20 0a 2a 2a 0a 2a 2a  contents. .**.**
4740: 20 46 6f 72 20 69 6e 73 74 61 6c 6c 61 62 6c 65   For installable
4750: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
4760: 69 6f 6e 73 2c 20 69 66 20 74 68 65 20 73 74 65  ions, if the ste
4770: 70 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  p function has b
4780: 65 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 6d  een.** called, m
4790: 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6e  ake sure the fin
47a0: 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20  alizer function 
47b0: 68 61 73 20 61 6c 73 6f 20 62 65 65 6e 20 63 61  has also been ca
47c0: 6c 6c 65 64 2e 20 20 54 68 65 0a 2a 2a 20 66 69  lled.  The.** fi
47d0: 6e 61 6c 69 7a 65 72 20 6d 69 67 68 74 20 6e 65  nalizer might ne
47e0: 65 64 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72  ed to free memor
47f0: 79 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  y that was alloc
4800: 61 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ated as part of 
4810: 69 74 73 0a 2a 2a 20 70 72 69 76 61 74 65 20 63  its.** private c
4820: 6f 6e 74 65 78 74 2e 20 20 49 66 20 74 68 65 20  ontext.  If the 
4830: 66 69 6e 61 6c 69 7a 65 72 20 68 61 73 20 6e 6f  finalizer has no
4840: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
4850: 74 2c 20 63 61 6c 6c 20 69 74 0a 2a 2a 20 6e 6f  t, call it.** no
4860: 77 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  w..*/.void sqlit
4870: 65 33 56 64 62 65 41 67 67 52 65 73 65 74 28 41  e3VdbeAggReset(A
4880: 67 67 20 2a 70 41 67 67 29 7b 0a 20 20 69 6e 74  gg *pAgg){.  int
4890: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
48a0: 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 73 71 6c  p;.  for(p = sql
48b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 41  iteHashFirst(&pA
48c0: 67 67 2d 3e 68 61 73 68 29 3b 20 70 3b 20 70 20  gg->hash); p; p 
48d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  = sqliteHashNext
48e0: 28 70 29 29 7b 0a 20 20 20 20 41 67 67 45 6c 65  (p)){.    AggEle
48f0: 6d 20 2a 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74  m *pElem = sqlit
4900: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
4910: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
4920: 61 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20  apFunc!=0 );.   
4930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
4940: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
4950: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
4960: 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b  &pElem->aMem[i];
4970: 0a 20 20 20 20 20 20 69 66 28 20 70 41 67 67 2d  .      if( pAgg-
4980: 3e 61 70 46 75 6e 63 5b 69 5d 20 26 26 20 28 70  >apFunc[i] && (p
4990: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
49a0: 5f 41 67 67 43 74 78 29 21 3d 30 20 29 7b 0a 20  _AggCtx)!=0 ){. 
49b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 66 75         sqlite_fu
49c0: 6e 63 20 63 74 78 3b 0a 20 20 20 20 20 20 20 20  nc ctx;.        
49d0: 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 41 67 67  ctx.pFunc = pAgg
49e0: 2d 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  ->apFunc[i];.   
49f0: 20 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67 73       ctx.s.flags
4a00: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
4a10: 20 20 20 20 20 63 74 78 2e 70 41 67 67 20 3d 20       ctx.pAgg = 
4a20: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 20  pMem->z;.       
4a30: 20 63 74 78 2e 63 6e 74 20 3d 20 70 4d 65 6d 2d   ctx.cnt = pMem-
4a40: 3e 69 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e  >i;.        ctx.
4a50: 69 73 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20  isStep = 0;.    
4a60: 20 20 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20      ctx.isError 
4a70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 28 2a 70  = 0;.        (*p
4a80: 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 2d 3e  Agg->apFunc[i]->
4a90: 78 46 69 6e 61 6c 69 7a 65 29 28 26 63 74 78 29  xFinalize)(&ctx)
4aa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
4ab0: 65 6d 2d 3e 7a 21 3d 30 20 26 26 20 70 4d 65 6d  em->z!=0 && pMem
4ac0: 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72  ->z!=pMem->zShor
4ad0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
4ae0: 71 6c 69 74 65 46 72 65 65 28 70 4d 65 6d 2d 3e  qliteFree(pMem->
4af0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
4b00: 20 20 20 20 20 20 69 66 28 20 63 74 78 2e 73 2e        if( ctx.s.
4b10: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
4b20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
4b30: 69 74 65 46 72 65 65 28 63 74 78 2e 73 2e 7a 29  iteFree(ctx.s.z)
4b40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4b50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4b60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
4b70: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
4b80: 69 74 65 46 72 65 65 28 70 4d 65 6d 2d 3e 7a 29  iteFree(pMem->z)
4b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4ba0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4bb0: 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Elem);.  }.  sql
4bc0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70  ite3HashClear(&p
4bd0: 41 67 67 2d 3e 68 61 73 68 29 3b 0a 20 20 73 71  Agg->hash);.  sq
4be0: 6c 69 74 65 46 72 65 65 28 70 41 67 67 2d 3e 61  liteFree(pAgg->a
4bf0: 70 46 75 6e 63 29 3b 0a 20 20 70 41 67 67 2d 3e  pFunc);.  pAgg->
4c00: 61 70 46 75 6e 63 20 3d 20 30 3b 0a 20 20 70 41  apFunc = 0;.  pA
4c10: 67 67 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30  gg->pCurrent = 0
4c20: 3b 0a 20 20 70 41 67 67 2d 3e 70 53 65 61 72 63  ;.  pAgg->pSearc
4c30: 68 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 6e  h = 0;.  pAgg->n
4c40: 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mem = 0;.}../*.*
4c50: 2a 20 44 65 6c 65 74 65 20 61 20 6b 65 79 6c 69  * Delete a keyli
4c60: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
4c70: 65 33 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65  e3VdbeKeylistFre
4c80: 65 28 4b 65 79 6c 69 73 74 20 2a 70 29 7b 0a 20  e(Keylist *p){. 
4c90: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4ca0: 20 4b 65 79 6c 69 73 74 20 2a 70 4e 65 78 74 20   Keylist *pNext 
4cb0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
4cc0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
4cd0: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
4ce0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
4cf0: 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65   a cursor and re
4d00: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
4d10: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
4d20: 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74  sor happens.** t
4d30: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
4d40: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 6e  sqlite3VdbeClean
4d50: 75 70 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20  upCursor(Cursor 
4d60: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
4d70: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
4d80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
4d90: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
4da0: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66  ursor);.  }.  if
4db0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
4dc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
4dd0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
4de0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
4df0: 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73  pCx->pData);.  s
4e00: 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61  qliteFree(pCx->a
4e10: 54 79 70 65 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Type);.  memset(
4e20: 70 43 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pCx, 0, sizeof(*
4e30: 70 43 78 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pCx));.}../*.** 
4e40: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
4e50: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
4e60: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
4e70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
4e80: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4e90: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
4ea0: 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20 2a 70  ){.    Cursor *p
4eb0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
4ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ed0: 43 6c 65 61 6e 75 70 43 75 72 73 6f 72 28 70 43  CleanupCursor(pC
4ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
4ef0: 65 28 70 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e(pC);.  }.  sql
4f00: 69 74 65 46 72 65 65 28 70 2d 3e 61 70 43 73 72  iteFree(p->apCsr
4f10: 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  );.  p->apCsr = 
4f20: 30 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  0;.  p->nCursor 
4f30: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
4f40: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
4f50: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
4f60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4f70: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
4f80: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
4f90: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
4fa0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
4fb0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
4fc0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
4fd0: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
4fe0: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
4ff0: 73 20 69 6e 20 74 68 65 20 61 7a 56 61 72 69 61  s in the azVaria
5000: 62 6c 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ble[] array..*/.
5010: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
5020: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
5030: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
5040: 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 4d 65  aStack ){.    Me
5050: 6d 20 2a 70 54 6f 73 20 3d 20 70 2d 3e 70 54 6f  m *pTos = p->pTo
5060: 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  s;.    while( pT
5070: 6f 73 3e 3d 70 2d 3e 61 53 74 61 63 6b 20 29 7b  os>=p->aStack ){
5080: 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 73 2d  .      if( pTos-
5090: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
50a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
50b0: 74 65 46 72 65 65 28 70 54 6f 73 2d 3e 7a 29 3b  teFree(pTos->z);
50c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
50d0: 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Tos--;.    }.   
50e0: 20 70 2d 3e 70 54 6f 73 20 3d 20 70 54 6f 73 3b   p->pTos = pTos;
50f0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
5100: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28  ursors(p);.  if(
5110: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
5120: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
5130: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
5140: 69 66 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  if( p->aMem[i].f
5150: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
5160: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5170: 46 72 65 65 28 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  Free(p->aMem[i].
5180: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
5190: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
51a0: 65 65 28 70 2d 3e 61 4d 65 6d 29 3b 0a 20 20 70  ee(p->aMem);.  p
51b0: 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 2d  ->aMem = 0;.  p-
51c0: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 69 66 28  >nMem = 0;.  if(
51d0: 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20   p->pList ){.   
51e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c   sqlite3VdbeKeyl
51f0: 69 73 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74  istFree(p->pList
5200: 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20  );.    p->pList 
5210: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
5220: 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65  e3VdbeSorterRese
5230: 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  t(p);.  if( p->p
5240: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  File ){.    if( 
5250: 70 2d 3e 70 46 69 6c 65 21 3d 73 74 64 69 6e 20  p->pFile!=stdin 
5260: 29 20 66 63 6c 6f 73 65 28 70 2d 3e 70 46 69 6c  ) fclose(p->pFil
5270: 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 69 6c 65  e);.    p->pFile
5280: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
5290: 70 2d 3e 61 7a 46 69 65 6c 64 20 29 7b 0a 20 20  p->azField ){.  
52a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
52b0: 61 7a 46 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d  azField);.    p-
52c0: 3e 61 7a 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20  >azField = 0;.  
52d0: 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  }.  p->nField = 
52e0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e  0;.  if( p->zLin
52f0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  e ){.    sqliteF
5300: 72 65 65 28 70 2d 3e 7a 4c 69 6e 65 29 3b 0a 20  ree(p->zLine);. 
5310: 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30 3b     p->zLine = 0;
5320: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 69 6e 65 41  .  }.  p->nLineA
5330: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lloc = 0;.  sqli
5340: 74 65 33 56 64 62 65 41 67 67 52 65 73 65 74 28  te3VdbeAggReset(
5350: 26 70 2d 3e 61 67 67 29 3b 0a 20 20 69 66 28 20  &p->agg);.  if( 
5360: 70 2d 3e 61 53 65 74 20 29 7b 0a 20 20 20 20 66  p->aSet ){.    f
5370: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65  or(i=0; i<p->nSe
5380: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t; i++){.      s
5390: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
53a0: 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61 73 68  &p->aSet[i].hash
53b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
53c0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 65  qliteFree(p->aSe
53d0: 74 29 3b 0a 20 20 70 2d 3e 61 53 65 74 20 3d 20  t);.  p->aSet = 
53e0: 30 3b 0a 20 20 70 2d 3e 6e 53 65 74 20 3d 20 30  0;.  p->nSet = 0
53f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6b 65 79 6c 69  ;.  if( p->keyli
5400: 73 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69  stStack ){.    i
5410: 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
5420: 69 20 3d 20 30 3b 20 69 69 20 3c 20 70 2d 3e 6b  i = 0; ii < p->k
5430: 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68  eylistStackDepth
5440: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; ii++){.      s
5450: 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c 69 73  qlite3VdbeKeylis
5460: 74 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74  tFree(p->keylist
5470: 53 74 61 63 6b 5b 69 69 5d 29 3b 0a 20 20 20 20  Stack[ii]);.    
5480: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
5490: 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b  (p->keylistStack
54a0: 29 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c 69 73  );.    p->keylis
54b0: 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b  tStackDepth = 0;
54c0: 0a 20 20 20 20 70 2d 3e 6b 65 79 6c 69 73 74 53  .    p->keylistS
54d0: 74 61 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tack = 0;.  }.  
54e0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63 6f  sqliteFree(p->co
54f0: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 70  ntextStack);.  p
5500: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d  ->contextStack =
5510: 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65   0;.  sqliteFree
5520: 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  (p->zErrMsg);.  
5530: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
5550: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
5560: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
5570: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
5580: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
5590: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
55a0: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
55b0: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
55c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
55d0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
55e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
55f0: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
5600: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
5610: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
5620: 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gain..*/.int sql
5630: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
5640: 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a  be *p, char **pz
5650: 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74  ErrMsg){.  sqlit
5660: 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e *db = p->db;. 
5670: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
5680: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
5690: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61  GIC_RUN && p->ma
56a0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
56b0: 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  HALT ){.    sqli
56c0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45  te3SetString(pzE
56d0: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
56e0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 51 4c 49  rror_string(SQLI
56f0: 54 45 5f 4d 49 53 55 53 45 29 2c 20 28 63 68 61  TE_MISUSE), (cha
5700: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
5710: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
5720: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 45  .  }.  if( p->zE
5730: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 69 66 28  rrMsg ){.    if(
5740: 20 70 7a 45 72 72 4d 73 67 20 26 26 20 2a 70 7a   pzErrMsg && *pz
5750: 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20 20  ErrMsg==0 ){.   
5760: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 70     *pzErrMsg = p
5770: 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7d  ->zErrMsg;.    }
5780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5790: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  teFree(p->zErrMs
57a0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  g);.    }.    p-
57b0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
57c0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
57d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
57e0: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
57f0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72 5f  , sqlite3_error_
5800: 73 74 72 69 6e 67 28 70 2d 3e 72 63 29 2c 20 28  string(p->rc), (
5810: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
5820: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
5830: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
5840: 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  OK ){.    switch
5850: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
5860: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
5870: 45 5f 41 62 6f 72 74 3a 20 7b 0a 20 20 20 20 20  E_Abort: {.     
5880: 20 20 20 69 66 28 20 21 70 2d 3e 75 6e 64 6f 54     if( !p->undoT
5890: 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20  ransOnError ){. 
58a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
58b0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
58c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
58d0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
58e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
58f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
5900: 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 64 62 2d 3e  ollbackStmt(db->
5910: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
5920: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5950: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  }.        /* Fal
5960: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 52 4f 4c  l through to ROL
5970: 4c 42 41 43 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  LBACK */.      }
5980: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
5990: 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  ollback: {.     
59a0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
59b0: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
59c0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
59d0: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
59e0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45  .        db->onE
59f0: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
5a00: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
5a10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5a20: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5a30: 20 20 20 69 66 28 20 70 2d 3e 75 6e 64 6f 54 72     if( p->undoTr
5a40: 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  ansOnError ){.  
5a50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5a60: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
5a70: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5a80: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
5a90: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 20 20 20 20  nTrans;.        
5aa0: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
5ab0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  OE_Default;.    
5ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5ad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5ae0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f   }.    sqlite3Ro
5af0: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
5b00: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 20  anges(db);.  }. 
5b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
5b20: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
5b30: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
5b40: 74 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  t && db->aDb[i].
5b50: 69 6e 54 72 61 6e 73 3d 3d 32 20 29 7b 0a 20 20  inTrans==2 ){.  
5b60: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5b70: 43 6f 6d 6d 69 74 53 74 6d 74 28 64 62 2d 3e 61  CommitStmt(db->a
5b80: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
5b90: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54    db->aDb[i].inT
5ba0: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rans = 1;.    }.
5bb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5bc0: 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b  >pTos<&p->aStack
5bd0: 5b 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69 74  [p->pc] || sqlit
5be0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
5bf0: 3d 3d 31 20 29 3b 0a 23 69 66 64 65 66 20 56 44  ==1 );.#ifdef VD
5c00: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
5c10: 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
5c20: 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
5c30: 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
5c40: 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
5c50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5c60: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
5c70: 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
5c80: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
5c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
5ca0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
5cb0: 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
5cc0: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
5cd0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5ce0: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
5cf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
5d00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5d10: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
5d20: 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
5d30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
5d40: 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
5d50: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
5d60: 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
5d70: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
5d80: 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
5d90: 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
5da0: 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
5db0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
5dc0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
5dd0: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
5de0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5df0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
5e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
5e10: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
5e20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
5e30: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
5e40: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
5e50: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
5e60: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
5e70: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
5e80: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
5e90: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
5ea0: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
5eb0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
5ec0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
5ed0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5ee0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
5ef0: 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72   *p, char **pzEr
5f00: 72 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rMsg){.  int rc;
5f10: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
5f20: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
5f30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
5f40: 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  & p->magic!=VDBE
5f50: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
5f60: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
5f70: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71  ing(pzErrMsg, sq
5f80: 6c 69 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69  lite3_error_stri
5f90: 6e 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ng(SQLITE_MISUSE
5fa0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 64 62  MISUSE;.  }.  db
5fd0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
5fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
5ff0: 74 28 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  t(p, pzErrMsg);.
6000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
6010: 65 74 65 28 70 29 3b 0a 20 20 69 66 28 20 64 62  ete(p);.  if( db
6020: 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20  ->want_to_close 
6030: 26 26 20 64 62 2d 3e 70 56 64 62 65 3d 3d 30 20  && db->pVdbe==0 
6040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
6050: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 7d 0a 20 20  lose(db);.  }.  
6060: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 53  if( rc==SQLITE_S
6070: 43 48 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c  CHEMA ){.    sql
6080: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
6090: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
60a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
60b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
60c0: 65 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20  e values of all 
60d0: 76 61 72 69 61 62 6c 65 73 2e 20 20 56 61 72 69  variables.  Vari
60e0: 61 62 6c 65 20 24 31 20 69 6e 20 74 68 65 20 6f  able $1 in the o
60f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 77 69 6c 6c  riginal SQL will
6100: 0a 2a 2a 20 62 65 20 74 68 65 20 73 74 72 69 6e  .** be the strin
6110: 67 20 61 7a 56 61 6c 75 65 5b 30 5d 2e 20 20 24  g azValue[0].  $
6120: 32 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  2 will have the 
6130: 76 61 6c 75 65 20 61 7a 56 61 6c 75 65 5b 31 5d  value azValue[1]
6140: 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66 6f 72  .  And.** so for
6150: 74 68 2e 20 20 49 66 20 61 20 76 61 6c 75 65 20  th.  If a value 
6160: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
6170: 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 24 33 20  (for example $3 
6180: 77 68 65 6e 20 6e 56 61 6c 75 65 3d 3d 32 29 0a  when nValue==2).
6190: 2a 2a 20 74 68 65 6e 20 69 74 73 20 76 61 6c 75  ** then its valu
61a0: 65 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 0a  e will be NULL..
61b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
61c0: 6e 65 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ne overrides any
61d0: 20 70 72 69 6f 72 20 63 61 6c 6c 2e 0a 2a 2f 0a   prior call..*/.
61e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  int sqlite3_bind
61f0: 28 73 71 6c 69 74 65 5f 76 6d 20 2a 70 56 6d 2c  (sqlite_vm *pVm,
6200: 20 69 6e 74 20 69 2c 20 63 6f 6e 73 74 20 63 68   int i, const ch
6210: 61 72 20 2a 7a 56 61 6c 2c 20 69 6e 74 20 6c 65  ar *zVal, int le
6220: 6e 2c 20 69 6e 74 20 63 6f 70 79 29 7b 0a 20 20  n, int copy){.  
6230: 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 2a  Vdbe *p = (Vdbe*
6240: 29 70 56 6d 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  )pVm;.  if( p->m
6250: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
6260: 5f 52 55 4e 20 7c 7c 20 70 2d 3e 70 63 21 3d 30  _RUN || p->pc!=0
6270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6280: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
6290: 7d 0a 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69  }.  if( i<1 || i
62a0: 3e 70 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  >p->nVar ){.    
62b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41  return SQLITE_RA
62c0: 4e 47 45 3b 0a 20 20 7d 0a 20 20 69 2d 2d 3b 0a  NGE;.  }.  i--;.
62d0: 20 20 69 66 28 20 70 2d 3e 61 62 56 61 72 5b 69    if( p->abVar[i
62e0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ] ){.    sqliteF
62f0: 72 65 65 28 70 2d 3e 61 7a 56 61 72 5b 69 5d 29  ree(p->azVar[i])
6300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 56 61 6c  ;.  }.  if( zVal
6310: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 70 79 20  ==0 ){.    copy 
6320: 3d 20 30 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30  = 0;.    len = 0
6330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3c  ;.  }.  if( len<
6340: 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  0 ){.    len = s
6350: 74 72 6c 65 6e 28 7a 56 61 6c 29 2b 31 3b 0a 20  trlen(zVal)+1;. 
6360: 20 7d 0a 20 20 69 66 28 20 63 6f 70 79 20 29 7b   }.  if( copy ){
6370: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  .    p->azVar[i]
6380: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6390: 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66 28 20   len );.    if( 
63a0: 70 2d 3e 61 7a 56 61 72 5b 69 5d 20 29 20 6d 65  p->azVar[i] ) me
63b0: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 5b 69 5d  mcpy(p->azVar[i]
63c0: 2c 20 7a 56 61 6c 2c 20 6c 65 6e 29 3b 0a 20 20  , zVal, len);.  
63d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 7a  }else{.    p->az
63e0: 56 61 72 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29  Var[i] = (char*)
63f0: 7a 56 61 6c 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  zVal;.  }.  p->a
6400: 62 56 61 72 5b 69 5d 20 3d 20 63 6f 70 79 3b 0a  bVar[i] = copy;.
6410: 20 20 70 2d 3e 61 6e 56 61 72 5b 69 5d 20 3d 20    p->anVar[i] = 
6420: 6c 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  len;.  return SQ
6430: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
6440: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
6450: 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
6460: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
6470: 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
6480: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6490: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c  0 ) return;.  Cl
64a0: 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20  eanup(p);.  if( 
64b0: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
64c0: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
64d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
64e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
64f0: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70   p->db->pVdbe==p
6500: 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70   );.    p->db->p
6510: 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
6520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
6530: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
6540: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
6550: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
6560: 70 50 72 65 76 20 3d 20 70 2d 3e 70 4e 65 78 74  pPrev = p->pNext
6570: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   = 0;.  if( p->n
6580: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20  OpAlloc==0 ){.  
6590: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
65a0: 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20    p->nOp = 0;.  
65b0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
65c0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
65d0: 20 69 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70   if( p->aOp[i].p
65e0: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49  3type==P3_DYNAMI
65f0: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
6600: 65 46 72 65 65 28 70 2d 3e 61 4f 70 5b 69 5d 2e  eFree(p->aOp[i].
6610: 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p3);.    }.  }. 
6620: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6630: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Var; i++){.    i
6640: 66 28 20 70 2d 3e 61 62 56 61 72 5b 69 5d 20 29  f( p->abVar[i] )
6650: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
6660: 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zVar[i]);.  }.  
6670: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f  sqliteFree(p->aO
6680: 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p);.  sqliteFree
6690: 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73  (p->aLabel);.  s
66a0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74  qliteFree(p->aSt
66b0: 61 63 6b 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  ack);.  p->magic
66c0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
66d0: 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  AD;.  sqliteFree
66e0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
66f0: 6e 76 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72  nvert an integer
6700: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
6710: 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 66  native integer f
6720: 6f 72 6d 61 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ormat and.** the
6730: 20 62 69 67 45 6e 64 69 61 6e 20 66 6f 72 6d 61   bigEndian forma
6740: 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 65  t used as the re
6750: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
6760: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
6770: 65 20 62 69 67 45 6e 64 69 61 6e 20 66 6f 72 6d  e bigEndian form
6780: 61 74 20 28 6d 6f 73 74 20 73 69 67 6e 69 66 69  at (most signifi
6790: 63 61 6e 74 20 62 79 74 65 20 66 69 72 73 74 29  cant byte first)
67a0: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
67b0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 73  record numbers s
67c0: 6f 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  o that records w
67d0: 69 6c 6c 20 73 6f 72 74 20 69 6e 74 6f 20 74 68  ill sort into th
67e0: 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 0a  e correct order.
67f0: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 6d  ** even though m
6800: 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20  emcmp() is used 
6810: 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 6b  to compare the k
6820: 65 79 73 2e 20 20 4f 6e 20 6d 61 63 68 69 6e 65  eys.  On machine
6830: 73 0a 2a 2a 20 77 68 6f 73 65 20 6e 61 74 69 76  s.** whose nativ
6840: 65 20 69 6e 74 65 67 65 72 20 66 6f 72 6d 61 74  e integer format
6850: 20 69 73 20 6c 69 74 74 6c 65 20 65 6e 64 69 61   is little endia
6860: 6e 20 28 65 78 3a 20 69 34 38 36 29 20 74 68 65  n (ex: i486) the
6870: 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 62 79 74  .** order of byt
6880: 65 73 20 69 73 20 72 65 76 65 72 73 65 64 2e 20  es is reversed. 
6890: 20 4f 6e 20 6e 61 74 69 76 65 20 62 69 67 2d 65   On native big-e
68a0: 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 0a 2a  ndian machines.*
68b0: 2a 20 28 65 78 3a 20 41 6c 70 68 61 2c 20 53 70  * (ex: Alpha, Sp
68c0: 61 72 63 2c 20 4d 6f 74 6f 72 6f 6c 61 29 20 74  arc, Motorola) t
68d0: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 69 73  he byte order is
68e0: 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 0a 2a 2a   the same..**.**
68f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6900: 73 20 69 74 73 20 6f 77 6e 20 69 6e 76 65 72 73  s its own invers
6910: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
6920: 64 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  ds.**.**        
6930: 20 58 20 3d 3d 20 62 79 74 65 53 77 61 70 28 62   X == byteSwap(b
6940: 79 74 65 53 77 61 70 28 58 29 29 0a 2a 2f 0a 69  yteSwap(X)).*/.i
6950: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 42 79  nt sqlite3VdbeBy
6960: 74 65 53 77 61 70 28 69 6e 74 20 78 29 7b 0a 20  teSwap(int x){. 
6970: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 20 63 68   union {.     ch
6980: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 69  ar zBuf[sizeof(i
6990: 6e 74 29 5d 3b 0a 20 20 20 20 20 69 6e 74 20 69  nt)];.     int i
69a0: 3b 0a 20 20 7d 20 75 78 3b 0a 20 20 75 78 2e 7a  ;.  } ux;.  ux.z
69b0: 42 75 66 5b 33 5d 20 3d 20 78 26 30 78 66 66 3b  Buf[3] = x&0xff;
69c0: 0a 20 20 75 78 2e 7a 42 75 66 5b 32 5d 20 3d 20  .  ux.zBuf[2] = 
69d0: 28 78 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 75  (x>>8)&0xff;.  u
69e0: 78 2e 7a 42 75 66 5b 31 5d 20 3d 20 28 78 3e 3e  x.zBuf[1] = (x>>
69f0: 31 36 29 26 30 78 66 66 3b 0a 20 20 75 78 2e 7a  16)&0xff;.  ux.z
6a00: 42 75 66 5b 30 5d 20 3d 20 28 78 3e 3e 32 34 29  Buf[0] = (x>>24)
6a10: 26 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20  &0xff;.  return 
6a20: 75 78 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ux.i;.}../*.** I
6a30: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
6a40: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
6a50: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
6a60: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
6a70: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
6a80: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
6a90: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
6aa0: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
6ab0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
6ac0: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
6ad0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
6ae0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
6af0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
6b00: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
6b10: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
6b20: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
6b30: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 65 78 74  int res;.    ext
6b40: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
6b50: 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20  search_count;.  
6b60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 74    assert( p->int
6b70: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
6b80: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
6b90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
6ba0: 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c  veto(p->pCursor,
6bb0: 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
6bc0: 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  get, &res);.    
6bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
6be0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
6bf0: 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68 61 72  p->pCursor,(char
6c00: 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  *)&p->movetoTarg
6c10: 65 74 2c 73 69 7a 65 6f 66 28 69 36 34 29 2c 26  et,sizeof(i64),&
6c20: 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  res);.    }.    
6c30: 70 2d 3e 69 6e 63 72 4b 65 79 20 3d 20 30 3b 0a  p->incrKey = 0;.
6c40: 20 20 20 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f      p->lastRecno
6c50: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
6c60: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
6c70: 20 20 70 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69    p->recnoIsVali
6c80: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20  d = res==0;.    
6c90: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
6ca0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e     sqlite3BtreeN
6cb0: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
6cc0: 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &res);.    }.   
6cd0: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
6ce0: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e  count++;.    p->
6cf0: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
6d00: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
6d10: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Valid = 0;.  }. 
6d20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6d30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 49 58 20  K;.}../*.** FIX 
6d40: 4d 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ME.**.** This fu
6d50: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 63 6c 75 64  nction is includ
6d60: 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 73  ed temporarily s
6d70: 6f 20 74 68 61 74 20 72 65 67 72 65 73 73 69 6f  o that regressio
6d80: 6e 20 74 65 73 74 73 20 68 61 76 65 0a 2a 2a 20  n tests have.** 
6d90: 61 20 63 68 61 6e 63 65 20 6f 66 20 70 61 73 73  a chance of pass
6da0: 69 6e 67 2e 20 49 74 20 61 6c 77 61 79 73 20 75  ing. It always u
6db0: 73 65 73 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2f  ses memcmp()..*/
6dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 32 42 74 72 65  .int sqlite2Btre
6dd0: 65 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 42  eKeyCompare(.  B
6de0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
6df0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6e00: 74 6f 20 65 6e 74 72 79 20 74 6f 20 63 6f 6d 70  to entry to comp
6e10: 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
6e20: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
6e30: 79 2c 20 20 20 20 20 2f 2a 20 4b 65 79 20 74 6f  y,     /* Key to
6e40: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
6e50: 20 65 6e 74 72 79 20 74 68 61 74 20 70 43 75 72   entry that pCur
6e60: 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20   points to */.  
6e70: 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
6e80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6e90: 6f 66 20 62 79 74 65 73 20 69 6e 20 70 4b 65 79  of bytes in pKey
6ea0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 67 6e 6f 72   */.  int nIgnor
6eb0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  e,          /* I
6ec0: 67 6e 6f 72 65 20 74 68 69 73 20 6d 61 6e 79 20  gnore this many 
6ed0: 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
6ee0: 20 6f 66 20 70 43 75 72 20 2a 2f 0a 20 20 69 6e   of pCur */.  in
6ef0: 74 20 2a 70 52 65 73 75 6c 74 20 20 20 20 20 20  t *pResult      
6f00: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6f10: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
6f20: 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
6f30: 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 76 6f 69  *pCellKey;.  voi
6f40: 64 20 2a 70 4d 61 6c 6c 6f 63 65 64 4b 65 79 3b  d *pMallocedKey;
6f50: 0a 20 20 75 36 34 20 6e 43 65 6c 6c 4b 65 79 3b  .  u64 nCellKey;
6f60: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71  .  int rc;..  sq
6f70: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
6f80: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
6f90: 79 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d  y);.  nCellKey =
6fa0: 20 6e 43 65 6c 6c 4b 65 79 20 2d 20 6e 49 67 6e   nCellKey - nIgn
6fb0: 6f 72 65 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ore;.  if( nCell
6fc0: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Key<=0 ){.    *p
6fd0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  Result = 0;.    
6fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ff0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 65 6c 6c 4b 65  ;.  }..  pCellKe
7000: 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
7010: 4b 65 79 46 65 74 63 68 28 70 43 75 72 2c 20 6e  KeyFetch(pCur, n
7020: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
7030: 70 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  pCellKey ){.    
7040: 2a 70 52 65 73 75 6c 74 20 3d 20 6d 65 6d 63 6d  *pResult = memcm
7050: 70 28 70 43 65 6c 6c 4b 65 79 2c 20 70 4b 65 79  p(pCellKey, pKey
7060: 2c 20 6e 4b 65 79 3e 6e 43 65 6c 6c 4b 65 79 3f  , nKey>nCellKey?
7070: 6e 43 65 6c 6c 4b 65 79 3a 6e 4b 65 79 29 3b 0a  nCellKey:nKey);.
7080: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7090: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 4d 61  E_OK;.  }..  pMa
70a0: 6c 6c 6f 63 65 64 4b 65 79 20 3d 20 73 71 6c 69  llocedKey = sqli
70b0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b  teMalloc( nCellK
70c0: 65 79 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 6c  ey );.  if( pMal
70d0: 6c 6f 63 65 64 4b 65 79 3d 3d 30 20 29 20 72 65  locedKey==0 ) re
70e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
70f0: 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  M;..  rc = sqlit
7100: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
7110: 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 4d   0, nCellKey, pM
7120: 61 6c 6c 6f 63 65 64 4b 65 79 29 3b 0a 20 20 2a  allocedKey);.  *
7130: 70 52 65 73 75 6c 74 20 3d 20 6d 65 6d 63 6d 70  pResult = memcmp
7140: 28 70 4d 61 6c 6c 6f 63 65 64 4b 65 79 2c 20 70  (pMallocedKey, p
7150: 4b 65 79 2c 20 6e 4b 65 79 3e 6e 43 65 6c 6c 4b  Key, nKey>nCellK
7160: 65 79 3f 6e 43 65 6c 6c 4b 65 79 3a 6e 4b 65 79  ey?nCellKey:nKey
7170: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
7180: 70 4d 61 6c 6c 6f 63 65 64 4b 65 79 29 3b 0a 0a  pMallocedKey);..
7190: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
71a0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
71b0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
71c0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
71d0: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
71e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
71f0: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
7200: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
7210: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
7220: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
7230: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
7240: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
7250: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
7260: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
7270: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
7280: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
7290: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
72a0: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
72b0: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
72c0: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
72d0: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
72e0: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
72f0: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
7300: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
7310: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
7320: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
7330: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
7340: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
7350: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
7360: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
7370: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
7380: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
7390: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
73a0: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
73b0: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
73c0: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
73d0: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
73e0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
73f0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
7400: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
7410: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
7420: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
7430: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
7440: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
7450: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
7460: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
7470: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
7480: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
7490: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
74a0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
74b0: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
74c0: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
74d0: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
74e0: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
74f0: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
7500: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
7510: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7540: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
7550: 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 20 20              -   
7560: 20 20 20 20 20 20 20 20 20 4e 6f 74 20 61 20 74           Not a t
7570: 79 70 65 2e 0a 2a 2a 20 20 20 20 20 20 31 20 20  ype..**      1  
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
75a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
75b0: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
75d0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
75e0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
75f0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
7600: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
7610: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
7620: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
7650: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
7660: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
7670: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
7680: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
7690: 61 74 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  at.**      6    
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
76c0: 4c 4c 0a 2a 2a 20 20 20 20 20 37 2e 2e 31 31 20  LL.**     7..11 
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
76f0: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
7700: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
7710: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
7720: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
7730: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
7740: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
7750: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
7760: 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a  text.**.*/../*.*
7770: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
7780: 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
7790: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
77a0: 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 36 34 20 73 71   pMem..*/.u64 sq
77b0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
77c0: 79 70 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ype(const Mem *p
77d0: 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Mem){.  int flag
77e0: 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
77f0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
7800: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
7810: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
7820: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
7830: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
7840: 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
7850: 75 73 65 20 31 2c 20 32 2c 20 34 20 6f 72 20 38  use 1, 2, 4 or 8
7860: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 69   bytes. */.    i
7870: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a  64 i = pMem->i;.
7880: 20 20 20 20 69 66 28 20 69 3e 3d 2d 31 32 37 20      if( i>=-127 
7890: 26 26 20 69 3c 3d 31 32 37 20 29 20 72 65 74 75  && i<=127 ) retu
78a0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  rn 1;.    if( i>
78b0: 3d 2d 33 32 37 36 37 20 26 26 20 69 3c 3d 33 32  =-32767 && i<=32
78c0: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
78d0: 20 20 20 20 69 66 28 20 69 3e 3d 2d 32 31 34 37      if( i>=-2147
78e0: 34 38 33 36 34 37 20 26 26 20 69 3c 3d 32 31 34  483647 && i<=214
78f0: 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
7900: 20 33 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 34   3;.    return 4
7910: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
7920: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
7930: 20 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 7d 0a    return 5;.  }.
7940: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
7950: 53 74 72 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  Str ){.    /* We
7960: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
7970: 20 73 74 72 69 6e 67 20 69 73 20 4e 55 4c 4c 2d   string is NULL-
7980: 74 65 72 6d 69 6e 61 74 65 64 2e 20 57 65 20 64  terminated. We d
7990: 6f 6e 27 74 20 73 74 6f 72 65 20 74 68 65 0a 20  on't store the. 
79a0: 20 20 20 2a 2a 20 4e 55 4c 4c 2d 74 65 72 6d 69     ** NULL-termi
79b0: 6e 61 74 6f 72 20 2d 20 69 74 20 69 73 20 69 6d  nator - it is im
79c0: 70 6c 69 65 64 20 62 79 20 74 68 65 20 73 74 72  plied by the str
79d0: 69 6e 67 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ing storage clas
79e0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
79f0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 30 20  sert( pMem->n>0 
7a00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7a10: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2d 31  Mem->z[pMem->n-1
7a20: 5d 3d 3d 27 5c 30 27 20 29 3b 0a 20 20 20 20 72  ]=='\0' );.    r
7a30: 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32  eturn (pMem->n*2
7a40: 20 2b 20 31 31 29 3b 20 2f 2a 20 28 70 4d 65 6d   + 11); /* (pMem
7a50: 2d 3e 6e 2d 31 29 2a 32 20 2b 20 31 33 20 2a 2f  ->n-1)*2 + 13 */
7a60: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
7a70: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
7a80: 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e   return (pMem->n
7a90: 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20  *2 + 12);.  }.  
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7ab0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
7ac0: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
7ad0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
7ae0: 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
7af0: 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69  erial-type..*/.i
7b00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
7b10: 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 36 34 20  rialTypeLen(u64 
7b20: 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
7b30: 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
7b40: 79 70 65 21 3d 30 20 29 3b 0a 20 20 73 77 69 74  ype!=0 );.  swit
7b50: 63 68 28 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  ch(serial_type){
7b60: 0a 20 20 20 20 63 61 73 65 20 36 3a 20 72 65 74  .    case 6: ret
7b70: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
7b80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20          /* NULL 
7b90: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 3a 20 72  */.    case 1: r
7ba0: 65 74 75 72 6e 20 31 3b 20 20 20 20 20 20 20 20  eturn 1;        
7bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 62            /* 1 b
7bc0: 79 74 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  yte integer */. 
7bd0: 20 20 20 63 61 73 65 20 32 3a 20 72 65 74 75 72     case 2: retur
7be0: 6e 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 2;            
7bf0: 20 20 20 20 20 20 2f 2a 20 32 20 62 79 74 65 20        /* 2 byte 
7c00: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
7c10: 61 73 65 20 33 3a 20 72 65 74 75 72 6e 20 34 3b  ase 3: return 4;
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 2f 2a 20 34 20 62 79 74 65 20 69 6e 74 65    /* 4 byte inte
7c40: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
7c50: 34 3a 20 72 65 74 75 72 6e 20 38 3b 20 20 20 20  4: return 8;    
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c70: 20 38 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   8 byte integer 
7c80: 2a 2f 0a 20 20 20 20 63 61 73 65 20 35 3a 20 72  */.    case 5: r
7c90: 65 74 75 72 6e 20 38 3b 20 20 20 20 20 20 20 20  eturn 8;        
7ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 38 20 62            /* 8 b
7cb0: 79 74 65 20 66 6c 6f 61 74 20 2a 2f 0a 20 20 7d  yte float */.  }
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61  .  assert( seria
7cd0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20  l_type>=12 );.  
7ce0: 72 65 74 75 72 6e 20 28 28 73 65 72 69 61 6c 5f  return ((serial_
7cf0: 74 79 70 65 2d 31 32 29 3e 3e 31 29 3b 20 20 20  type-12)>>1);   
7d00: 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 72 20       /* text or 
7d10: 62 6c 6f 62 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  blob */.}../*.**
7d20: 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
7d30: 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
7d40: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
7d50: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
7d60: 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
7d70: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
7d80: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
7d90: 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
7da0: 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
7db0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7dc0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
7dd0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
7de0: 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73  dbeSerialPut(uns
7df0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
7e00: 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
7e10: 29 7b 0a 20 20 75 36 34 20 73 65 72 69 61 6c 5f  ){.  u64 serial_
7e20: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
7e30: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
7e40: 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  m);.  int len;..
7e50: 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
7e60: 5f 74 79 70 65 21 3d 30 20 29 3b 0a 20 0a 20 20  _type!=0 );. .  
7e70: 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28  /* NULL */.  if(
7e80: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
7e90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7ea0: 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49 6e 74 65  .  }. .  /* Inte
7eb0: 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  ger */.  if( ser
7ec0: 69 61 6c 5f 74 79 70 65 3c 35 20 29 7b 0a 20 20  ial_type<5 ){.  
7ed0: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
7ee0: 69 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  i;.    len = sql
7ef0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
7f00: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
7f10: 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6c  e);.    while( l
7f20: 65 6e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75  en-- ){.      bu
7f30: 66 5b 6c 65 6e 5d 20 3d 20 28 69 26 30 78 46 46  f[len] = (i&0xFF
7f40: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 69 20 3e  );.      i = i >
7f50: 3e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  > 8;.    }.    r
7f60: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
7f70: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
7f80: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
7f90: 0a 0a 20 20 2f 2a 20 46 6c 6f 61 74 20 2a 2f 0a  ..  /* Float */.
7fa0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
7fb0: 65 3d 3d 35 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e==5 ){.    /* T
7fc0: 4f 44 4f 3a 20 62 79 74 65 20 6f 72 64 65 72 69  ODO: byte orderi
7fd0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ng? */.    asser
7fe0: 74 28 20 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65  t( sizeof(double
7ff0: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d 63  )==8 );.    memc
8000: 70 79 28 62 75 66 2c 20 26 70 4d 65 6d 2d 3e 72  py(buf, &pMem->r
8010: 2c 20 38 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 8);.    return
8020: 20 38 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   8;.  }.  .  /* 
8030: 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
8040: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69  /.  assert( seri
8050: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20  al_type>=12 );. 
8060: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
8070: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
8080: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
8090: 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
80a0: 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 72 65 74  ->z, len);.  ret
80b0: 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn len;.}../*.*
80c0: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
80d0: 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
80e0: 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
80f0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
8100: 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
8110: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
8120: 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
8130: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8140: 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
8150: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
8160: 65 72 69 61 6c 47 65 74 28 63 6f 6e 73 74 20 75  erialGet(const u
8170: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
8180: 66 2c 20 75 36 34 20 73 65 72 69 61 6c 5f 74 79  f, u64 serial_ty
8190: 70 65 2c 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  pe, Mem *pMem){.
81a0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73    int len;..  as
81b0: 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
81c0: 65 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 6d 65  e!=0 );..  /* me
81d0: 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 69  mset(pMem, 0, si
81e0: 7a 65 6f 66 28 70 4d 65 6d 29 29 3b 20 2a 2f 0a  zeof(pMem)); */.
81f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8200: 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30  0;.  pMem->z = 0
8210: 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  ;..  /* NULL */.
8220: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
8230: 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d  e==6 ){.    pMem
8240: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8250: 6c 6c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ll;.    return 0
8260: 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49 6e 74  ;.  }. .  /* Int
8270: 65 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 73 65  eger */.  if( se
8280: 72 69 61 6c 5f 74 79 70 65 3c 35 20 29 7b 0a 20  rial_type<5 ){. 
8290: 20 20 20 69 36 34 20 69 20 3d 20 30 3b 0a 20 20     i64 i = 0;.  
82a0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6c 65 6e    int n;.    len
82b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
82c0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
82d0: 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 20 20 69  al_type);..    i
82e0: 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29  f( buf[0]&0x80 )
82f0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b  {.      for(n=0;
8300: 20 6e 3c 28 38 2d 6c 65 6e 29 3b 20 6e 2b 2b 29   n<(8-len); n++)
8310: 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 28 69  {.        i = (i
8320: 3c 3c 38 29 2b 30 78 46 46 3b 0a 20 20 20 20 20  <<8)+0xFF;.     
8330: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
8340: 28 6e 3d 30 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b  (n=0; n<len; n++
8350: 29 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 20 3c  ){.      i = i <
8360: 3c 20 38 3b 0a 20 20 20 20 20 20 69 20 3d 20 69  < 8;.      i = i
8370: 20 2b 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 7d   + buf[n];.    }
8380: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
8390: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
83a0: 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 0a 20 20 20  pMem->i = i;.   
83b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
83c0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
83d0: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
83e0: 20 7d 0a 0a 20 20 2f 2a 20 46 6c 6f 61 74 20 2a   }..  /* Float *
83f0: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
8400: 79 70 65 3d 3d 35 20 29 7b 0a 20 20 20 20 2f 2a  ype==5 ){.    /*
8410: 20 54 4f 44 4f 3a 20 62 79 74 65 20 6f 72 64 65   TODO: byte orde
8420: 72 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 61 73 73  ring? */.    ass
8430: 65 72 74 28 20 73 69 7a 65 6f 66 28 64 6f 75 62  ert( sizeof(doub
8440: 6c 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 6d 65  le)==8 );.    me
8450: 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 62  mcpy(&pMem->r, b
8460: 75 66 2c 20 38 29 3b 0a 20 20 20 20 70 4d 65 6d  uf, 8);.    pMem
8470: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65  ->flags = MEM_Re
8480: 61 6c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 38  al;.    return 8
8490: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74  ;.  }.  .  /* St
84a0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
84b0: 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
84c0: 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c  _type>=12 );.  l
84d0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  en = sqlite3Vdbe
84e0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
84f0: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
8500: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
8510: 30 31 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  01 ){.    pMem->
8520: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
8530: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c  .    pMem->n = l
8540: 65 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  en+1;.  }else{. 
8550: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8560: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 70   MEM_Blob;.    p
8570: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
8580: 7d 0a 0a 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e  }..  if( (pMem->
8590: 6e 29 3e 4e 42 46 53 20 29 7b 0a 20 20 20 20 70  n)>NBFS ){.    p
85a0: 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d  Mem->z = sqliteM
85b0: 61 6c 6c 6f 63 52 61 77 28 20 70 4d 65 6d 2d 3e  allocRaw( pMem->
85c0: 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4d  n );.    if( !pM
85d0: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 72  em->z ){.      r
85e0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
85f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8600: 7c 3d 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 7d 65  |= MEM_Dyn;.  }e
8610: 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  lse{.    pMem->z
8620: 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 3b   = pMem->zShort;
8630: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
8640: 20 7c 3d 20 4d 45 4d 5f 53 68 6f 72 74 3b 0a 20   |= MEM_Short;. 
8650: 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 65   }..  memcpy(pMe
8660: 6d 2d 3e 7a 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  m->z, buf, len);
8670: 20 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c   .  if( pMem->fl
8680: 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
8690: 20 20 20 70 4d 65 6d 2d 3e 7a 5b 6c 65 6e 5d 20     pMem->z[len] 
86a0: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72  = '\0';.  }..  r
86b0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a  eturn len;.}../*
86c0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
86d0: 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
86e0: 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
86f0: 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
8700: 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
8710: 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
8720: 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
8730: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
8740: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
8750: 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
8760: 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
8770: 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
8780: 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
8790: 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
87a0: 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
87b0: 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
87c0: 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
87d0: 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
87e0: 20 61 6e 64 0a 2a 2a 20 66 69 6e 61 6c 6c 79 20   and.** finally 
87f0: 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
8800: 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
8810: 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
8820: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
8830: 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
8840: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
8850: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
8860: 65 28 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 4d 65  e(Mem *pMem1, Me
8870: 6d 20 2a 70 4d 65 6d 32 29 7b 0a 20 20 69 6e 74  m *pMem2){.  int
8880: 20 72 63 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   rc;.  int combi
8890: 6e 65 64 5f 66 6c 61 67 73 20 3d 20 70 4d 65 6d  ned_flags = pMem
88a0: 31 2d 3e 66 6c 61 67 73 7c 70 4d 65 6d 32 2d 3e  1->flags|pMem2->
88b0: 66 6c 61 67 73 3b 20 0a 20 0a 20 20 2f 2a 20 49  flags; . .  /* I
88c0: 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
88d0: 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
88e0: 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
88f0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
8900: 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
8910: 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
8920: 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
8930: 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
8940: 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 32 2d    return (pMem2-
8950: 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
8960: 20 2d 20 28 70 4d 65 6d 31 2d 3e 66 6c 61 67 73   - (pMem1->flags
8970: 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
8980: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
8990: 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61  ue is a number a
89a0: 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
89b0: 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  not, the number 
89c0: 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
89d0: 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72   both are number
89e0: 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65  s, compare as re
89f0: 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20  als if one is a 
8a00: 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65  real, or as inte
8a10: 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74  gers.  ** if bot
8a20: 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74  h values are int
8a30: 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  egers..  */.  if
8a40: 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
8a50: 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
8a60: 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  al) ){.    if( !
8a70: 28 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 26 28 4d  (pMem1->flags&(M
8a80: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
8a90: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8aa0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
8ab0: 66 28 20 21 28 70 4d 65 6d 32 2d 3e 66 6c 61 67  f( !(pMem2->flag
8ac0: 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
8ad0: 65 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  eal)) ){.      r
8ae0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
8af0: 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
8b00: 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  d_flags&MEM_Real
8b10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
8b20: 65 6d 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49  em1->flags&MEM_I
8b30: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  nt ){.        pM
8b40: 65 6d 31 2d 3e 72 20 3d 20 70 4d 65 6d 31 2d 3e  em1->r = pMem1->
8b50: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
8b60: 20 69 66 28 20 70 4d 65 6d 32 2d 3e 66 6c 61 67   if( pMem2->flag
8b70: 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
8b80: 20 20 20 20 20 70 4d 65 6d 32 2d 3e 72 20 3d 20       pMem2->r = 
8b90: 70 4d 65 6d 32 2d 3e 69 3b 0a 20 20 20 20 20 20  pMem2->i;.      
8ba0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  }.      if( pMem
8bb0: 31 2d 3e 72 20 3c 20 70 4d 65 6d 32 2d 3e 72 20  1->r < pMem2->r 
8bc0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
8bd0: 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 72 20     if( pMem1->r 
8be0: 3e 20 70 4d 65 6d 32 2d 3e 72 20 29 20 72 65 74  > pMem2->r ) ret
8bf0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74  urn 1;.      ret
8c00: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
8c10: 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 31 2d    return (pMem1-
8c20: 3e 69 20 2d 20 70 4d 65 6d 32 2d 3e 69 29 3b 0a  >i - pMem2->i);.
8c30: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 28 70 4d 65    }..  rc = (pMe
8c40: 6d 32 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  m2->flags&MEM_Nu
8c50: 6c 6c 29 20 2d 20 28 70 4d 65 6d 31 2d 3e 66 6c  ll) - (pMem1->fl
8c60: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ags&MEM_Null);. 
8c70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
8c80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
8c90: 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
8ca0: 6d 75 73 74 20 62 65 20 73 74 72 69 6e 67 73 20  must be strings 
8cb0: 6f 72 20 62 6c 6f 62 73 2e 20 49 66 20 6f 6e 6c  or blobs. If onl
8cc0: 79 20 6f 6e 65 20 69 73 20 61 20 73 74 72 69 6e  y one is a strin
8cd0: 67 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 61  g, then.  ** tha
8ce0: 74 20 76 61 6c 75 65 20 69 73 20 6c 65 73 73 2e  t value is less.
8cf0: 20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 6d 70   Otherwise, comp
8d00: 61 72 65 20 77 69 74 68 20 6d 65 6d 63 6d 70 28  are with memcmp(
8d10: 29 2e 20 49 66 20 6d 65 6d 63 6d 70 28 29 0a 20  ). If memcmp(). 
8d20: 20 2a 2a 20 72 65 74 75 72 6e 73 20 30 20 61 6e   ** returns 0 an
8d30: 64 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 6c  d one value is l
8d40: 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6f  onger than the o
8d50: 74 68 65 72 2c 20 74 68 65 6e 20 74 68 61 74 20  ther, then that 
8d60: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 67 72  value.  ** is gr
8d70: 65 61 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 72 63  eater..  */.  rc
8d80: 20 3d 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d   = memcmp(pMem1-
8d90: 3e 7a 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70  >z, pMem2->z, (p
8da0: 4d 65 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e  Mem1->n>pMem2->n
8db0: 29 3f 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31  )?pMem2->n:pMem1
8dc0: 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ->n);.  if( rc )
8dd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8de0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
8df0: 70 4d 65 6d 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32  pMem1->n - pMem2
8e00: 2d 3e 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ->n);.}../*.** T
8e10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
8e20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
8e30: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 28 6e 6f 6e  unction for (non
8e40: 2d 69 6e 74 65 67 65 72 29 0a 2a 2a 20 6b 65 79  -integer).** key
8e50: 73 20 69 6e 20 74 68 65 20 62 74 72 65 65 73 2e  s in the btrees.
8e60: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
8e70: 72 65 74 75 72 6e 73 20 6e 65 67 61 74 69 76 65  returns negative
8e80: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
8e90: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
8ea0: 72 73 74 20 6b 65 79 20 69 73 20 6c 65 73 73 20  rst key is less 
8eb0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
8ec0: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  or greater than.
8ed0: 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a  ** the second..*
8ee0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8ef0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
8f00: 65 61 63 68 20 6b 65 79 20 63 6f 6e 73 69 73 74  each key consist
8f10: 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  s of one or more
8f20: 20 74 79 70 65 2f 62 6c 6f 62 0a 2a 2a 20 70 61   type/blob.** pa
8f30: 69 72 73 2c 20 65 6e 63 6f 64 65 64 20 75 73 69  irs, encoded usi
8f40: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ng the sqlite3Vd
8f50: 62 65 53 65 72 69 61 6c 58 58 58 28 29 20 66 75  beSerialXXX() fu
8f60: 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 2e 20 0a  nctions above. .
8f70: 2a 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  **.** Following 
8f80: 74 68 65 20 74 79 70 65 2f 62 6c 6f 62 20 70 61  the type/blob pa
8f90: 69 72 73 2c 20 65 61 63 68 20 6b 65 79 20 6d 61  irs, each key ma
8fa0: 79 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  y have a single 
8fb0: 30 78 30 30 20 62 79 74 65 0a 2a 2a 20 66 6f 6c  0x00 byte.** fol
8fc0: 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 6e  lowed by a varin
8fd0: 74 2e 20 41 20 6b 65 79 20 6d 61 79 20 6f 6e 6c  t. A key may onl
8fe0: 79 20 68 61 76 65 20 74 68 69 73 20 74 72 61 6c  y have this tral
8ff0: 69 6e 67 20 30 78 30 30 2f 76 61 72 69 6e 74 0a  ing 0x00/varint.
9000: 2a 2a 20 70 61 69 72 20 69 66 20 69 74 20 68 61  ** pair if it ha
9010: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61  s at least as ma
9020: 6e 79 20 74 79 70 65 2f 62 6c 6f 62 20 70 61 69  ny type/blob pai
9030: 72 73 20 61 73 20 74 68 65 20 6b 65 79 20 69 74  rs as the key it
9040: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 63 6f 6d   is being.** com
9050: 70 61 72 65 64 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  pared to..*/.int
9060: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 43   sqlite3VdbeKeyC
9070: 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  ompare(.  void *
9080: 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20  userData,.  int 
9090: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
90a0: 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74  d *pKey1, .  int
90b0: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
90c0: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 43  id *pKey2.){.  C
90d0: 75 72 73 6f 72 20 2a 70 43 20 3d 20 28 43 75 72  ursor *pC = (Cur
90e0: 73 6f 72 20 2a 29 75 73 65 72 44 61 74 61 3b 0a  sor *)userData;.
90f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 31 20 3d 20    int offset1 = 
9100: 30 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 32  0;.  int offset2
9110: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
9120: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
9130: 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
9140: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
9150: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  1;.  const unsig
9160: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20  ned char *aKey2 
9170: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
9180: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a  d char *)pKey2;.
9190: 20 20 0a 20 20 77 68 69 6c 65 28 20 6f 66 66 73    .  while( offs
91a0: 65 74 31 3c 6e 4b 65 79 31 20 26 26 20 6f 66 66  et1<nKey1 && off
91b0: 73 65 74 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  set2<nKey2 ){.  
91c0: 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 20 20    Mem mem1;.    
91d0: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 20 20 75 36  Mem mem2;.    u6
91e0: 34 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  4 serial_type1;.
91f0: 20 20 20 20 75 36 34 20 73 65 72 69 61 6c 5f 74      u64 serial_t
9200: 79 70 65 32 3b 0a 20 20 20 20 69 6e 74 20 72 63  ype2;.    int rc
9210: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
9220: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
9230: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
9240: 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
9250: 2e 20 2a 2f 0a 20 20 20 20 6f 66 66 73 65 74 31  . */.    offset1
9260: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
9270: 72 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66 73  rint(&aKey1[offs
9280: 65 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79  et1], &serial_ty
9290: 70 65 31 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  pe1);.    offset
92a0: 32 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  2 += sqlite3GetV
92b0: 61 72 69 6e 74 28 26 61 4b 65 79 32 5b 6f 66 66  arint(&aKey2[off
92c0: 73 65 74 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74  set2], &serial_t
92d0: 79 70 65 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ype2);..    /* I
92e0: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
92f0: 76 61 72 69 6e 74 73 20 6a 75 73 74 20 72 65 61  varints just rea
9300: 64 20 69 6e 20 61 72 65 20 30 20 28 6e 6f 74 20  d in are 0 (not 
9310: 61 20 74 79 70 65 29 2c 20 74 68 65 6e 0a 20 20  a type), then.  
9320: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 74 68 65    ** this is the
9330: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 73   end of the keys
9340: 2e 20 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  . The remaining 
9350: 64 61 74 61 20 69 6e 20 65 61 63 68 20 6b 65 79  data in each key
9360: 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76   is.    ** the v
9370: 61 72 69 6e 74 20 72 6f 77 69 64 2e 20 43 6f 6d  arint rowid. Com
9380: 70 61 72 65 20 74 68 65 73 65 20 61 73 20 73 69  pare these as si
9390: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 20 61 6e  gned integers an
93a0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
93b0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  the result..    
93c0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 65 72 69  */.    if( !seri
93d0: 61 6c 5f 74 79 70 65 31 20 7c 7c 20 21 73 65 72  al_type1 || !ser
93e0: 69 61 6c 5f 74 79 70 65 32 20 29 7b 0a 20 20 20  ial_type2 ){.   
93f0: 20 20 20 61 73 73 65 72 74 28 20 21 73 65 72 69     assert( !seri
9400: 61 6c 5f 74 79 70 65 31 20 26 26 20 21 73 65 72  al_type1 && !ser
9410: 69 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20  ial_type2 );.   
9420: 20 20 20 61 73 73 65 72 74 28 20 21 70 43 20 7c     assert( !pC |
9430: 7c 20 21 70 43 2d 3e 69 6e 63 72 4b 65 79 20 29  | !pC->incrKey )
9440: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
9450: 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79 31 5b  etVarint(&aKey1[
9460: 6f 66 66 73 65 74 31 5d 2c 20 26 73 65 72 69 61  offset1], &seria
9470: 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 20 20  l_type1);.      
9480: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
9490: 28 26 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d  (&aKey2[offset2]
94a0: 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29  , &serial_type2)
94b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
94c0: 20 28 69 36 34 29 73 65 72 69 61 6c 5f 74 79 70   (i64)serial_typ
94d0: 65 31 20 2d 20 28 69 36 34 29 73 65 72 69 61 6c  e1 - (i64)serial
94e0: 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 7d 0a  _type2 );.    }.
94f0: 0a 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74  .    /* Assert t
9500: 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
9510: 75 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 69  ugh space left i
9520: 6e 20 65 61 63 68 20 6b 65 79 20 66 6f 72 20 74  n each key for t
9530: 68 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a  he blob of.    *
9540: 2a 20 64 61 74 61 20 74 6f 20 67 6f 20 77 69 74  * data to go wit
9550: 68 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  h the serial typ
9560: 65 20 6a 75 73 74 20 72 65 61 64 2e 20 54 68 69  e just read. Thi
9570: 73 20 61 73 73 65 72 74 20 6d 61 79 20 66 61 69  s assert may fai
9580: 6c 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  l if.    ** the 
9590: 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65  file is corrupte
95a0: 64 2e 20 20 54 68 65 6e 20 72 65 61 64 20 74 68  d.  Then read th
95b0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 61 63  e value from eac
95c0: 68 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a  h key into mem1.
95d0: 20 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20      ** and mem2 
95e0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
95f0: 20 20 2a 2f 0a 20 20 20 20 6f 66 66 73 65 74 31    */.    offset1
9600: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
9610: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
9620: 6f 66 66 73 65 74 31 5d 2c 20 73 65 72 69 61 6c  offset1], serial
9630: 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
9640: 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d 20 73      offset2 += s
9650: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
9660: 47 65 74 28 26 61 4b 65 79 32 5b 6f 66 66 73 65  Get(&aKey2[offse
9670: 74 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  t2], serial_type
9680: 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20  2, &mem2);..    
9690: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
96a0: 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d  ompare(&mem1, &m
96b0: 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  em2);.    if( me
96c0: 6d 31 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  m1.flags&MEM_Dyn
96d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
96e0: 46 72 65 65 28 6d 65 6d 31 2e 7a 29 3b 0a 20 20  Free(mem1.z);.  
96f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 32    }.    if( mem2
9700: 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29  .flags&MEM_Dyn )
9710: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
9720: 65 65 28 6d 65 6d 32 2e 7a 29 3b 0a 20 20 20 20  ee(mem2.z);.    
9730: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  }.    if( rc!=0 
9740: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9750: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
9760: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b   /* One of the k
9770: 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
9780: 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74  ields, but all t
9790: 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
97a0: 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  that point.  ** 
97b0: 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
97c0: 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20  he incrKey flag 
97d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
97e0: 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a  e second key is.
97f0: 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
9800: 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  larger..  */.  i
9810: 66 28 20 70 43 20 26 26 20 70 43 2d 3e 69 6e 63  f( pC && pC->inc
9820: 72 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  rKey ){.    asse
9830: 72 74 28 20 6f 66 66 73 65 74 32 3d 3d 6e 4b 65  rt( offset2==nKe
9840: 79 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  y2 );.    return
9850: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   -1;.  }..  if( 
9860: 6f 66 66 73 65 74 31 3c 6e 4b 65 79 31 20 29 7b  offset1<nKey1 ){
9870: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9880: 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 32   }.  if( offset2
9890: 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 72 65  <nKey2 ){.    re
98a0: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
98b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
98c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
98d0: 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
98e0: 6f 20 74 61 62 6c 65 20 72 6f 77 20 72 65 63 6f  o table row reco
98f0: 72 64 73 20 73 70 65 63 69 66 69 65 64 20 62 79  rds specified by
9900: 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   .** {nKey1, pKe
9910: 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20  y1} and {nKey2, 
9920: 70 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e  pKey2}, returnin
9930: 67 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  g a negative, ze
9940: 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
9950: 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b  e integer if {nK
9960: 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c  ey1, pKey1} is l
9970: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
9980: 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
9990: 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70  r than {nKey2, p
99a0: 4b 65 79 32 7d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Key2}..**.** Thi
99b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 72  s function is pr
99c0: 65 74 74 79 20 69 6e 65 66 66 69 63 69 65 6e 74  etty inefficient
99d0: 20 61 6e 64 20 77 69 6c 6c 20 70 72 6f 62 61 62   and will probab
99e0: 6c 79 20 62 65 20 72 65 70 6c 61 63 65 64 0a 2a  ly be replaced.*
99f0: 2a 20 62 79 20 73 6f 6d 65 74 68 69 6e 67 20 65  * by something e
9a00: 6c 73 65 20 69 6e 20 74 68 65 20 6e 65 61 72 20  lse in the near 
9a10: 66 75 74 75 72 65 2e 20 49 74 20 69 73 20 63 75  future. It is cu
9a20: 72 72 65 6e 74 6c 79 20 72 65 71 75 69 72 65 64  rrently required
9a30: 0a 2a 2a 20 62 79 20 63 6f 6d 70 6f 75 6e 64 20  .** by compound 
9a40: 53 45 4c 45 43 54 20 6f 70 65 72 61 74 6f 72 73  SELECT operators
9a50: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
9a60: 33 56 64 62 65 52 6f 77 43 6f 6d 70 61 72 65 28  3VdbeRowCompare(
9a70: 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74  .  void *userDat
9a80: 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  a,.  int nKey1, 
9a90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
9aa0: 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  1, .  int nKey2,
9ab0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
9ac0: 79 32 0a 29 7b 0a 20 20 43 75 72 73 6f 72 20 2a  y2.){.  Cursor *
9ad0: 70 43 20 3d 20 28 43 75 72 73 6f 72 20 2a 29 75  pC = (Cursor *)u
9ae0: 73 65 72 44 61 74 61 3b 0a 20 20 69 6e 74 20 6f  serData;.  int o
9af0: 66 66 73 65 74 31 20 3d 20 30 3b 0a 20 20 69 6e  ffset1 = 0;.  in
9b00: 74 20 6f 66 66 73 65 74 32 20 3d 20 30 3b 0a 20  t offset2 = 0;. 
9b10: 20 69 6e 74 20 74 6f 66 66 73 65 74 31 20 3d 20   int toffset1 = 
9b20: 30 3b 0a 20 20 69 6e 74 20 74 6f 66 66 73 65 74  0;.  int toffset
9b30: 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  2 = 0;.  int i;.
9b40: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
9b50: 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
9b60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9b70: 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63  har *)pKey1;.  c
9b80: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9b90: 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e  ar *aKey2 = (con
9ba0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9bb0: 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 61 73 73   *)pKey2;..  ass
9bc0: 65 72 74 28 20 70 43 20 29 3b 0a 20 20 61 73 73  ert( pC );.  ass
9bd0: 65 72 74 28 20 70 43 2d 3e 6e 46 69 65 6c 64 3e  ert( pC->nField>
9be0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 20 69 3d 30  0 );..  for( i=0
9bf0: 3b 20 69 3c 70 43 2d 3e 6e 46 69 65 6c 64 3b 20  ; i<pC->nField; 
9c00: 69 2b 2b 20 29 7b 0a 20 20 20 20 75 36 34 20 64  i++ ){.    u64 d
9c10: 75 6d 6d 79 3b 0a 20 20 20 20 6f 66 66 73 65 74  ummy;.    offset
9c20: 31 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  1 += sqlite3GetV
9c30: 61 72 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66  arint(&aKey1[off
9c40: 73 65 74 31 5d 2c 20 26 64 75 6d 6d 79 29 3b 0a  set1], &dummy);.
9c50: 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d 20 73      offset2 += s
9c60: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
9c70: 26 61 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c  &aKey1[offset1],
9c80: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 0a 20   &dummy);.  }.. 
9c90: 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 70 43 2d   for( i=0; i<pC-
9ca0: 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 20 29 7b 0a  >nField; i++ ){.
9cb0: 20 20 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20      Mem mem1;.  
9cc0: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 20 20    Mem mem2;.    
9cd0: 75 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u64 serial_type1
9ce0: 3b 0a 20 20 20 20 75 36 34 20 73 65 72 69 61 6c  ;.    u64 serial
9cf0: 5f 74 79 70 65 32 3b 0a 20 20 20 20 69 6e 74 20  _type2;.    int 
9d00: 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  rc;..    /* Read
9d10: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
9d20: 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
9d30: 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
9d40: 65 79 2e 20 2a 2f 0a 20 20 20 20 74 6f 66 66 73  ey. */.    toffs
9d50: 65 74 31 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  et1 += sqlite3Ge
9d60: 74 56 61 72 69 6e 74 28 26 61 4b 65 79 31 5b 74  tVarint(&aKey1[t
9d70: 6f 66 66 73 65 74 31 5d 2c 20 26 73 65 72 69 61  offset1], &seria
9d80: 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 74 6f  l_type1);.    to
9d90: 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65  ffset2 += sqlite
9da0: 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79  3GetVarint(&aKey
9db0: 32 5b 74 6f 66 66 73 65 74 32 5d 2c 20 26 73 65  2[toffset2], &se
9dc0: 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 0a 20 20  rial_type2);..  
9dd0: 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
9de0: 5f 74 79 70 65 31 20 26 26 20 73 65 72 69 61 6c  _type1 && serial
9df0: 5f 74 79 70 65 32 20 29 3b 0a 0a 20 20 20 20 2f  _type2 );..    /
9e00: 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
9e10: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9e20: 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68  ace left in each
9e30: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f   key for the blo
9e40: 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61  b of.    ** data
9e50: 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20   to go with the 
9e60: 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74  serial type just
9e70: 20 72 65 61 64 2e 20 54 68 69 73 20 61 73 73 65   read. This asse
9e80: 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20  rt may fail if. 
9e90: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69     ** the file i
9ea0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  s corrupted.  Th
9eb0: 65 6e 20 72 65 61 64 20 74 68 65 20 76 61 6c 75  en read the valu
9ec0: 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20  e from each key 
9ed0: 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a  into mem1.    **
9ee0: 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63   and mem2 respec
9ef0: 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  tively..    */. 
9f00: 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73 71     offset1 += sq
9f10: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
9f20: 65 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65 74  et(&aKey1[offset
9f30: 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
9f40: 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 6f 66  , &mem1);.    of
9f50: 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65 33  fset2 += sqlite3
9f60: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
9f70: 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20 73  Key2[offset2], s
9f80: 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65  erial_type2, &me
9f90: 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  m2);..    rc = s
9fa0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
9fb0: 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 29 3b 0a  (&mem1, &mem2);.
9fc0: 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61      if( mem1.fla
9fd0: 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20  gs&MEM_Dyn ){.  
9fe0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d      sqliteFree(m
9ff0: 65 6d 31 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  em1.z);.    }.  
a000: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
a010: 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20  &MEM_Dyn ){.    
a020: 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d    sqliteFree(mem
a030: 32 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  2.z);.    }.    
a040: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
a050: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a060: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a070: 6e 20 30 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a  n 0;.}.  ../*.**
a080: 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
a090: 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  an index entry. 
a0a0: 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
a0b0: 76 61 72 69 6e 74 20 6f 63 63 75 72 69 6e 67 20  varint occuring 
a0c0: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  at.** the end of
a0d0: 20 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 73   the entry and s
a0e0: 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
a0f0: 64 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  d. Return SQLITE
a100: 5f 4f 4b 20 69 66 0a 2a 2a 20 65 76 65 72 79 74  _OK if.** everyt
a110: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
a120: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
a130: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
a140: 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
a150: 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
a160: 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
a170: 20 20 69 36 34 20 73 7a 3b 0a 20 20 69 6e 74 20    i64 sz;.  int 
a180: 72 63 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  rc;.  char buf[1
a190: 30 5d 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  0];.  int len;. 
a1a0: 20 75 36 34 20 72 3b 0a 0a 20 20 72 63 20 3d 20   u64 r;..  rc = 
a1b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
a1c0: 69 7a 65 28 70 43 75 72 2c 20 26 73 7a 29 3b 0a  ize(pCur, &sz);.
a1d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a1e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
a1f0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 20  n rc;.  }.  len 
a200: 3d 20 28 28 73 7a 3e 31 30 29 3f 31 30 3a 73 7a  = ((sz>10)?10:sz
a210: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
a220: 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
a230: 32 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  2 bytes in the k
a240: 65 79 2c 20 74 68 69 73 20 63 61 6e 6e 6f 74 20  ey, this cannot 
a250: 62 65 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  be.  ** a valid 
a260: 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 49 6e 20  index entry. In 
a270: 70 72 61 63 74 69 63 65 20 74 68 69 73 20 63 6f  practice this co
a280: 6d 65 73 20 75 70 20 66 6f 72 20 61 20 71 75 65  mes up for a que
a290: 72 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  ry.  ** of the s
a2a0: 6f 72 74 20 22 53 45 4c 45 43 54 20 6d 61 78 28  ort "SELECT max(
a2b0: 78 29 20 46 52 4f 4d 20 74 31 3b 22 20 77 68 65  x) FROM t1;" whe
a2c0: 6e 20 74 31 20 69 73 20 61 6e 20 65 6d 70 74 79  n t1 is an empty
a2d0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 77 69 74 68   table.  ** with
a2e0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 78 2e 20   an index on x. 
a2f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
a300: 74 20 63 61 6c 6c 20 74 68 65 20 72 6f 77 69 64  t call the rowid
a310: 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c   0..  */.  if( l
a320: 65 6e 3c 32 20 29 7b 0a 20 20 20 20 2a 72 6f 77  en<2 ){.    *row
a330: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  id = 0;.    retu
a340: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a350: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
a360: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
a370: 73 7a 2d 6c 65 6e 2c 20 6c 65 6e 2c 20 62 75 66  sz-len, len, buf
a380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
a3a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
a3b0: 6c 65 6e 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20  len--;.  while( 
a3c0: 62 75 66 5b 6c 65 6e 2d 31 5d 20 26 26 20 2d 2d  buf[len-1] && --
a3d0: 6c 65 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  len );..  sqlite
a3e0: 33 47 65 74 56 61 72 69 6e 74 28 26 62 75 66 5b  3GetVarint(&buf[
a3f0: 6c 65 6e 5d 2c 20 26 72 29 3b 0a 20 20 2a 72 6f  len], &r);.  *ro
a400: 77 69 64 20 3d 20 72 3b 0a 20 20 72 65 74 75 72  wid = r;.  retur
a410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a420: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
a430: 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
a440: 43 75 72 73 6f 72 20 2a 70 43 2c 20 0a 20 20 69  Cursor *pC, .  i
a450: 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75  nt nKey, const u
a460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4b  nsigned char *pK
a470: 65 79 2c 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65  ey,.  int ignore
a480: 72 6f 77 69 64 2c 0a 20 20 69 6e 74 20 2a 72 65  rowid,.  int *re
a490: 73 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  s.){.  unsigned 
a4a0: 63 68 61 72 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  char *pCellKey;.
a4b0: 20 20 75 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    u64 nCellKey;.
a4c0: 20 20 69 6e 74 20 66 72 65 65 43 65 6c 6c 4b 65    int freeCellKe
a4d0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
a4e0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 42 74  .  int len;.  Bt
a4f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
a500: 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 73  C->pCursor;..  s
a510: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
a520: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
a530: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
a540: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
a550: 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
a560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a570: 7d 0a 0a 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20  }..  pCellKey = 
a580: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
a590: 29 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  )sqlite3BtreeKey
a5a0: 46 65 74 63 68 28 70 43 75 72 2c 20 6e 43 65 6c  Fetch(pCur, nCel
a5b0: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 21 70 43  lKey);.  if( !pC
a5c0: 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 70 43  ellKey ){.    pC
a5d0: 65 6c 6c 4b 65 79 20 3d 20 28 75 6e 73 69 67 6e  ellKey = (unsign
a5e0: 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
a5f0: 4d 61 6c 6c 6f 63 52 61 77 28 6e 43 65 6c 6c 4b  MallocRaw(nCellK
a600: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ey);.    if( !pC
a610: 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
a620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a630: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MEM;.    }.    f
a640: 72 65 65 43 65 6c 6c 4b 65 79 20 3d 20 31 3b 0a  reeCellKey = 1;.
a650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a660: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
a670: 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
a680: 6c 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  lKey);.    if( r
a690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a6b0: 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
a6c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a6d0: 20 7d 0a 20 20 7d 0a 20 0a 20 20 6c 65 6e 20 3d   }.  }. .  len =
a6e0: 20 6e 43 65 6c 6c 4b 65 79 2d 32 3b 0a 20 20 77   nCellKey-2;.  w
a6f0: 68 69 6c 65 28 20 70 43 65 6c 6c 4b 65 79 5b 6c  hile( pCellKey[l
a700: 65 6e 5d 20 26 26 20 2d 2d 6c 65 6e 20 29 3b 0a  en] && --len );.
a710: 0a 20 20 69 66 28 20 69 67 6e 6f 72 65 72 6f 77  .  if( ignorerow
a720: 69 64 20 29 7b 0a 20 20 20 20 6e 4b 65 79 2d 2d  id ){.    nKey--
a730: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4b 65  ;.    while( pKe
a740: 79 5b 6e 4b 65 79 5d 20 26 26 20 2d 2d 6e 4b 65  y[nKey] && --nKe
a750: 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20  y );.  }.  *res 
a760: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79  = sqlite3VdbeKey
a770: 43 6f 6d 70 61 72 65 28 70 43 2c 20 6c 65 6e 2c  Compare(pC, len,
a780: 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c   pCellKey, nKey,
a790: 20 70 4b 65 79 29 3b 0a 20 20 0a 20 20 69 66 28   pKey);.  .  if(
a7a0: 20 66 72 65 65 43 65 6c 6c 4b 65 79 20 29 7b 0a   freeCellKey ){.
a7b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
a7c0: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  CellKey);.  }.  
a7d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a7e0: 3b 0a 7d 0a                                      ;.}.