/ Hex Artifact Content
Login

Artifact 8411f411b421bc19ded1e992db82434aef740f5f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 5f 76 6d 22 20 61 73 20 69  "sqlite_vm" as i
01e0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  t is known to th
01f0: 65 20 6f 75 74 73 69 64 65 20 77 6f 72 6c 64 2e  e outside world.
0200: 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 6f 20 76  )  Prior.** to v
0210: 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c 20 61 6c  ersion 2.8.7, al
0220: 6c 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  l this code was 
0230: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0240: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
0250: 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 74 68 61  file..** But tha
0260: 74 20 66 69 6c 65 20 77 61 73 20 67 65 74 74 69  t file was getti
0270: 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f 20 74 68  ng too big so th
0280: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  is subroutines w
0290: 65 72 65 20 73 70 6c 69 74 20 6f 75 74 2e 0a 2a  ere split out..*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
02e0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65  .../*.** When de
0300: 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65  bugging the code
0310: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20   generator in a 
0320: 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65  symbolic debugge
0330: 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65  r, one can.** se
0340: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 64  t the sqlite3_vd
0350: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 74  be_addop_trace t
0360: 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f  o 1 and all opco
0370: 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e  des will be prin
0380: 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61  ted.** as they a
0390: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
03a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65  instruction stre
03b0: 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  am..*/.#ifndef N
03c0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
03d0: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
03e0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0400: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
0410: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0420: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0430: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 20 2a  eCreate(sqlite *
0440: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
0450: 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c    p = sqliteMall
0460: 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29  oc( sizeof(Vdbe)
0470: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
0480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
0490: 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64  db = db;.  if( d
04a0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
04b0: 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76  db->pVdbe->pPrev
04c0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70   = p;.  }.  p->p
04d0: 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65  Next = db->pVdbe
04e0: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
04f0: 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20  ;.  db->pVdbe = 
0500: 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  p;.  p->magic = 
0510: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
0520: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0530: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69  /*.** Turn traci
0540: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a  ng on or off.*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46  Trace(Vdbe *p, F
0570: 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70  ILE *trace){.  p
0580: 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b  ->trace = trace;
0590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
05a0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
05b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
05c0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
05d0: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
05e0: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
05f0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0600: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0610: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0630: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0640: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0650: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0660: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0670: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0680: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0690: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
06a0: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
06b0: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
06c0: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
06d0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
06e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
06f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0700: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0710: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0720: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0730: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0740: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0750: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0770: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0780: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0790: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
07a0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
07b0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
07c0: 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20  p;.  p->nOp++;. 
07d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
07e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
07f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
0800: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20  ->nOpAlloc ){.  
0810: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0820: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
0830: 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70   Op *aNew;.    p
0840: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
0850: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30  nOpAlloc*2 + 100
0860: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
0870: 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f  iteRealloc(p->aO
0880: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73  p, p->nOpAlloc*s
0890: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
08a0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
08b0: 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63       p->nOpAlloc
08c0: 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20   = oldSize;.    
08d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
08e0: 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61  }.    p->aOp = a
08f0: 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  New;.    memset(
0900: 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d  &p->aOp[oldSize]
0910: 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  , 0, (p->nOpAllo
0920: 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f  c-oldSize)*sizeo
0930: 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 70 4f  f(Op));.  }.  pO
0940: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
0950: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
0960: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  op;.  pOp->p1 = 
0970: 70 31 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26  p1;.  if( p2<0 &
0980: 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61  & (-1-p2)<p->nLa
0990: 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  bel && p->aLabel
09a0: 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20  [-1-p2]>=0 ){.  
09b0: 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c    p2 = p->aLabel
09c0: 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70  [-1-p2];.  }.  p
09d0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
09e0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f  Op->p3 = 0;.  pO
09f0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
0a00: 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20  OTUSED;.#ifndef 
0a10: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
0a20: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
0a30: 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56  trace ) sqlite3V
0a40: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0a50: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65   &p->aOp[i]);.#e
0a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
0a80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
0a90: 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c  ludes the p3 val
0aa0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0ab0: 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a  e3VdbeOp3(Vdbe *
0ac0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0ad0: 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74  1, int p2, const
0ae0: 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20   char *zP3, int 
0af0: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
0b00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
0b10: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
0b20: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
0b30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
0b40: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
0b50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
0b60: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
0b70: 6d 75 6c 74 69 70 6c 65 20 6f 70 63 6f 64 65 73  multiple opcodes
0b80: 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
0b90: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
0ba0: 6f 70 63 6f 64 65 20 6f 66 20 30 2e 0a 2a 2f 0a  opcode of 0..*/.
0bb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
0bc0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 2e 2e 2e  ode(Vdbe *p, ...
0bd0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
0be0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
0bf0: 6e 74 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 70  nt opcode, p1, p
0c00: 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
0c10: 2c 20 70 29 3b 0a 20 20 61 64 64 72 20 3d 20 70  , p);.  addr = p
0c20: 2d 3e 6e 4f 70 3b 0a 20 20 77 68 69 6c 65 28 20  ->nOp;.  while( 
0c30: 28 6f 70 63 6f 64 65 20 3d 20 76 61 5f 61 72 67  (opcode = va_arg
0c40: 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 7b 0a  (ap,int))!=0 ){.
0c50: 20 20 20 20 70 31 20 3d 20 76 61 5f 61 72 67 28      p1 = va_arg(
0c60: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 70 32 20  ap,int);.    p2 
0c70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
0c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0c90: 65 41 64 64 4f 70 28 70 2c 20 6f 70 63 6f 64 65  eAddOp(p, opcode
0ca0: 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 7d 0a 20  , p1, p2);.  }. 
0cb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
0cc0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 0a  eturn addr;.}...
0cd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0ce0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
0cf0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
0d00: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
0d10: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
0d20: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
0d30: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
0d40: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
0d50: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
0d60: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
0d70: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
0d80: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
0d90: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
0da0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
0db0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
0dc0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
0dd0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
0de0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
0df0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
0e00: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
0e10: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
0e20: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
0e30: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
0e40: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
0e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
0e60: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
0e70: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0e80: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
0e90: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
0ea0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
0eb0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
0ec0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
0ed0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
0ee0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
0ef0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
0f00: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
0f10: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69  e resolved..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
0f30: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
0f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
0f50: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
0f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0f80: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
0f90: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
0fa0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
0fb0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fc0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fd0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 61  oc*2 + 10;.    a
0fe0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0ff0: 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65 6c 2c 20  loc( p->aLabel, 
1000: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
1010: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1020: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
1030: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
1040: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
1050: 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bel);.    }.    
1060: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 61 4e 65 77  p->aLabel = aNew
1070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
1080: 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Label==0 ){.    
1090: 70 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  p->nLabel = 0;. 
10a0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
10b0: 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  c = 0;.    retur
10c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c  n 0;.  }.  p->aL
10d0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
10e0: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
10f0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1100: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1110: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1120: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1130: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1140: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1150: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1160: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1170: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1180: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1190: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
11a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
11d0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
11e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
11f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1200: 0a 20 20 69 66 28 20 78 3c 30 20 26 26 20 28 2d  .  if( x<0 && (-
1210: 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65 6c 20 26 26  x)<=p->nLabel &&
1220: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 69   p->aOp ){.    i
1230: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d  f( p->aLabel[-1-
1240: 78 5d 3d 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74  x]==p->nOp ) ret
1250: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
1260: 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d   p->aLabel[-1-x]
1270: 3c 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4c 61  <0 );.    p->aLa
1280: 62 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e  bel[-1-x] = p->n
1290: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  Op;.    for(j=0;
12a0: 20 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b   j<p->nOp; j++){
12b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  .      if( p->aO
12c0: 70 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e  p[j].p2==x ) p->
12d0: 61 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e  aOp[j].p2 = p->n
12e0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Op;.    }.  }.}.
12f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1300: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1310: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1320: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
1330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1350: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
1360: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1370: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1380: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
13a0: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
13b0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
13c0: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
13d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
13e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
13f0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
1400: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
1410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
1420: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
1430: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
1440: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
1450: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
1460: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1470: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1480: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
1490: 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  Op >= p->nOpAllo
14a0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
14b0: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
14c0: 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77  oc;.    Op *aNew
14d0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
14e0: 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c = p->nOpAlloc*
14f0: 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20  2 + nOp + 10;.  
1500: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
1510: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70  ealloc(p->aOp, p
1520: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
1530: 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  f(Op));.    if( 
1540: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
1550: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f   p->nOpAlloc = o
1560: 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 65  ldSize;.      re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1580: 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b    p->aOp = aNew;
1590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  .    memset(&p->
15a0: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
15b0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
15c0: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
15d0: 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  ));.  }.  addr =
15e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
15f0: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
1600: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
1610: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
1620: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
1630: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
1640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
1650: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
1660: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
1670: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
1680: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
1690: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
16a0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
16b0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
16c0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
16d0: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
16e0: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
16f0: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
1700: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
1710: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
1720: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
1730: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
1740: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
1760: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
1770: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1780: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1790: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
17a0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
17b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
17c0: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
17d0: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
17e0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
17f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1800: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
1810: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1820: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1840: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1850: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1860: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1870: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1880: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1890: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
18a0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
18b0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
18c0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
18d0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
18e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
18f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1900: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1910: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1920: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1930: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
1940: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
1950: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
1960: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
1970: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
1980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
1990: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
19a0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
19b0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
19c0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
19d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
19e0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
19f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
1a00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1a10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
1a20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1a30: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1a40: 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b  ssert( val>=0 );
1a50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1a60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1a70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
1a80: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
1a90: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
1aa0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
1ab0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
1ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1ad0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1ae0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
1af0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b20: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1b30: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1b40: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1b50: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1b60: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1b70: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
1b80: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
1b90: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
1ba0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
1bb0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
1bc0: 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70  0 then the P3 op
1bd0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
1be0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
1bf0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
1c00: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
1c10: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1c20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1c30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
1c40: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
1c50: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
1c60: 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP3 up to and in
1c70: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
1c80: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
1c90: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
1ca0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
1cb0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P3..**.** If n==
1cc0: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
1cd0: 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20  ans that zP3 is 
1ce0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
1cf0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
1d00: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
1d10: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
1d20: 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e 3d 3d 50  e pointer.  n==P
1d30: 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61 6e 73 20  3_POINTER means 
1d40: 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e  zP3 is.** a poin
1d50: 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f 62 6a 65  ter to some obje
1d60: 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ct other than a 
1d70: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  string..**.** If
1d80: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
1d90: 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f  nge P3 on the mo
1da0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
1db0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
1dc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dd0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
1de0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33   const char *zP3
1e00: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
1e10: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
1e20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1e30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1e40: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  ( p==0 || p->aOp
1e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e60: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
1e70: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
1e80: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
1e90: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
1ea0: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
1eb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
1ec0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70  p[addr];.  if( p
1ed0: 4f 70 2d 3e 70 33 20 26 26 20 70 4f 70 2d 3e 70  Op->p3 && pOp->p
1ee0: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49  3type==P3_DYNAMI
1ef0: 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  C ){.    sqliteF
1f00: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  ree(pOp->p3);.  
1f10: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
1f20: 20 7d 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20   }.  if( zP3==0 
1f30: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
1f40: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74   0;.    pOp->p3t
1f50: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
1f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
1f70: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
1f80: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
1f90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
1fa0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   n;.  }else{.   
1fb0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
1fc0: 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50 33  ng(&pOp->p3, zP3
1fd0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f 70  , n, 0);.    pOp
1fe0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
1ff0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
2000: 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70  .** If the P3 op
2010: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65  erand to the spe
2020: 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69  cified instructi
2030: 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f  on appears.** to
2040: 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72   be a quoted str
2050: 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  ing token, then 
2060: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  this procedure r
2070: 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71  emoves .** the q
2080: 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uotes..**.** The
2090: 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f   quoting operato
20a0: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
20b0: 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28  a grave ascent (
20c0: 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f  ASCII 0x27).** o
20d0: 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  r a double quote
20e0: 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49   character (ASCI
20f0: 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75  I 0x22).  Two qu
2100: 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a  otes in a row.**
2110: 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61   resolve to be a
2120: 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71   single actual q
2130: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
2140: 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67  ithin the string
2150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2160: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  3VdbeDequoteP3(V
2170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2180: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
2190: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
21a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
21b0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
21c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
21d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
21e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
21f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
2200: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
2210: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
2220: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
2230: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20  Op[addr];.  if( 
2240: 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
2250: 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65  p->p3[0]==0 ) re
2260: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d  turn;.  if( pOp-
2270: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
2280: 54 45 52 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  TER ) return;.  
2290: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21  if( pOp->p3type!
22a0: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
22b0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c     pOp->p3 = sql
22c0: 69 74 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70  iteStrDup(pOp->p
22d0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  3);.    pOp->p3t
22e0: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
22f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
2300: 65 71 75 6f 74 65 28 70 4f 70 2d 3e 70 33 29 3b  equote(pOp->p3);
2310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65  .}../*.** On the
2320: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P3 argument of 
2330: 74 68 65 20 67 69 76 65 6e 20 69 6e 73 74 72 75  the given instru
2340: 63 74 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61 6c  ction, change al
2350: 6c 0a 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66 20  l.** strings of 
2360: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
2370: 63 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  cters into a sin
2380: 67 6c 65 20 73 70 61 63 65 20 61 6e 64 0a 2a 2a  gle space and.**
2390: 20 64 65 6c 65 74 65 20 6c 65 61 64 69 6e 67 20   delete leading 
23a0: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
23b0: 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64  tespace..*/.void
23c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
23d0: 72 65 73 73 53 70 61 63 65 28 56 64 62 65 20 2a  ressSpace(Vdbe *
23e0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2400: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2410: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
2420: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2430: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2440: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2450: 7c 7c 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  || addr<0 || add
2460: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75  r>=p->nOp ) retu
2470: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
2480: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
2490: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
24a0: 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
24b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
24c0: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21 3d 50  ( pOp->p3type!=P
24d0: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
24e0: 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74   pOp->p3 = sqlit
24f0: 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29  eStrDup(pOp->p3)
2500: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2510: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
2520: 20 20 7d 0a 20 20 7a 20 3d 20 28 75 6e 73 69 67    }.  z = (unsig
2530: 6e 65 64 20 63 68 61 72 2a 29 70 4f 70 2d 3e 70  ned char*)pOp->p
2540: 33 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  3;.  if( z==0 ) 
2550: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 6a 20  return;.  i = j 
2560: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
2570: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
2580: 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ++; }.  while( z
2590: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 69  [i] ){.    if( i
25a0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
25b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
25c0: 20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ';.      while(
25d0: 20 69 73 73 70 61 63 65 28 7a 5b 2b 2b 69 5d 29   isspace(z[++i])
25e0: 20 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ){}.    }else{.
25f0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
2600: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2610: 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26  .  while( j>0 &&
2620: 20 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   isspace(z[j-1])
2630: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a   ){ j--; }.  z[j
2640: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2650: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  Search for the c
2660: 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 20 66  urrent program f
2670: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 6f 70 63  or the given opc
2680: 6f 64 65 20 61 6e 64 20 50 32 0a 2a 2a 20 76 61  ode and P2.** va
2690: 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  lue.  Return the
26a0: 20 61 64 64 72 65 73 73 20 70 6c 75 73 20 31 20   address plus 1 
26b0: 69 66 20 66 6f 75 6e 64 20 61 6e 64 20 30 20 69  if found and 0 i
26c0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
26d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
26e0: 69 6e 64 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  indOp(Vdbe *p, i
26f0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 32 29 7b 0a  nt op, int p2){.
2700: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
2710: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2720: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2740: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nOp; i++){.    i
2750: 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  f( p->aOp[i].opc
2760: 6f 64 65 3d 3d 6f 70 20 26 26 20 70 2d 3e 61 4f  ode==op && p->aO
2770: 70 5b 69 5d 2e 70 32 3d 3d 70 32 20 29 20 72 65  p[i].p2==p2 ) re
2780: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20  turn i+1;.  }.  
2790: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
27b0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
27c0: 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62   address..*/.Vdb
27d0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
27e0: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
27f0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
2800: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2810: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2820: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
2830: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
2840: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 26 70  p );.  return &p
2850: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a  ->aOp[addr];.}..
2860: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2870: 69 6e 67 20 67 72 6f 75 70 20 6f 72 20 72 6f 75  ing group or rou
2880: 74 69 6e 65 73 20 61 72 65 20 65 6d 70 6c 6f 79  tines are employ
2890: 65 64 20 62 79 20 69 6e 73 74 61 6c 6c 61 62 6c  ed by installabl
28a0: 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  e functions.** t
28b0: 6f 20 72 65 74 75 72 6e 20 74 68 65 69 72 20 72  o return their r
28c0: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  esults..**.** Th
28d0: 65 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  e sqlite3_set_re
28e0: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 72 6f  sult_string() ro
28f0: 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
2900: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 74  d to return a st
2910: 72 69 6e 67 0a 2a 2a 20 76 61 6c 75 65 20 6f 72  ring.** value or
2920: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 4e 55 4c   to return a NUL
2930: 4c 2e 20 20 54 6f 20 72 65 74 75 72 6e 20 61 20  L.  To return a 
2940: 4e 55 4c 4c 2c 20 70 61 73 73 20 69 6e 20 4e 55  NULL, pass in NU
2950: 4c 4c 20 66 6f 72 20 7a 52 65 73 75 6c 74 2e 0a  LL for zResult..
2960: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
2970: 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  e of the string 
2980: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
2990: 69 6e 65 20 72 65 74 75 72 6e 73 20 73 6f 20 69  ine returns so i
29a0: 74 20 69 73 20 73 61 66 65 0a 2a 2a 20 74 6f 20  t is safe.** to 
29b0: 70 61 73 73 20 69 6e 20 61 6e 20 65 70 68 65 6d  pass in an ephem
29c0: 65 72 61 6c 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  eral string..**.
29d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72  ** sqlite3_set_r
29e0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20 77 6f  esult_error() wo
29f0: 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  rks like sqlite3
2a00: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
2a10: 6e 67 28 29 20 65 78 63 65 70 74 0a 2a 2a 20 74  ng() except.** t
2a20: 68 61 74 20 69 74 20 73 69 67 6e 61 6c 73 20 61  hat it signals a
2a30: 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20 54   fatal error.  T
2a40: 68 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  he string argume
2a50: 6e 74 2c 20 69 66 20 61 6e 79 2c 20 69 73 20 74  nt, if any, is t
2a60: 68 65 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  he.** error mess
2a70: 61 67 65 2e 20 20 49 66 20 74 68 65 20 61 72 67  age.  If the arg
2a80: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 20 61 20  ument is NULL a 
2a90: 67 65 6e 65 72 69 63 20 73 75 62 73 74 69 74 75  generic substitu
2aa0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ab0: 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  .** is used..**.
2ac0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  ** The sqlite3_s
2ad0: 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 29 20  et_result_int() 
2ae0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  and sqlite3_set_
2af0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 29 20  result_double() 
2b00: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 0a 2a  set the return.*
2b10: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 75  * value of the u
2b20: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ser function to 
2b30: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20  an integer or a 
2b40: 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  double..**.** Th
2b50: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
2b60: 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e   defined here in
2b70: 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20   vdbe.c because 
2b80: 74 68 65 79 20 64 65 70 65 6e 64 20 6f 6e 20 6b  they depend on k
2b90: 6e 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e  nowing.** the in
2ba0: 74 65 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73  ternals of the s
2bb0: 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63  qlite_func struc
2bc0: 74 75 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e  ture which is on
2bd0: 6c 79 20 64 65 66 69 6e 65 64 20 69 6e 20 0a 2a  ly defined in .*
2be0: 2a 20 74 68 69 73 20 73 6f 75 72 63 65 20 66 69  * this source fi
2bf0: 6c 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  le..*/.char *sql
2c00: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2c10: 73 74 72 69 6e 67 28 73 71 6c 69 74 65 5f 66 75  string(sqlite_fu
2c20: 6e 63 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  nc *p, const cha
2c30: 72 20 2a 7a 52 65 73 75 6c 74 2c 20 69 6e 74 20  r *zResult, int 
2c40: 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 70  n){.  assert( !p
2c50: 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20 69 66  ->isStep );.  if
2c60: 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26 20 4d  ( p->s.flags & M
2c70: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 73 71  EM_Dyn ){.    sq
2c80: 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e 7a 29  liteFree(p->s.z)
2c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 73  ;.  }.  if( zRes
2ca0: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ult==0 ){.    p-
2cb0: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  >s.flags = MEM_N
2cc0: 75 6c 6c 3b 0a 20 20 20 20 6e 20 3d 20 30 3b 0a  ull;.    n = 0;.
2cd0: 20 20 20 20 70 2d 3e 73 2e 7a 20 3d 20 30 3b 0a      p->s.z = 0;.
2ce0: 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20 30 3b 0a      p->s.n = 0;.
2cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2d00: 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65   n<0 ) n = strle
2d10: 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  n(zResult);.    
2d20: 69 66 28 20 6e 3c 4e 42 46 53 2d 31 20 29 7b 0a  if( n<NBFS-1 ){.
2d30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
2d40: 73 2e 7a 53 68 6f 72 74 2c 20 7a 52 65 73 75 6c  s.zShort, zResul
2d50: 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  t, n);.      p->
2d60: 73 2e 7a 53 68 6f 72 74 5b 6e 5d 20 3d 20 30 3b  s.zShort[n] = 0;
2d70: 0a 20 20 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67  .      p->s.flag
2d80: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
2d90: 4d 5f 53 68 6f 72 74 3b 0a 20 20 20 20 20 20 70  M_Short;.      p
2da0: 2d 3e 73 2e 7a 20 3d 20 70 2d 3e 73 2e 7a 53 68  ->s.z = p->s.zSh
2db0: 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ort;.    }else{.
2dc0: 20 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d 20 73        p->s.z = s
2dd0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2de0: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  n+1 );.      if(
2df0: 20 70 2d 3e 73 2e 7a 20 29 7b 0a 20 20 20 20 20   p->s.z ){.     
2e00: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 73 2e 7a     memcpy(p->s.z
2e10: 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a 20  , zResult, n);. 
2e20: 20 20 20 20 20 20 20 70 2d 3e 73 2e 7a 5b 6e 5d         p->s.z[n]
2e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2e40: 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20 3d      p->s.flags =
2e50: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 44   MEM_Str | MEM_D
2e60: 79 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  yn;.    }.    p-
2e70: 3e 73 2e 6e 20 3d 20 6e 2b 31 3b 0a 20 20 7d 0a  >s.n = n+1;.  }.
2e80: 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 2e 7a 3b    return p->s.z;
2e90: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  .}.void sqlite3_
2ea0: 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 73  set_result_int(s
2eb0: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 69  qlite_func *p, i
2ec0: 6e 74 20 69 52 65 73 75 6c 74 29 7b 0a 20 20 61  nt iResult){.  a
2ed0: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2ee0: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2ef0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2f10: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2f20: 20 70 2d 3e 73 2e 69 20 3d 20 69 52 65 73 75 6c   p->s.i = iResul
2f30: 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20  t;.  p->s.flags 
2f40: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 7d 0a 76 6f 69  = MEM_Int;.}.voi
2f50: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  d sqlite3_set_re
2f60: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 73 71 6c 69  sult_double(sqli
2f70: 74 65 5f 66 75 6e 63 20 2a 70 2c 20 64 6f 75 62  te_func *p, doub
2f80: 6c 65 20 72 52 65 73 75 6c 74 29 7b 0a 20 20 61  le rResult){.  a
2f90: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2fa0: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2fb0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2fd0: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2fe0: 20 70 2d 3e 73 2e 72 20 3d 20 72 52 65 73 75 6c   p->s.r = rResul
2ff0: 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20  t;.  p->s.flags 
3000: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a 76 6f  = MEM_Real;.}.vo
3010: 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72  id sqlite3_set_r
3020: 65 73 75 6c 74 5f 65 72 72 6f 72 28 73 71 6c 69  esult_error(sqli
3030: 74 65 5f 66 75 6e 63 20 2a 70 2c 20 63 6f 6e 73  te_func *p, cons
3040: 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c 20 69 6e  t char *zMsg, in
3050: 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t n){.  assert( 
3060: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
3070: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
3080: 6c 74 5f 73 74 72 69 6e 67 28 70 2c 20 7a 4d 73  lt_string(p, zMs
3090: 67 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 45 72  g, n);.  p->isEr
30a0: 72 6f 72 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ror = 1;.}../*.*
30b0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 75 73  * Extract the us
30c0: 65 72 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73  er data from a s
30d0: 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63  qlite_func struc
30e0: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
30f0: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
3100: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  it..*/.void *sql
3110: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 73  ite3_user_data(s
3120: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b 0a  qlite_func *p){.
3130: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
3140: 2d 3e 70 46 75 6e 63 20 29 3b 0a 20 20 72 65 74  ->pFunc );.  ret
3150: 75 72 6e 20 70 2d 3e 70 46 75 6e 63 2d 3e 70 55  urn p->pFunc->pU
3160: 73 65 72 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  serData;.}../*.*
3170: 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 72 65  * Allocate or re
3180: 74 75 72 6e 20 74 68 65 20 61 67 67 72 65 67 61  turn the aggrega
3190: 74 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 61  te context for a
31a0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20   user function. 
31b0: 20 41 20 6e 65 77 0a 2a 2a 20 63 6f 6e 74 65 78   A new.** contex
31c0: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t is allocated o
31d0: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
31e0: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  .  Subsequent ca
31f0: 6c 6c 73 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  lls return the.*
3200: 2a 20 73 61 6d 65 20 63 6f 6e 74 65 78 74 20 74  * same context t
3210: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
3220: 20 6f 6e 20 70 72 69 6f 72 20 63 61 6c 6c 73 2e   on prior calls.
3230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3240: 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20 68  ine is defined h
3250: 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65  ere in vdbe.c be
3260: 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64 73  cause it depends
3270: 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74   on knowing.** t
3280: 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20  he internals of 
3290: 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20  the sqlite_func 
32a0: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
32b0: 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20  is only defined 
32c0: 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  in.** this sourc
32d0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
32e0: 2a 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  *sqlite3_aggrega
32f0: 74 65 5f 63 6f 6e 74 65 78 74 28 73 71 6c 69 74  te_context(sqlit
3300: 65 5f 66 75 6e 63 20 2a 70 2c 20 69 6e 74 20 6e  e_func *p, int n
3310: 42 79 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Byte){.  assert(
3320: 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20 26   p && p->pFunc &
3330: 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65  & p->pFunc->xSte
3340: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 41  p );.  if( p->pA
3350: 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  gg==0 ){.    if(
3360: 20 6e 42 79 74 65 3c 3d 4e 42 46 53 20 29 7b 0a   nByte<=NBFS ){.
3370: 20 20 20 20 20 20 70 2d 3e 70 41 67 67 20 3d 20        p->pAgg = 
3380: 28 76 6f 69 64 2a 29 70 2d 3e 73 2e 7a 3b 0a 20  (void*)p->s.z;. 
3390: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70       memset(p->p
33a0: 41 67 67 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Agg, 0, nByte);.
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 70 2d 3e 70 41 67 67 20 3d 20 73 71 6c 69 74   p->pAgg = sqlit
33d0: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
33e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
33f0: 74 75 72 6e 20 70 2d 3e 70 41 67 67 3b 0a 7d 0a  turn p->pAgg;.}.
3400: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3410: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
3420: 73 20 74 68 65 20 53 74 65 70 20 66 75 6e 63 74  s the Step funct
3430: 69 6f 6e 20 6f 66 20 61 20 61 67 67 72 65 67 61  ion of a aggrega
3440: 74 65 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a 20  te has been .** 
3450: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
3470: 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20 76 64  fined here in vd
3480: 62 65 2e 63 20 62 65 63 61 75 73 65 20 69 74 20  be.c because it 
3490: 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f 77 69  depends on knowi
34a0: 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  ng.** the intern
34b0: 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  als of the sqlit
34c0: 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72 65  e_func structure
34d0: 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20 64   which is only d
34e0: 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69  efined in.** thi
34f0: 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a  s source file..*
3500: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 67  /.int sqlite3_ag
3510: 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 73 71  gregate_count(sq
3520: 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b 0a 20  lite_func *p){. 
3530: 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
3540: 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46 75  >pFunc && p->pFu
3550: 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20 72  nc->xStep );.  r
3560: 65 74 75 72 6e 20 70 2d 3e 63 6e 74 3b 0a 7d 0a  eturn p->cnt;.}.
3570: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
3580: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
3590: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 2f  (VDBE_PROFILE)./
35a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
35b0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
35c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
35d0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
35e0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
35f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
3600: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
3610: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
3620: 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68   char *zP3;.  ch
3630: 61 72 20 7a 50 74 72 5b 34 30 5d 3b 0a 20 20 69  ar zPtr[40];.  i
3640: 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d  f( pOp->p3type==
3650: 50 33 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  P3_POINTER ){.  
3660: 20 20 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20    sprintf(zPtr, 
3670: 22 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74  "ptr(%#x)", (int
3680: 29 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7a  )pOp->p3);.    z
3690: 50 33 20 3d 20 7a 50 74 72 3b 0a 20 20 7d 65 6c  P3 = zPtr;.  }el
36a0: 73 65 7b 0a 20 20 20 20 7a 50 33 20 3d 20 70 4f  se{.    zP3 = pO
36b0: 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28  p->p3;.  }.  if(
36c0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
36d0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 66 70 72 69  = stdout;.  fpri
36e0: 6e 74 66 28 70 4f 75 74 2c 22 25 34 64 20 25 2d  ntf(pOut,"%4d %-
36f0: 31 32 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e  12s %4d %4d %s\n
3700: 22 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c  ",.      pc, sql
3710: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b  ite3OpcodeNames[
3720: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f  pOp->opcode], pO
3730: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
3740: 7a 50 33 20 3f 20 7a 50 33 20 3a 20 22 22 29 3b  zP3 ? zP3 : "");
3750: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
3760: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3770: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
3780: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
3790: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
37a0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
37b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
37c0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
37d0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
37e0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
37f0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
3800: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
3810: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
3820: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
3830: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
3840: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
3850: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
3860: 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IN"..*/.int sqli
3870: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
3880: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
3890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
38a0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
38b0: 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  ite *db = p->db;
38c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
38d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
38e0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
38f0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 5d 20 3d  zColumnNames[] =
3900: 20 7b 0a 20 20 20 20 20 22 61 64 64 72 22 2c 20   {.     "addr", 
3910: 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
3920: 20 22 70 32 22 2c 20 20 22 70 33 22 2c 20 0a 20   "p2",  "p3", . 
3930: 20 20 20 20 22 69 6e 74 22 2c 20 20 22 74 65 78      "int",  "tex
3940: 74 22 2c 20 20 20 22 69 6e 74 22 2c 20 22 69 6e  t",   "int", "in
3950: 74 22 2c 20 22 74 65 78 74 22 2c 0a 20 20 20 20  t", "text",.    
3960: 20 30 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72   0.  };..  asser
3970: 74 28 20 70 2d 3e 70 6f 70 53 74 61 63 6b 3d 3d  t( p->popStack==
3980: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3990: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 70  ->explain );.  p
39a0: 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 61 7a  ->azColName = az
39b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 3b 0a 20 20 70  ColumnNames;.  p
39c0: 2d 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  ->azResColumn = 
39d0: 70 2d 3e 7a 41 72 67 76 3b 0a 20 20 66 6f 72 28  p->zArgv;.  for(
39e0: 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 20 70  i=0; i<5; i++) p
39f0: 2d 3e 7a 41 72 67 76 5b 69 5d 20 3d 20 70 2d 3e  ->zArgv[i] = p->
3a00: 61 53 74 61 63 6b 5b 69 5d 2e 7a 53 68 6f 72 74  aStack[i].zShort
3a10: 3b 0a 20 20 69 20 3d 20 70 2d 3e 70 63 3b 0a 20  ;.  i = p->pc;. 
3a20: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
3a30: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
3a40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
3a50: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
3a60: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66   }else if( db->f
3a70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3a80: 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 64  terrupt ){.    d
3a90: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3aa0: 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20  ITE_Interrupt;. 
3ab0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63     if( db->magic
3ac0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  !=SQLITE_MAGIC_B
3ad0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  USY ){.      p->
3ae0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
3af0: 53 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SE;.    }else{. 
3b00: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
3b10: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
3b20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51     }.    rc = SQ
3b30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3b40: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
3b50: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71  (&p->zErrMsg, sq
3b60: 6c 69 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69  lite3_error_stri
3b70: 6e 67 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72  ng(p->rc), (char
3b80: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
3b90: 20 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41     sprintf(p->zA
3ba0: 72 67 76 5b 30 5d 2c 22 25 64 22 2c 69 29 3b 0a  rgv[0],"%d",i);.
3bb0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a      sprintf(p->z
3bc0: 41 72 67 76 5b 32 5d 2c 22 25 64 22 2c 20 70 2d  Argv[2],"%d", p-
3bd0: 3e 61 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20  >aOp[i].p1);.   
3be0: 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41 72 67   sprintf(p->zArg
3bf0: 76 5b 33 5d 2c 22 25 64 22 2c 20 70 2d 3e 61 4f  v[3],"%d", p->aO
3c00: 70 5b 69 5d 2e 70 32 29 3b 0a 20 20 20 20 69 66  p[i].p2);.    if
3c10: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79  ( p->aOp[i].p3ty
3c20: 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29  pe==P3_POINTER )
3c30: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
3c40: 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a 53 68  p->aStack[4].zSh
3c50: 6f 72 74 2c 20 22 70 74 72 28 25 23 78 29 22 2c  ort, "ptr(%#x)",
3c60: 20 28 69 6e 74 29 70 2d 3e 61 4f 70 5b 69 5d 2e   (int)p->aOp[i].
3c70: 70 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 41  p3);.      p->zA
3c80: 72 67 76 5b 34 5d 20 3d 20 70 2d 3e 61 53 74 61  rgv[4] = p->aSta
3c90: 63 6b 5b 34 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20  ck[4].zShort;.  
3ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3cb0: 2d 3e 7a 41 72 67 76 5b 34 5d 20 3d 20 70 2d 3e  ->zArgv[4] = p->
3cc0: 61 4f 70 5b 69 5d 2e 70 33 3b 0a 20 20 20 20 7d  aOp[i].p3;.    }
3cd0: 0a 20 20 20 20 70 2d 3e 7a 41 72 67 76 5b 31 5d  .    p->zArgv[1]
3ce0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
3cf0: 4e 61 6d 65 73 5b 70 2d 3e 61 4f 70 5b 69 5d 2e  Names[p->aOp[i].
3d00: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 70 2d 3e  opcode];.    p->
3d10: 70 63 20 3d 20 69 2b 31 3b 0a 20 20 20 20 70 2d  pc = i+1;.    p-
3d20: 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70  >azResColumn = p
3d30: 2d 3e 7a 41 72 67 76 3b 0a 20 20 20 20 70 2d 3e  ->zArgv;.    p->
3d40: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 3b 0a  nResColumn = 5;.
3d50: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
3d60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
3d70: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
3d80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3d90: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
3da0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
3db0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
3dc0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
3dd0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
3de0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
3df0: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
3e00: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
3e10: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
3e20: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
3e30: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
3e40: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
3e50: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
3e60: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
3e70: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
3e80: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
3e90: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
3ea0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
3ed0: 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20    int nVar,     
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f   /* Number of '?
3f00: 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c  ' see in the SQL
3f10: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3f20: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f40: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
3f50: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
3f60: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
3f70: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65    int n;..  asse
3f80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3f90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3fa0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fb0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 20 48  );..  /* Add a H
3fc0: 41 4c 54 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ALT instruction 
3fd0: 74 6f 20 74 68 65 20 76 65 72 79 20 65 6e 64 20  to the very end 
3fe0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  of the program..
3ff0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4f    */.  if( p->nO
4000: 70 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61 4f 70 20  p==0 || (p->aOp 
4010: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
4020: 2d 31 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 48  -1].opcode!=OP_H
4030: 61 6c 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  alt) ){.    sqli
4040: 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c 20  te3VdbeAddOp(p, 
4050: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
4060: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73    }..  /* No ins
4070: 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75  truction ever pu
4080: 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  shes more than a
4090: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20   single element 
40a0: 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74  onto the.  ** st
40b0: 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74  ack.  And the st
40c0: 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20  ack never grows 
40d0: 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78  on successive ex
40e0: 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ecutions of the.
40f0: 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20    ** same loop. 
4100: 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   So the total nu
4110: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
4120: 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72  ions is an upper
4130: 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74   bound.  ** on t
4140: 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b  he maximum stack
4150: 20 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e   depth required.
4160: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  **.  ** Alloc
4170: 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74  ation all the st
4180: 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c  ack space we wil
4190: 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a  l ever need..  *
41a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  /.  if( p->aStac
41b0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  k==0 ){.    p->n
41c0: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
41d0: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
41e0: 29 3b 0a 20 20 20 20 6e 20 3d 20 69 73 45 78 70  );.    n = isExp
41f0: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 70 2d 3e 6e  lain ? 10 : p->n
4200: 4f 70 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63  Op;.    p->aStac
4210: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
4220: 28 0a 20 20 20 20 20 20 6e 2a 28 73 69 7a 65 6f  (.      n*(sizeo
4230: 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20  f(p->aStack[0]) 
4240: 2b 20 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  + 2*sizeof(char*
4250: 29 29 20 20 20 20 20 2f 2a 20 61 53 74 61 63 6b  ))     /* aStack
4260: 20 61 6e 64 20 7a 41 72 67 76 20 2a 2f 0a 20 20   and zArgv */.  
4270: 20 20 20 20 20 20 2b 20 70 2d 3e 6e 56 61 72 2a        + p->nVar*
4280: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 73  (sizeof(char*)+s
4290: 69 7a 65 6f 66 28 69 6e 74 29 2b 31 29 20 20 20  izeof(int)+1)   
42a0: 20 2f 2a 20 61 7a 56 61 72 2c 20 61 6e 56 61 72   /* azVar, anVar
42b0: 2c 20 61 62 56 61 72 20 2a 2f 0a 20 20 20 20 29  , abVar */.    )
42c0: 3b 0a 20 20 20 20 70 2d 3e 7a 41 72 67 76 20 3d  ;.    p->zArgv =
42d0: 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 53 74   (char**)&p->aSt
42e0: 61 63 6b 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61  ack[n];.    p->a
42f0: 7a 43 6f 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  zColName = (char
4300: 2a 2a 29 26 70 2d 3e 7a 41 72 67 76 5b 6e 5d 3b  **)&p->zArgv[n];
4310: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
4320: 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 7a 43 6f  (char**)&p->azCo
4330: 6c 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 20 20 70 2d  lName[n];.    p-
4340: 3e 61 6e 56 61 72 20 3d 20 28 69 6e 74 2a 29 26  >anVar = (int*)&
4350: 70 2d 3e 61 7a 56 61 72 5b 70 2d 3e 6e 56 61 72  p->azVar[p->nVar
4360: 5d 3b 0a 20 20 20 20 70 2d 3e 61 62 56 61 72 20  ];.    p->abVar 
4370: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 6e 56 61 72  = (u8*)&p->anVar
4380: 5b 70 2d 3e 6e 56 61 72 5d 3b 0a 20 20 7d 0a 0a  [p->nVar];.  }..
4390: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
43a0: 74 28 26 70 2d 3e 61 67 67 2e 68 61 73 68 2c 20  t(&p->agg.hash, 
43b0: 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41  SQLITE_HASH_BINA
43c0: 52 59 2c 20 30 29 3b 0a 20 20 70 2d 3e 61 67 67  RY, 0);.  p->agg
43d0: 2e 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 23 69  .pSearch = 0;.#i
43e0: 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  fdef MEMORY_DEBU
43f0: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  G.  if( sqlite3O
4400: 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62  sFileExists("vdb
4410: 65 5f 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20  e_trace") ){.   
4420: 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f   p->trace = stdo
4430: 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ut;.  }.#endif. 
4440: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
4450: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e  Stack[-1];.  p->
4460: 70 63 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 63 20  pc = 0;.  p->rc 
4470: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
4480: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
4490: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
44a0: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
44b0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
44c0: 72 74 3b 0a 20 20 70 2d 3e 75 6e 64 6f 54 72 61  rt;.  p->undoTra
44d0: 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20  nsOnError = 0;. 
44e0: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
44f0: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
4500: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
4510: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
4520: 4d 41 47 49 43 5f 52 55 4e 3b 0a 23 69 66 64 65  MAGIC_RUN;.#ifde
4530: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4540: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
4550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4560: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
4570: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
4580: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
4590: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
45a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
45b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  .}.../*.** Remov
45c0: 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74  e any elements t
45d0: 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68  hat remain on th
45e0: 65 20 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65  e sorter for the
45f0: 20 56 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a   VDBE given..*/.
4600: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4610: 53 6f 72 74 65 72 52 65 73 65 74 28 56 64 62 65  SorterReset(Vdbe
4620: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
4630: 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 53  ->pSort ){.    S
4640: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d  orter *pSorter =
4650: 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70   p->pSort;.    p
4660: 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f 72 74 65  ->pSort = pSorte
4670: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  r->pNext;.    sq
4680: 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72  liteFree(pSorter
4690: 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->zKey);.    sql
46a0: 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d  iteFree(pSorter-
46b0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
46c0: 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 29  iteFree(pSorter)
46d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
46e0: 65 73 65 74 20 61 6e 20 41 67 67 20 73 74 72 75  eset an Agg stru
46f0: 63 74 75 72 65 2e 20 20 44 65 6c 65 74 65 20 61  cture.  Delete a
4700: 6c 6c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  ll its contents.
4710: 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73 74   .**.** For inst
4720: 61 6c 6c 61 62 6c 65 20 61 67 67 72 65 67 61 74  allable aggregat
4730: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 69 66 20  e functions, if 
4740: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
4750: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 63 61  n has been.** ca
4760: 6c 6c 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  lled, make sure 
4770: 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75  the finalizer fu
4780: 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 73 6f 20  nction has also 
4790: 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20 54 68  been called.  Th
47a0: 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 72 20 6d  e.** finalizer m
47b0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 66 72 65  ight need to fre
47c0: 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  e memory that wa
47d0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70  s allocated as p
47e0: 61 72 74 20 6f 66 20 69 74 73 0a 2a 2a 20 70 72  art of its.** pr
47f0: 69 76 61 74 65 20 63 6f 6e 74 65 78 74 2e 20 20  ivate context.  
4800: 49 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  If the finalizer
4810: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61   has not been ca
4820: 6c 6c 65 64 20 79 65 74 2c 20 63 61 6c 6c 20 69  lled yet, call i
4830: 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2f 0a 76 6f 69  t.** now..*/.voi
4840: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67  d sqlite3VdbeAgg
4850: 52 65 73 65 74 28 41 67 67 20 2a 70 41 67 67 29  Reset(Agg *pAgg)
4860: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73  {.  int i;.  Has
4870: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 66 6f 72 28  hElem *p;.  for(
4880: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  p = sqliteHashFi
4890: 72 73 74 28 26 70 41 67 67 2d 3e 68 61 73 68 29  rst(&pAgg->hash)
48a0: 3b 20 70 3b 20 70 20 3d 20 73 71 6c 69 74 65 48  ; p; p = sqliteH
48b0: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
48c0: 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 20   AggElem *pElem 
48d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
48e0: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
48f0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 21 3d 30   pAgg->apFunc!=0
4900: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
4910: 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69   i<pAgg->nMem; i
4920: 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
4930: 70 4d 65 6d 20 3d 20 26 70 45 6c 65 6d 2d 3e 61  pMem = &pElem->a
4940: 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
4950: 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69  ( pAgg->apFunc[i
4960: 5d 20 26 26 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ] && (pMem->flag
4970: 73 20 26 20 4d 45 4d 5f 41 67 67 43 74 78 29 21  s & MEM_AggCtx)!
4980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
4990: 6c 69 74 65 5f 66 75 6e 63 20 63 74 78 3b 0a 20  lite_func ctx;. 
49a0: 20 20 20 20 20 20 20 63 74 78 2e 70 46 75 6e 63         ctx.pFunc
49b0: 20 3d 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b   = pAgg->apFunc[
49c0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e  i];.        ctx.
49d0: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  s.flags = MEM_Nu
49e0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e  ll;.        ctx.
49f0: 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a  pAgg = pMem->z;.
4a00: 20 20 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20          ctx.cnt 
4a10: 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 20  = pMem->i;.     
4a20: 20 20 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20     ctx.isStep = 
4a30: 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 69  0;.        ctx.i
4a40: 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  sError = 0;.    
4a50: 20 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75      (*pAgg->apFu
4a60: 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65  nc[i]->xFinalize
4a70: 29 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20  )(&ctx);.       
4a80: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20   if( pMem->z!=0 
4a90: 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d  && pMem->z!=pMem
4aa0: 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20  ->zShort ){.    
4ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4ac0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
4ad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
4ae0: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 26 20 4d   ctx.s.flags & M
4af0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4b00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 63      sqliteFree(c
4b10: 74 78 2e 73 2e 7a 29 3b 0a 20 20 20 20 20 20 20  tx.s.z);.       
4b20: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
4b30: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4b40: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
4b50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4b60: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d  Mem->z);.      }
4b70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4b80: 65 46 72 65 65 28 70 45 6c 65 6d 29 3b 0a 20 20  eFree(pElem);.  
4b90: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
4ba0: 6c 65 61 72 28 26 70 41 67 67 2d 3e 68 61 73 68  lear(&pAgg->hash
4bb0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4bc0: 70 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20  pAgg->apFunc);. 
4bd0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20   pAgg->apFunc = 
4be0: 30 3b 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72  0;.  pAgg->pCurr
4bf0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d  ent = 0;.  pAgg-
4c00: 3e 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20  >pSearch = 0;.  
4c10: 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  pAgg->nMem = 0;.
4c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4c30: 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69  a keylist.*/.voi
4c40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79  d sqlite3VdbeKey
4c50: 6c 69 73 74 46 72 65 65 28 4b 65 79 6c 69 73 74  listFree(Keylist
4c60: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
4c70: 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74 20   ){.    Keylist 
4c80: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
4c90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  t;.    sqliteFre
4ca0: 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  e(p);.    p = pN
4cb0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
4cc0: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
4cd0: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
4ce0: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
4cf0: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
4d00: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
4d10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4d20: 62 65 43 6c 65 61 6e 75 70 43 75 72 73 6f 72 28  beCleanupCursor(
4d30: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
4d40: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
4d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
4d60: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
4d70: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
4d80: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
4d90: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
4da0: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
4db0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pBt);.  }.  sqli
4dc0: 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74  teFree(pCx->pDat
4dd0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
4de0: 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20  (pCx->aType);.  
4df0: 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73  memset(pCx, 0, s
4e00: 69 7a 65 6f 66 28 2a 70 43 78 29 29 3b 0a 7d 0a  izeof(*pCx));.}.
4e10: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
4e20: 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74   cursors.*/.stat
4e30: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
4e40: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
4e50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4e60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
4e70: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75  or; i++){.    Cu
4e80: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
4e90: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  Csr[i];.    sqli
4ea0: 74 65 33 56 64 62 65 43 6c 65 61 6e 75 70 43 75  te3VdbeCleanupCu
4eb0: 72 73 6f 72 28 70 43 29 3b 0a 20 20 20 20 73 71  rsor(pC);.    sq
4ec0: 6c 69 74 65 46 72 65 65 28 70 43 29 3b 0a 20 20  liteFree(pC);.  
4ed0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4ee0: 2d 3e 61 70 43 73 72 29 3b 0a 20 20 70 2d 3e 61  ->apCsr);.  p->a
4ef0: 70 43 73 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  pCsr = 0;.  p->n
4f00: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Cursor = 0;.}../
4f10: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
4f20: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
4f30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
4f40: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
4f50: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
4f60: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
4f70: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
4f80: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
4f90: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
4fa0: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
4fb0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
4fc0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
4fd0: 61 7a 56 61 72 69 61 62 6c 65 5b 5d 20 61 72 72  azVariable[] arr
4fe0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
4ff0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
5000: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5010: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b  if( p->aStack ){
5020: 0a 20 20 20 20 4d 65 6d 20 2a 70 54 6f 73 20 3d  .    Mem *pTos =
5030: 20 70 2d 3e 70 54 6f 73 3b 0a 20 20 20 20 77 68   p->pTos;.    wh
5040: 69 6c 65 28 20 70 54 6f 73 3e 3d 70 2d 3e 61 53  ile( pTos>=p->aS
5050: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  tack ){.      if
5060: 28 20 70 54 6f 73 2d 3e 66 6c 61 67 73 20 26 20  ( pTos->flags & 
5070: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
5080: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
5090: 6f 73 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  os->z);.      }.
50a0: 20 20 20 20 20 20 70 54 6f 73 2d 2d 3b 0a 20 20        pTos--;.  
50b0: 20 20 7d 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20    }.    p->pTos 
50c0: 3d 20 70 54 6f 73 3b 0a 20 20 7d 0a 20 20 63 6c  = pTos;.  }.  cl
50d0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
50e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
50f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
5100: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
5110: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4d  .      if( p->aM
5120: 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[i].flags & ME
5130: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20  M_Dyn ){.       
5140: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
5150: 4d 65 6d 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 20  Mem[i].z);.     
5160: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
5170: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65  qliteFree(p->aMe
5180: 6d 29 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  m);.  p->aMem = 
5190: 30 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30  0;.  p->nMem = 0
51a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ;.  if( p->pList
51b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
51c0: 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28 70  dbeKeylistFree(p
51d0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  ->pList);.    p-
51e0: 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pList = 0;.  }.
51f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
5200: 74 65 72 52 65 73 65 74 28 70 29 3b 0a 20 20 69  terReset(p);.  i
5210: 66 28 20 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20  f( p->pFile ){. 
5220: 20 20 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 21     if( p->pFile!
5230: 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f 73 65 28  =stdin ) fclose(
5240: 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20 20 20 70  p->pFile);.    p
5250: 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d  ->pFile = 0;.  }
5260: 0a 20 20 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c  .  if( p->azFiel
5270: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  d ){.    sqliteF
5280: 72 65 65 28 70 2d 3e 61 7a 46 69 65 6c 64 29 3b  ree(p->azField);
5290: 0a 20 20 20 20 70 2d 3e 61 7a 46 69 65 6c 64 20  .    p->azField 
52a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46  = 0;.  }.  p->nF
52b0: 69 65 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  ield = 0;.  if( 
52c0: 70 2d 3e 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20  p->zLine ){.    
52d0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 4c  sqliteFree(p->zL
52e0: 69 6e 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69  ine);.    p->zLi
52f0: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  ne = 0;.  }.  p-
5300: 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b  >nLineAlloc = 0;
5310: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 67  .  sqlite3VdbeAg
5320: 67 52 65 73 65 74 28 26 70 2d 3e 61 67 67 29 3b  gReset(&p->agg);
5330: 0a 20 20 69 66 28 20 70 2d 3e 61 53 65 74 20 29  .  if( p->aSet )
5340: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5350: 3c 70 2d 3e 6e 53 65 74 3b 20 69 2b 2b 29 7b 0a  <p->nSet; i++){.
5360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
5370: 68 43 6c 65 61 72 28 26 70 2d 3e 61 53 65 74 5b  hClear(&p->aSet[
5380: 69 5d 2e 68 61 73 68 29 3b 0a 20 20 20 20 7d 0a  i].hash);.    }.
5390: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
53a0: 28 70 2d 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e  (p->aSet);.  p->
53b0: 61 53 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  aSet = 0;.  p->n
53c0: 53 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Set = 0;.  if( p
53d0: 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 20 29  ->keylistStack )
53e0: 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
53f0: 20 20 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69    for(ii = 0; ii
5400: 20 3c 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61   < p->keylistSta
5410: 63 6b 44 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a  ckDepth; ii++){.
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e  eKeylistFree(p->
5440: 6b 65 79 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d  keylistStack[ii]
5450: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5460: 69 74 65 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69  iteFree(p->keyli
5470: 73 74 53 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d  stStack);.    p-
5480: 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70  >keylistStackDep
5490: 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b  th = 0;.    p->k
54a0: 65 79 6c 69 73 74 53 74 61 63 6b 20 3d 20 30 3b  eylistStack = 0;
54b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
54c0: 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  e(p->contextStac
54d0: 6b 29 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74  k);.  p->context
54e0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 73 71 6c  Stack = 0;.  sql
54f0: 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d  iteFree(p->zErrM
5500: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
5510: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
5520: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
5530: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
5540: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
5550: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
5560: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
5570: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
5580: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
5590: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
55a0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
55b0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
55c0: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
55d0: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
55e0: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
55f0: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2f 0a  ed.** again..*/.
5600: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
5610: 65 73 65 74 28 56 64 62 65 20 2a 70 2c 20 63 68  eset(Vdbe *p, ch
5620: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a  ar **pzErrMsg){.
5630: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
5640: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
5650: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
5660: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
5670: 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  & p->magic!=VDBE
5680: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
5690: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
56a0: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71  ing(pzErrMsg, sq
56b0: 6c 69 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69  lite3_error_stri
56c0: 6e 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ng(SQLITE_MISUSE
56d0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
56e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56f0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66  MISUSE;.  }.  if
5700: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
5710: 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67      if( pzErrMsg
5720: 20 26 26 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30   && *pzErrMsg==0
5730: 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72   ){.      *pzErr
5740: 4d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 4d 73 67  Msg = p->zErrMsg
5750: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5760: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
5770: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
5780: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
5790: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
57a0: 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71   p->rc ){.    sq
57b0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
57c0: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33  zErrMsg, sqlite3
57d0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d  _error_string(p-
57e0: 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >rc), (char*)0);
57f0: 0a 20 20 7d 0a 20 20 43 6c 65 61 6e 75 70 28 70  .  }.  Cleanup(p
5800: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
5810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5820: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 72 72 6f   switch( p->erro
5830: 72 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rAction ){.     
5840: 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20   case OE_Abort: 
5850: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
5860: 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72  ->undoTransOnErr
5870: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
5880: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
5890: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
58a0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
58b0: 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20  b[i].pBt ){.    
58c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
58d0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
58e0: 6d 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  mt(db->aDb[i].pB
58f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
5900: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
5910: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5930: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
5940: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 20 2a 2f 0a   to ROLLBACK */.
5950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5960: 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20  se OE_Rollback: 
5970: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5980: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
5990: 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c  ;.        db->fl
59a0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
59b0: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 20 20 20 20  nTrans;.        
59c0: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
59d0: 5f 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  _Default;.      
59e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
59f0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
5a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
5a10: 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f  >undoTransOnErro
5a20: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
5a30: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
5a40: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
5a50: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
5a60: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
5a70: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45           db->onE
5a80: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
5a90: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
5aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
5ac0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74  lite3RollbackInt
5ad0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
5ae0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
5af0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
5b00: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
5b10: 62 5b 69 5d 2e 70 42 74 20 26 26 20 64 62 2d 3e  b[i].pBt && db->
5b20: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 3d 3d  aDb[i].inTrans==
5b30: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
5b40: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
5b50: 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
5b60: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  );.      db->aDb
5b70: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 31 3b  [i].inTrans = 1;
5b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
5b90: 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d  ert( p->pTos<&p-
5ba0: 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 5d 20 7c  >aStack[p->pc] |
5bb0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
5bc0: 5f 66 61 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69  _failed==1 );.#i
5bd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
5be0: 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
5bf0: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
5c00: 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
5c10: 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
5c20: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
5c30: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
5c40: 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
5c50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5c60: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5c70: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
5c80: 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
5c90: 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
5ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
5cb0: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
5cc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5cd0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5ce0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
5cf0: 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
5d00: 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
5d10: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
5d20: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
5d30: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
5d40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
5d50: 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
5d60: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
5d70: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
5d80: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
5d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
5da0: 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
5db0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
5dc0: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
5dd0: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
5de0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
5df0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
5e00: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
5e10: 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >rc;.}../*.** Cl
5e20: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
5e30: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
5e40: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
5e50: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
5e60: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
5e70: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
5e80: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
5e90: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
5ea0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
5eb0: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
5ec0: 7a 65 28 56 64 62 65 20 2a 70 2c 20 63 68 61 72  ze(Vdbe *p, char
5ed0: 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20   **pzErrMsg){.  
5ee0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
5ef0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   *db;..  if( p->
5f00: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
5f10: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69  C_RUN && p->magi
5f20: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c!=VDBE_MAGIC_HA
5f30: 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LT ){.    sqlite
5f40: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
5f50: 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Msg, sqlite3_err
5f60: 6f 72 5f 73 74 72 69 6e 67 28 53 51 4c 49 54 45  or_string(SQLITE
5f70: 5f 4d 49 53 55 53 45 29 2c 20 28 63 68 61 72 2a  _MISUSE), (char*
5f80: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
5f90: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
5fa0: 20 7d 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b   }.  db = p->db;
5fb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
5fc0: 64 62 65 52 65 73 65 74 28 70 2c 20 70 7a 45 72  dbeReset(p, pzEr
5fd0: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
5fe0: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
5ff0: 20 69 66 28 20 64 62 2d 3e 77 61 6e 74 5f 74 6f   if( db->want_to
6000: 5f 63 6c 6f 73 65 20 26 26 20 64 62 2d 3e 70 56  _close && db->pV
6010: 64 62 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dbe==0 ){.    sq
6020: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
6030: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
6040: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a  QLITE_SCHEMA ){.
6050: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
6060: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
6070: 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  b, 0);.  }.  ret
6080: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6090: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 73 20   Set the values 
60a0: 6f 66 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 73  of all variables
60b0: 2e 20 20 56 61 72 69 61 62 6c 65 20 24 31 20 69  .  Variable $1 i
60c0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
60d0: 51 4c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 74 68  QL will.** be th
60e0: 65 20 73 74 72 69 6e 67 20 61 7a 56 61 6c 75 65  e string azValue
60f0: 5b 30 5d 2e 20 20 24 32 20 77 69 6c 6c 20 68 61  [0].  $2 will ha
6100: 76 65 20 74 68 65 20 76 61 6c 75 65 20 61 7a 56  ve the value azV
6110: 61 6c 75 65 5b 31 5d 2e 20 20 41 6e 64 0a 2a 2a  alue[1].  And.**
6120: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 61   so forth.  If a
6130: 20 76 61 6c 75 65 20 69 73 20 6f 75 74 20 6f 66   value is out of
6140: 20 72 61 6e 67 65 20 28 66 6f 72 20 65 78 61 6d   range (for exam
6150: 70 6c 65 20 24 33 20 77 68 65 6e 20 6e 56 61 6c  ple $3 when nVal
6160: 75 65 3d 3d 32 29 0a 2a 2a 20 74 68 65 6e 20 69  ue==2).** then i
6170: 74 73 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ts value will be
6180: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
6190: 73 20 72 6f 75 74 69 6e 65 20 6f 76 65 72 72 69  s routine overri
61a0: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 63 61  des any prior ca
61b0: 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ll..*/.int sqlit
61c0: 65 33 5f 62 69 6e 64 28 73 71 6c 69 74 65 5f 76  e3_bind(sqlite_v
61d0: 6d 20 2a 70 56 6d 2c 20 69 6e 74 20 69 2c 20 63  m *pVm, int i, c
61e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 2c  onst char *zVal,
61f0: 20 69 6e 74 20 6c 65 6e 2c 20 69 6e 74 20 63 6f   int len, int co
6200: 70 79 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  py){.  Vdbe *p =
6210: 20 28 56 64 62 65 2a 29 70 56 6d 3b 0a 20 20 69   (Vdbe*)pVm;.  i
6220: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
6230: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
6240: 2d 3e 70 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ->pc!=0 ){.    r
6250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6260: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  USE;.  }.  if( i
6270: 3c 31 20 7c 7c 20 69 3e 70 2d 3e 6e 56 61 72 20  <1 || i>p->nVar 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6290: 4c 49 54 45 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a  LITE_RANGE;.  }.
62a0: 20 20 69 2d 2d 3b 0a 20 20 69 66 28 20 70 2d 3e    i--;.  if( p->
62b0: 61 62 56 61 72 5b 69 5d 20 29 7b 0a 20 20 20 20  abVar[i] ){.    
62c0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 7a  sqliteFree(p->az
62d0: 56 61 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  Var[i]);.  }.  i
62e0: 66 28 20 7a 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( zVal==0 ){.  
62f0: 20 20 63 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20    copy = 0;.    
6300: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  len = 0;.  }.  i
6310: 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
6320: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61  len = strlen(zVa
6330: 6c 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  l)+1;.  }.  if( 
6340: 63 6f 70 79 20 29 7b 0a 20 20 20 20 70 2d 3e 61  copy ){.    p->a
6350: 7a 56 61 72 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zVar[i] = sqlite
6360: 4d 61 6c 6c 6f 63 28 20 6c 65 6e 20 29 3b 0a 20  Malloc( len );. 
6370: 20 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 5b     if( p->azVar[
6380: 69 5d 20 29 20 6d 65 6d 63 70 79 28 70 2d 3e 61  i] ) memcpy(p->a
6390: 7a 56 61 72 5b 69 5d 2c 20 7a 56 61 6c 2c 20 6c  zVar[i], zVal, l
63a0: 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  en);.  }else{.  
63b0: 20 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 20 3d 20    p->azVar[i] = 
63c0: 28 63 68 61 72 2a 29 7a 56 61 6c 3b 0a 20 20 7d  (char*)zVal;.  }
63d0: 0a 20 20 70 2d 3e 61 62 56 61 72 5b 69 5d 20 3d  .  p->abVar[i] =
63e0: 20 63 6f 70 79 3b 0a 20 20 70 2d 3e 61 6e 56 61   copy;.  p->anVa
63f0: 72 5b 69 5d 20 3d 20 6c 65 6e 3b 0a 20 20 72 65  r[i] = len;.  re
6400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6410: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
6420: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
6430: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6440: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
6450: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
6460: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6470: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  n;.  Cleanup(p);
6480: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
6490: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
64a0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
64b0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
64c0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
64d0: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
64e0: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
64f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
6500: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
6510: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
6520: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
6530: 7d 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70  }.  p->pPrev = p
6540: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
6550: 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d  f( p->nOpAlloc==
6560: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 20  0 ){.    p->aOp 
6570: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 20  = 0;.    p->nOp 
6580: 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
6590: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
65a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
65b0: 4f 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33  Op[i].p3type==P3
65c0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
65d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
65e0: 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20 20 20  aOp[i].p3);.    
65f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
6600: 20 69 3c 70 2d 3e 6e 56 61 72 3b 20 69 2b 2b 29   i<p->nVar; i++)
6610: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 62 56  {.    if( p->abV
6620: 61 72 5b 69 5d 20 29 20 73 71 6c 69 74 65 46 72  ar[i] ) sqliteFr
6630: 65 65 28 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b  ee(p->azVar[i]);
6640: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
6650: 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c  e(p->aOp);.  sql
6660: 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65  iteFree(p->aLabe
6670: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  l);.  sqliteFree
6680: 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 70  (p->aStack);.  p
6690: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
66a0: 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
66b0: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
66c0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
66d0: 69 6e 74 65 67 65 72 20 69 6e 20 62 65 74 77 65  integer in betwe
66e0: 65 6e 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e  en the native in
66f0: 74 65 67 65 72 20 66 6f 72 6d 61 74 20 61 6e 64  teger format and
6700: 0a 2a 2a 20 74 68 65 20 62 69 67 45 6e 64 69 61  .** the bigEndia
6710: 6e 20 66 6f 72 6d 61 74 20 75 73 65 64 20 61 73  n format used as
6720: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6730: 65 72 20 66 6f 72 20 74 61 62 6c 65 73 2e 0a 2a  er for tables..*
6740: 2a 0a 2a 2a 20 54 68 65 20 62 69 67 45 6e 64 69  *.** The bigEndi
6750: 61 6e 20 66 6f 72 6d 61 74 20 28 6d 6f 73 74 20  an format (most 
6760: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
6770: 20 66 69 72 73 74 29 20 69 73 20 75 73 65 64 20   first) is used 
6780: 66 6f 72 0a 2a 2a 20 72 65 63 6f 72 64 20 6e 75  for.** record nu
6790: 6d 62 65 72 73 20 73 6f 20 74 68 61 74 20 72 65  mbers so that re
67a0: 63 6f 72 64 73 20 77 69 6c 6c 20 73 6f 72 74 20  cords will sort 
67b0: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
67c0: 20 6f 72 64 65 72 0a 2a 2a 20 65 76 65 6e 20 74   order.** even t
67d0: 68 6f 75 67 68 20 6d 65 6d 63 6d 70 28 29 20 69  hough memcmp() i
67e0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
67f0: 65 20 74 68 65 20 6b 65 79 73 2e 20 20 4f 6e 20  e the keys.  On 
6800: 6d 61 63 68 69 6e 65 73 0a 2a 2a 20 77 68 6f 73  machines.** whos
6810: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  e native integer
6820: 20 66 6f 72 6d 61 74 20 69 73 20 6c 69 74 74 6c   format is littl
6830: 65 20 65 6e 64 69 61 6e 20 28 65 78 3a 20 69 34  e endian (ex: i4
6840: 38 36 29 20 74 68 65 0a 2a 2a 20 6f 72 64 65 72  86) the.** order
6850: 20 6f 66 20 62 79 74 65 73 20 69 73 20 72 65 76   of bytes is rev
6860: 65 72 73 65 64 2e 20 20 4f 6e 20 6e 61 74 69 76  ersed.  On nativ
6870: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 6d 61 63  e big-endian mac
6880: 68 69 6e 65 73 0a 2a 2a 20 28 65 78 3a 20 41 6c  hines.** (ex: Al
6890: 70 68 61 2c 20 53 70 61 72 63 2c 20 4d 6f 74 6f  pha, Sparc, Moto
68a0: 72 6f 6c 61 29 20 74 68 65 20 62 79 74 65 20 6f  rola) the byte o
68b0: 72 64 65 72 20 69 73 20 74 68 65 20 73 61 6d 65  rder is the same
68c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
68d0: 63 74 69 6f 6e 20 69 73 20 69 74 73 20 6f 77 6e  ction is its own
68e0: 20 69 6e 76 65 72 73 65 2e 20 20 49 6e 20 6f 74   inverse.  In ot
68f0: 68 65 72 20 77 6f 72 64 73 0a 2a 2a 0a 2a 2a 20  her words.**.** 
6900: 20 20 20 20 20 20 20 20 58 20 3d 3d 20 62 79 74          X == byt
6910: 65 53 77 61 70 28 62 79 74 65 53 77 61 70 28 58  eSwap(byteSwap(X
6920: 29 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )).*/.int sqlite
6930: 33 56 64 62 65 42 79 74 65 53 77 61 70 28 69 6e  3VdbeByteSwap(in
6940: 74 20 78 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a  t x){.  union {.
6950: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 73       char zBuf[s
6960: 69 7a 65 6f 66 28 69 6e 74 29 5d 3b 0a 20 20 20  izeof(int)];.   
6970: 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 75 78 3b    int i;.  } ux;
6980: 0a 20 20 75 78 2e 7a 42 75 66 5b 33 5d 20 3d 20  .  ux.zBuf[3] = 
6990: 78 26 30 78 66 66 3b 0a 20 20 75 78 2e 7a 42 75  x&0xff;.  ux.zBu
69a0: 66 5b 32 5d 20 3d 20 28 78 3e 3e 38 29 26 30 78  f[2] = (x>>8)&0x
69b0: 66 66 3b 0a 20 20 75 78 2e 7a 42 75 66 5b 31 5d  ff;.  ux.zBuf[1]
69c0: 20 3d 20 28 78 3e 3e 31 36 29 26 30 78 66 66 3b   = (x>>16)&0xff;
69d0: 0a 20 20 75 78 2e 7a 42 75 66 5b 30 5d 20 3d 20  .  ux.zBuf[0] = 
69e0: 28 78 3e 3e 32 34 29 26 30 78 66 66 3b 0a 20 20  (x>>24)&0xff;.  
69f0: 72 65 74 75 72 6e 20 75 78 2e 69 3b 0a 7d 0a 0a  return ux.i;.}..
6a00: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
6a10: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
6a20: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
6a30: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
6a40: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
6a50: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
6a60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
6a70: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
6a80: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
6a90: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
6aa0: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
6ab0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
6ac0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
6ad0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
6ae0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
6af0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
6b00: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  ){.    int res;.
6b10: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
6b20: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
6b30: 75 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  unt;.    assert(
6b40: 20 70 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20   p->intKey );.  
6b50: 20 20 69 66 28 20 70 2d 3e 69 6e 74 4b 65 79 20    if( p->intKey 
6b60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6b70: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70  BtreeMoveto(p->p
6b80: 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
6b90: 76 65 74 6f 54 61 72 67 65 74 2c 20 26 72 65 73  vetoTarget, &res
6ba0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6bc0: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
6bd0: 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76  r,(char*)&p->mov
6be0: 65 74 6f 54 61 72 67 65 74 2c 73 69 7a 65 6f 66  etoTarget,sizeof
6bf0: 28 69 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20  (i64),&res);.   
6c00: 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 63 72 4b 65   }.    p->incrKe
6c10: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
6c20: 73 74 52 65 63 6e 6f 20 3d 20 6b 65 79 54 6f 49  stRecno = keyToI
6c30: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
6c40: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 65 63 6e  et);.    p->recn
6c50: 6f 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  oIsValid = res==
6c60: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
6c70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6c80: 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43  3BtreeNext(p->pC
6c90: 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
6ca0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
6cb0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
6cc0: 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
6cd0: 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
6ce0: 2d 3e 63 61 63 68 65 56 61 6c 69 64 20 3d 20 30  ->cacheValid = 0
6cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
6d00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6d10: 2a 2a 20 46 49 58 20 4d 45 0a 2a 2a 0a 2a 2a 20  ** FIX ME.**.** 
6d20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6d30: 20 69 6e 63 6c 75 64 65 64 20 74 65 6d 70 6f 72   included tempor
6d40: 61 72 69 6c 79 20 73 6f 20 74 68 61 74 20 72 65  arily so that re
6d50: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 68  gression tests h
6d60: 61 76 65 0a 2a 2a 20 61 20 63 68 61 6e 63 65 20  ave.** a chance 
6d70: 6f 66 20 70 61 73 73 69 6e 67 2e 20 49 74 20 61  of passing. It a
6d80: 6c 77 61 79 73 20 75 73 65 73 20 6d 65 6d 63 6d  lways uses memcm
6d90: 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  p()..*/.int sqli
6da0: 74 65 32 42 74 72 65 65 4b 65 79 43 6f 6d 70 61  te2BtreeKeyCompa
6db0: 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  re(.  BtCursor *
6dc0: 70 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 50  pCur,       /* P
6dd0: 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 72 79 20  ointer to entry 
6de0: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
6df0: 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  st */.  const vo
6e00: 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 2f 2a  id *pKey,     /*
6e10: 20 4b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   Key to compare 
6e20: 61 67 61 69 6e 73 74 20 65 6e 74 72 79 20 74 68  against entry th
6e30: 61 74 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  at pCur points t
6e40: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  o */.  int nKey,
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
6e70: 69 6e 20 70 4b 65 79 20 2a 2f 0a 20 20 69 6e 74  in pKey */.  int
6e80: 20 6e 49 67 6e 6f 72 65 2c 20 20 20 20 20 20 20   nIgnore,       
6e90: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69     /* Ignore thi
6ea0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61 74 20  s many bytes at 
6eb0: 74 68 65 20 65 6e 64 20 6f 66 20 70 43 75 72 20  the end of pCur 
6ec0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 75 6c  */.  int *pResul
6ed0: 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  t          /* Wr
6ee0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 68  ite the result h
6ef0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ere */.){.  cons
6f00: 74 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79  t void *pCellKey
6f10: 3b 0a 20 20 76 6f 69 64 20 2a 70 4d 61 6c 6c 6f  ;.  void *pMallo
6f20: 63 65 64 4b 65 79 3b 0a 20 20 75 36 34 20 6e 43  cedKey;.  u64 nC
6f30: 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63  ellKey;.  int rc
6f40: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
6f50: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
6f60: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 6e 43 65  nCellKey);.  nCe
6f70: 6c 6c 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  llKey = nCellKey
6f80: 20 2d 20 6e 49 67 6e 6f 72 65 3b 0a 20 20 69 66   - nIgnore;.  if
6f90: 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
6fa0: 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20  .    *pResult = 
6fb0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
6fc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
6fd0: 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
6fe0: 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
6ff0: 70 43 75 72 2c 20 6e 43 65 6c 6c 4b 65 79 29 3b  pCur, nCellKey);
7000: 0a 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 20  .  if( pCellKey 
7010: 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20  ){.    *pResult 
7020: 3d 20 6d 65 6d 63 6d 70 28 70 43 65 6c 6c 4b 65  = memcmp(pCellKe
7030: 79 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 3e 6e 43  y, pKey, nKey>nC
7040: 65 6c 6c 4b 65 79 3f 6e 43 65 6c 6c 4b 65 79 3a  ellKey?nCellKey:
7050: 6e 4b 65 79 29 3b 0a 20 20 20 20 72 65 74 75 72  nKey);.    retur
7060: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7070: 0a 0a 20 20 70 4d 61 6c 6c 6f 63 65 64 4b 65 79  ..  pMallocedKey
7080: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7090: 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 69   nCellKey );.  i
70a0: 66 28 20 70 4d 61 6c 6c 6f 63 65 64 4b 65 79 3d  f( pMallocedKey=
70b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
70c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20  TE_NOMEM;..  rc 
70d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
70e0: 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
70f0: 4b 65 79 2c 20 70 4d 61 6c 6c 6f 63 65 64 4b 65  Key, pMallocedKe
7100: 79 29 3b 0a 20 20 2a 70 52 65 73 75 6c 74 20 3d  y);.  *pResult =
7110: 20 6d 65 6d 63 6d 70 28 70 4d 61 6c 6c 6f 63 65   memcmp(pMalloce
7120: 64 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  dKey, pKey, nKey
7130: 3e 6e 43 65 6c 6c 4b 65 79 3f 6e 43 65 6c 6c 4b  >nCellKey?nCellK
7140: 65 79 3a 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  ey:nKey);.  sqli
7150: 74 65 46 72 65 65 28 70 4d 61 6c 6c 6f 63 65 64  teFree(pMalloced
7160: 4b 65 79 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Key);..  return 
7170: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
7180: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
7190: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
71a0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
71b0: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
71c0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
71d0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
71e0: 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20  SerialRead().** 
71f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
7200: 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
7210: 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65  3VdbeSerialWrite
7220: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
7230: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
7240: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
7250: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
7260: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
7270: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
7280: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
7290: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
72a0: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
72b0: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
72c0: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
72d0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
72e0: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
72f0: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
7300: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
7310: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
7320: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
7330: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
7340: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
7350: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
7360: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
7370: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
7380: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
7390: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
73a0: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
73b0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
73c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
73d0: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
73e0: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
73f0: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
7400: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
7410: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
7420: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
7430: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
7440: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
7450: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
7460: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7470: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
7480: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
7490: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
74a0: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
74b0: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
74c0: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
74d0: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
74f0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
7500: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
7510: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 20 20 20 2d 20 20 20 20 20 20 20 20 20 20 20 20     -            
7540: 4e 6f 74 20 61 20 74 79 70 65 2e 0a 2a 2a 20 20  Not a type..**  
7550: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
7560: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
7570: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
7580: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
75b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
75c0: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
75e0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
75f0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
7600: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
7610: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
7620: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
7630: 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
7660: 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
7670: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
7680: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
7690: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
76a0: 20 37 2e 2e 31 31 20 20 20 20 20 20 20 20 20 20   7..11          
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
76d0: 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
76e0: 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
76f0: 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
7700: 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
7710: 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
7720: 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
7730: 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
7740: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
7750: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
7760: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
7770: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
7780: 0a 75 36 34 20 73 71 6c 69 74 65 33 56 64 62 65  .u64 sqlite3Vdbe
7790: 53 65 72 69 61 6c 54 79 70 65 28 63 6f 6e 73 74  SerialType(const
77a0: 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69   Mem *pMem){.  i
77b0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
77c0: 3e 66 6c 61 67 73 3b 0a 0a 20 20 69 66 28 20 66  >flags;..  if( f
77d0: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
77e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
77f0: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
7800: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
7810: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
7820: 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
7830: 20 34 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   4 or 8 bytes. *
7840: 2f 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  /.    i64 i = pM
7850: 65 6d 2d 3e 69 3b 0a 20 20 20 20 69 66 28 20 69  em->i;.    if( i
7860: 3e 3d 2d 31 32 37 20 26 26 20 69 3c 3d 31 32 37  >=-127 && i<=127
7870: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
7880: 20 69 66 28 20 69 3e 3d 2d 33 32 37 36 37 20 26   if( i>=-32767 &
7890: 26 20 69 3c 3d 33 32 37 36 37 20 29 20 72 65 74  & i<=32767 ) ret
78a0: 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 69  urn 2;.    if( i
78b0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
78c0: 20 69 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   i<=2147483647 )
78d0: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 72   return 3;.    r
78e0: 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a 20 20 69  eturn 4;.  }.  i
78f0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
7900: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
7910: 35 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  5;.  }.  if( fla
7920: 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
7930: 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e    return (pMem->
7940: 6e 2a 32 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20  n*2 + 13);.  }. 
7950: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42   if( flags&MEM_B
7960: 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lob ){.    retur
7970: 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31  n (pMem->n*2 + 1
7980: 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  2);.  }.  return
7990: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
79a0: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
79b0: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
79c0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
79d0: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
79e0: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
79f0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
7a00: 70 65 4c 65 6e 28 75 36 34 20 73 65 72 69 61 6c  peLen(u64 serial
7a10: 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
7a20: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30  ( serial_type!=0
7a30: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 73 65 72   );.  switch(ser
7a40: 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 20 20 63  ial_type){.    c
7a50: 61 73 65 20 36 3a 20 72 65 74 75 72 6e 20 30 3b  ase 6: return 0;
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
7a80: 20 63 61 73 65 20 31 3a 20 72 65 74 75 72 6e 20   case 1: return 
7a90: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
7aa0: 20 20 20 20 2f 2a 20 31 20 62 79 74 65 20 69 6e      /* 1 byte in
7ab0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
7ac0: 65 20 32 3a 20 72 65 74 75 72 6e 20 32 3b 20 20  e 2: return 2;  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 2f 2a 20 32 20 62 79 74 65 20 69 6e 74 65 67 65  /* 2 byte intege
7af0: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 33 3a  r */.    case 3:
7b00: 20 72 65 74 75 72 6e 20 34 3b 20 20 20 20 20 20   return 4;      
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34              /* 4
7b20: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 2a 2f   byte integer */
7b30: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 72 65 74  .    case 4: ret
7b40: 75 72 6e 20 38 3b 20 20 20 20 20 20 20 20 20 20  urn 8;          
7b50: 20 20 20 20 20 20 20 20 2f 2a 20 38 20 62 79 74          /* 8 byt
7b60: 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  e integer */.   
7b70: 20 63 61 73 65 20 35 3a 20 72 65 74 75 72 6e 20   case 5: return 
7b80: 38 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8;              
7b90: 20 20 20 20 2f 2a 20 38 20 62 79 74 65 20 66 6c      /* 8 byte fl
7ba0: 6f 61 74 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  oat */.  }.  ass
7bb0: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
7bc0: 3e 3d 31 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  >=12 );.  return
7bd0: 20 28 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31   ((serial_type-1
7be0: 32 29 3e 3e 31 29 3b 20 20 20 20 20 20 20 20 2f  2)>>1);        /
7bf0: 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 2a  * text or blob *
7c00: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  /.}../*.** Write
7c10: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
7c20: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
7c30: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
7c40: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
7c50: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
7c60: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
7c70: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
7c80: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
7c90: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
7ca0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
7cb0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e   written..*/ .in
7cc0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
7cd0: 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64 20  ialPut(unsigned 
7ce0: 63 68 61 72 20 2a 62 75 66 2c 20 63 6f 6e 73 74  char *buf, const
7cf0: 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 75   Mem *pMem){.  u
7d00: 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  64 serial_type =
7d10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
7d20: 61 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20  alType(pMem);.  
7d30: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65  int len;..  asse
7d40: 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21  rt( serial_type!
7d50: 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 4e 55 4c  =0 );. .  /* NUL
7d60: 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  L */.  if( seria
7d70: 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
7d80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7d90: 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 2a 2f  .  /* Integer */
7da0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
7db0: 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36 34 20  pe<5 ){.    i64 
7dc0: 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20  i = pMem->i;.   
7dd0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
7de0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
7df0: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
7e00: 20 20 77 68 69 6c 65 28 20 6c 65 6e 2d 2d 20 29    while( len-- )
7e10: 7b 0a 20 20 20 20 20 20 62 75 66 5b 6c 65 6e 5d  {.      buf[len]
7e20: 20 3d 20 28 69 26 30 78 46 46 29 3b 0a 20 20 20   = (i&0xFF);.   
7e30: 20 20 20 69 20 3d 20 69 20 3e 3e 20 38 3b 0a 20     i = i >> 8;. 
7e40: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7e50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
7e60: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
7e70: 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  type);.  }..  /*
7e80: 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66 28 20   Float */.  if( 
7e90: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35 20 29  serial_type==5 )
7ea0: 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 62  {.    /* TODO: b
7eb0: 79 74 65 20 6f 72 64 65 72 69 6e 67 3f 20 2a 2f  yte ordering? */
7ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
7ed0: 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38 20 29  eof(double)==8 )
7ee0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
7ef0: 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 38 29 3b 0a  , &pMem->r, 8);.
7f00: 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
7f10: 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67  }.  .  /* String
7f20: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73   or blob */.  as
7f30: 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
7f40: 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d  e>=12 );.  len =
7f50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
7f60: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
7f70: 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79  _type);.  memcpy
7f80: 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
7f90: 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65  en);.  return le
7fa0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  n;.}../*.** Dese
7fb0: 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
7fc0: 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
7fd0: 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
7fe0: 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
7ff0: 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
8000: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
8010: 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
8020: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8030: 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  read..*/ .int sq
8040: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
8050: 65 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  et(const unsigne
8060: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 36 34  d char *buf, u64
8070: 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 4d 65   serial_type, Me
8080: 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20  m *pMem){.  int 
8090: 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  len;..  assert( 
80a0: 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 20 29  serial_type!=0 )
80b0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
80c0: 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Mem, 0, sizeof(p
80d0: 4d 65 6d 29 29 3b 20 2a 2f 0a 20 20 70 4d 65 6d  Mem)); */.  pMem
80e0: 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  ->flags = 0;.  p
80f0: 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 0a 20 20 2f  Mem->z = 0;..  /
8100: 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20  * NULL */.  if( 
8110: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
8120: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  {.    pMem->flag
8130: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
8140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8150: 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 2a   .  /* Integer *
8160: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
8170: 79 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36 34  ype<5 ){.    i64
8180: 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
8190: 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  n;.    len = sql
81a0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
81b0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
81c0: 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 75 66  e);..    if( buf
81d0: 5b 30 5d 26 30 78 38 30 20 29 7b 0a 20 20 20 20  [0]&0x80 ){.    
81e0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 28 38 2d    for(n=0; n<(8-
81f0: 6c 65 6e 29 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  len); n++){.    
8200: 20 20 20 20 69 20 3d 20 28 69 3c 3c 38 29 2b 30      i = (i<<8)+0
8210: 78 46 46 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xFF;.      }.   
8220: 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20   }.    for(n=0; 
8230: 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20  n<len; n++){.   
8240: 20 20 20 69 20 3d 20 69 20 3c 3c 20 38 3b 0a 20     i = i << 8;. 
8250: 20 20 20 20 20 69 20 3d 20 69 20 2b 20 62 75 66       i = i + buf
8260: 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [n];.    }.    p
8270: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8280: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
8290: 69 20 3d 20 69 3b 0a 20 20 20 20 72 65 74 75 72  i = i;.    retur
82a0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  n sqlite3VdbeSer
82b0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
82c0: 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20  l_type);.  }..  
82d0: 2f 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66  /* Float */.  if
82e0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35  ( serial_type==5
82f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
8300: 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 3f 20   byte ordering? 
8310: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
8320: 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38  izeof(double)==8
8330: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
8340: 70 4d 65 6d 2d 3e 72 2c 20 62 75 66 2c 20 38 29  pMem->r, buf, 8)
8350: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
8360: 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  s = MEM_Real;.  
8370: 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 7d 0a    return 8;.  }.
8380: 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f    .  /* String o
8390: 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65  r blob */.  asse
83a0: 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  rt( serial_type>
83b0: 3d 31 32 20 29 3b 0a 20 20 69 66 28 20 73 65 72  =12 );.  if( ser
83c0: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
83d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
83e0: 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d 65   = MEM_Str;.  }e
83f0: 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  lse{.    pMem->f
8400: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  lags = MEM_Blob;
8410: 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  .  }.  len = sql
8420: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
8430: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
8440: 65 29 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20  e);.  pMem->n = 
8450: 6c 65 6e 3b 0a 20 20 69 66 28 20 6c 65 6e 3e 4e  len;.  if( len>N
8460: 42 46 53 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  BFS ){.    pMem-
8470: 3e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >z = sqliteMallo
8480: 63 52 61 77 28 20 6c 65 6e 20 29 3b 0a 20 20 20  cRaw( len );.   
8490: 20 69 66 28 20 21 70 4d 65 6d 2d 3e 7a 20 29 7b   if( !pMem->z ){
84a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
84b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
84c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 44  ->flags |= MEM_D
84d0: 79 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  yn;.  }else{.   
84e0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d   pMem->z = pMem-
84f0: 3e 7a 53 68 6f 72 74 3b 0a 20 20 20 20 70 4d 65  >zShort;.    pMe
8500: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
8510: 53 68 6f 72 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d  Short;.  }.  mem
8520: 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 62 75 66  cpy(pMem->z, buf
8530: 2c 20 6c 65 6e 29 3b 20 0a 0a 20 20 72 65 74 75  , len); ..  retu
8540: 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn len;.}../*.**
8550: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
8560: 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
8570: 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
8580: 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
8590: 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
85a0: 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
85b0: 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
85c0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
85d0: 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
85e0: 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
85f0: 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
8600: 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
8610: 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
8620: 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
8630: 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
8640: 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
8650: 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
8660: 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 20 61 6e  d by memcmp() an
8670: 64 0a 2a 2a 20 66 69 6e 61 6c 6c 79 20 62 6c 6f  d.** finally blo
8680: 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
8690: 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
86a0: 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
86b0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
86c0: 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
86d0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 63 6f 6d  tion..*/.int com
86e0: 70 61 72 65 4d 65 6d 43 65 6c 6c 73 28 4d 65 6d  pareMemCells(Mem
86f0: 20 2a 70 4d 65 6d 31 2c 20 4d 65 6d 20 2a 70 4d   *pMem1, Mem *pM
8700: 65 6d 32 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  em2){.  int rc;.
8710: 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
8720: 6c 61 67 73 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c  lags = pMem1->fl
8730: 61 67 73 7c 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  ags|pMem2->flags
8740: 3b 20 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  ; . .  /* If one
8750: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
8760: 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
8770: 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
8780: 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
8790: 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
87a0: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
87b0: 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
87c0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
87d0: 75 72 6e 20 28 70 4d 65 6d 32 2d 3e 66 6c 61 67  urn (pMem2->flag
87e0: 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 70  s&MEM_Null) - (p
87f0: 4d 65 6d 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Mem1->flags&MEM_
8800: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
8810: 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
8820: 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
8830: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
8840: 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
8850: 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
8860: 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
8870: 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
8880: 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
8890: 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
88a0: 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
88b0: 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
88c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
88d0: 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
88e0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
88f0: 7b 0a 20 20 20 20 69 66 28 20 21 28 70 4d 65 6d  {.    if( !(pMem
8900: 31 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  1->flags&(MEM_In
8910: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20 29 7b 0a  t|MEM_Real)) ){.
8920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8930: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 28      }.    if( !(
8940: 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 28 4d 45  pMem2->flags&(ME
8950: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29  M_Int|MEM_Real))
8960: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8970: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
8980: 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
8990: 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
89a0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
89b0: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
89c0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e  .        pMem1->
89d0: 72 20 3d 20 70 4d 65 6d 31 2d 3e 69 3b 0a 20 20  r = pMem1->i;.  
89e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
89f0: 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 4d 45 4d  pMem2->flags&MEM
8a00: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
8a10: 70 4d 65 6d 32 2d 3e 72 20 3d 20 70 4d 65 6d 32  pMem2->r = pMem2
8a20: 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ->i;.      }.   
8a30: 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 72 20     if( pMem1->r 
8a40: 3c 20 70 4d 65 6d 32 2d 3e 72 20 29 20 72 65 74  < pMem2->r ) ret
8a50: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
8a60: 28 20 70 4d 65 6d 31 2d 3e 72 20 3e 20 70 4d 65  ( pMem1->r > pMe
8a70: 6d 32 2d 3e 72 20 29 20 72 65 74 75 72 6e 20 31  m2->r ) return 1
8a80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
8a90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
8aa0: 75 72 6e 20 28 70 4d 65 6d 31 2d 3e 69 20 2d 20  urn (pMem1->i - 
8ab0: 70 4d 65 6d 32 2d 3e 69 29 3b 0a 20 20 7d 0a 0a  pMem2->i);.  }..
8ac0: 20 20 72 63 20 3d 20 28 70 4d 65 6d 32 2d 3e 66    rc = (pMem2->f
8ad0: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d  lags&MEM_Null) -
8ae0: 20 28 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 26 4d   (pMem1->flags&M
8af0: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  EM_Null);.  if( 
8b00: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8b10: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   rc;.  }..  /* B
8b20: 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
8b30: 62 65 20 73 74 72 69 6e 67 73 20 6f 72 20 62 6c  be strings or bl
8b40: 6f 62 73 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65  obs. If only one
8b50: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
8b60: 65 6e 0a 20 20 2a 2a 20 74 68 61 74 20 76 61 6c  en.  ** that val
8b70: 75 65 20 69 73 20 6c 65 73 73 2e 20 4f 74 68 65  ue is less. Othe
8b80: 72 77 69 73 65 2c 20 63 6f 6d 70 61 72 65 20 77  rwise, compare w
8b90: 69 74 68 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ith memcmp(). If
8ba0: 20 6d 65 6d 63 6d 70 28 29 0a 20 20 2a 2a 20 72   memcmp().  ** r
8bb0: 65 74 75 72 6e 73 20 30 20 61 6e 64 20 6f 6e 65  eturns 0 and one
8bc0: 20 76 61 6c 75 65 20 69 73 20 6c 6f 6e 67 65 72   value is longer
8bd0: 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2c   than the other,
8be0: 20 74 68 65 6e 20 74 68 61 74 20 76 61 6c 75 65   then that value
8bf0: 0a 20 20 2a 2a 20 69 73 20 67 72 65 61 74 65 72  .  ** is greater
8c00: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65  ..  */.  rc = me
8c10: 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70  mcmp(pMem1->z, p
8c20: 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d  Mem2->z, (pMem1-
8c30: 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65  >n>pMem2->n)?pMe
8c40: 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b  m2->n:pMem1->n);
8c50: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8c60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8c70: 0a 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 31  .  return (pMem1
8c80: 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 29 3b  ->n - pMem2->n);
8c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
8ca0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 63  llowing is the c
8cb0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
8cc0: 6f 6e 20 66 6f 72 20 28 6e 6f 6e 2d 69 6e 74 65  on for (non-inte
8cd0: 67 65 72 29 0a 2a 2a 20 6b 65 79 73 20 69 6e 20  ger).** keys in 
8ce0: 74 68 65 20 62 74 72 65 65 73 2e 20 20 54 68 69  the btrees.  Thi
8cf0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
8d00: 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ns negative, zer
8d10: 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76  o, or.** positiv
8d20: 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 6b  e if the first k
8d30: 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ey is less than,
8d40: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
8d50: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  eater than.** th
8d60: 65 20 73 65 63 6f 6e 64 2e 0a 2a 2a 0a 2a 2a 20  e second..**.** 
8d70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
8d80: 73 75 6d 65 73 20 74 68 61 74 20 65 61 63 68 20  sumes that each 
8d90: 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  key consists of 
8da0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 79 70 65  one or more type
8db0: 2f 62 6c 6f 62 0a 2a 2a 20 70 61 69 72 73 2c 20  /blob.** pairs, 
8dc0: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68  encoded using th
8dd0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  e sqlite3VdbeSer
8de0: 69 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ialXXX() functio
8df0: 6e 73 20 61 62 6f 76 65 2e 20 0a 2a 2a 0a 2a 2a  ns above. .**.**
8e00: 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   Following the t
8e10: 79 70 65 2f 62 6c 6f 62 20 70 61 69 72 73 2c 20  ype/blob pairs, 
8e20: 65 61 63 68 20 6b 65 79 20 6d 61 79 20 68 61 76  each key may hav
8e30: 65 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20  e a single 0x00 
8e40: 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64  byte.** followed
8e50: 20 62 79 20 61 20 76 61 72 69 6e 74 2e 20 41 20   by a varint. A 
8e60: 6b 65 79 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76  key may only hav
8e70: 65 20 74 68 69 73 20 74 72 61 6c 69 6e 67 20 30  e this traling 0
8e80: 78 30 30 2f 76 61 72 69 6e 74 0a 2a 2a 20 70 61  x00/varint.** pa
8e90: 69 72 20 69 66 20 69 74 20 68 61 73 20 61 74 20  ir if it has at 
8ea0: 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 74 79  least as many ty
8eb0: 70 65 2f 62 6c 6f 62 20 70 61 69 72 73 20 61 73  pe/blob pairs as
8ec0: 20 74 68 65 20 6b 65 79 20 69 74 20 69 73 20 62   the key it is b
8ed0: 65 69 6e 67 0a 2a 2a 20 63 6f 6d 70 61 72 65 64  eing.** compared
8ee0: 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
8ef0: 74 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61 72  te3VdbeKeyCompar
8f00: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
8f10: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
8f20: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
8f30: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
8f40: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
8f50: 4b 65 79 32 0a 29 7b 0a 20 20 43 75 72 73 6f 72  Key2.){.  Cursor
8f60: 20 2a 70 43 20 3d 20 28 43 75 72 73 6f 72 20 2a   *pC = (Cursor *
8f70: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 69 6e 74  )userData;.  int
8f80: 20 6f 66 66 73 65 74 31 20 3d 20 30 3b 0a 20 20   offset1 = 0;.  
8f90: 69 6e 74 20 6f 66 66 73 65 74 32 20 3d 20 30 3b  int offset2 = 0;
8fa0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
8fb0: 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
8fc0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
8fd0: 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
8fe0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8ff0: 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f  har *aKey2 = (co
9000: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9010: 72 20 2a 29 70 4b 65 79 32 3b 0a 20 20 0a 20 20  r *)pKey2;.  .  
9020: 77 68 69 6c 65 28 20 6f 66 66 73 65 74 31 3c 6e  while( offset1<n
9030: 4b 65 79 31 20 26 26 20 6f 66 66 73 65 74 32 3c  Key1 && offset2<
9040: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 4d 65 6d  nKey2 ){.    Mem
9050: 20 6d 65 6d 31 3b 0a 20 20 20 20 4d 65 6d 20 6d   mem1;.    Mem m
9060: 65 6d 32 3b 0a 20 20 20 20 75 36 34 20 73 65 72  em2;.    u64 ser
9070: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
9080: 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  64 serial_type2;
9090: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
90a0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
90b0: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
90c0: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
90d0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
90e0: 20 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73      offset1 += s
90f0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
9100: 26 61 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c  &aKey1[offset1],
9110: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b   &serial_type1);
9120: 0a 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d 20  .    offset2 += 
9130: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
9140: 28 26 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d  (&aKey2[offset2]
9150: 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29  , &serial_type2)
9160: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  ;..    /* If eit
9170: 68 65 72 20 6f 66 20 74 68 65 20 76 61 72 69 6e  her of the varin
9180: 74 73 20 6a 75 73 74 20 72 65 61 64 20 69 6e 20  ts just read in 
9190: 61 72 65 20 30 20 28 6e 6f 74 20 61 20 74 79 70  are 0 (not a typ
91a0: 65 29 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  e), then.    ** 
91b0: 74 68 69 73 20 69 73 20 74 68 65 20 65 6e 64 20  this is the end 
91c0: 6f 66 20 74 68 65 20 6b 65 79 73 2e 20 54 68 65  of the keys. The
91d0: 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 20   remaining data 
91e0: 69 6e 20 65 61 63 68 20 6b 65 79 20 69 73 0a 20  in each key is. 
91f0: 20 20 20 2a 2a 20 74 68 65 20 76 61 72 69 6e 74     ** the varint
9200: 20 72 6f 77 69 64 2e 20 43 6f 6d 70 61 72 65 20   rowid. Compare 
9210: 74 68 65 73 65 20 61 73 20 73 69 67 6e 65 64 20  these as signed 
9220: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 72 65 74  integers and ret
9230: 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  urn.    ** the r
9240: 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
9250: 20 20 69 66 28 20 21 73 65 72 69 61 6c 5f 74 79    if( !serial_ty
9260: 70 65 31 20 7c 7c 20 21 73 65 72 69 61 6c 5f 74  pe1 || !serial_t
9270: 79 70 65 32 20 29 7b 0a 20 20 20 20 20 20 61 73  ype2 ){.      as
9280: 73 65 72 74 28 20 21 73 65 72 69 61 6c 5f 74 79  sert( !serial_ty
9290: 70 65 31 20 26 26 20 21 73 65 72 69 61 6c 5f 74  pe1 && !serial_t
92a0: 79 70 65 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ype2 );.      as
92b0: 73 65 72 74 28 20 21 70 43 20 7c 7c 20 21 70 43  sert( !pC || !pC
92c0: 2d 3e 69 6e 63 72 4b 65 79 20 29 3b 0a 20 20 20  ->incrKey );.   
92d0: 20 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72     sqlite3GetVar
92e0: 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65  int(&aKey1[offse
92f0: 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  t1], &serial_typ
9300: 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
9310: 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65  e3GetVarint(&aKe
9320: 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20 26 73 65  y2[offset2], &se
9330: 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 20 20  rial_type2);.   
9340: 20 20 20 72 65 74 75 72 6e 20 28 20 28 69 36 34     return ( (i64
9350: 29 73 65 72 69 61 6c 5f 74 79 70 65 31 20 2d 20  )serial_type1 - 
9360: 28 69 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65  (i64)serial_type
9370: 32 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  2 );.    }..    
9380: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
9390: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
93a0: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61 63  pace left in eac
93b0: 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62 6c  h key for the bl
93c0: 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74  ob of.    ** dat
93d0: 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68 65  a to go with the
93e0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75 73   serial type jus
93f0: 74 20 72 65 61 64 2e 20 54 68 69 73 20 61 73 73  t read. This ass
9400: 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66 0a  ert may fail if.
9410: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
9420: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  is corrupted.  T
9430: 68 65 6e 20 72 65 61 64 20 74 68 65 20 76 61 6c  hen read the val
9440: 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65 79  ue from each key
9450: 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a   into mem1.    *
9460: 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70 65  * and mem2 respe
9470: 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ctively..    */.
9480: 20 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73      offset1 += s
9490: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
94a0: 47 65 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65  Get(&aKey1[offse
94b0: 74 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  t1], serial_type
94c0: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 6f  1, &mem1);.    o
94d0: 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65  ffset2 += sqlite
94e0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
94f0: 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20  aKey2[offset2], 
9500: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
9510: 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  em2);..    rc = 
9520: 63 6f 6d 70 61 72 65 4d 65 6d 43 65 6c 6c 73 28  compareMemCells(
9530: 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 29 3b 0a 20  &mem1, &mem2);. 
9540: 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67     if( mem1.flag
9550: 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  s&MEM_Dyn ){.   
9560: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65     sqliteFree(me
9570: 6d 31 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m1.z);.    }.   
9580: 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 26   if( mem2.flags&
9590: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
95a0: 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d 32   sqliteFree(mem2
95b0: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  .z);.    }.    i
95c0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
95d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
95e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65   }.  }..  /* One
95f0: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
9600: 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
9610: 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
9620: 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
9630: 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
9640: 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
9650: 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
9660: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
9670: 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
9680: 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
9690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 20 26  .  */.  if( pC &
96a0: 26 20 70 43 2d 3e 69 6e 63 72 4b 65 79 20 29 7b  & pC->incrKey ){
96b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66  .    assert( off
96c0: 73 65 74 32 3d 3d 6e 4b 65 79 32 20 29 3b 0a 20  set2==nKey2 );. 
96d0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
96e0: 7d 0a 0a 20 20 69 66 28 20 6f 66 66 73 65 74 31  }..  if( offset1
96f0: 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 72 65  <nKey1 ){.    re
9700: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9710: 28 20 6f 66 66 73 65 74 32 3c 6e 4b 65 79 32 20  ( offset2<nKey2 
9720: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
9730: 3b 0a 20 20 7d 0a 0a 72 65 74 75 72 6e 5f 72 65  ;.  }..return_re
9740: 73 75 6c 74 3a 0a 0a 20 20 72 65 74 75 72 6e 20  sult:..  return 
9750: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  0;.}../*.** pCur
9760: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
9770: 64 65 78 20 65 6e 74 72 79 2e 20 52 65 61 64 20  dex entry. Read 
9780: 74 68 65 20 72 6f 77 69 64 20 28 76 61 72 69 6e  the rowid (varin
9790: 74 20 6f 63 63 75 72 69 6e 67 20 61 74 0a 2a 2a  t occuring at.**
97a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
97b0: 65 6e 74 72 79 20 61 6e 64 20 73 74 6f 72 65 20  entry and store 
97c0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 20 52 65  it in *rowid. Re
97d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
97e0: 66 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20  f.** everything 
97f0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
9800: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
9810: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
9820: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
9830: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
9840: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
9850: 20 73 7a 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   sz;.  int rc;. 
9860: 20 63 68 61 72 20 62 75 66 5b 31 30 5d 3b 0a 20   char buf[10];. 
9870: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 75 36 34 20   int len;.  u64 
9880: 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r;..  rc = sqlit
9890: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
98a0: 43 75 72 2c 20 26 73 7a 29 3b 0a 20 20 69 66 28  Cur, &sz);.  if(
98b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
98c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
98d0: 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20 28 28 73  .  }.  len = ((s
98e0: 7a 3e 31 30 29 3f 31 30 3a 73 7a 29 3b 0a 0a 20  z>10)?10:sz);.. 
98f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
9900: 20 6c 65 73 73 20 74 68 61 6e 20 32 20 62 79 74   less than 2 byt
9910: 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2c 20 74  es in the key, t
9920: 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  his cannot be.  
9930: 2a 2a 20 61 20 76 61 6c 69 64 20 69 6e 64 65 78  ** a valid index
9940: 20 65 6e 74 72 79 2e 20 49 6e 20 70 72 61 63 74   entry. In pract
9950: 69 63 65 20 74 68 69 73 20 63 6f 6d 65 73 20 75  ice this comes u
9960: 70 20 66 6f 72 20 61 20 71 75 65 72 79 0a 20 20  p for a query.  
9970: 2a 2a 20 6f 66 20 74 68 65 20 73 6f 72 74 20 22  ** of the sort "
9980: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
9990: 4f 4d 20 74 31 3b 22 20 77 68 65 6e 20 74 31 20  OM t1;" when t1 
99a0: 69 73 20 61 6e 20 65 6d 70 74 79 20 74 61 62 6c  is an empty tabl
99b0: 65 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 69  e.  ** with an i
99c0: 6e 64 65 78 20 6f 6e 20 78 2e 20 49 6e 20 74 68  ndex on x. In th
99d0: 69 73 20 63 61 73 65 20 6a 75 73 74 20 63 61 6c  is case just cal
99e0: 6c 20 74 68 65 20 72 6f 77 69 64 20 30 2e 0a 20  l the rowid 0.. 
99f0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e 3c 32 20   */.  if( len<2 
9a00: 29 7b 0a 20 20 20 20 2a 72 6f 77 69 64 20 3d 20  ){.    *rowid = 
9a10: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
9a20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
9a30: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
9a40: 65 4b 65 79 28 70 43 75 72 2c 20 73 7a 2d 6c 65  eKey(pCur, sz-le
9a50: 6e 2c 20 6c 65 6e 2c 20 62 75 66 29 3b 0a 20 20  n, len, buf);.  
9a60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9a70: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
9a80: 72 63 3b 0a 20 20 7d 0a 0a 20 20 6c 65 6e 2d 2d  rc;.  }..  len--
9a90: 3b 0a 20 20 77 68 69 6c 65 28 20 62 75 66 5b 6c  ;.  while( buf[l
9aa0: 65 6e 2d 31 5d 20 26 26 20 2d 2d 6c 65 6e 20 29  en-1] && --len )
9ab0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  ;..  sqlite3GetV
9ac0: 61 72 69 6e 74 28 26 62 75 66 5b 6c 65 6e 5d 2c  arint(&buf[len],
9ad0: 20 26 72 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &r);.  *rowid =
9ae0: 20 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   r;.  return SQL
9af0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
9b00: 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
9b10: 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
9b20: 72 20 2a 70 43 2c 20 0a 20 20 69 6e 74 20 6e 4b  r *pC, .  int nK
9b30: 65 79 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ey, const unsign
9b40: 65 64 20 63 68 61 72 20 2a 70 4b 65 79 2c 0a 20  ed char *pKey,. 
9b50: 20 69 6e 74 20 69 67 6e 6f 72 65 72 6f 77 69 64   int ignorerowid
9b60: 2c 0a 20 20 69 6e 74 20 2a 72 65 73 0a 29 7b 0a  ,.  int *res.){.
9b70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9b80: 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 75 36 34  *pCellKey;.  u64
9b90: 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74   nCellKey;.  int
9ba0: 20 66 72 65 65 43 65 6c 6c 4b 65 79 20 3d 20 30   freeCellKey = 0
9bb0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
9bc0: 74 20 6c 65 6e 3b 0a 20 20 42 74 43 75 72 73 6f  t len;.  BtCurso
9bd0: 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
9be0: 75 72 73 6f 72 3b 0a 0a 20 20 73 71 6c 69 74 65  ursor;..  sqlite
9bf0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
9c00: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
9c10: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
9c20: 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
9c30: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
9c40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
9c50: 70 43 65 6c 6c 4b 65 79 20 3d 20 28 75 6e 73 69  pCellKey = (unsi
9c60: 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
9c70: 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
9c80: 28 70 43 75 72 2c 20 6e 43 65 6c 6c 4b 65 79 29  (pCur, nCellKey)
9c90: 3b 0a 20 20 69 66 28 20 21 70 43 65 6c 6c 4b 65  ;.  if( !pCellKe
9ca0: 79 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 4b 65  y ){.    pCellKe
9cb0: 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  y = (unsigned ch
9cc0: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
9cd0: 63 52 61 77 28 6e 43 65 6c 6c 4b 65 79 29 3b 0a  cRaw(nCellKey);.
9ce0: 20 20 20 20 69 66 28 20 21 70 43 65 6c 6c 4b 65      if( !pCellKe
9cf0: 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
9d00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9d10: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 65      }.    freeCe
9d20: 6c 6c 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 72  llKey = 1;.    r
9d30: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9d40: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
9d50: 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 29  llKey, pCellKey)
9d60: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
9d70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9d80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
9d90: 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  lKey);.      ret
9da0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
9db0: 7d 0a 20 0a 20 20 6c 65 6e 20 3d 20 6e 43 65 6c  }. .  len = nCel
9dc0: 6c 4b 65 79 2d 32 3b 0a 20 20 77 68 69 6c 65 28  lKey-2;.  while(
9dd0: 20 70 43 65 6c 6c 4b 65 79 5b 6c 65 6e 5d 20 26   pCellKey[len] &
9de0: 26 20 2d 2d 6c 65 6e 20 29 3b 0a 0a 20 20 69 66  & --len );..  if
9df0: 28 20 69 67 6e 6f 72 65 72 6f 77 69 64 20 29 7b  ( ignorerowid ){
9e00: 0a 20 20 20 20 6e 4b 65 79 2d 2d 3b 0a 20 20 20  .    nKey--;.   
9e10: 20 77 68 69 6c 65 28 20 70 4b 65 79 5b 6e 4b 65   while( pKey[nKe
9e20: 79 5d 20 26 26 20 2d 2d 6e 4b 65 79 20 29 3b 0a  y] && --nKey );.
9e30: 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
9e40: 69 74 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61  ite3VdbeKeyCompa
9e50: 72 65 28 70 43 2c 20 6c 65 6e 2c 20 70 43 65 6c  re(pC, len, pCel
9e60: 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
9e70: 29 3b 0a 20 20 0a 20 20 69 66 28 20 66 72 65 65  );.  .  if( free
9e80: 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 73  CellKey ){.    s
9e90: 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b  qliteFree(pCellK
9ea0: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
9eb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.