/ Hex Artifact Content
Login

Artifact 0039a786c6d1c1eeff36f50ad2c528de70e11b26:


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