/ Hex Artifact Content
Login

Artifact 7162f1390620257e25070da1ac2b4ec83e472752:


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