/ Hex Artifact Content
Login

Artifact b770802151f30589bd063f434174d230aa043406:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 5f 76 6d 22 20 61 73 20 69  "sqlite_vm" as i
01e0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  t is known to th
01f0: 65 20 6f 75 74 73 69 64 65 20 77 6f 72 6c 64 2e  e outside world.
0200: 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 6f 20 76  )  Prior.** to v
0210: 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c 20 61 6c  ersion 2.8.7, al
0220: 6c 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  l this code was 
0230: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0240: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
0250: 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 74 68 61  file..** But tha
0260: 74 20 66 69 6c 65 20 77 61 73 20 67 65 74 74 69  t file was getti
0270: 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f 20 74 68  ng too big so th
0280: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  is subroutines w
0290: 65 72 65 20 73 70 6c 69 74 20 6f 75 74 2e 0a 2a  ere split out..*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
02e0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65  .../*.** When de
0300: 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65  bugging the code
0310: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20   generator in a 
0320: 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65  symbolic debugge
0330: 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65  r, one can.** se
0340: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 64  t the sqlite3_vd
0350: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 74  be_addop_trace t
0360: 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f  o 1 and all opco
0370: 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e  des will be prin
0380: 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61  ted.** as they a
0390: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
03a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65  instruction stre
03b0: 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  am..*/.#ifndef N
03c0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
03d0: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
03e0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0400: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
0410: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0420: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0430: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 20 2a  eCreate(sqlite *
0440: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
0450: 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c    p = sqliteMall
0460: 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29  oc( sizeof(Vdbe)
0470: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
0480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
0490: 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64  db = db;.  if( d
04a0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
04b0: 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76  db->pVdbe->pPrev
04c0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70   = p;.  }.  p->p
04d0: 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65  Next = db->pVdbe
04e0: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
04f0: 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20  ;.  db->pVdbe = 
0500: 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  p;.  p->magic = 
0510: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
0520: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0530: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69  /*.** Turn traci
0540: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a  ng on or off.*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46  Trace(Vdbe *p, F
0570: 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70  ILE *trace){.  p
0580: 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b  ->trace = trace;
0590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
05a0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
05b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
05c0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
05d0: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
05e0: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
05f0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0600: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0610: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0630: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0640: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0650: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0660: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0670: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0680: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0690: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
06a0: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
06b0: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
06c0: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
06d0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
06e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
06f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0700: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0710: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0720: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0730: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0740: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0750: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0770: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0780: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0790: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
07a0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
07b0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
07c0: 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20  p;.  p->nOp++;. 
07d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
07e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
07f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
0800: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20  ->nOpAlloc ){.  
0810: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0820: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
0830: 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70   Op *aNew;.    p
0840: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
0850: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30  nOpAlloc*2 + 100
0860: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
0870: 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f  iteRealloc(p->aO
0880: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73  p, p->nOpAlloc*s
0890: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
08a0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
08b0: 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63       p->nOpAlloc
08c0: 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20   = oldSize;.    
08d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
08e0: 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61  }.    p->aOp = a
08f0: 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  New;.    memset(
0900: 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d  &p->aOp[oldSize]
0910: 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  , 0, (p->nOpAllo
0920: 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f  c-oldSize)*sizeo
0930: 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 70 4f  f(Op));.  }.  pO
0940: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
0950: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
0960: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  op;.  pOp->p1 = 
0970: 70 31 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26  p1;.  if( p2<0 &
0980: 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61  & (-1-p2)<p->nLa
0990: 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  bel && p->aLabel
09a0: 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20  [-1-p2]>=0 ){.  
09b0: 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c    p2 = p->aLabel
09c0: 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70  [-1-p2];.  }.  p
09d0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
09e0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f  Op->p3 = 0;.  pO
09f0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
0a00: 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20  OTUSED;.#ifndef 
0a10: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
0a20: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
0a30: 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56  trace ) sqlite3V
0a40: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0a50: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65   &p->aOp[i]);.#e
0a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
0a80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
0a90: 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c  ludes the p3 val
0aa0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0ab0: 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a  e3VdbeOp3(Vdbe *
0ac0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0ad0: 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74  1, int p2, const
0ae0: 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20   char *zP3, int 
0af0: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
0b00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
0b10: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
0b20: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
0b30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
0b40: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
0b50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
0b60: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
0b70: 6d 75 6c 74 69 70 6c 65 20 6f 70 63 6f 64 65 73  multiple opcodes
0b80: 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
0b90: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
0ba0: 6f 70 63 6f 64 65 20 6f 66 20 30 2e 0a 2a 2f 0a  opcode of 0..*/.
0bb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
0bc0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 2e 2e 2e  ode(Vdbe *p, ...
0bd0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
0be0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
0bf0: 6e 74 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 70  nt opcode, p1, p
0c00: 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
0c10: 2c 20 70 29 3b 0a 20 20 61 64 64 72 20 3d 20 70  , p);.  addr = p
0c20: 2d 3e 6e 4f 70 3b 0a 20 20 77 68 69 6c 65 28 20  ->nOp;.  while( 
0c30: 28 6f 70 63 6f 64 65 20 3d 20 76 61 5f 61 72 67  (opcode = va_arg
0c40: 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 7b 0a  (ap,int))!=0 ){.
0c50: 20 20 20 20 70 31 20 3d 20 76 61 5f 61 72 67 28      p1 = va_arg(
0c60: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 70 32 20  ap,int);.    p2 
0c70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
0c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0c90: 65 41 64 64 4f 70 28 70 2c 20 6f 70 63 6f 64 65  eAddOp(p, opcode
0ca0: 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 7d 0a 20  , p1, p2);.  }. 
0cb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
0cc0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 0a  eturn addr;.}...
0cd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0ce0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
0cf0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
0d00: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
0d10: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
0d20: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
0d30: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
0d40: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
0d50: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
0d60: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
0d70: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
0d80: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
0d90: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
0da0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
0db0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
0dc0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
0dd0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
0de0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
0df0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
0e00: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
0e10: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
0e20: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
0e30: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
0e40: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
0e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
0e60: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
0e70: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0e80: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
0e90: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
0ea0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
0eb0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
0ec0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
0ed0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
0ee0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
0ef0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
0f00: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
0f10: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69  e resolved..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
0f30: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
0f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
0f50: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
0f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0f80: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
0f90: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
0fa0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
0fb0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fc0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fd0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 61  oc*2 + 10;.    a
0fe0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0ff0: 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65 6c 2c 20  loc( p->aLabel, 
1000: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
1010: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1020: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
1030: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
1040: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
1050: 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bel);.    }.    
1060: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 61 4e 65 77  p->aLabel = aNew
1070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
1080: 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Label==0 ){.    
1090: 70 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  p->nLabel = 0;. 
10a0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
10b0: 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  c = 0;.    retur
10c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c  n 0;.  }.  p->aL
10d0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
10e0: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
10f0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1100: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1110: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1120: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1130: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1140: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1150: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1160: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1170: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1180: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1190: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
11a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
11d0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
11e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
11f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1200: 0a 20 20 69 66 28 20 78 3c 30 20 26 26 20 28 2d  .  if( x<0 && (-
1210: 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65 6c 20 26 26  x)<=p->nLabel &&
1220: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 69   p->aOp ){.    i
1230: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d  f( p->aLabel[-1-
1240: 78 5d 3d 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74  x]==p->nOp ) ret
1250: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
1260: 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d   p->aLabel[-1-x]
1270: 3c 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4c 61  <0 );.    p->aLa
1280: 62 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e  bel[-1-x] = p->n
1290: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  Op;.    for(j=0;
12a0: 20 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b   j<p->nOp; j++){
12b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  .      if( p->aO
12c0: 70 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e  p[j].p2==x ) p->
12d0: 61 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e  aOp[j].p2 = p->n
12e0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Op;.    }.  }.}.
12f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1300: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1310: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1320: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
1330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1350: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
1360: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1370: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1380: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
13a0: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
13b0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
13c0: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
13d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
13e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
13f0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
1400: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
1410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
1420: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
1430: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
1440: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
1450: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
1460: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1470: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1480: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
1490: 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  Op >= p->nOpAllo
14a0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
14b0: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
14c0: 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77  oc;.    Op *aNew
14d0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
14e0: 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c = p->nOpAlloc*
14f0: 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20  2 + nOp + 10;.  
1500: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
1510: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70  ealloc(p->aOp, p
1520: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
1530: 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  f(Op));.    if( 
1540: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
1550: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f   p->nOpAlloc = o
1560: 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 65  ldSize;.      re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1580: 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b    p->aOp = aNew;
1590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  .    memset(&p->
15a0: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
15b0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
15c0: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
15d0: 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  ));.  }.  addr =
15e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
15f0: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
1600: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
1610: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
1620: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
1630: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
1640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
1650: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
1660: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
1670: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
1680: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
1690: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
16a0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
16b0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
16c0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
16d0: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
16e0: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
16f0: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
1700: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
1710: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
1720: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
1730: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
1740: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
1760: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
1770: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1780: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1790: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
17a0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
17b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
17c0: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
17d0: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
17e0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
17f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1800: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
1810: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1820: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1840: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1850: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1860: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1870: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1880: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1890: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
18a0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
18b0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
18c0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
18d0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
18e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
18f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1900: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1910: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1920: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1930: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
1940: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
1950: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
1960: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
1970: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
1980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
1990: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
19a0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
19b0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
19c0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
19d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
19e0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
19f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
1a00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1a10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
1a20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1a30: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1a40: 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b  ssert( val>=0 );
1a50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1a60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1a70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
1a80: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
1a90: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
1aa0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
1ab0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
1ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1ad0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1ae0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
1af0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b20: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1b30: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1b40: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1b50: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1b60: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1b70: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
1b80: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
1b90: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
1ba0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
1bb0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
1bc0: 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70  0 then the P3 op
1bd0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
1be0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
1bf0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
1c00: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
1c10: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1c20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1c30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
1c40: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
1c50: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
1c60: 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP3 up to and in
1c70: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
1c80: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
1c90: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
1ca0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
1cb0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P3..**.** If n==
1cc0: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
1cd0: 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20  ans that zP3 is 
1ce0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
1cf0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
1d00: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
1d10: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
1d20: 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e 3d 3d 50  e pointer.  n==P
1d30: 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61 6e 73 20  3_POINTER means 
1d40: 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e  zP3 is.** a poin
1d50: 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f 62 6a 65  ter to some obje
1d60: 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ct other than a 
1d70: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  string..**.** If
1d80: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
1d90: 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f  nge P3 on the mo
1da0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
1db0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
1dc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dd0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
1de0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33   const char *zP3
1e00: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
1e10: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
1e20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1e30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1e40: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  ( p==0 || p->aOp
1e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e60: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
1e70: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
1e80: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
1e90: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
1ea0: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
1eb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
1ec0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70  p[addr];.  if( p
1ed0: 4f 70 2d 3e 70 33 20 26 26 20 70 4f 70 2d 3e 70  Op->p3 && pOp->p
1ee0: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49  3type==P3_DYNAMI
1ef0: 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  C ){.    sqliteF
1f00: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  ree(pOp->p3);.  
1f10: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
1f20: 20 7d 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20   }.  if( zP3==0 
1f30: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
1f40: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74   0;.    pOp->p3t
1f50: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
1f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
1f70: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
1f80: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
1f90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
1fa0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   n;.  }else{.   
1fb0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
1fc0: 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50 33  ng(&pOp->p3, zP3
1fd0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f 70  , n, 0);.    pOp
1fe0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
1ff0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
2000: 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70  .** If the P3 op
2010: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65  erand to the spe
2020: 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69  cified instructi
2030: 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f  on appears.** to
2040: 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72   be a quoted str
2050: 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  ing token, then 
2060: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  this procedure r
2070: 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71  emoves .** the q
2080: 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uotes..**.** The
2090: 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f   quoting operato
20a0: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
20b0: 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28  a grave ascent (
20c0: 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f  ASCII 0x27).** o
20d0: 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  r a double quote
20e0: 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49   character (ASCI
20f0: 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75  I 0x22).  Two qu
2100: 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a  otes in a row.**
2110: 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61   resolve to be a
2120: 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71   single actual q
2130: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
2140: 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67  ithin the string
2150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2160: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  3VdbeDequoteP3(V
2170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2180: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
2190: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
21a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
21b0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
21c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
21d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
21e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
21f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
2200: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
2210: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
2220: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
2230: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20  Op[addr];.  if( 
2240: 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
2250: 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65  p->p3[0]==0 ) re
2260: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d  turn;.  if( pOp-
2270: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
2280: 54 45 52 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  TER ) return;.  
2290: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21  if( pOp->p3type!
22a0: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
22b0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c     pOp->p3 = sql
22c0: 69 74 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70  iteStrDup(pOp->p
22d0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  3);.    pOp->p3t
22e0: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
22f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
2300: 65 71 75 6f 74 65 28 70 4f 70 2d 3e 70 33 29 3b  equote(pOp->p3);
2310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65  .}../*.** On the
2320: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P3 argument of 
2330: 74 68 65 20 67 69 76 65 6e 20 69 6e 73 74 72 75  the given instru
2340: 63 74 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61 6c  ction, change al
2350: 6c 0a 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66 20  l.** strings of 
2360: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
2370: 63 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  cters into a sin
2380: 67 6c 65 20 73 70 61 63 65 20 61 6e 64 0a 2a 2a  gle space and.**
2390: 20 64 65 6c 65 74 65 20 6c 65 61 64 69 6e 67 20   delete leading 
23a0: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
23b0: 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64  tespace..*/.void
23c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
23d0: 72 65 73 73 53 70 61 63 65 28 56 64 62 65 20 2a  ressSpace(Vdbe *
23e0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2400: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2410: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
2420: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2430: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2440: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2450: 7c 7c 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  || addr<0 || add
2460: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75  r>=p->nOp ) retu
2470: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
2480: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
2490: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
24a0: 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
24b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
24c0: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21 3d 50  ( pOp->p3type!=P
24d0: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
24e0: 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74   pOp->p3 = sqlit
24f0: 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29  eStrDup(pOp->p3)
2500: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2510: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
2520: 20 20 7d 0a 20 20 7a 20 3d 20 28 75 6e 73 69 67    }.  z = (unsig
2530: 6e 65 64 20 63 68 61 72 2a 29 70 4f 70 2d 3e 70  ned char*)pOp->p
2540: 33 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  3;.  if( z==0 ) 
2550: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 6a 20  return;.  i = j 
2560: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
2570: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
2580: 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ++; }.  while( z
2590: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 69  [i] ){.    if( i
25a0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
25b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
25c0: 20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ';.      while(
25d0: 20 69 73 73 70 61 63 65 28 7a 5b 2b 2b 69 5d 29   isspace(z[++i])
25e0: 20 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ){}.    }else{.
25f0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
2600: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2610: 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26  .  while( j>0 &&
2620: 20 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   isspace(z[j-1])
2630: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a   ){ j--; }.  z[j
2640: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2650: 53 65 61 72 63 68 20 74 68 65 20 63 75 72 72 65  Search the curre
2660: 6e 74 20 70 72 6f 67 72 61 6d 20 73 74 61 72 74  nt program start
2670: 69 6e 67 20 61 74 20 69 6e 73 74 72 75 63 74 69  ing at instructi
2680: 6f 6e 20 61 64 64 72 20 66 6f 72 20 74 68 65 20  on addr for the 
2690: 67 69 76 65 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  given.** opcode 
26a0: 61 6e 64 20 50 32 20 76 61 6c 75 65 2e 20 20 52  and P2 value.  R
26b0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
26c0: 73 20 70 6c 75 73 20 31 20 69 66 20 66 6f 75 6e  s plus 1 if foun
26d0: 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 0a 2a  d and 0 if not.*
26e0: 2a 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  * found..*/.int 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 4f  sqlite3VdbeFindO
2700: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
2710: 64 64 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ddr, int op, int
2720: 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p2){.  int i;. 
2730: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
2740: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2750: 49 54 20 29 3b 0a 20 20 66 6f 72 28 69 3d 61 64  IT );.  for(i=ad
2760: 64 72 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  dr; i<p->nOp; i+
2770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
2780: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op[i].opcode==op
2790: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32   && p->aOp[i].p2
27a0: 3d 3d 70 32 20 29 20 72 65 74 75 72 6e 20 69 2b  ==p2 ) return i+
27b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
27c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
27d0: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
27e0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
27f0: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
2800: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
2810: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2820: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
2830: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2840: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
2850: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
2860: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
2870: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
2880: 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ddr];.}../*.** T
2890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
28a0: 75 70 20 6f 72 20 72 6f 75 74 69 6e 65 73 20 61  up or routines a
28b0: 72 65 20 65 6d 70 6c 6f 79 65 64 20 62 79 20 69  re employed by i
28c0: 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63 74  nstallable funct
28d0: 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 75 72  ions.** to retur
28e0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 73 2e  n their results.
28f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
2900: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  e3_set_result_st
2910: 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 20 63  ring() routine c
2920: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  an be used to re
2930: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 0a 2a 2a  turn a string.**
2940: 20 76 61 6c 75 65 20 6f 72 20 74 6f 20 72 65 74   value or to ret
2950: 75 72 6e 20 61 20 4e 55 4c 4c 2e 20 20 54 6f 20  urn a NULL.  To 
2960: 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2c 20 70  return a NULL, p
2970: 61 73 73 20 69 6e 20 4e 55 4c 4c 20 66 6f 72 20  ass in NULL for 
2980: 7a 52 65 73 75 6c 74 2e 0a 2a 2a 20 41 20 63 6f  zResult..** A co
2990: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
29a0: 65 20 73 74 72 69 6e 67 20 62 65 66 6f 72 65 20  e string before 
29b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29c0: 75 72 6e 73 20 73 6f 20 69 74 20 69 73 20 73 61  urns so it is sa
29d0: 66 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20 69 6e  fe.** to pass in
29e0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74   an ephemeral st
29f0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ring..**.** sqli
2a00: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
2a10: 72 72 6f 72 28 29 20 77 6f 72 6b 73 20 6c 69 6b  rror() works lik
2a20: 65 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  e sqlite3_set_re
2a30: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 65 78  sult_string() ex
2a40: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
2a50: 73 69 67 6e 61 6c 73 20 61 20 66 61 74 61 6c 20  signals a fatal 
2a60: 65 72 72 6f 72 2e 20 20 54 68 65 20 73 74 72 69  error.  The stri
2a70: 6e 67 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  ng argument, if 
2a80: 61 6e 79 2c 20 69 73 20 74 68 65 0a 2a 2a 20 65  any, is the.** e
2a90: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49  rror message.  I
2aa0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
2ab0: 73 20 4e 55 4c 4c 20 61 20 67 65 6e 65 72 69 63  s NULL a generic
2ac0: 20 73 75 62 73 74 69 74 75 74 65 20 65 72 72 6f   substitute erro
2ad0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2ae0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
2af0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
2b00: 6c 74 5f 69 6e 74 28 29 20 61 6e 64 20 73 71 6c  lt_int() and sql
2b10: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2b20: 64 6f 75 62 6c 65 28 29 20 73 65 74 20 74 68 65  double() set the
2b30: 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
2b40: 20 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e   of the user fun
2b50: 63 74 69 6f 6e 20 74 6f 20 61 6e 20 69 6e 74 65  ction to an inte
2b60: 67 65 72 20 6f 72 20 61 20 64 6f 75 62 6c 65 2e  ger or a double.
2b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
2b80: 74 69 6e 65 73 20 61 72 65 20 64 65 66 69 6e 65  tines are define
2b90: 64 20 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63  d here in vdbe.c
2ba0: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 64 65   because they de
2bb0: 70 65 6e 64 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a  pend on knowing.
2bc0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73  ** the internals
2bd0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 66   of the sqlite_f
2be0: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 68  unc structure wh
2bf0: 69 63 68 20 69 73 20 6f 6e 6c 79 20 64 65 66 69  ich is only defi
2c00: 6e 65 64 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20  ned in .** this 
2c10: 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a  source file..*/.
2c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 65  char *sqlite3_se
2c30: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
2c40: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20  sqlite_func *p, 
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 73  const char *zRes
2c60: 75 6c 74 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61  ult, int n){.  a
2c70: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2c80: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2c90: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2ca0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2cb0: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2cc0: 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20   if( zResult==0 
2cd0: 29 7b 0a 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67  ){.    p->s.flag
2ce0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2cf0: 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e    n = 0;.    p->
2d00: 73 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  s.z = 0;.    p->
2d10: 73 2e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  s.n = 0;.  }else
2d20: 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  {.    if( n<0 ) 
2d30: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75  n = strlen(zResu
2d40: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 4e  lt);.    if( n<N
2d50: 42 46 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  BFS-1 ){.      m
2d60: 65 6d 63 70 79 28 70 2d 3e 73 2e 7a 53 68 6f 72  emcpy(p->s.zShor
2d70: 74 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a  t, zResult, n);.
2d80: 20 20 20 20 20 20 70 2d 3e 73 2e 7a 53 68 6f 72        p->s.zShor
2d90: 74 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[n] = 0;.      
2da0: 70 2d 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  p->s.flags = MEM
2db0: 5f 53 74 72 20 7c 20 4d 45 4d 5f 53 68 6f 72 74  _Str | MEM_Short
2dc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d  ;.      p->s.z =
2dd0: 20 70 2d 3e 73 2e 7a 53 68 6f 72 74 3b 0a 20 20   p->s.zShort;.  
2de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2df0: 2d 3e 73 2e 7a 20 3d 20 73 71 6c 69 74 65 4d 61  ->s.z = sqliteMa
2e00: 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a  llocRaw( n+1 );.
2e10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 2e 7a        if( p->s.z
2e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2e30: 70 79 28 70 2d 3e 73 2e 7a 2c 20 7a 52 65 73 75  py(p->s.z, zResu
2e40: 6c 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  lt, n);.        
2e50: 70 2d 3e 73 2e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20  p->s.z[n] = 0;. 
2e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
2e70: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  s.flags = MEM_St
2e80: 72 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  r | MEM_Dyn;.   
2e90: 20 7d 0a 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20   }.    p->s.n = 
2ea0: 6e 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n+1;.  }.  retur
2eb0: 6e 20 70 2d 3e 73 2e 7a 3b 0a 7d 0a 76 6f 69 64  n p->s.z;.}.void
2ec0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
2ed0: 75 6c 74 5f 69 6e 74 28 73 71 6c 69 74 65 5f 66  ult_int(sqlite_f
2ee0: 75 6e 63 20 2a 70 2c 20 69 6e 74 20 69 52 65 73  unc *p, int iRes
2ef0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2f00: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2f10: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2f20: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2f30: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
2f40: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 69  z);.  }.  p->s.i
2f50: 20 3d 20 69 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = iResult;.  p-
2f60: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  >s.flags = MEM_I
2f70: 6e 74 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  nt;.}.void sqlit
2f80: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f  e3_set_result_do
2f90: 75 62 6c 65 28 73 71 6c 69 74 65 5f 66 75 6e 63  uble(sqlite_func
2fa0: 20 2a 70 2c 20 64 6f 75 62 6c 65 20 72 52 65 73   *p, double rRes
2fb0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2fc0: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2fd0: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2fe0: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2ff0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
3000: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 72  z);.  }.  p->s.r
3010: 20 3d 20 72 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = rResult;.  p-
3020: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  >s.flags = MEM_R
3030: 65 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  eal;.}.void sqli
3040: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
3050: 72 72 6f 72 28 73 71 6c 69 74 65 5f 66 75 6e 63  rror(sqlite_func
3060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3070: 2a 7a 4d 73 67 2c 20 69 6e 74 20 6e 29 7b 0a 20  *zMsg, int n){. 
3080: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53   assert( !p->isS
3090: 74 65 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  tep );.  sqlite3
30a0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
30b0: 6e 67 28 70 2c 20 7a 4d 73 67 2c 20 6e 29 3b 0a  ng(p, zMsg, n);.
30c0: 20 20 70 2d 3e 69 73 45 72 72 6f 72 20 3d 20 31    p->isError = 1
30d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  ;.}../*.** Extra
30e0: 63 74 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ct the user data
30f0: 20 66 72 6f 6d 20 61 20 73 71 6c 69 74 65 5f 66   from a sqlite_f
3100: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 61 6e  unc structure an
3110: 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
3120: 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 2a 2f 0a  inter to it..*/.
3130: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 73  void *sqlite3_us
3140: 65 72 5f 64 61 74 61 28 73 71 6c 69 74 65 5f 66  er_data(sqlite_f
3150: 75 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  unc *p){.  asser
3160: 74 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63  t( p && p->pFunc
3170: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
3180: 70 46 75 6e 63 2d 3e 70 55 73 65 72 44 61 74 61  pFunc->pUserData
3190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
31a0: 61 74 65 20 6f 72 20 72 65 74 75 72 6e 20 74 68  ate or return th
31b0: 65 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  e aggregate cont
31c0: 65 78 74 20 66 6f 72 20 61 20 75 73 65 72 20 66  ext for a user f
31d0: 75 6e 63 74 69 6f 6e 2e 20 20 41 20 6e 65 77 0a  unction.  A new.
31e0: 2a 2a 20 63 6f 6e 74 65 78 74 20 69 73 20 61 6c  ** context is al
31f0: 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 66  located on the f
3200: 69 72 73 74 20 63 61 6c 6c 2e 20 20 53 75 62 73  irst call.  Subs
3210: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 72 65 74  equent calls ret
3220: 75 72 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  urn the.** same 
3230: 63 6f 6e 74 65 78 74 20 74 68 61 74 20 77 61 73  context that was
3240: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 70 72 69   returned on pri
3250: 6f 72 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  or calls..**.** 
3260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3270: 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20  defined here in 
3280: 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20 69  vdbe.c because i
3290: 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f  t depends on kno
32a0: 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65  wing.** the inte
32b0: 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c  rnals of the sql
32c0: 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75  ite_func structu
32d0: 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  re which is only
32e0: 20 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74   defined in.** t
32f0: 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  his source file.
3300: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
3310: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3320: 65 78 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ext(sqlite_func 
3330: 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *p, int nByte){.
3340: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
3350: 2d 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46  ->pFunc && p->pF
3360: 75 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20  unc->xStep );.  
3370: 69 66 28 20 70 2d 3e 70 41 67 67 3d 3d 30 20 29  if( p->pAgg==0 )
3380: 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  {.    if( nByte<
3390: 3d 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20 70  =NBFS ){.      p
33a0: 2d 3e 70 41 67 67 20 3d 20 28 76 6f 69 64 2a 29  ->pAgg = (void*)
33b0: 70 2d 3e 73 2e 7a 3b 0a 20 20 20 20 20 20 6d 65  p->s.z;.      me
33c0: 6d 73 65 74 28 70 2d 3e 70 41 67 67 2c 20 30 2c  mset(p->pAgg, 0,
33d0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 65 6c   nByte);.    }el
33e0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 70 41 67  se{.      p->pAg
33f0: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
3400: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 7d  ( nByte );.    }
3410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
3420: 3e 70 41 67 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pAgg;.}../*.** 
3430: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3440: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65 20 53  r of times the S
3450: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  tep function of 
3460: 61 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  a aggregate has 
3470: 62 65 65 6e 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e  been .** called.
3480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3490: 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20 68  ine is defined h
34a0: 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65  ere in vdbe.c be
34b0: 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64 73  cause it depends
34c0: 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74   on knowing.** t
34d0: 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20  he internals of 
34e0: 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20  the sqlite_func 
34f0: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
3500: 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20  is only defined 
3510: 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  in.** this sourc
3520: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e file..*/.int s
3530: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3540: 5f 63 6f 75 6e 74 28 73 71 6c 69 74 65 5f 66 75  _count(sqlite_fu
3550: 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  nc *p){.  assert
3560: 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20  ( p && p->pFunc 
3570: 26 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74  && p->pFunc->xSt
3580: 65 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ep );.  return p
3590: 2d 3e 63 6e 74 3b 0a 7d 0a 0a 23 69 66 20 21 64  ->cnt;.}..#if !d
35a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
35b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
35c0: 52 4f 46 49 4c 45 29 0a 2f 2a 0a 2a 2a 20 50 72  ROFILE)./*.** Pr
35d0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
35e0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
35f0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3600: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3610: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3620: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3630: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3640: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3650: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3660: 5b 34 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  [40];.  if( pOp-
3670: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
3680: 54 45 52 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  TER ){.    sprin
3690: 74 66 28 7a 50 74 72 2c 20 22 70 74 72 28 25 23  tf(zPtr, "ptr(%#
36a0: 78 29 22 2c 20 28 69 6e 74 29 70 4f 70 2d 3e 70  x)", (int)pOp->p
36b0: 33 29 3b 0a 20 20 20 20 7a 50 33 20 3d 20 7a 50  3);.    zP3 = zP
36c0: 74 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  tr;.  }else{.   
36d0: 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   zP3 = pOp->p3;.
36e0: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d    }.  if( pOut==
36f0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
3700: 74 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  t;.  fprintf(pOu
3710: 74 2c 22 25 34 64 20 25 2d 31 32 73 20 25 34 64  t,"%4d %-12s %4d
3720: 20 25 34 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %4d %s\n",.    
3730: 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63    pc, sqlite3Opc
3740: 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70  odeNames[pOp->op
3750: 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20  code], pOp->p1, 
3760: 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 20 3f 20 7a  pOp->p2, zP3 ? z
3770: 50 33 20 3a 20 22 22 29 3b 0a 20 20 66 66 6c 75  P3 : "");.  fflu
3780: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
3790: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  if../*.** Give a
37a0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
37b0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
37c0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
37d0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
37e0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
37f0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
3800: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
3810: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
3820: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
3830: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
3840: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
3850: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3860: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
3870: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3880: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
3890: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
38a0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
38d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
38e0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
38f0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
3900: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
3910: 63 20 63 68 61 72 20 2a 61 7a 43 6f 6c 75 6d 6e  c char *azColumn
3920: 4e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Names[] = {.    
3930: 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
3940: 22 2c 20 22 70 31 22 2c 20 20 22 70 32 22 2c 20  ", "p1",  "p2", 
3950: 20 22 70 33 22 2c 20 0a 20 20 20 20 20 22 69 6e   "p3", .     "in
3960: 74 22 2c 20 20 22 74 65 78 74 22 2c 20 20 20 22  t",  "text",   "
3970: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 74 65  int", "int", "te
3980: 78 74 22 2c 0a 20 20 20 20 20 30 0a 20 20 7d 3b  xt",.     0.  };
3990: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
39a0: 6f 70 53 74 61 63 6b 3d 3d 30 20 29 3b 0a 20 20  opStack==0 );.  
39b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
39c0: 69 6e 20 29 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c  in );.  p->azCol
39d0: 4e 61 6d 65 20 3d 20 61 7a 43 6f 6c 75 6d 6e 4e  Name = azColumnN
39e0: 61 6d 65 73 3b 0a 20 20 70 2d 3e 61 7a 52 65 73  ames;.  p->azRes
39f0: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67  Column = p->zArg
3a00: 76 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  v;.  for(i=0; i<
3a10: 35 3b 20 69 2b 2b 29 20 70 2d 3e 7a 41 72 67 76  5; i++) p->zArgv
3a20: 5b 69 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  [i] = p->aStack[
3a30: 69 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20 69 20 3d  i].zShort;.  i =
3a40: 20 70 2d 3e 70 63 3b 0a 20 20 69 66 28 20 69 3e   p->pc;.  if( i>
3a50: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
3a60: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
3a70: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3a80: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
3a90: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
3aa0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
3ab0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
3ac0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3ad0: 65 72 72 75 70 74 3b 0a 20 20 20 20 69 66 28 20  errupt;.    if( 
3ae0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
3af0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a  E_MAGIC_BUSY ){.
3b00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
3b10: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
3b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3b30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
3b40: 45 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ERRUPT;.    }.  
3b50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3b60: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
3b70: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
3b80: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
3b90: 72 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72  rror_string(p->r
3ba0: 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
3bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
3bc0: 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 30 5d 2c  ntf(p->zArgv[0],
3bd0: 22 25 64 22 2c 69 29 3b 0a 20 20 20 20 73 70 72  "%d",i);.    spr
3be0: 69 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 32 5d  intf(p->zArgv[2]
3bf0: 2c 22 25 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  ,"%d", p->aOp[i]
3c00: 2e 70 31 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  .p1);.    sprint
3c10: 66 28 70 2d 3e 7a 41 72 67 76 5b 33 5d 2c 22 25  f(p->zArgv[3],"%
3c20: 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32  d", p->aOp[i].p2
3c30: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  );.    if( p->aO
3c40: 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33 5f  p[i].p3type==P3_
3c50: 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
3c60: 20 73 70 72 69 6e 74 66 28 70 2d 3e 61 53 74 61   sprintf(p->aSta
3c70: 63 6b 5b 34 5d 2e 7a 53 68 6f 72 74 2c 20 22 70  ck[4].zShort, "p
3c80: 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 70  tr(%#x)", (int)p
3c90: 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20  ->aOp[i].p3);.  
3ca0: 20 20 20 20 70 2d 3e 7a 41 72 67 76 5b 34 5d 20      p->zArgv[4] 
3cb0: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a  = p->aStack[4].z
3cc0: 53 68 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  Short;.    }else
3cd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 41 72 67 76  {.      p->zArgv
3ce0: 5b 34 5d 20 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e  [4] = p->aOp[i].
3cf0: 70 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  p3;.    }.    p-
3d00: 3e 7a 41 72 67 76 5b 31 5d 20 3d 20 73 71 6c 69  >zArgv[1] = sqli
3d10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
3d20: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 5d  ->aOp[i].opcode]
3d30: 3b 0a 20 20 20 20 70 2d 3e 70 63 20 3d 20 69 2b  ;.    p->pc = i+
3d40: 31 3b 0a 20 20 20 20 70 2d 3e 61 7a 52 65 73 43  1;.    p->azResC
3d50: 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67 76  olumn = p->zArgv
3d60: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ;.    p->nResCol
3d70: 75 6d 6e 20 3d 20 35 3b 0a 20 20 20 20 70 2d 3e  umn = 5;.    p->
3d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3d90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3da0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
3db0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3dc0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
3dd0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
3de0: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
3df0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
3e00: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
3e10: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
3e20: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
3e30: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
3e40: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
3e50: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
3e60: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
3e70: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
3e80: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
3e90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
3ea0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2f 0a 76 6f  eExec().  .*/.vo
3eb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
3ec0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
3ed0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
3ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3ef0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
3f00: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f20: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
3f30: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
3f40: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ent */.  int isE
3f50: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f70: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
3f80: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
3f90: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
3fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
3fb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3fc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3fd0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
3fe0: 2a 20 41 64 64 20 61 20 48 41 4c 54 20 69 6e 73  * Add a HALT ins
3ff0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
4000: 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65 20  very end of the 
4010: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
4020: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 7c 7c  if( p->nOp==0 ||
4030: 20 28 70 2d 3e 61 4f 70 20 26 26 20 70 2d 3e 61   (p->aOp && p->a
4040: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
4050: 6f 64 65 21 3d 4f 50 5f 48 61 6c 74 29 20 29 7b  ode!=OP_Halt) ){
4060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4070: 41 64 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74  AddOp(p, OP_Halt
4080: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
4090: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f  /* No instructio
40a0: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f  n ever pushes mo
40b0: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  re than a single
40c0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68   element onto th
40d0: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41  e.  ** stack.  A
40e0: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76  nd the stack nev
40f0: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63  er grows on succ
4100: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e  essive execution
4110: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61  s of the.  ** sa
4120: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65  me loop.  So the
4130: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73   instructions is
4150: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a   an upper bound.
4160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69    ** on the maxi
4170: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
4180: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
4190: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61   ** Allocation a
41a0: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61  ll the stack spa
41b0: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20  ce we will ever 
41c0: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  need..  */.  if(
41d0: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b   p->aStack==0 ){
41e0: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e  .    p->nVar = n
41f0: 56 61 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Var;.    assert(
4200: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
4210: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20  n = isExplain ? 
4220: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  10 : p->nOp;.   
4230: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
4240: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
4250: 20 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53   n*(sizeof(p->aS
4260: 74 61 63 6b 5b 30 5d 29 20 2b 20 32 2a 73 69 7a  tack[0]) + 2*siz
4270: 65 6f 66 28 63 68 61 72 2a 29 29 20 20 20 20 20  eof(char*))     
4280: 2f 2a 20 61 53 74 61 63 6b 20 61 6e 64 20 7a 41  /* aStack and zA
4290: 72 67 76 20 2a 2f 0a 20 20 20 20 20 20 2b 20 70  rgv */.      + p
42a0: 2d 3e 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  ->nVar*sizeof(Me
42b0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
42d0: 70 56 61 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pVar */.    );. 
42e0: 20 20 20 70 2d 3e 7a 41 72 67 76 20 3d 20 28 63     p->zArgv = (c
42f0: 68 61 72 2a 2a 29 26 70 2d 3e 61 53 74 61 63 6b  har**)&p->aStack
4300: 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  [n];.    p->azCo
4310: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 2a 29  lName = (char**)
4320: 26 70 2d 3e 7a 41 72 67 76 5b 6e 5d 3b 0a 20 20  &p->zArgv[n];.  
4330: 20 20 70 2d 3e 61 70 56 61 72 20 3d 20 28 4d 65    p->apVar = (Me
4340: 6d 20 2a 29 26 70 2d 3e 61 7a 43 6f 6c 4e 61 6d  m *)&p->azColNam
4350: 65 5b 6e 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  e[n];.    for(n=
4360: 30 3b 20 6e 3c 70 2d 3e 6e 56 61 72 3b 20 6e 2b  0; n<p->nVar; n+
4370: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 70 56  +){.      p->apV
4380: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
4390: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  M_Null;.    }.  
43a0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  }..  sqlite3Hash
43b0: 49 6e 69 74 28 26 70 2d 3e 61 67 67 2e 68 61 73  Init(&p->agg.has
43c0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  h, SQLITE_HASH_B
43d0: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 70 2d 3e  INARY, 0);.  p->
43e0: 61 67 67 2e 70 53 65 61 72 63 68 20 3d 20 30 3b  agg.pSearch = 0;
43f0: 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44  .#ifdef MEMORY_D
4400: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
4410: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22  e3OsFileExists("
4420: 76 64 62 65 5f 74 72 61 63 65 22 29 20 29 7b 0a  vdbe_trace") ){.
4430: 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73      p->trace = s
4440: 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tdout;.  }.#endi
4450: 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70  f.  p->pTos = &p
4460: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
4470: 70 2d 3e 70 63 20 3d 20 30 3b 0a 20 20 70 2d 3e  p->pc = 0;.  p->
4480: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4490: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
44a0: 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44   0;.  p->returnD
44b0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  epth = 0;.  p->e
44c0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
44d0: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 75 6e 64 6f  Abort;.  p->undo
44e0: 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 30  TransOnError = 0
44f0: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
4500: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
4510: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
4520: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
4530: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 23 69  BE_MAGIC_RUN;.#i
4540: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4550: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
4560: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4570: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
4580: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
4590: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
45a0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
45b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
45c0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  dif.}.../*.** Re
45d0: 6d 6f 76 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74  move any element
45e0: 73 20 74 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e  s that remain on
45f0: 20 74 68 65 20 73 6f 72 74 65 72 20 66 6f 72 20   the sorter for 
4600: 74 68 65 20 56 44 42 45 20 67 69 76 65 6e 2e 0a  the VDBE given..
4610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4620: 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 56  dbeSorterReset(V
4630: 64 62 65 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  dbe *p){.  while
4640: 28 20 70 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20  ( p->pSort ){.  
4650: 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65    Sorter *pSorte
4660: 72 20 3d 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20  r = p->pSort;.  
4670: 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f    p->pSort = pSo
4680: 72 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  rter->pNext;.   
4690: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72   sqliteFree(pSor
46a0: 74 65 72 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20  ter->zKey);.    
46b0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74  sqliteFree(pSort
46c0: 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  er->pData);.    
46d0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74  sqliteFree(pSort
46e0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
46f0: 2a 20 52 65 73 65 74 20 61 6e 20 41 67 67 20 73  * Reset an Agg s
4700: 74 72 75 63 74 75 72 65 2e 20 20 44 65 6c 65 74  tructure.  Delet
4710: 65 20 61 6c 6c 20 69 74 73 20 63 6f 6e 74 65 6e  e all its conten
4720: 74 73 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  ts. .**.** For i
4730: 6e 73 74 61 6c 6c 61 62 6c 65 20 61 67 67 72 65  nstallable aggre
4740: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  gate functions, 
4750: 69 66 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  if the step func
4760: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  tion has been.**
4770: 20 63 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 73 75   called, make su
4780: 72 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  re the finalizer
4790: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
47a0: 73 6f 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20  so been called. 
47b0: 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   The.** finalize
47c0: 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  r might need to 
47d0: 66 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  free memory that
47e0: 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61   was allocated a
47f0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 0a 2a 2a  s part of its.**
4800: 20 70 72 69 76 61 74 65 20 63 6f 6e 74 65 78 74   private context
4810: 2e 20 20 49 66 20 74 68 65 20 66 69 6e 61 6c 69  .  If the finali
4820: 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  zer has not been
4830: 20 63 61 6c 6c 65 64 20 79 65 74 2c 20 63 61 6c   called yet, cal
4840: 6c 20 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2f 0a  l it.** now..*/.
4850: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4860: 41 67 67 52 65 73 65 74 28 41 67 67 20 2a 70 41  AggReset(Agg *pA
4870: 67 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gg){.  int i;.  
4880: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 66  HashElem *p;.  f
4890: 6f 72 28 70 20 3d 20 73 71 6c 69 74 65 48 61 73  or(p = sqliteHas
48a0: 68 46 69 72 73 74 28 26 70 41 67 67 2d 3e 68 61  hFirst(&pAgg->ha
48b0: 73 68 29 3b 20 70 3b 20 70 20 3d 20 73 71 6c 69  sh); p; p = sqli
48c0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
48d0: 20 20 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c      AggElem *pEl
48e0: 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  em = sqliteHashD
48f0: 61 74 61 28 70 29 3b 0a 20 20 20 20 61 73 73 65  ata(p);.    asse
4900: 72 74 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  rt( pAgg->apFunc
4910: 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
4920: 3d 30 3b 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d  =0; i<pAgg->nMem
4930: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65  ; i++){.      Me
4940: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 45 6c 65 6d  m *pMem = &pElem
4950: 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
4960: 20 69 66 28 20 70 41 67 67 2d 3e 61 70 46 75 6e   if( pAgg->apFun
4970: 63 5b 69 5d 20 26 26 20 28 70 4d 65 6d 2d 3e 66  c[i] && (pMem->f
4980: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 43 74  lags & MEM_AggCt
4990: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  x)!=0 ){.       
49a0: 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 63 74 78   sqlite_func ctx
49b0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 70 46  ;.        ctx.pF
49c0: 75 6e 63 20 3d 20 70 41 67 67 2d 3e 61 70 46 75  unc = pAgg->apFu
49d0: 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 63  nc[i];.        c
49e0: 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  tx.s.flags = MEM
49f0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  _Null;.        c
4a00: 74 78 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e  tx.pAgg = pMem->
4a10: 7a 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 63  z;.        ctx.c
4a20: 6e 74 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20  nt = pMem->i;.  
4a30: 20 20 20 20 20 20 63 74 78 2e 69 73 53 74 65 70        ctx.isStep
4a40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74   = 0;.        ct
4a50: 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  x.isError = 0;. 
4a60: 20 20 20 20 20 20 20 28 2a 70 41 67 67 2d 3e 61         (*pAgg->a
4a70: 70 46 75 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c  pFunc[i]->xFinal
4a80: 69 7a 65 29 28 26 63 74 78 29 3b 0a 20 20 20 20  ize)(&ctx);.    
4a90: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21      if( pMem->z!
4aa0: 3d 30 20 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70  =0 && pMem->z!=p
4ab0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20  Mem->zShort ){. 
4ac0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
4ad0: 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  ree(pMem->z);.  
4ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4af0: 69 66 28 20 63 74 78 2e 73 2e 66 6c 61 67 73 20  if( ctx.s.flags 
4b00: 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  & MEM_Dyn ){.   
4b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4b20: 65 28 63 74 78 2e 73 2e 7a 29 3b 0a 20 20 20 20  e(ctx.s.z);.    
4b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
4b40: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4b50: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  s & MEM_Dyn ){. 
4b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4b70: 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  e(pMem->z);.    
4b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4b90: 6c 69 74 65 46 72 65 65 28 70 45 6c 65 6d 29 3b  liteFree(pElem);
4ba0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
4bb0: 73 68 43 6c 65 61 72 28 26 70 41 67 67 2d 3e 68  shClear(&pAgg->h
4bc0: 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ash);.  sqliteFr
4bd0: 65 65 28 70 41 67 67 2d 3e 61 70 46 75 6e 63 29  ee(pAgg->apFunc)
4be0: 3b 0a 20 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  ;.  pAgg->apFunc
4bf0: 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 70 43   = 0;.  pAgg->pC
4c00: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41  urrent = 0;.  pA
4c10: 67 67 2d 3e 70 53 65 61 72 63 68 20 3d 20 30 3b  gg->pSearch = 0;
4c20: 0a 20 20 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20  .  pAgg->nMem = 
4c30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4c40: 74 65 20 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a  te a keylist.*/.
4c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4c60: 4b 65 79 6c 69 73 74 46 72 65 65 28 4b 65 79 6c  KeylistFree(Keyl
4c70: 69 73 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ist *p){.  while
4c80: 28 20 70 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69  ( p ){.    Keyli
4c90: 73 74 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  st *pNext = p->p
4ca0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
4cb0: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 70 20 3d  Free(p);.    p =
4cc0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
4cd0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
4ce0: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
4cf0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
4d00: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68 61  s that cursor ha
4d10: 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64  ppens.** to hold
4d20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4d30: 33 56 64 62 65 43 6c 65 61 6e 75 70 43 75 72 73  3VdbeCleanupCurs
4d40: 6f 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  or(Cursor *pCx){
4d50: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
4d60: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
4d70: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
4d80: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
4d90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
4da0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
4db0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
4dc0: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73  x->pBt);.  }.  s
4dd0: 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70  qliteFree(pCx->p
4de0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  Data);.  sqliteF
4df0: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
4e00: 0a 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30  .  memset(pCx, 0
4e10: 2c 20 73 69 7a 65 6f 66 28 2a 70 43 78 29 29 3b  , sizeof(*pCx));
4e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
4e30: 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73  all cursors.*/.s
4e40: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
4e50: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
4e60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4e70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4e80: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
4e90: 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d   Cursor *pC = p-
4ea0: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 73  >apCsr[i];.    s
4eb0: 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 6e 75  qlite3VdbeCleanu
4ec0: 70 43 75 72 73 6f 72 28 70 43 29 3b 0a 20 20 20  pCursor(pC);.   
4ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 29 3b   sqliteFree(pC);
4ee0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
4ef0: 65 28 70 2d 3e 61 70 43 73 72 29 3b 0a 20 20 70  e(p->apCsr);.  p
4f00: 2d 3e 61 70 43 73 72 20 3d 20 30 3b 0a 20 20 70  ->apCsr = 0;.  p
4f10: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 7d  ->nCursor = 0;.}
4f20: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
4f30: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
4f40: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
4f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
4f60: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
4f70: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
4f80: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
4f90: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
4fa0: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
4fb0: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
4fc0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
4fd0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
4fe0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
4ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5000: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
5010: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
5020: 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20   p->aStack ){.  
5030: 20 20 4d 65 6d 20 2a 70 54 6f 73 20 3d 20 70 2d    Mem *pTos = p-
5040: 3e 70 54 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65  >pTos;.    while
5050: 28 20 70 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 63  ( pTos>=p->aStac
5060: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  k ){.      if( p
5070: 54 6f 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Tos->flags & MEM
5080: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
5090: 73 71 6c 69 74 65 46 72 65 65 28 70 54 6f 73 2d  sqliteFree(pTos-
50a0: 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >z);.      }.   
50b0: 20 20 20 70 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d     pTos--;.    }
50c0: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70  .    p->pTos = p
50d0: 54 6f 73 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  Tos;.  }.  close
50e0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
50f0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
5100: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5110: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
5120: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b      if( p->aMem[
5130: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  i].flags & MEM_D
5140: 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  yn ){.        sq
5150: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d  liteFree(p->aMem
5160: 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  [i].z);.      }.
5170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5180: 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b  teFree(p->aMem);
5190: 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a  .  p->aMem = 0;.
51a0: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20    p->nMem = 0;. 
51b0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
51c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
51d0: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70  KeylistFree(p->p
51e0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  List);.    p->pL
51f0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ist = 0;.  }.  s
5200: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
5210: 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20  Reset(p);.  if( 
5220: 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  p->pFile ){.    
5230: 69 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74  if( p->pFile!=st
5240: 64 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e  din ) fclose(p->
5250: 70 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70  pFile);.    p->p
5260: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
5270: 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29  if( p->azField )
5280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5290: 28 70 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20  (p->azField);.  
52a0: 20 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30    p->azField = 0
52b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c  ;.  }.  p->nFiel
52c0: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  d = 0;.  if( p->
52d0: 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  zLine ){.    sql
52e0: 69 74 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65  iteFree(p->zLine
52f0: 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20  );.    p->zLine 
5300: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c  = 0;.  }.  p->nL
5310: 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ineAlloc = 0;.  
5320: 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65  sqlite3VdbeAggRe
5330: 73 65 74 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20  set(&p->agg);.  
5340: 69 66 28 20 70 2d 3e 61 53 65 74 20 29 7b 0a 20  if( p->aSet ){. 
5350: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5360: 3e 6e 53 65 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSet; i++){.   
5370: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
5380: 65 61 72 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e  ear(&p->aSet[i].
5390: 68 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hash);.    }.  }
53a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
53b0: 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e 61 53 65  >aSet);.  p->aSe
53c0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53 65 74  t = 0;.  p->nSet
53d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6b   = 0;.  if( p->k
53e0: 65 79 6c 69 73 74 53 74 61 63 6b 20 29 7b 0a 20  eylistStack ){. 
53f0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
5400: 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20  or(ii = 0; ii < 
5410: 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44  p->keylistStackD
5420: 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  epth; ii++){.   
5430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65     sqlite3VdbeKe
5440: 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 6b 65 79  ylistFree(p->key
5450: 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d 29 3b 0a  listStack[ii]);.
5460: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5470: 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53  Free(p->keylistS
5480: 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65  tack);.    p->ke
5490: 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20  ylistStackDepth 
54a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c  = 0;.    p->keyl
54b0: 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  istStack = 0;.  
54c0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
54d0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b  ->contextStack);
54e0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
54f0: 63 6b 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ck = 0;.  sqlite
5500: 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29  Free(p->zErrMsg)
5510: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
5520: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
5530: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
5540: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
5550: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
5560: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
5570: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
5580: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
5590: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
55a0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
55b0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
55c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
55d0: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
55e0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
55f0: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
5600: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74  ** again..*/.int
5610: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
5620: 74 28 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20  t(Vdbe *p, char 
5630: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73  **pzErrMsg){.  s
5640: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64  qlite *db = p->d
5650: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  b;.  int i;..  i
5660: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
5670: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
5680: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
5690: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
56a0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
56b0: 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  (pzErrMsg, sqlit
56c0: 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  e3_error_string(
56d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c 20  SQLITE_MISUSE), 
56e0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
56f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5700: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  USE;.  }.  if( p
5710: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
5720: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 26 26   if( pzErrMsg &&
5730: 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b   *pzErrMsg==0 ){
5740: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  .      *pzErrMsg
5750: 20 3d 20 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20   = p->zErrMsg;. 
5760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5770: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45  sqliteFree(p->zE
5780: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
5790: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
57a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
57b0: 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >rc ){.    sqlit
57c0: 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  e3SetString(pzEr
57d0: 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
57e0: 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72 63  ror_string(p->rc
57f0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5800: 7d 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  }.  Cleanup(p);.
5810: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
5820: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77  ITE_OK ){.    sw
5830: 69 74 63 68 28 20 70 2d 3e 65 72 72 6f 72 41 63  itch( p->errorAc
5840: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 63 61  tion ){.      ca
5850: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 7b 0a 20  se OE_Abort: {. 
5860: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 75         if( !p->u
5870: 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20  ndoTransOnError 
5880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
5890: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
58a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
58b0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
58c0: 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ].pBt ){.       
58d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
58e0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
58f0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
5900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5910: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
5940: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   Fall through to
5950: 20 52 4f 4c 4c 42 41 43 4b 20 2a 2f 0a 20 20 20   ROLLBACK */.   
5960: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5970: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20  OE_Rollback: {. 
5980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
5990: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
59a0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
59b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
59c0: 61 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  ans;.        db-
59d0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65  >onError = OE_De
59e0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 62  fault;.        b
59f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5a00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5a10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75 6e         if( p->un
5a20: 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29  doTransOnError )
5a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5a40: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
5a50: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
5a60: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
5a70: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20  TE_InTrans;.    
5a80: 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f        db->onErro
5a90: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
5aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5ad0: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
5ae0: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
5af0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
5b00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5b10: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
5b20: 5d 2e 70 42 74 20 26 26 20 64 62 2d 3e 61 44 62  ].pBt && db->aDb
5b30: 5b 69 5d 2e 69 6e 54 72 61 6e 73 3d 3d 32 20 29  [i].inTrans==2 )
5b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
5b50: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 64  treeCommitStmt(d
5b60: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
5b70: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
5b80: 2e 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20  .inTrans = 1;.  
5b90: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5ba0: 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53  ( p->pTos<&p->aS
5bb0: 74 61 63 6b 5b 70 2d 3e 70 63 5d 20 7c 7c 20 73  tack[p->pc] || s
5bc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
5bd0: 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65  iled==1 );.#ifde
5be0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
5bf0: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
5c00: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
5c10: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
5c20: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
5c30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
5c40: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5c50: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
5c60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5c70: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
5c80: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
5c90: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
5ca0: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
5cb0: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
5cc0: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
5cd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5ce0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5cf0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5d00: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
5d10: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
5d20: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
5d30: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
5d40: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
5d50: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
5d60: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
5d70: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
5d80: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
5d90: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
5da0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5db0: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
5dc0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
5dd0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
5de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5df0: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
5e00: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
5e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
5e30: 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
5e40: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
5e50: 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
5e60: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
5e70: 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
5e80: 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
5e90: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
5ea0: 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
5eb0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
5ec0: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5ed0: 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a  Vdbe *p, char **
5ee0: 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74  pzErrMsg){.  int
5ef0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   rc;.  sqlite *d
5f00: 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  b;..  if( p->mag
5f10: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
5f20: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d  UN && p->magic!=
5f30: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
5f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
5f50: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
5f60: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72 5f  , sqlite3_error_
5f70: 73 74 72 69 6e 67 28 53 51 4c 49 54 45 5f 4d 49  string(SQLITE_MI
5f80: 53 55 53 45 29 2c 20 28 63 68 61 72 2a 29 30 29  SUSE), (char*)0)
5f90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5fa0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
5fb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5fc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
5fd0: 52 65 73 65 74 28 70 2c 20 70 7a 45 72 72 4d 73  Reset(p, pzErrMs
5fe0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  g);.  sqlite3Vdb
5ff0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 69 66  eDelete(p);.  if
6000: 28 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c  ( db->want_to_cl
6010: 6f 73 65 20 26 26 20 64 62 2d 3e 70 56 64 62 65  ose && db->pVdbe
6020: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6030: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
6040: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6050: 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20  TE_SCHEMA ){.   
6060: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
6070: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
6080: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
6090: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
60a0: 62 69 6e 64 20 74 68 65 20 76 61 6c 75 65 20 62  bind the value b
60b0: 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65  ound to variable
60c0: 20 24 69 20 69 6e 20 76 69 72 74 75 61 6c 20 6d   $i in virtual m
60d0: 61 63 68 69 6e 65 20 70 2e 20 54 68 69 73 20 69  achine p. This i
60e0: 73 20 74 68 65 20 0a 2a 2a 20 74 68 65 20 73 61  s the .** the sa
60f0: 6d 65 20 61 73 20 62 69 6e 64 69 6e 67 20 61 20  me as binding a 
6100: 4e 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 74 68  NULL value to th
6110: 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 20 74 68 65  e column. If the
6120: 20 22 69 22 20 70 61 72 61 6d 65 74 65 72 20 69   "i" parameter i
6130: 73 0a 2a 2a 20 6f 75 74 20 6f 66 20 72 61 6e 67  s.** out of rang
6140: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 52  e, then SQLITE_R
6150: 41 4e 47 45 20 69 73 20 72 65 74 75 72 6e 65 64  ANGE is returned
6160: 2e 20 4f 74 68 65 77 69 73 65 20 53 51 4c 49 54  . Othewise SQLIT
6170: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
6180: 65 72 72 6f 72 20 63 6f 64 65 20 73 74 6f 72 65  error code store
6190: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 70 2d  d in database p-
61a0: 3e 64 62 20 69 73 20 6f 76 65 72 77 72 69 74 74  >db is overwritt
61b0: 65 6e 20 77 69 74 68 20 74 68 65 20 72 65 74 75  en with the retu
61c0: 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 61  rn.** value in a
61d0: 6e 79 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  ny case..*/.stat
61e0: 69 63 20 69 6e 74 20 76 64 62 65 55 6e 62 69 6e  ic int vdbeUnbin
61f0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  d(Vdbe *p, int i
6200: 29 7b 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 0a  ){.  Mem *pVar;.
6210: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
6220: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
6230: 7c 20 70 2d 3e 70 63 21 3d 30 20 29 7b 0a 20 20  | p->pc!=0 ){.  
6240: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
6250: 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53  ->db, SQLITE_MIS
6260: 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  USE, 0);.    ret
6270: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
6280: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 31  E;.  }.  if( i<1
6290: 20 7c 7c 20 69 3e 70 2d 3e 6e 56 61 72 20 29 7b   || i>p->nVar ){
62a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
62b0: 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  r(p->db, SQLITE_
62c0: 52 41 4e 47 45 2c 20 30 29 3b 0a 20 20 20 20 72  RANGE, 0);.    r
62d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e  eturn SQLITE_RAN
62e0: 47 45 3b 0a 20 20 7d 0a 20 20 69 2d 2d 3b 0a 20  GE;.  }.  i--;. 
62f0: 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 70 56 61   pVar = &p->apVa
6300: 72 5b 69 5d 3b 0a 20 20 69 66 28 20 70 56 61 72  r[i];.  if( pVar
6310: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20  ->flags&MEM_Dyn 
6320: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
6330: 65 28 70 56 61 72 2d 3e 7a 29 3b 0a 20 20 7d 0a  e(pVar->z);.  }.
6340: 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 3d 20    pVar->flags = 
6350: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 73 71 6c 69  MEM_Null;.  sqli
6360: 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20  te3Error(p->db, 
6370: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
6380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6390: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
63a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
63b0: 20 74 6f 20 62 69 6e 64 20 74 65 78 74 20 6f 72   to bind text or
63c0: 20 62 6c 6f 62 20 64 61 74 61 20 74 6f 20 61 6e   blob data to an
63d0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 28 61   SQL variable (a
63e0: 20 3f 29 2e 0a 2a 2a 20 49 74 20 6d 61 79 20 61   ?)..** It may a
63f0: 6c 73 6f 20 62 65 20 75 73 65 64 20 74 6f 20 62  lso be used to b
6400: 69 6e 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ind a NULL value
6410: 2c 20 62 79 20 73 65 74 74 69 6e 67 20 7a 56 61  , by setting zVa
6420: 6c 20 74 6f 20 30 2e 20 41 6e 79 0a 2a 2a 20 65  l to 0. Any.** e
6430: 78 69 73 74 69 6e 67 20 76 61 6c 75 65 20 69 73  xisting value is
6440: 20 75 6e 62 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20   unbound..**.** 
6450: 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  The error code s
6460: 74 6f 72 65 64 20 69 6e 20 70 2d 3e 64 62 20 69  tored in p->db i
6470: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
6480: 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
6490: 6c 75 65 20 69 6e 0a 2a 2a 20 61 6c 6c 20 63 61  lue in.** all ca
64a0: 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ses..*/.static i
64b0: 6e 74 20 76 64 62 65 42 69 6e 64 42 6c 6f 62 28  nt vdbeBindBlob(
64c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
64d0: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
64e0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e   machine */.  in
64f0: 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
6500: 20 2f 2a 20 56 61 72 20 6e 75 6d 62 65 72 20 74   /* Var number t
6510: 6f 20 62 69 6e 64 20 28 6e 75 6d 62 65 72 65 64  o bind (numbered
6520: 20 66 72 6f 6d 20 31 20 75 70 77 61 72 64 29 20   from 1 upward) 
6530: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6540: 2a 7a 56 61 6c 2c 20 20 2f 2a 20 50 6f 69 6e 74  *zVal,  /* Point
6550: 65 72 20 74 6f 20 62 6c 6f 62 20 6f 66 20 64 61  er to blob of da
6560: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65  ta */.  int byte
6570: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  s,         /* Nu
6580: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
6590: 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 63   copy */.  int c
65a0: 6f 70 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  opy,          /*
65b0: 20 54 72 75 65 20 74 6f 20 63 6f 70 79 20 74 68   True to copy th
65c0: 65 20 6d 65 6d 6f 72 79 2c 20 66 61 6c 73 65 20  e memory, false 
65d0: 74 6f 20 63 6f 70 79 20 61 20 70 6f 69 6e 74 65  to copy a pointe
65e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
65f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6600: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  id combination o
6610: 66 20 4d 45 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f  f MEM_Blob, MEM_
6620: 53 74 72 2c 20 4d 45 4d 5f 55 74 66 58 58 20 2a  Str, MEM_UtfXX *
6630: 2f 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 56 61 72  /.){.  Mem *pVar
6640: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
6650: 63 20 3d 20 76 64 62 65 55 6e 62 69 6e 64 28 70  c = vdbeUnbind(p
6660: 2c 20 69 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , i);.  if( rc!=
6670: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6690: 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 70 56    pVar = &p->apV
66a0: 61 72 5b 69 2d 31 5d 3b 0a 0a 20 20 69 66 28 20  ar[i-1];..  if( 
66b0: 7a 56 61 6c 20 29 7b 0a 20 20 20 20 70 56 61 72  zVal ){.    pVar
66c0: 2d 3e 6e 20 3d 20 62 79 74 65 73 3b 0a 20 20 20  ->n = bytes;.   
66d0: 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 3d 20 66   pVar->flags = f
66e0: 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 21 63  lags;.    if( !c
66f0: 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 70 56 61  opy ){.      pVa
6700: 72 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 7a  r->z = (char *)z
6710: 56 61 6c 3b 0a 20 20 20 20 20 20 70 56 61 72 2d  Val;.      pVar-
6720: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74  >flags |= MEM_St
6730: 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  atic;.    }else{
6740: 0a 20 20 20 20 20 20 69 66 28 20 62 79 74 65 73  .      if( bytes
6750: 3e 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20 20  >NBFS ){.       
6760: 20 70 56 61 72 2d 3e 7a 20 3d 20 28 63 68 61 72   pVar->z = (char
6770: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
6780: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
6790: 69 66 28 20 21 70 56 61 72 2d 3e 7a 20 29 7b 0a  if( !pVar->z ){.
67a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
67b0: 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51  3Error(p->db, SQ
67c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29 3b 0a  LITE_NOMEM, 0);.
67d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
67e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
67f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6800: 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 7c 3d 20   pVar->flags |= 
6810: 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 20 20 7d  MEM_Dyn;.      }
6820: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 56  else{.        pV
6830: 61 72 2d 3e 7a 20 3d 20 70 56 61 72 2d 3e 7a 53  ar->z = pVar->zS
6840: 68 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 70 56  hort;.        pV
6850: 61 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ar->flags |= MEM
6860: 5f 53 68 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Short;.      }.
6870: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 56 61        memcpy(pVa
6880: 72 2d 3e 7a 2c 20 7a 56 61 6c 2c 20 62 79 74 65  r->z, zVal, byte
6890: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  s);.    }.  }.. 
68a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
68b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64  K;.}../*.** Bind
68c0: 20 61 20 36 34 20 62 69 74 20 69 6e 74 65 67 65   a 64 bit intege
68d0: 72 20 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74  r to an SQL stat
68e0: 65 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a  ement variable..
68f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
6900: 69 6e 64 5f 69 6e 74 36 34 28 73 71 6c 69 74 65  ind_int64(sqlite
6910: 33 5f 73 74 6d 74 20 2a 70 2c 20 69 6e 74 20 69  3_stmt *p, int i
6920: 2c 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20  , long long int 
6930: 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  iValue){.  int r
6940: 63 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 28  c;.  Vdbe *v = (
6950: 56 64 62 65 20 2a 29 70 3b 0a 20 20 72 63 20 3d  Vdbe *)p;.  rc =
6960: 20 76 64 62 65 55 6e 62 69 6e 64 28 76 2c 20 69   vdbeUnbind(v, i
6970: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6980: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4d 65  ITE_OK ){.    Me
6990: 6d 20 2a 70 56 61 72 20 3d 20 26 76 2d 3e 61 70  m *pVar = &v->ap
69a0: 56 61 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 70 56  Var[i-1];.    pV
69b0: 61 72 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ar->flags = MEM_
69c0: 49 6e 74 3b 0a 20 20 20 20 70 56 61 72 2d 3e 69  Int;.    pVar->i
69d0: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 7d 0a 20   = iValue;.  }. 
69e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
69f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64  K;.}../*.** Bind
6a00: 20 61 20 33 32 20 62 69 74 20 69 6e 74 65 67 65   a 32 bit intege
6a10: 72 20 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74  r to an SQL stat
6a20: 65 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a  ement variable..
6a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
6a40: 69 6e 64 5f 69 6e 74 33 32 28 73 71 6c 69 74 65  ind_int32(sqlite
6a50: 33 5f 73 74 6d 74 20 2a 70 2c 20 69 6e 74 20 69  3_stmt *p, int i
6a60: 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20  , int iValue){. 
6a70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
6a80: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2c 20 69 2c  bind_int64(p, i,
6a90: 20 28 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 29   (long long int)
6aa0: 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iValue);.}../*.*
6ab0: 2a 20 42 69 6e 64 20 61 20 64 6f 75 62 6c 65 20  * Bind a double 
6ac0: 28 72 65 61 6c 29 20 74 6f 20 61 6e 20 53 51 4c  (real) to an SQL
6ad0: 20 73 74 61 74 65 6d 65 6e 74 20 76 61 72 69 61   statement varia
6ae0: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
6af0: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
6b00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 2c  sqlite3_stmt *p,
6b10: 20 69 6e 74 20 69 2c 20 64 6f 75 62 6c 65 20 69   int i, double i
6b20: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
6b30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 28 56  ;.  Vdbe *v = (V
6b40: 64 62 65 20 2a 29 70 3b 0a 20 20 72 63 20 3d 20  dbe *)p;.  rc = 
6b50: 76 64 62 65 55 6e 62 69 6e 64 28 76 2c 20 69 29  vdbeUnbind(v, i)
6b60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6b70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4d 65 6d  TE_OK ){.    Mem
6b80: 20 2a 70 56 61 72 20 3d 20 26 76 2d 3e 61 70 56   *pVar = &v->apV
6b90: 61 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 70 56 61  ar[i-1];.    pVa
6ba0: 72 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  r->flags = MEM_R
6bb0: 65 61 6c 3b 0a 20 20 20 20 70 56 61 72 2d 3e 72  eal;.    pVar->r
6bc0: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 7d 0a 20   = iValue;.  }. 
6bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6be0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64  K;.}../*.** Bind
6bf0: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 74 6f   a NULL value to
6c00: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
6c10: 74 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69  t variable..*/.i
6c20: 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  nt sqlite3_bind_
6c30: 6e 75 6c 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d  null(sqlite3_stm
6c40: 74 2a 20 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  t* p, int i){.  
6c50: 72 65 74 75 72 6e 20 76 64 62 65 55 6e 62 69 6e  return vdbeUnbin
6c60: 64 28 28 56 64 62 65 20 2a 29 70 2c 20 69 29 3b  d((Vdbe *)p, i);
6c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 61  .}../*.** Bind a
6c80: 20 55 54 46 2d 38 20 74 65 78 74 20 76 61 6c 75   UTF-8 text valu
6c90: 65 20 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74  e to an SQL stat
6ca0: 65 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a  ement variable..
6cb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
6cc0: 69 6e 64 5f 74 65 78 74 28 20 0a 20 20 73 71 6c  ind_text( .  sql
6cd0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 2c 20 0a 20  ite3_stmt *p, . 
6ce0: 20 69 6e 74 20 69 2c 20 0a 20 20 63 6f 6e 73 74   int i, .  const
6cf0: 20 63 68 61 72 20 2a 7a 44 61 74 61 2c 20 0a 20   char *zData, . 
6d00: 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20 69   int nData, .  i
6d10: 6e 74 20 65 43 6f 70 79 0a 29 7b 0a 20 20 69 6e  nt eCopy.){.  in
6d20: 74 20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  t flags = MEM_St
6d30: 72 7c 4d 45 4d 5f 55 74 66 38 3b 0a 20 20 69 66  r|MEM_Utf8;.  if
6d40: 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 69  ( zData ){.    i
6d50: 66 28 20 6e 44 61 74 61 3c 30 20 29 7b 0a 20 20  f( nData<0 ){.  
6d60: 20 20 20 20 6e 44 61 74 61 20 3d 20 73 74 72 6c      nData = strl
6d70: 65 6e 28 7a 44 61 74 61 29 2b 31 3b 0a 20 20 20  en(zData)+1;.   
6d80: 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f     flags |= MEM_
6d90: 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Term;.    }else 
6da0: 69 66 28 20 21 7a 44 61 74 61 5b 6e 44 61 74 61  if( !zData[nData
6db0: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  -1] ){.      fla
6dc0: 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
6dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6de0: 72 6e 20 76 64 62 65 42 69 6e 64 42 6c 6f 62 28  rn vdbeBindBlob(
6df0: 28 56 64 62 65 20 2a 29 70 2c 20 69 2c 20 7a 44  (Vdbe *)p, i, zD
6e00: 61 74 61 2c 20 6e 44 61 74 61 2c 20 65 43 6f 70  ata, nData, eCop
6e10: 79 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  y, flags);.}../*
6e20: 0a 2a 2a 20 42 69 6e 64 20 61 20 55 54 46 2d 31  .** Bind a UTF-1
6e30: 36 20 74 65 78 74 20 76 61 6c 75 65 20 74 6f 20  6 text value to 
6e40: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
6e50: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   variable..*/.in
6e60: 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  t sqlite3_bind_t
6e70: 65 78 74 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ext16(.  sqlite3
6e80: 5f 73 74 6d 74 20 2a 70 2c 20 0a 20 20 69 6e 74  _stmt *p, .  int
6e90: 20 69 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69   i, .  const voi
6ea0: 64 20 2a 7a 44 61 74 61 2c 20 0a 20 20 69 6e 74  d *zData, .  int
6eb0: 20 6e 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 65   nData, .  int e
6ec0: 43 6f 70 79 0a 29 7b 0a 20 20 69 6e 74 20 66 6c  Copy.){.  int fl
6ed0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
6ee0: 4d 5f 55 74 66 31 36 6c 65 7c 4d 45 4d 5f 55 74  M_Utf16le|MEM_Ut
6ef0: 66 31 36 62 65 3b 0a 0a 20 20 69 66 28 20 7a 44  f16be;..  if( zD
6f00: 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ata ){.    /* If
6f10: 20 6e 44 61 74 61 20 69 73 20 6c 65 73 73 20 74   nData is less t
6f20: 68 61 6e 20 7a 65 72 6f 2c 20 6d 65 61 73 75 72  han zero, measur
6f30: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  e the length of 
6f40: 74 68 65 20 73 74 72 69 6e 67 2e 20 0a 20 20 20  the string. .   
6f50: 20 2a 2a 20 6d 61 6e 75 61 6c 6c 79 2e 20 49 6e   ** manually. In
6f60: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 76   this case the v
6f70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 61 6c 77  ariable will alw
6f80: 61 79 73 20 62 65 20 6e 75 6c 6c 20 74 65 72 6d  ays be null term
6f90: 69 6e 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  inated..    */. 
6fa0: 20 20 20 69 66 28 20 6e 44 61 74 61 3c 30 20 29     if( nData<0 )
6fb0: 7b 0a 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20  {.      nData = 
6fc0: 73 71 6c 69 74 65 33 75 74 66 31 36 42 79 74 65  sqlite3utf16Byte
6fd0: 4c 65 6e 28 7a 44 61 74 61 2c 20 2d 31 29 20 2b  Len(zData, -1) +
6fe0: 20 32 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   2;.      flags 
6ff0: 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  |= MEM_Term;.   
7000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7010: 20 49 66 20 6e 44 61 74 61 20 69 73 20 67 72 65   If nData is gre
7020: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
7030: 63 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6e  check if the fin
7040: 61 6c 20 63 68 61 72 61 63 74 65 72 20 61 70 70  al character app
7050: 65 61 72 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ears.      ** to
7060: 20 62 65 20 61 20 74 65 72 6d 69 6e 61 74 6f 72   be a terminator
7070: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7080: 20 69 66 28 20 21 28 28 28 75 38 20 2a 29 7a 44   if( !(((u8 *)zD
7090: 61 74 61 29 5b 6e 44 61 74 61 2d 31 5d 29 20 26  ata)[nData-1]) &
70a0: 26 20 21 28 28 28 75 38 20 2a 29 7a 44 61 74 61  & !(((u8 *)zData
70b0: 29 5b 6e 44 61 74 61 2d 32 5d 29 20 29 7b 0a 20  )[nData-2]) ){. 
70c0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
70d0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
70e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 0a  }.    }.  }  . .
70f0: 20 20 72 65 74 75 72 6e 20 76 64 62 65 42 69 6e    return vdbeBin
7100: 64 42 6c 6f 62 28 28 56 64 62 65 20 2a 29 70 2c  dBlob((Vdbe *)p,
7110: 20 69 2c 20 7a 44 61 74 61 2c 20 6e 44 61 74 61   i, zData, nData
7120: 2c 20 65 43 6f 70 79 2c 20 66 6c 61 67 73 29 3b  , eCopy, flags);
7130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 61  .}../*.** Bind a
7140: 20 62 6c 6f 62 20 76 61 6c 75 65 20 74 6f 20 61   blob value to a
7150: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
7160: 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  variable..*/.int
7170: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
7180: 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ob(.  sqlite3_st
7190: 6d 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 2c  mt *p, .  int i,
71a0: 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
71b0: 7a 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44  zData, .  int nD
71c0: 61 74 61 2c 20 0a 20 20 69 6e 74 20 65 43 6f 70  ata, .  int eCop
71d0: 79 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 64  y.){.  return vd
71e0: 62 65 42 69 6e 64 42 6c 6f 62 28 28 56 64 62 65  beBindBlob((Vdbe
71f0: 20 2a 29 70 2c 20 69 2c 20 7a 44 61 74 61 2c 20   *)p, i, zData, 
7200: 6e 44 61 74 61 2c 20 65 43 6f 70 79 2c 20 4d 45  nData, eCopy, ME
7210: 4d 5f 42 6c 6f 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  M_Blob);.}../*.*
7220: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 73  * Set the values
7230: 20 6f 66 20 61 6c 6c 20 76 61 72 69 61 62 6c 65   of all variable
7240: 73 2e 20 20 56 61 72 69 61 62 6c 65 20 24 31 20  s.  Variable $1 
7250: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
7260: 53 51 4c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 74  SQL will.** be t
7270: 68 65 20 73 74 72 69 6e 67 20 61 7a 56 61 6c 75  he string azValu
7280: 65 5b 30 5d 2e 20 20 24 32 20 77 69 6c 6c 20 68  e[0].  $2 will h
7290: 61 76 65 20 74 68 65 20 76 61 6c 75 65 20 61 7a  ave the value az
72a0: 56 61 6c 75 65 5b 31 5d 2e 20 20 41 6e 64 0a 2a  Value[1].  And.*
72b0: 2a 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  * so forth.  If 
72c0: 61 20 76 61 6c 75 65 20 69 73 20 6f 75 74 20 6f  a value is out o
72d0: 66 20 72 61 6e 67 65 20 28 66 6f 72 20 65 78 61  f range (for exa
72e0: 6d 70 6c 65 20 24 33 20 77 68 65 6e 20 6e 56 61  mple $3 when nVa
72f0: 6c 75 65 3d 3d 32 29 0a 2a 2a 20 74 68 65 6e 20  lue==2).** then 
7300: 69 74 73 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  its value will b
7310: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e NULL..**.** Th
7320: 69 73 20 72 6f 75 74 69 6e 65 20 6f 76 65 72 72  is routine overr
7330: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 63  ides any prior c
7340: 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
7350: 74 65 33 5f 62 69 6e 64 28 73 71 6c 69 74 65 5f  te3_bind(sqlite_
7360: 76 6d 20 2a 70 56 6d 2c 20 69 6e 74 20 69 2c 20  vm *pVm, int i, 
7370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
7380: 2c 20 69 6e 74 20 6c 65 6e 2c 20 69 6e 74 20 63  , int len, int c
7390: 6f 70 79 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  opy){.  return s
73a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
73b0: 28 70 56 6d 2c 20 69 2c 20 7a 56 61 6c 2c 20 6c  (pVm, i, zVal, l
73c0: 65 6e 2c 20 63 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  en, copy);.}../*
73d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
73e0: 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
73f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
7400: 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
7410: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
7420: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43  =0 ) return;.  C
7430: 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28  leanup(p);.  if(
7440: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
7450: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
7460: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
7470: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7480: 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d  ( p->db->pVdbe==
7490: 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e  p );.    p->db->
74a0: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
74b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
74c0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
74d0: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
74e0: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
74f0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 4e 65 78  >pPrev = p->pNex
7500: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
7510: 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20  nOpAlloc==0 ){. 
7520: 20 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20     p->aOp = 0;. 
7530: 20 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20     p->nOp = 0;. 
7540: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7550: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
7560: 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e    if( p->aOp[i].
7570: 70 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d  p3type==P3_DYNAM
7580: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
7590: 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 5b 69 5d  teFree(p->aOp[i]
75a0: 2e 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .p3);.    }.  }.
75b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
75c0: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
75d0: 69 66 28 20 70 2d 3e 61 70 56 61 72 5b 69 5d 2e  if( p->apVar[i].
75e0: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b  flags&MEM_Dyn ){
75f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7600: 65 28 70 2d 3e 61 70 56 61 72 5b 69 5d 2e 7a 29  e(p->apVar[i].z)
7610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
7620: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29  liteFree(p->aOp)
7630: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
7640: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
7650: 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63  iteFree(p->aStac
7660: 6b 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  k);.  p->magic =
7670: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
7680: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
7690: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
76a0: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
76b0: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
76c0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
76d0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
76e0: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
76f0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
7700: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
7710: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
7720: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
7730: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
7740: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
7750: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
7760: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
7770: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
7780: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
7790: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
77a0: 20 72 65 73 3b 0a 20 20 20 20 65 78 74 65 72 6e   res;.    extern
77b0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
77c0: 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61  rch_count;.    a
77d0: 73 73 65 72 74 28 20 70 2d 3e 69 6e 74 4b 65 79  ssert( p->intKey
77e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   );.    if( p->i
77f0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 73  ntKey ){.      s
7800: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
7810: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
7820: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
7830: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , &res);.    }el
7840: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7850: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
7860: 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29 26  pCursor,(char*)&
7870: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
7880: 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 73  sizeof(i64),&res
7890: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
78a0: 69 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20  incrKey = 0;.   
78b0: 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f 20 3d 20   p->lastRecno = 
78c0: 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65  keyToInt(p->move
78d0: 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70  toTarget);.    p
78e0: 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69 64 20 3d  ->recnoIsValid =
78f0: 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28   res==0;.    if(
7900: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
7910: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
7920: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
7930: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
7940: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
7950: 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64 65 66  nt++;.    p->def
7960: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
7970: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56 61 6c  .    p->cacheVal
7980: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  id = 0;.  }.  re
7990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
79a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
79b0: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
79c0: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
79d0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
79e0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
79f0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
7a00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
7a10: 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69  alRead().** sqli
7a20: 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
7a30: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
7a40: 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a  eSerialWrite().*
7a50: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
7a60: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
7a70: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
7a80: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
7a90: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
7aa0: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
7ab0: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
7ac0: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
7ad0: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
7ae0: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
7af0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
7b00: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
7b10: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
7b20: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
7b30: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
7b40: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
7b50: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
7b60: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
7b70: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
7b80: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
7b90: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
7ba0: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
7bb0: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
7bc0: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
7bd0: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
7be0: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
7bf0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
7c00: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
7c10: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
7c20: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
7c30: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
7c40: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
7c50: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
7c60: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
7c70: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
7c80: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
7c90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
7ca0: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
7cb0: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
7cc0: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
7cd0: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
7ce0: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
7cf0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
7d00: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
7d30: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7d40: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 20              Not 
7d70: 61 20 74 79 70 65 2e 0a 2a 2a 20 20 20 20 20 20  a type..**      
7d80: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
7d90: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
7da0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
7db0: 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
7de0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
7df0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
7e00: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
7e10: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
7e20: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
7e50: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
7e60: 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
7e80: 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
7e90: 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 36 20  float.**      6 
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
7ec0: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 37 2e 2e   NULL.**     7..
7ed0: 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
7f00: 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
7f10: 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
7f20: 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
7f30: 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
7f40: 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
7f50: 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
7f60: 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f     text.**.*/../
7f70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7f80: 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
7f90: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
7fa0: 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 36 34   in pMem..*/.u64
7fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
7fc0: 61 6c 54 79 70 65 28 63 6f 6e 73 74 20 4d 65 6d  alType(const Mem
7fd0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66   *pMem){.  int f
7fe0: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
7ff0: 67 73 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73  gs;..  if( flags
8000: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
8010: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
8020: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
8030: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
8040: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
8050: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 20 6f  to use 1, 2, 4 o
8060: 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  r 8 bytes. */.  
8070: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
8080: 69 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 31  i;.    if( i>=-1
8090: 32 37 20 26 26 20 69 3c 3d 31 32 37 20 29 20 72  27 && i<=127 ) r
80a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
80b0: 20 69 3e 3d 2d 33 32 37 36 37 20 26 26 20 69 3c   i>=-32767 && i<
80c0: 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
80d0: 32 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 32  2;.    if( i>=-2
80e0: 31 34 37 34 38 33 36 34 37 20 26 26 20 69 3c 3d  147483647 && i<=
80f0: 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
8100: 75 72 6e 20 33 3b 0a 20 20 20 20 72 65 74 75 72  urn 3;.    retur
8110: 6e 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 4;.  }.  if( f
8120: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
8130: 0a 20 20 20 20 72 65 74 75 72 6e 20 35 3b 0a 20  .    return 5;. 
8140: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
8150: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 2f 2a  EM_Str ){.    /*
8160: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
8170: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 4e 55  the string is NU
8180: 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 57  LL-terminated. W
8190: 65 20 64 6f 6e 27 74 20 73 74 6f 72 65 20 74 68  e don't store th
81a0: 65 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2d 74 65  e.    ** NULL-te
81b0: 72 6d 69 6e 61 74 6f 72 20 2d 20 69 74 20 69 73  rminator - it is
81c0: 20 69 6d 70 6c 69 65 64 20 62 79 20 74 68 65 20   implied by the 
81d0: 73 74 72 69 6e 67 20 73 74 6f 72 61 67 65 20 63  string storage c
81e0: 6c 61 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lass..    */.   
81f0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
8200: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
8210: 28 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e  ( pMem->z[pMem->
8220: 6e 2d 31 5d 3d 3d 27 5c 30 27 20 29 3b 0a 20 20  n-1]=='\0' );.  
8230: 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e    return (pMem->
8240: 6e 2a 32 20 2b 20 31 31 29 3b 20 2f 2a 20 28 70  n*2 + 11); /* (p
8250: 4d 65 6d 2d 3e 6e 2d 31 29 2a 32 20 2b 20 31 33  Mem->n-1)*2 + 13
8260: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   */.  }.  if( fl
8270: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
8280: 20 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d      return (pMem
8290: 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d  ->n*2 + 12);.  }
82a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
82b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
82c0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
82d0: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
82e0: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
82f0: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
8300: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8310: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
8320: 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  64 serial_type){
8330: 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61  .  assert( seria
8340: 6c 5f 74 79 70 65 21 3d 30 20 29 3b 0a 20 20 73  l_type!=0 );.  s
8350: 77 69 74 63 68 28 73 65 72 69 61 6c 5f 74 79 70  witch(serial_typ
8360: 65 29 7b 0a 20 20 20 20 63 61 73 65 20 36 3a 20  e){.    case 6: 
8370: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
8380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 55             /* NU
8390: 4c 4c 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  LL */.    case 1
83a0: 3a 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 20  : return 1;     
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 31 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 2a  1 byte integer *
83d0: 2f 0a 20 20 20 20 63 61 73 65 20 32 3a 20 72 65  /.    case 2: re
83e0: 74 75 72 6e 20 32 3b 20 20 20 20 20 20 20 20 20  turn 2;         
83f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 62 79           /* 2 by
8400: 74 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  te integer */.  
8410: 20 20 63 61 73 65 20 33 3a 20 72 65 74 75 72 6e    case 3: return
8420: 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   4;             
8430: 20 20 20 20 20 2f 2a 20 34 20 62 79 74 65 20 69       /* 4 byte i
8440: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
8450: 73 65 20 34 3a 20 72 65 74 75 72 6e 20 38 3b 20  se 4: return 8; 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 2f 2a 20 38 20 62 79 74 65 20 69 6e 74 65 67   /* 8 byte integ
8480: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 35  er */.    case 5
8490: 3a 20 72 65 74 75 72 6e 20 38 3b 20 20 20 20 20  : return 8;     
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84b0: 38 20 62 79 74 65 20 66 6c 6f 61 74 20 2a 2f 0a  8 byte float */.
84c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 65    }.  assert( se
84d0: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b  rial_type>=12 );
84e0: 0a 20 20 72 65 74 75 72 6e 20 28 28 73 65 72 69  .  return ((seri
84f0: 61 6c 5f 74 79 70 65 2d 31 32 29 3e 3e 31 29 3b  al_type-12)>>1);
8500: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
8510: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 7d 0a 0a 2f 2a  or blob */.}../*
8520: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
8530: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
8540: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
8550: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
8560: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
8570: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
8580: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
8590: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
85a0: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
85b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
85c0: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
85d0: 6e 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  n..*/ .int sqlit
85e0: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
85f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
8600: 75 66 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  uf, const Mem *p
8610: 4d 65 6d 29 7b 0a 20 20 75 36 34 20 73 65 72 69  Mem){.  u64 seri
8620: 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
8630: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
8640: 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e  pMem);.  int len
8650: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 65 72  ;..  assert( ser
8660: 69 61 6c 5f 74 79 70 65 21 3d 30 20 29 3b 0a 20  ial_type!=0 );. 
8670: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  .  /* NULL */.  
8680: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
8690: 3d 36 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =6 ){.    return
86a0: 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49   0;.  }. .  /* I
86b0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 66 28 20  nteger */.  if( 
86c0: 73 65 72 69 61 6c 5f 74 79 70 65 3c 35 20 29 7b  serial_type<5 ){
86d0: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
86e0: 6d 2d 3e 69 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  m->i;.    len = 
86f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
8700: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
8710: 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65  type);.    while
8720: 28 20 6c 65 6e 2d 2d 20 29 7b 0a 20 20 20 20 20  ( len-- ){.     
8730: 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 28 69 26 30   buf[len] = (i&0
8740: 78 46 46 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  xFF);.      i = 
8750: 69 20 3e 3e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  i >> 8;.    }.  
8760: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8770: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
8780: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
8790: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 6f 61 74 20    }..  /* Float 
87a0: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
87b0: 74 79 70 65 3d 3d 35 20 29 7b 0a 20 20 20 20 2f  type==5 ){.    /
87c0: 2a 20 54 4f 44 4f 3a 20 62 79 74 65 20 6f 72 64  * TODO: byte ord
87d0: 65 72 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 61 73  ering? */.    as
87e0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 6f 75  sert( sizeof(dou
87f0: 62 6c 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 6d  ble)==8 );.    m
8800: 65 6d 63 70 79 28 62 75 66 2c 20 26 70 4d 65 6d  emcpy(buf, &pMem
8810: 2d 3e 72 2c 20 38 29 3b 0a 20 20 20 20 72 65 74  ->r, 8);.    ret
8820: 75 72 6e 20 38 3b 0a 20 20 7d 0a 20 20 0a 20 20  urn 8;.  }.  .  
8830: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
8840: 62 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  b */.  assert( s
8850: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
8860: 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ;.  len = sqlite
8870: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
8880: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
8890: 0a 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70  .  memcpy(buf, p
88a0: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
88b0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f  return len;.}../
88c0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
88d0: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
88e0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
88f0: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
8900: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
8910: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
8920: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
8930: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8940: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
8950: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
8960: 62 65 53 65 72 69 61 6c 47 65 74 28 63 6f 6e 73  beSerialGet(cons
8970: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8980: 2a 62 75 66 2c 20 75 36 34 20 73 65 72 69 61 6c  *buf, u64 serial
8990: 5f 74 79 70 65 2c 20 4d 65 6d 20 2a 70 4d 65 6d  _type, Mem *pMem
89a0: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  ){.  int len;.. 
89b0: 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
89c0: 74 79 70 65 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  type!=0 );..  /*
89d0: 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
89e0: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 29 29 3b 20   sizeof(pMem)); 
89f0: 2a 2f 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  */.  pMem->flags
8a00: 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20   = 0;.  pMem->z 
8a10: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  = 0;..  /* NULL 
8a20: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
8a30: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70  type==6 ){.    p
8a40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8a50: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 72 65 74 75 72  _Null;.    retur
8a60: 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  n 0;.  }. .  /* 
8a70: 49 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 66 28  Integer */.  if(
8a80: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 35 20 29   serial_type<5 )
8a90: 7b 0a 20 20 20 20 69 36 34 20 69 20 3d 20 30 3b  {.    i64 i = 0;
8aa0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
8ab0: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62  len = sqlite3Vdb
8ac0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
8ad0: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20  erial_type);..  
8ae0: 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
8af0: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e  0 ){.      for(n
8b00: 3d 30 3b 20 6e 3c 28 38 2d 6c 65 6e 29 3b 20 6e  =0; n<(8-len); n
8b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ++){.        i =
8b20: 20 28 69 3c 3c 38 29 2b 30 78 46 46 3b 0a 20 20   (i<<8)+0xFF;.  
8b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8b40: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6c 65 6e 3b 20  for(n=0; n<len; 
8b50: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 3d 20  n++){.      i = 
8b60: 69 20 3c 3c 20 38 3b 0a 20 20 20 20 20 20 69 20  i << 8;.      i 
8b70: 3d 20 69 20 2b 20 62 75 66 5b 6e 5d 3b 0a 20 20  = i + buf[n];.  
8b80: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
8b90: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
8ba0: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 0a     pMem->i = i;.
8bb0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8bc0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
8bd0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
8be0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 6f 61  ;.  }..  /* Floa
8bf0: 74 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  t */.  if( seria
8c00: 6c 5f 74 79 70 65 3d 3d 35 20 29 7b 0a 20 20 20  l_type==5 ){.   
8c10: 20 2f 2a 20 54 4f 44 4f 3a 20 62 79 74 65 20 6f   /* TODO: byte o
8c20: 72 64 65 72 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  rdering? */.    
8c30: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
8c40: 6f 75 62 6c 65 29 3d 3d 38 20 29 3b 0a 20 20 20  ouble)==8 );.   
8c50: 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
8c60: 2c 20 62 75 66 2c 20 38 29 3b 0a 20 20 20 20 70  , buf, 8);.    p
8c70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8c80: 5f 52 65 61 6c 3b 0a 20 20 20 20 72 65 74 75 72  _Real;.    retur
8c90: 6e 20 38 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n 8;.  }.  .  /*
8ca0: 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
8cb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 65 72  */.  assert( ser
8cc0: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a  ial_type>=12 );.
8cd0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
8ce0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
8cf0: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
8d00: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
8d10: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 70 4d 65  &0x01 ){.    pMe
8d20: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
8d30: 74 72 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  tr;.    pMem->n 
8d40: 3d 20 6c 65 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65  = len+1;.  }else
8d50: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  {.    pMem->flag
8d60: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20  s = MEM_Blob;.  
8d70: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
8d80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 70 4d 65  .  }..  if( (pMe
8d90: 6d 2d 3e 6e 29 3e 4e 42 46 53 20 29 7b 0a 20 20  m->n)>NBFS ){.  
8da0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69    pMem->z = sqli
8db0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 4d 65  teMallocRaw( pMe
8dc0: 6d 2d 3e 6e 20 29 3b 0a 20 20 20 20 69 66 28 20  m->n );.    if( 
8dd0: 21 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  !pMem->z ){.    
8de0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
8df0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
8e00: 67 73 20 7c 3d 20 4d 45 4d 5f 44 79 6e 3b 0a 20  gs |= MEM_Dyn;. 
8e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
8e20: 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f  ->z = pMem->zSho
8e30: 72 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  rt;.    pMem->fl
8e40: 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 68 6f 72 74  ags |= MEM_Short
8e50: 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28  ;.  }..  memcpy(
8e60: 70 4d 65 6d 2d 3e 7a 2c 20 62 75 66 2c 20 6c 65  pMem->z, buf, le
8e70: 6e 29 3b 20 0a 20 20 69 66 28 20 70 4d 65 6d 2d  n); .  if( pMem-
8e80: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  >flags&MEM_Str )
8e90: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 6c 65  {.    pMem->z[le
8ea0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  n] = '\0';.  }..
8eb0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a    return len;.}.
8ec0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
8ed0: 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
8ee0: 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
8ef0: 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
8f00: 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
8f10: 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
8f20: 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
8f30: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
8f40: 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
8f50: 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
8f60: 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
8f70: 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
8f80: 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
8f90: 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
8fa0: 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
8fb0: 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
8fc0: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
8fd0: 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
8fe0: 70 28 29 20 61 6e 64 0a 2a 2a 20 66 69 6e 61 6c  p() and.** final
8ff0: 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
9000: 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
9010: 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
9020: 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
9030: 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
9040: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
9050: 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
9060: 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
9070: 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
9080: 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
9090: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
90a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
90b0: 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
90c0: 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
90d0: 20 2f 2a 20 49 6e 74 65 72 63 68 61 6e 67 65 20   /* Interchange 
90e0: 70 4d 65 6d 31 20 61 6e 64 20 70 4d 65 6d 32 20  pMem1 and pMem2 
90f0: 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  if the collating
9100: 20 73 65 71 75 65 6e 63 65 20 73 70 65 63 69 66   sequence specif
9110: 69 65 73 0a 20 20 2a 2a 20 44 45 53 43 20 6f 72  ies.  ** DESC or
9120: 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  der..  */.  if( 
9130: 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
9140: 72 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a  reverseOrder ){.
9150: 20 20 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70      const Mem *p
9160: 54 65 6d 70 20 3d 20 70 4d 65 6d 31 3b 0a 20 20  Temp = pMem1;.  
9170: 20 20 70 4d 65 6d 31 20 3d 20 70 4d 65 6d 32 3b    pMem1 = pMem2;
9180: 0a 20 20 20 20 70 4d 65 6d 32 20 3d 20 70 54 65  .    pMem2 = pTe
9190: 6d 70 3b 0a 20 20 7d 0a 20 20 66 31 20 3d 20 70  mp;.  }.  f1 = p
91a0: 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
91b0: 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
91c0: 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
91d0: 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 0a 20 20  gs = f1|f2;. .  
91e0: 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
91f0: 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
9200: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
9210: 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
9220: 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
9230: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
9240: 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
9250: 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
9260: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
9270: 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
9280: 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
9290: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
92a0: 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61  ue is a number a
92b0: 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
92c0: 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  not, the number 
92d0: 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
92e0: 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72   both are number
92f0: 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65  s, compare as re
9300: 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20  als if one is a 
9310: 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65  real, or as inte
9320: 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74  gers.  ** if bot
9330: 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74  h values are int
9340: 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  egers..  */.  if
9350: 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
9360: 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
9370: 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  al) ){.    if( !
9380: 28 66 31 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  (f1&(MEM_Int|MEM
9390: 5f 52 65 61 6c 29 29 20 29 7b 0a 20 20 20 20 20  _Real)) ){.     
93a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
93b0: 0a 20 20 20 20 69 66 28 20 21 28 66 32 26 28 4d  .    if( !(f2&(M
93c0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
93d0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
93e0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
93f0: 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
9400: 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20  EM_Int)==0 ){.  
9410: 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72      double r1, r
9420: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 31  2;.      if( (f1
9430: 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b  &MEM_Real)==0 ){
9440: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 4d  .        r1 = pM
9450: 65 6d 31 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65  em1->i;.      }e
9460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
9470: 3d 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 20  = pMem1->r;.    
9480: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 66    }.      if( (f
9490: 32 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  2&MEM_Real)==0 )
94a0: 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 70  {.        r2 = p
94b0: 4d 65 6d 32 2d 3e 69 3b 0a 20 20 20 20 20 20 7d  Mem2->i;.      }
94c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32  else{.        r2
94d0: 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20   = pMem2->r;.   
94e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
94f0: 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31  1<r2 ) return -1
9500: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31 3e 72  ;.      if( r1>r
9510: 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  2 ) return 1;.  
9520: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9540: 73 73 65 72 74 28 20 66 31 26 4d 45 4d 5f 49 6e  ssert( f1&MEM_In
9550: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
9560: 74 28 20 66 32 26 4d 45 4d 5f 49 6e 74 20 29 3b  t( f2&MEM_Int );
9570: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
9580: 2d 3e 69 20 3c 20 70 4d 65 6d 32 2d 3e 69 20 29  ->i < pMem2->i )
9590: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
95a0: 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 69 20 3e    if( pMem1->i >
95b0: 20 70 4d 65 6d 32 2d 3e 69 20 29 20 72 65 74 75   pMem2->i ) retu
95c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
95d0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
95e0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
95f0: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
9600: 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
9610: 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
9620: 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
9630: 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
9640: 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
9650: 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
9660: 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
9670: 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
9680: 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
9690: 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
96a0: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
96b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
96c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
96d0: 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
96e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
96f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
9700: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
9710: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 72  >xCmp ){.      r
9720: 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
9730: 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
9740: 70 4d 65 6d 31 2d 3e 6e 2c 20 70 4d 65 6d 31 2d  pMem1->n, pMem1-
9750: 3e 7a 2c 20 70 4d 65 6d 32 2d 3e 6e 2c 20 70 4d  >z, pMem2->n, pM
9760: 65 6d 32 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  em2->z);.    }el
9770: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
9780: 6e 6f 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  no collating seq
9790: 75 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  uence is defined
97a0: 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  , fall through i
97b0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
97c0: 20 62 6c 6f 62 20 63 61 73 65 20 62 65 6c 6f 77   blob case below
97d0: 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
97e0: 29 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72  ) for the compar
97f0: 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ison. */.    }. 
9800: 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
9810: 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
9820: 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
9830: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 0a 20 20  ing memcmp()..  
9840: 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  */.  rc = memcmp
9850: 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32  (pMem1->z, pMem2
9860: 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70  ->z, (pMem1->n>p
9870: 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e  Mem2->n)?pMem2->
9880: 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20 69  n:pMem1->n);.  i
9890: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
98a0: 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d 20  rc = pMem1->n - 
98b0: 70 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a 20 20  pMem2->n;.  }.  
98c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
98d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
98e0: 67 20 69 73 20 74 68 65 20 63 6f 6d 70 61 72 69  g is the compari
98f0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  son function for
9900: 20 28 6e 6f 6e 2d 69 6e 74 65 67 65 72 29 0a 2a   (non-integer).*
9910: 2a 20 6b 65 79 73 20 69 6e 20 74 68 65 20 62 74  * keys in the bt
9920: 72 65 65 73 2e 20 20 54 68 69 73 20 66 75 6e 63  rees.  This func
9930: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 65 67  tion returns neg
9940: 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a  ative, zero, or.
9950: 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  ** positive if t
9960: 68 65 20 66 69 72 73 74 20 6b 65 79 20 69 73 20  he first key is 
9970: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
9980: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
9990: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f  than.** the seco
99a0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  nd..**.** This f
99b0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
99c0: 74 68 61 74 20 65 61 63 68 20 6b 65 79 20 63 6f  that each key co
99d0: 6e 73 69 73 74 73 20 6f 66 20 6f 6e 65 20 6f 72  nsists of one or
99e0: 20 6d 6f 72 65 20 74 79 70 65 2f 62 6c 6f 62 0a   more type/blob.
99f0: 2a 2a 20 70 61 69 72 73 2c 20 65 6e 63 6f 64 65  ** pairs, encode
9a00: 64 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  d using the sqli
9a10: 74 65 33 56 64 62 65 53 65 72 69 61 6c 58 58 58  te3VdbeSerialXXX
9a20: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f  () functions abo
9a30: 76 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 6c 6c 6f  ve. .**.** Follo
9a40: 77 69 6e 67 20 74 68 65 20 74 79 70 65 2f 62 6c  wing the type/bl
9a50: 6f 62 20 70 61 69 72 73 2c 20 65 61 63 68 20 6b  ob pairs, each k
9a60: 65 79 20 6d 61 79 20 68 61 76 65 20 61 20 73 69  ey may have a si
9a70: 6e 67 6c 65 20 30 78 30 30 20 62 79 74 65 0a 2a  ngle 0x00 byte.*
9a80: 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
9a90: 76 61 72 69 6e 74 2e 20 41 20 6b 65 79 20 6d 61  varint. A key ma
9aa0: 79 20 6f 6e 6c 79 20 68 61 76 65 20 74 68 69 73  y only have this
9ab0: 20 74 72 61 6c 69 6e 67 20 30 78 30 30 2f 76 61   traling 0x00/va
9ac0: 72 69 6e 74 0a 2a 2a 20 70 61 69 72 20 69 66 20  rint.** pair if 
9ad0: 69 74 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  it has at least 
9ae0: 61 73 20 6d 61 6e 79 20 74 79 70 65 2f 62 6c 6f  as many type/blo
9af0: 62 20 70 61 69 72 73 20 61 73 20 74 68 65 20 6b  b pairs as the k
9b00: 65 79 20 69 74 20 69 73 20 62 65 69 6e 67 0a 2a  ey it is being.*
9b10: 2a 20 63 6f 6d 70 61 72 65 64 20 74 6f 2e 0a 2a  * compared to..*
9b20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
9b30: 65 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 76  eKeyCompare(.  v
9b40: 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20  oid *userData,. 
9b50: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
9b60: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
9b70: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
9b80: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
9b90: 7b 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d  {.  Cursor *pC =
9ba0: 20 28 43 75 72 73 6f 72 20 2a 29 75 73 65 72 44   (Cursor *)userD
9bb0: 61 74 61 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65  ata;.  int offse
9bc0: 74 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 66  t1 = 0;.  int of
9bd0: 66 73 65 74 32 20 3d 20 30 3b 0a 20 20 63 6f 6e  fset2 = 0;.  con
9be0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9bf0: 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
9c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9c10: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
9c20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
9c30: 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key2 = (const un
9c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
9c50: 65 79 32 3b 0a 20 20 0a 20 20 77 68 69 6c 65 28  ey2;.  .  while(
9c60: 20 6f 66 66 73 65 74 31 3c 6e 4b 65 79 31 20 26   offset1<nKey1 &
9c70: 26 20 6f 66 66 73 65 74 32 3c 6e 4b 65 79 32 20  & offset2<nKey2 
9c80: 29 7b 0a 20 20 20 20 4d 65 6d 20 6d 65 6d 31 3b  ){.    Mem mem1;
9c90: 0a 20 20 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20  .    Mem mem2;. 
9ca0: 20 20 20 75 36 34 20 73 65 72 69 61 6c 5f 74 79     u64 serial_ty
9cb0: 70 65 31 3b 0a 20 20 20 20 75 36 34 20 73 65 72  pe1;.    u64 ser
9cc0: 69 61 6c 5f 74 79 70 65 32 3b 0a 20 20 20 20 69  ial_type2;.    i
9cd0: 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 52  nt rc;..    /* R
9ce0: 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
9cf0: 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
9d00: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
9d10: 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 6f 66  h key. */.    of
9d20: 66 73 65 74 31 20 2b 3d 20 73 71 6c 69 74 65 33  fset1 += sqlite3
9d30: 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79 31  GetVarint(&aKey1
9d40: 5b 6f 66 66 73 65 74 31 5d 2c 20 26 73 65 72 69  [offset1], &seri
9d50: 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 6f  al_type1);.    o
9d60: 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65  ffset2 += sqlite
9d70: 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79  3GetVarint(&aKey
9d80: 32 5b 6f 66 66 73 65 74 32 5d 2c 20 26 73 65 72  2[offset2], &ser
9d90: 69 61 6c 5f 74 79 70 65 32 29 3b 0a 0a 20 20 20  ial_type2);..   
9da0: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66   /* If either of
9db0: 20 74 68 65 20 76 61 72 69 6e 74 73 20 6a 75 73   the varints jus
9dc0: 74 20 72 65 61 64 20 69 6e 20 61 72 65 20 30 20  t read in are 0 
9dd0: 28 6e 6f 74 20 61 20 74 79 70 65 29 2c 20 74 68  (not a type), th
9de0: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  en.    ** this i
9df0: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  s the end of the
9e00: 20 6b 65 79 73 2e 20 54 68 65 20 72 65 6d 61 69   keys. The remai
9e10: 6e 69 6e 67 20 64 61 74 61 20 69 6e 20 65 61 63  ning data in eac
9e20: 68 20 6b 65 79 20 69 73 0a 20 20 20 20 2a 2a 20  h key is.    ** 
9e30: 74 68 65 20 76 61 72 69 6e 74 20 72 6f 77 69 64  the varint rowid
9e40: 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 73 65 20  . Compare these 
9e50: 61 73 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  as signed intege
9e60: 72 73 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  rs and return.  
9e70: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e    ** the result.
9e80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9e90: 21 73 65 72 69 61 6c 5f 74 79 70 65 31 20 7c 7c  !serial_type1 ||
9ea0: 20 21 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29   !serial_type2 )
9eb0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9ec0: 21 73 65 72 69 61 6c 5f 74 79 70 65 31 20 26 26  !serial_type1 &&
9ed0: 20 21 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29   !serial_type2 )
9ee0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ef0: 21 70 43 20 7c 7c 20 21 70 43 2d 3e 69 6e 63 72  !pC || !pC->incr
9f00: 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Key );.      sql
9f10: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
9f20: 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26  Key1[offset1], &
9f30: 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20  serial_type1);. 
9f40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 56       sqlite3GetV
9f50: 61 72 69 6e 74 28 26 61 4b 65 79 32 5b 6f 66 66  arint(&aKey2[off
9f60: 73 65 74 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74  set2], &serial_t
9f70: 79 70 65 32 29 3b 0a 20 20 20 20 20 20 72 65 74  ype2);.      ret
9f80: 75 72 6e 20 28 20 28 69 36 34 29 73 65 72 69 61  urn ( (i64)seria
9f90: 6c 5f 74 79 70 65 31 20 2d 20 28 69 36 34 29 73  l_type1 - (i64)s
9fa0: 65 72 69 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20  erial_type2 );. 
9fb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73     }..    /* Ass
9fc0: 65 72 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ert that there i
9fd0: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  s enough space l
9fe0: 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 20  eft in each key 
9ff0: 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a  for the blob of.
a000: 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 67      ** data to g
a010: 6f 20 77 69 74 68 20 74 68 65 20 73 65 72 69 61  o with the seria
a020: 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 64  l type just read
a030: 2e 20 54 68 69 73 20 61 73 73 65 72 74 20 6d 61  . This assert ma
a040: 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a  y fail if.    **
a050: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
a060: 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 65  rupted.  Then re
a070: 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ad the value fro
a080: 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f 20  m each key into 
a090: 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20  mem1.    ** and 
a0a0: 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 6c  mem2 respectivel
a0b0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f 66  y..    */.    of
a0c0: 66 73 65 74 31 20 2b 3d 20 73 71 6c 69 74 65 33  fset1 += sqlite3
a0d0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
a0e0: 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 73  Key1[offset1], s
a0f0: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
a100: 6d 31 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 32  m1);.    offset2
a110: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
a120: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32 5b  erialGet(&aKey2[
a130: 6f 66 66 73 65 74 32 5d 2c 20 73 65 72 69 61 6c  offset2], serial
a140: 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a  _type2, &mem2);.
a150: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a160: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
a170: 31 2c 20 26 6d 65 6d 32 2c 20 30 29 3b 0a 20 20  1, &mem2, 0);.  
a180: 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73    if( mem1.flags
a190: 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20  &MEM_Dyn ){.    
a1a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d    sqliteFree(mem
a1b0: 31 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1.z);.    }.    
a1c0: 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 26 4d  if( mem2.flags&M
a1d0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
a1e0: 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d 32 2e  sqliteFree(mem2.
a1f0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
a200: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
a210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a220: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20  }.  }..  /* One 
a230: 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
a240: 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62  out of fields, b
a250: 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ut all the field
a260: 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
a270: 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75  nt.  ** were equ
a280: 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b  al. If the incrK
a290: 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ey flag is true,
a2a0: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
a2b0: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65   key is.  ** tre
a2c0: 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a  ated as larger..
a2d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 20 26 26    */.  if( pC &&
a2e0: 20 70 43 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a   pC->incrKey ){.
a2f0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
a300: 65 74 32 3d 3d 6e 4b 65 79 32 20 29 3b 0a 20 20  et2==nKey2 );.  
a310: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
a320: 0a 0a 20 20 69 66 28 20 6f 66 66 73 65 74 31 3c  ..  if( offset1<
a330: 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 72 65 74  nKey1 ){.    ret
a340: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
a350: 20 6f 66 66 73 65 74 32 3c 6e 4b 65 79 32 20 29   offset2<nKey2 )
a360: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
a370: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
a380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a390: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
a3a0: 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
a3b0: 72 6f 77 20 72 65 63 6f 72 64 73 20 73 70 65 63  row records spec
a3c0: 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b  ified by .** {nK
a3d0: 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
a3e0: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20  {nKey2, pKey2}, 
a3f0: 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61  returning a nega
a400: 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
a410: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
a420: 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  r if {nKey1, pKe
a430: 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e  y1} is less than
a440: 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
a450: 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b  * greater than {
a460: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 0a 2a  nKey2, pKey2}..*
a470: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a480: 6f 6e 20 69 73 20 70 72 65 74 74 79 20 69 6e 65  on is pretty ine
a490: 66 66 69 63 69 65 6e 74 20 61 6e 64 20 77 69 6c  fficient and wil
a4a0: 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20 72 65  l probably be re
a4b0: 70 6c 61 63 65 64 0a 2a 2a 20 62 79 20 73 6f 6d  placed.** by som
a4c0: 65 74 68 69 6e 67 20 65 6c 73 65 20 69 6e 20 74  ething else in t
a4d0: 68 65 20 6e 65 61 72 20 66 75 74 75 72 65 2e 20  he near future. 
a4e0: 49 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  It is currently 
a4f0: 72 65 71 75 69 72 65 64 0a 2a 2a 20 62 79 20 63  required.** by c
a500: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 6f  ompound SELECT o
a510: 70 65 72 61 74 6f 72 73 2e 20 0a 2a 2f 0a 69 6e  perators. .*/.in
a520: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 6f 77  t sqlite3VdbeRow
a530: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
a540: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
a550: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
a560: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
a570: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
a580: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
a590: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 28 43 75  Cursor *pC = (Cu
a5a0: 72 73 6f 72 20 2a 29 75 73 65 72 44 61 74 61 3b  rsor *)userData;
a5b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 31 20 3d  .  int offset1 =
a5c0: 20 30 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   0;.  int offset
a5d0: 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 6f 66  2 = 0;.  int tof
a5e0: 66 73 65 74 31 20 3d 20 30 3b 0a 20 20 69 6e 74  fset1 = 0;.  int
a5f0: 20 74 6f 66 66 73 65 74 32 20 3d 20 30 3b 0a 20   toffset2 = 0;. 
a600: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
a610: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
a620: 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
a630: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
a640: 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ey1;.  const uns
a650: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
a660: 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  2 = (const unsig
a670: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32  ned char *)pKey2
a680: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 20  ;..  assert( pC 
a690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
a6a0: 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 0a 20 20  >nField>0 );..  
a6b0: 66 6f 72 28 20 69 3d 30 3b 20 69 3c 70 43 2d 3e  for( i=0; i<pC->
a6c0: 6e 46 69 65 6c 64 3b 20 69 2b 2b 20 29 7b 0a 20  nField; i++ ){. 
a6d0: 20 20 20 75 36 34 20 64 75 6d 6d 79 3b 0a 20 20     u64 dummy;.  
a6e0: 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73 71 6c    offset1 += sql
a6f0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
a700: 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26  Key1[offset1], &
a710: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 6f 66 66 73  dummy);.    offs
a720: 65 74 32 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  et2 += sqlite3Ge
a730: 74 56 61 72 69 6e 74 28 26 61 4b 65 79 31 5b 6f  tVarint(&aKey1[o
a740: 66 66 73 65 74 31 5d 2c 20 26 64 75 6d 6d 79 29  ffset1], &dummy)
a750: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 20 69 3d  ;.  }..  for( i=
a760: 30 3b 20 69 3c 70 43 2d 3e 6e 46 69 65 6c 64 3b  0; i<pC->nField;
a770: 20 69 2b 2b 20 29 7b 0a 20 20 20 20 4d 65 6d 20   i++ ){.    Mem 
a780: 6d 65 6d 31 3b 0a 20 20 20 20 4d 65 6d 20 6d 65  mem1;.    Mem me
a790: 6d 32 3b 0a 20 20 20 20 75 36 34 20 73 65 72 69  m2;.    u64 seri
a7a0: 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75 36  al_type1;.    u6
a7b0: 34 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a  4 serial_type2;.
a7c0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
a7d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
a7e0: 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
a7f0: 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
a800: 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
a810: 20 20 20 74 6f 66 66 73 65 74 31 20 2b 3d 20 73     toffset1 += s
a820: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
a830: 26 61 4b 65 79 31 5b 74 6f 66 66 73 65 74 31 5d  &aKey1[toffset1]
a840: 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 31 29  , &serial_type1)
a850: 3b 0a 20 20 20 20 74 6f 66 66 73 65 74 32 20 2b  ;.    toffset2 +
a860: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
a870: 6e 74 28 26 61 4b 65 79 32 5b 74 6f 66 66 73 65  nt(&aKey2[toffse
a880: 74 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  t2], &serial_typ
a890: 65 32 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  e2);..    assert
a8a0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 26  ( serial_type1 &
a8b0: 26 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29  & serial_type2 )
a8c0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73 65 72 74  ;..    /* Assert
a8d0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
a8e0: 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
a8f0: 20 69 6e 20 65 61 63 68 20 6b 65 79 20 66 6f 72   in each key for
a900: 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20   the blob of.   
a910: 20 2a 2a 20 64 61 74 61 20 74 6f 20 67 6f 20 77   ** data to go w
a920: 69 74 68 20 74 68 65 20 73 65 72 69 61 6c 20 74  ith the serial t
a930: 79 70 65 20 6a 75 73 74 20 72 65 61 64 2e 20 54  ype just read. T
a940: 68 69 73 20 61 73 73 65 72 74 20 6d 61 79 20 66  his assert may f
a950: 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ail if.    ** th
a960: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
a970: 74 65 64 2e 20 20 54 68 65 6e 20 72 65 61 64 20  ted.  Then read 
a980: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 65  the value from e
a990: 61 63 68 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d  ach key into mem
a9a0: 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d  1.    ** and mem
a9b0: 32 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  2 respectively..
a9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 6f 66 66 73 65      */.    offse
a9d0: 74 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  t1 += sqlite3Vdb
a9e0: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
a9f0: 31 5b 6f 66 66 73 65 74 31 5d 2c 20 73 65 72 69  1[offset1], seri
aa00: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
aa10: 3b 0a 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d  ;.    offset2 +=
aa20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
aa30: 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 6f 66 66  alGet(&aKey2[off
aa40: 73 65 74 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79  set2], serial_ty
aa50: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20  pe2, &mem2);..  
aa60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
aa70: 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
aa80: 26 6d 65 6d 32 2c 20 30 29 3b 0a 20 20 20 20 69  &mem2, 0);.    i
aa90: 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 26 4d 45  f( mem1.flags&ME
aaa0: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73  M_Dyn ){.      s
aab0: 71 6c 69 74 65 46 72 65 65 28 6d 65 6d 31 2e 7a  qliteFree(mem1.z
aac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
aad0: 20 6d 65 6d 32 2e 66 6c 61 67 73 26 4d 45 4d 5f   mem2.flags&MEM_
aae0: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Dyn ){.      sql
aaf0: 69 74 65 46 72 65 65 28 6d 65 6d 32 2e 7a 29 3b  iteFree(mem2.z);
ab00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
ab10: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
ab20: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
ab30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
ab40: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
ab50: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
ab60: 64 65 78 20 65 6e 74 72 79 2e 20 52 65 61 64 20  dex entry. Read 
ab70: 74 68 65 20 72 6f 77 69 64 20 28 76 61 72 69 6e  the rowid (varin
ab80: 74 20 6f 63 63 75 72 69 6e 67 20 61 74 0a 2a 2a  t occuring at.**
ab90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
aba0: 65 6e 74 72 79 20 61 6e 64 20 73 74 6f 72 65 20  entry and store 
abb0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 20 52 65  it in *rowid. Re
abc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
abd0: 66 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20  f.** everything 
abe0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
abf0: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
ac00: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
ac10: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
ac20: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
ac30: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
ac40: 20 73 7a 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   sz;.  int rc;. 
ac50: 20 63 68 61 72 20 62 75 66 5b 31 30 5d 3b 0a 20   char buf[10];. 
ac60: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 75 36 34 20   int len;.  u64 
ac70: 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r;..  rc = sqlit
ac80: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
ac90: 43 75 72 2c 20 26 73 7a 29 3b 0a 20 20 69 66 28  Cur, &sz);.  if(
aca0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
acb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
acc0: 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20 28 28 73  .  }.  len = ((s
acd0: 7a 3e 31 30 29 3f 31 30 3a 73 7a 29 3b 0a 0a 20  z>10)?10:sz);.. 
ace0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
acf0: 20 6c 65 73 73 20 74 68 61 6e 20 32 20 62 79 74   less than 2 byt
ad00: 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2c 20 74  es in the key, t
ad10: 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  his cannot be.  
ad20: 2a 2a 20 61 20 76 61 6c 69 64 20 69 6e 64 65 78  ** a valid index
ad30: 20 65 6e 74 72 79 2e 20 49 6e 20 70 72 61 63 74   entry. In pract
ad40: 69 63 65 20 74 68 69 73 20 63 6f 6d 65 73 20 75  ice this comes u
ad50: 70 20 66 6f 72 20 61 20 71 75 65 72 79 0a 20 20  p for a query.  
ad60: 2a 2a 20 6f 66 20 74 68 65 20 73 6f 72 74 20 22  ** of the sort "
ad70: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
ad80: 4f 4d 20 74 31 3b 22 20 77 68 65 6e 20 74 31 20  OM t1;" when t1 
ad90: 69 73 20 61 6e 20 65 6d 70 74 79 20 74 61 62 6c  is an empty tabl
ada0: 65 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 69  e.  ** with an i
adb0: 6e 64 65 78 20 6f 6e 20 78 2e 20 49 6e 20 74 68  ndex on x. In th
adc0: 69 73 20 63 61 73 65 20 6a 75 73 74 20 63 61 6c  is case just cal
add0: 6c 20 74 68 65 20 72 6f 77 69 64 20 30 2e 0a 20  l the rowid 0.. 
ade0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e 3c 32 20   */.  if( len<2 
adf0: 29 7b 0a 20 20 20 20 2a 72 6f 77 69 64 20 3d 20  ){.    *rowid = 
ae00: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
ae10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
ae20: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ae30: 65 4b 65 79 28 70 43 75 72 2c 20 73 7a 2d 6c 65  eKey(pCur, sz-le
ae40: 6e 2c 20 6c 65 6e 2c 20 62 75 66 29 3b 0a 20 20  n, len, buf);.  
ae50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ae60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
ae70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 6c 65 6e 2d 2d  rc;.  }..  len--
ae80: 3b 0a 20 20 77 68 69 6c 65 28 20 62 75 66 5b 6c  ;.  while( buf[l
ae90: 65 6e 2d 31 5d 20 26 26 20 2d 2d 6c 65 6e 20 29  en-1] && --len )
aea0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  ;..  sqlite3GetV
aeb0: 61 72 69 6e 74 28 26 62 75 66 5b 6c 65 6e 5d 2c  arint(&buf[len],
aec0: 20 26 72 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &r);.  *rowid =
aed0: 20 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   r;.  return SQL
aee0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
aef0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
af00: 20 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 79 20   of index entry 
af10: 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
af20: 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
af30: 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
af40: 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
af50: 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
af60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
af70: 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
af80: 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
af90: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
afa0: 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
afb0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
afc0: 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
afd0: 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
afe0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
aff0: 63 65 73 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cess..*/.int sql
b000: 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
b010: 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20  mpare(.  Cursor 
b020: 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
b030: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
b040: 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
b050: 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ainst */.  int n
b060: 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Key, const u8 *p
b070: 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65  Key,   /* The ke
b080: 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
b090: 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b0b0: 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
b0c0: 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
b0d0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
b0e0: 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 4b 65  ed char *pCellKe
b0f0: 79 3b 0a 20 20 75 36 34 20 6e 43 65 6c 6c 4b 65  y;.  u64 nCellKe
b100: 79 3b 0a 20 20 69 6e 74 20 66 72 65 65 43 65 6c  y;.  int freeCel
b110: 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
b120: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  rc;.  int len;. 
b130: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
b140: 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 0a  = pC->pCursor;..
b150: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
b160: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
b170: 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
b180: 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
b190: 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
b1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b1b0: 0a 20 20 7d 0a 0a 20 20 70 43 65 6c 6c 4b 65 79  .  }..  pCellKey
b1c0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
b1d0: 72 20 2a 29 73 71 6c 69 74 65 33 42 74 72 65 65  r *)sqlite3Btree
b1e0: 4b 65 79 46 65 74 63 68 28 70 43 75 72 2c 20 6e  KeyFetch(pCur, n
b1f0: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
b200: 21 70 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  !pCellKey ){.   
b210: 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 75 6e 73   pCellKey = (uns
b220: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
b230: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6e 43 65  iteMallocRaw(nCe
b240: 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  llKey);.    if( 
b250: 21 70 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  !pCellKey ){.   
b260: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b270: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
b280: 20 20 66 72 65 65 43 65 6c 6c 4b 65 79 20 3d 20    freeCellKey = 
b290: 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  1;.    rc = sqli
b2a0: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
b2b0: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  , 0, nCellKey, p
b2c0: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 69 66  CellKey);.    if
b2d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b2e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
b2f0: 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
b300: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
b310: 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 6c 65      }.  }. .  le
b320: 6e 20 3d 20 6e 43 65 6c 6c 4b 65 79 2d 32 3b 0a  n = nCellKey-2;.
b330: 20 20 77 68 69 6c 65 28 20 70 43 65 6c 6c 4b 65    while( pCellKe
b340: 79 5b 6c 65 6e 5d 20 26 26 20 2d 2d 6c 65 6e 20  y[len] && --len 
b350: 29 3b 0a 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c  );..  *res = sql
b360: 69 74 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61  ite3VdbeKeyCompa
b370: 72 65 28 70 43 2c 20 6c 65 6e 2c 20 70 43 65 6c  re(pC, len, pCel
b380: 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
b390: 29 3b 0a 20 20 0a 20 20 69 66 28 20 66 72 65 65  );.  .  if( free
b3a0: 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 73  CellKey ){.    s
b3b0: 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b  qliteFree(pCellK
b3c0: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
b3d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.