/ Hex Artifact Content
Login

Artifact 1e1aed6b07a02bf0768c9bf9eae06c9b488c560a:


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: 7a 56 61 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  zVar */.    );. 
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 7a 56 61 72 20 3d 20 28 4d 65    p->azVar = (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 7a 56  +){.      p->azV
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 7a 56 61 72 69 61 62 6c 65 5b 5d 20  he azVariable[] 
4ff0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
5000: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
5010: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
5020: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
5030: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 54 6f   ){.    Mem *pTo
5040: 73 20 3d 20 70 2d 3e 70 54 6f 73 3b 0a 20 20 20  s = p->pTos;.   
5050: 20 77 68 69 6c 65 28 20 70 54 6f 73 3e 3d 70 2d   while( pTos>=p-
5060: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  >aStack ){.     
5070: 20 69 66 28 20 70 54 6f 73 2d 3e 66 6c 61 67 73   if( pTos->flags
5080: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
5090: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
50a0: 28 70 54 6f 73 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pTos->z);.     
50b0: 20 7d 0a 20 20 20 20 20 20 70 54 6f 73 2d 2d 3b   }.      pTos--;
50c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 54  .    }.    p->pT
50d0: 6f 73 20 3d 20 70 54 6f 73 3b 0a 20 20 7d 0a 20  os = pTos;.  }. 
50e0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
50f0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
5100: 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
5110: 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
5120: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
5130: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26  >aMem[i].flags &
5140: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
5150: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5160: 2d 3e 61 4d 65 6d 5b 69 5d 2e 7a 29 3b 0a 20 20  ->aMem[i].z);.  
5170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5180: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5190: 61 4d 65 6d 29 3b 0a 20 20 70 2d 3e 61 4d 65 6d  aMem);.  p->aMem
51a0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20   = 0;.  p->nMem 
51b0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  = 0;.  if( p->pL
51c0: 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ist ){.    sqlit
51d0: 65 33 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65  e3VdbeKeylistFre
51e0: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  e(p->pList);.   
51f0: 20 70 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20   p->pList = 0;. 
5200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
5210: 53 6f 72 74 65 72 52 65 73 65 74 28 70 29 3b 0a  SorterReset(p);.
5220: 20 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 20 29    if( p->pFile )
5230: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69  {.    if( p->pFi
5240: 6c 65 21 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f  le!=stdin ) fclo
5250: 73 65 28 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20  se(p->pFile);.  
5260: 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a    p->pFile = 0;.
5270: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 46    }.  if( p->azF
5280: 69 65 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ield ){.    sqli
5290: 74 65 46 72 65 65 28 70 2d 3e 61 7a 46 69 65 6c  teFree(p->azFiel
52a0: 64 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 46 69 65  d);.    p->azFie
52b0: 6c 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  ld = 0;.  }.  p-
52c0: 3e 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 69  >nField = 0;.  i
52d0: 66 28 20 70 2d 3e 7a 4c 69 6e 65 20 29 7b 0a 20  f( p->zLine ){. 
52e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
52f0: 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 70 2d 3e  >zLine);.    p->
5300: 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zLine = 0;.  }. 
5310: 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d   p->nLineAlloc =
5320: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   0;.  sqlite3Vdb
5330: 65 41 67 67 52 65 73 65 74 28 26 70 2d 3e 61 67  eAggReset(&p->ag
5340: 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 65  g);.  if( p->aSe
5350: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
5360: 3b 20 69 3c 70 2d 3e 6e 53 65 74 3b 20 69 2b 2b  ; i<p->nSet; i++
5370: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5380: 48 61 73 68 43 6c 65 61 72 28 26 70 2d 3e 61 53  HashClear(&p->aS
5390: 65 74 5b 69 5d 2e 68 61 73 68 29 3b 0a 20 20 20  et[i].hash);.   
53a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46   }.  }.  sqliteF
53b0: 72 65 65 28 70 2d 3e 61 53 65 74 29 3b 0a 20 20  ree(p->aSet);.  
53c0: 70 2d 3e 61 53 65 74 20 3d 20 30 3b 0a 20 20 70  p->aSet = 0;.  p
53d0: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 69 66  ->nSet = 0;.  if
53e0: 28 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63  ( p->keylistStac
53f0: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  k ){.    int ii;
5400: 0a 20 20 20 20 66 6f 72 28 69 69 20 3d 20 30 3b  .    for(ii = 0;
5410: 20 69 69 20 3c 20 70 2d 3e 6b 65 79 6c 69 73 74   ii < p->keylist
5420: 53 74 61 63 6b 44 65 70 74 68 3b 20 69 69 2b 2b  StackDepth; ii++
5430: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5440: 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28  VdbeKeylistFree(
5450: 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 5b  p->keylistStack[
5460: 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ii]);.    }.    
5470: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 6b 65  sqliteFree(p->ke
5480: 79 6c 69 73 74 53 74 61 63 6b 29 3b 0a 20 20 20  ylistStack);.   
5490: 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b   p->keylistStack
54a0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  Depth = 0;.    p
54b0: 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 20 3d  ->keylistStack =
54c0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
54d0: 46 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53  Free(p->contextS
54e0: 74 61 63 6b 29 3b 0a 20 20 70 2d 3e 63 6f 6e 74  tack);.  p->cont
54f0: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
5500: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45  sqliteFree(p->zE
5510: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
5520: 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  rMsg = 0;.}../*.
5530: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
5540: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
5550: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
5560: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
5570: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
5580: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
5590: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
55a0: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
55b0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
55c0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
55d0: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
55e0: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
55f0: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
5600: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
5610: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5620: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 2c  beReset(Vdbe *p,
5630: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
5640: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
5650: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
5660: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  ;..  if( p->magi
5670: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
5680: 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56  N && p->magic!=V
5690: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
56a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
56b0: 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
56c0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72 5f 73   sqlite3_error_s
56d0: 74 72 69 6e 67 28 53 51 4c 49 54 45 5f 4d 49 53  tring(SQLITE_MIS
56e0: 55 53 45 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  USE), (char*)0);
56f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5700: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
5710: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
5720: 29 7b 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72  ){.    if( pzErr
5730: 4d 73 67 20 26 26 20 2a 70 7a 45 72 72 4d 73 67  Msg && *pzErrMsg
5740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  ==0 ){.      *pz
5750: 45 72 72 4d 73 67 20 3d 20 70 2d 3e 7a 45 72 72  ErrMsg = p->zErr
5760: 4d 73 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Msg;.    }else{.
5770: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
5780: 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  (p->zErrMsg);.  
5790: 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d    }.    p->zErrM
57a0: 73 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  sg = 0;.  }else 
57b0: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
57c0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
57d0: 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  g(pzErrMsg, sqli
57e0: 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  te3_error_string
57f0: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
5800: 30 29 3b 0a 20 20 7d 0a 20 20 43 6c 65 61 6e 75  0);.  }.  Cleanu
5810: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  p(p);.  if( p->r
5820: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5830: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
5840: 72 72 6f 72 41 63 74 69 6f 6e 20 29 7b 0a 20 20  rrorAction ){.  
5850: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
5860: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
5870: 20 21 70 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e   !p->undoTransOn
5880: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
5890: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
58a0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
58b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
58c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20  >aDb[i].pBt ){. 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
58e0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
58f0: 6b 53 74 6d 74 28 64 62 2d 3e 61 44 62 5b 69 5d  kStmt(db->aDb[i]
5900: 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20  .pBt);.         
5910: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
5920: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5940: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
5950: 75 67 68 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 20  ugh to ROLLBACK 
5960: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5970: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
5980: 6b 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k: {.        sql
5990: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
59a0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
59b0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
59c0: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20 20  E_InTrans;.     
59d0: 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d     db->onError =
59e0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 20   OE_Default;.   
59f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a00: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
5a10: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
5a20: 20 70 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e 45   p->undoTransOnE
5a30: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
5a40: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
5a50: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
5a60: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
5a70: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
5a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
5a90: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
5aa0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ault;.        }.
5ab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5ac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5ad0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
5ae0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
5af0: 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  db);.  }.  for(i
5b00: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
5b10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
5b20: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 26 26 20 64  >aDb[i].pBt && d
5b30: 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e  b->aDb[i].inTran
5b40: 73 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  s==2 ){.      sq
5b50: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
5b60: 53 74 6d 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  Stmt(db->aDb[i].
5b70: 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  pBt);.      db->
5b80: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d  aDb[i].inTrans =
5b90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
5ba0: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c  assert( p->pTos<
5bb0: 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63  &p->aStack[p->pc
5bc0: 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ] || sqlite3_mal
5bd0: 6c 6f 63 5f 66 61 69 6c 65 64 3d 3d 31 20 29 3b  loc_failed==1 );
5be0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
5bf0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
5c00: 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
5c10: 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
5c20: 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
5c30: 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
5c40: 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
5c50: 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
5c60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5c70: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
5c80: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5c90: 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
5ca0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
5cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
5cc0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
5cd0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
5ce0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
5cf0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
5d00: 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
5d10: 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
5d20: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
5d30: 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
5d40: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
5d50: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
5d60: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
5d70: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
5d80: 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
5d90: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
5da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5db0: 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
5dc0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
5de0: 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
5df0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
5e00: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
5e10: 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
5e20: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
5e30: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
5e40: 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
5e50: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
5e60: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
5e70: 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
5e80: 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
5e90: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
5ea0: 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
5eb0: 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
5ec0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
5ed0: 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 2c 20 63  alize(Vdbe *p, c
5ee0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b  har **pzErrMsg){
5ef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5f00: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
5f10: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
5f20: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d  AGIC_RUN && p->m
5f30: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
5f40: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c  _HALT ){.    sql
5f50: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a  ite3SetString(pz
5f60: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
5f70: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 51 4c  error_string(SQL
5f80: 49 54 45 5f 4d 49 53 55 53 45 29 2c 20 28 63 68  ITE_MISUSE), (ch
5f90: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
5fa0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
5fb0: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 2d 3e  ;.  }.  db = p->
5fc0: 64 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  db;.  rc = sqlit
5fd0: 65 33 56 64 62 65 52 65 73 65 74 28 70 2c 20 70  e3VdbeReset(p, p
5fe0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
5ff0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
6000: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 77 61 6e 74  ;.  if( db->want
6010: 5f 74 6f 5f 63 6c 6f 73 65 20 26 26 20 64 62 2d  _to_close && db-
6020: 3e 70 56 64 62 65 3d 3d 30 20 29 7b 0a 20 20 20  >pVdbe==0 ){.   
6030: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
6040: 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  b);.  }.  if( rc
6050: 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  ==SQLITE_SCHEMA 
6060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
6070: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
6080: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  a(db, 0);.  }.  
6090: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
60a0: 0a 2a 2a 20 55 6e 62 69 6e 64 20 74 68 65 20 76  .** Unbind the v
60b0: 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 76 61  alue bound to va
60c0: 72 69 61 62 6c 65 20 24 69 20 69 6e 20 76 69 72  riable $i in vir
60d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 2e 20  tual machine p. 
60e0: 54 68 69 73 20 69 73 20 74 68 65 20 0a 2a 2a 20  This is the .** 
60f0: 74 68 65 20 73 61 6d 65 20 61 73 20 62 69 6e 64  the same as bind
6100: 69 6e 67 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ing a NULL value
6110: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a   to the column..
6120: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
6130: 62 65 55 6e 62 69 6e 64 28 56 64 62 65 20 2a 70  beUnbind(Vdbe *p
6140: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 4d 65 6d 20  , int i){.  Mem 
6150: 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 70 2d 3e  *pVar;.  if( p->
6160: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
6170: 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 70 63 21 3d  C_RUN || p->pc!=
6180: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6190: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
61a0: 20 7d 0a 20 20 69 66 28 20 69 3c 31 20 7c 7c 20   }.  if( i<1 || 
61b0: 69 3e 70 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  i>p->nVar ){.   
61c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
61d0: 41 4e 47 45 3b 0a 20 20 7d 0a 20 20 69 2d 2d 3b  ANGE;.  }.  i--;
61e0: 0a 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 7a  .  pVar = &p->az
61f0: 56 61 72 5b 69 5d 3b 0a 20 20 69 66 28 20 70 56  Var[i];.  if( pV
6200: 61 72 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  ar->flags&MEM_Dy
6210: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  n ){.    sqliteF
6220: 72 65 65 28 70 56 61 72 2d 3e 7a 29 3b 0a 20 20  ree(pVar->z);.  
6230: 7d 0a 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20  }.  pVar->flags 
6240: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 72 65  = MEM_Null;.  re
6250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6260: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6270: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
6280: 20 62 69 6e 64 20 74 65 78 74 20 6f 72 20 62 6c   bind text or bl
6290: 6f 62 20 64 61 74 61 20 74 6f 20 61 6e 20 53 51  ob data to an SQ
62a0: 4c 20 76 61 72 69 61 62 6c 65 20 28 61 20 3f 29  L variable (a ?)
62b0: 2e 0a 2a 2a 20 49 74 20 6d 61 79 20 61 6c 73 6f  ..** It may also
62c0: 20 62 65 20 75 73 65 64 20 74 6f 20 62 69 6e 64   be used to bind
62d0: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 62   a NULL value, b
62e0: 79 20 73 65 74 74 69 6e 67 20 7a 56 61 6c 20 74  y setting zVal t
62f0: 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
6300: 6e 74 20 76 64 62 65 42 69 6e 64 42 6c 6f 62 28  nt vdbeBindBlob(
6310: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
6320: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
6330: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e   machine */.  in
6340: 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
6350: 20 2f 2a 20 56 61 72 20 6e 75 6d 62 65 72 20 74   /* Var number t
6360: 6f 20 62 69 6e 64 20 28 6e 75 6d 62 65 72 65 64  o bind (numbered
6370: 20 66 72 6f 6d 20 31 20 75 70 77 61 72 64 29 20   from 1 upward) 
6380: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6390: 2a 7a 56 61 6c 2c 20 20 2f 2a 20 50 6f 69 6e 74  *zVal,  /* Point
63a0: 65 72 20 74 6f 20 62 6c 6f 62 20 6f 66 20 64 61  er to blob of da
63b0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65  ta */.  int byte
63c0: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  s,         /* Nu
63d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
63e0: 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 63   copy */.  int c
63f0: 6f 70 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  opy,          /*
6400: 20 54 72 75 65 20 74 6f 20 63 6f 70 79 20 74 68   True to copy th
6410: 65 20 6d 65 6d 6f 72 79 2c 20 66 61 6c 73 65 20  e memory, false 
6420: 74 6f 20 63 6f 70 79 20 61 20 70 6f 69 6e 74 65  to copy a pointe
6430: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
6440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6450: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  id combination o
6460: 66 20 4d 45 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f  f MEM_Blob, MEM_
6470: 53 74 72 2c 20 4d 45 4d 5f 55 74 66 58 58 20 2a  Str, MEM_UtfXX *
6480: 2f 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 56 61 72  /.){.  Mem *pVar
6490: 3b 0a 0a 20 20 76 64 62 65 55 6e 62 69 6e 64 28  ;..  vdbeUnbind(
64a0: 70 2c 20 69 29 3b 0a 20 20 70 56 61 72 20 3d 20  p, i);.  pVar = 
64b0: 26 70 2d 3e 61 7a 56 61 72 5b 69 2d 31 5d 3b 0a  &p->azVar[i-1];.
64c0: 0a 20 20 69 66 28 20 7a 56 61 6c 20 29 7b 0a 20  .  if( zVal ){. 
64d0: 20 20 20 70 56 61 72 2d 3e 6e 20 3d 20 62 79 74     pVar->n = byt
64e0: 65 73 3b 0a 20 20 20 20 70 56 61 72 2d 3e 66 6c  es;.    pVar->fl
64f0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
6500: 20 69 66 28 20 21 63 6f 70 79 20 29 7b 0a 20 20   if( !copy ){.  
6510: 20 20 20 20 70 56 61 72 2d 3e 7a 20 3d 20 28 63      pVar->z = (c
6520: 68 61 72 20 2a 29 7a 56 61 6c 3b 0a 20 20 20 20  har *)zVal;.    
6530: 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 7c 3d    pVar->flags |=
6540: 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20   MEM_Static;.   
6550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6560: 28 20 62 79 74 65 73 3e 4e 42 46 53 20 29 7b 0a  ( bytes>NBFS ){.
6570: 20 20 20 20 20 20 20 20 70 56 61 72 2d 3e 7a 20          pVar->z 
6580: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
6590: 4d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b 0a 20  Malloc(bytes);. 
65a0: 20 20 20 20 20 20 20 69 66 28 20 21 70 56 61 72         if( !pVar
65b0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ->z ){.         
65c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
65d0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
65e0: 20 20 20 20 20 20 20 20 70 56 61 72 2d 3e 66 6c          pVar->fl
65f0: 61 67 73 20 7c 3d 20 4d 45 4d 5f 44 79 6e 3b 0a  ags |= MEM_Dyn;.
6600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6610: 20 20 20 20 20 70 56 61 72 2d 3e 7a 20 3d 20 70       pVar->z = p
6620: 56 61 72 2d 3e 7a 53 68 6f 72 74 3b 0a 20 20 20  Var->zShort;.   
6630: 20 20 20 20 20 70 56 61 72 2d 3e 66 6c 61 67 73       pVar->flags
6640: 20 7c 3d 20 4d 45 4d 5f 53 68 6f 72 74 3b 0a 20   |= MEM_Short;. 
6650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
6660: 63 70 79 28 70 56 61 72 2d 3e 7a 2c 20 7a 56 61  cpy(pVar->z, zVa
6670: 6c 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 7d  l, bytes);.    }
6680: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
6690: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
66a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
66b0: 74 36 34 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  t64(sqlite3_stmt
66c0: 20 2a 70 2c 20 69 6e 74 20 69 2c 20 6c 6f 6e 67   *p, int i, long
66d0: 20 6c 6f 6e 67 20 69 6e 74 20 69 56 61 6c 75 65   long int iValue
66e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56  ){.  int rc;.  V
66f0: 64 62 65 20 2a 76 20 3d 20 28 56 64 62 65 20 2a  dbe *v = (Vdbe *
6700: 29 70 3b 0a 20 20 72 63 20 3d 20 76 64 62 65 55  )p;.  rc = vdbeU
6710: 6e 62 69 6e 64 28 76 2c 20 69 29 3b 0a 20 20 69  nbind(v, i);.  i
6720: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6730: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 56 61   ){.    Mem *pVa
6740: 72 20 3d 20 26 76 2d 3e 61 7a 56 61 72 5b 69 2d  r = &v->azVar[i-
6750: 31 5d 3b 0a 20 20 20 20 70 56 61 72 2d 3e 66 6c  1];.    pVar->fl
6760: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
6770: 20 20 20 70 56 61 72 2d 3e 69 20 3d 20 69 56 61     pVar->i = iVa
6780: 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  lue;.  }.  retur
6790: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
67a0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  int sqlite3_bind
67b0: 5f 69 6e 74 33 32 28 73 71 6c 69 74 65 33 5f 73  _int32(sqlite3_s
67c0: 74 6d 74 20 2a 70 2c 20 69 6e 74 20 69 2c 20 69  tmt *p, int i, i
67d0: 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 72 65  nt iValue){.  re
67e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
67f0: 64 5f 69 6e 74 36 34 28 70 2c 20 69 2c 20 28 6c  d_int64(p, i, (l
6800: 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 29 69 56 61  ong long int)iVa
6810: 6c 75 65 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  lue);.}..int sql
6820: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
6830: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6840: 2c 20 69 6e 74 20 69 2c 20 64 6f 75 62 6c 65 20  , int i, double 
6850: 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  iValue){.  int r
6860: 63 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 28  c;.  Vdbe *v = (
6870: 56 64 62 65 20 2a 29 70 3b 0a 20 20 72 63 20 3d  Vdbe *)p;.  rc =
6880: 20 76 64 62 65 55 6e 62 69 6e 64 28 76 2c 20 69   vdbeUnbind(v, i
6890: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
68a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4d 65  ITE_OK ){.    Me
68b0: 6d 20 2a 70 56 61 72 20 3d 20 26 76 2d 3e 61 7a  m *pVar = &v->az
68c0: 56 61 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 70 56  Var[i-1];.    pV
68d0: 61 72 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ar->flags = MEM_
68e0: 52 65 61 6c 3b 0a 20 20 20 20 70 56 61 72 2d 3e  Real;.    pVar->
68f0: 72 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 7d 0a  r = iValue;.  }.
6900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6910: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
6920: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 73 71 6c  e3_bind_null(sql
6930: 69 74 65 33 5f 73 74 6d 74 2a 20 70 2c 20 69 6e  ite3_stmt* p, in
6940: 74 20 69 29 7b 0a 20 20 72 65 74 75 72 6e 20 76  t i){.  return v
6950: 64 62 65 55 6e 62 69 6e 64 28 28 56 64 62 65 20  dbeUnbind((Vdbe 
6960: 2a 29 70 2c 20 69 29 3b 0a 7d 0a 0a 69 6e 74 20  *)p, i);.}..int 
6970: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
6980: 74 28 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t( .  sqlite3_st
6990: 6d 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 2c  mt *p, .  int i,
69a0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
69b0: 7a 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44  zData, .  int nD
69c0: 61 74 61 2c 20 0a 20 20 69 6e 74 20 65 43 6f 70  ata, .  int eCop
69d0: 79 0a 29 7b 0a 20 20 69 66 28 20 7a 44 61 74 61  y.){.  if( zData
69e0: 20 26 26 20 6e 44 61 74 61 3c 30 20 29 7b 0a 20   && nData<0 ){. 
69f0: 20 20 20 6e 44 61 74 61 20 3d 20 73 74 72 6c 65     nData = strle
6a00: 6e 28 7a 44 61 74 61 29 2b 31 3b 0a 20 20 7d 0a  n(zData)+1;.  }.
6a10: 20 20 72 65 74 75 72 6e 20 76 64 62 65 42 69 6e    return vdbeBin
6a20: 64 42 6c 6f 62 28 28 56 64 62 65 20 2a 29 70 2c  dBlob((Vdbe *)p,
6a30: 20 69 2c 20 7a 44 61 74 61 2c 20 6e 44 61 74 61   i, zData, nData
6a40: 2c 20 65 43 6f 70 79 2c 20 4d 45 4d 5f 53 74 72  , eCopy, MEM_Str
6a50: 7c 4d 45 4d 5f 55 74 66 38 29 3b 0a 7d 0a 0a 69  |MEM_Utf8);.}..i
6a60: 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  nt sqlite3_bind_
6a70: 74 65 78 74 31 36 28 0a 20 20 73 71 6c 69 74 65  text16(.  sqlite
6a80: 33 5f 73 74 6d 74 20 2a 70 2c 20 0a 20 20 69 6e  3_stmt *p, .  in
6a90: 74 20 69 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  t i, .  const vo
6aa0: 69 64 20 2a 7a 44 61 74 61 2c 20 0a 20 20 69 6e  id *zData, .  in
6ab0: 74 20 6e 44 61 74 61 2c 20 0a 20 20 69 6e 74 20  t nData, .  int 
6ac0: 65 43 6f 70 79 0a 29 7b 0a 20 20 69 66 28 20 7a  eCopy.){.  if( z
6ad0: 44 61 74 61 20 26 26 20 6e 44 61 74 61 3c 30 20  Data && nData<0 
6ae0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
6af0: 20 28 63 68 61 72 20 2a 29 7a 44 61 74 61 3b 0a   (char *)zData;.
6b00: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 7a 29 21      while( (*z)!
6b10: 3d 30 20 26 26 20 28 2a 28 7a 2b 31 29 29 21 3d  =0 && (*(z+1))!=
6b20: 30 20 29 20 7a 2b 3d 32 3b 0a 20 20 20 20 6e 44  0 ) z+=2;.    nD
6b30: 61 74 61 20 3d 20 28 7a 20 2d 20 28 63 68 61 72  ata = (z - (char
6b40: 20 2a 29 7a 44 61 74 61 29 20 2b 20 32 3b 0a 20   *)zData) + 2;. 
6b50: 20 7d 0a 20 0a 20 20 2f 2a 20 46 49 58 20 4d 45   }. .  /* FIX ME
6b60: 20 2d 20 4d 45 4d 5f 55 74 66 31 36 6c 65 3f 20   - MEM_Utf16le? 
6b70: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 76 64 62 65  */.  return vdbe
6b80: 42 69 6e 64 42 6c 6f 62 28 28 56 64 62 65 20 2a  BindBlob((Vdbe *
6b90: 29 70 2c 20 69 2c 20 7a 44 61 74 61 2c 20 6e 44  )p, i, zData, nD
6ba0: 61 74 61 2c 20 65 43 6f 70 79 2c 20 4d 45 4d 5f  ata, eCopy, MEM_
6bb0: 53 74 72 7c 4d 45 4d 5f 55 74 66 31 36 6c 65 29  Str|MEM_Utf16le)
6bc0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
6bd0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 73 71  _bind_blob(.  sq
6be0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 2c 20 0a  lite3_stmt *p, .
6bf0: 20 20 69 6e 74 20 69 2c 20 0a 20 20 63 6f 6e 73    int i, .  cons
6c00: 74 20 76 6f 69 64 20 2a 7a 44 61 74 61 2c 20 0a  t void *zData, .
6c10: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20    int nData, .  
6c20: 69 6e 74 20 65 43 6f 70 79 0a 29 7b 0a 20 20 72  int eCopy.){.  r
6c30: 65 74 75 72 6e 20 76 64 62 65 42 69 6e 64 42 6c  eturn vdbeBindBl
6c40: 6f 62 28 28 56 64 62 65 20 2a 29 70 2c 20 69 2c  ob((Vdbe *)p, i,
6c50: 20 7a 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 65   zData, nData, e
6c60: 43 6f 70 79 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b  Copy, MEM_Blob);
6c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6c80: 65 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20  e values of all 
6c90: 76 61 72 69 61 62 6c 65 73 2e 20 20 56 61 72 69  variables.  Vari
6ca0: 61 62 6c 65 20 24 31 20 69 6e 20 74 68 65 20 6f  able $1 in the o
6cb0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 77 69 6c 6c  riginal SQL will
6cc0: 0a 2a 2a 20 62 65 20 74 68 65 20 73 74 72 69 6e  .** be the strin
6cd0: 67 20 61 7a 56 61 6c 75 65 5b 30 5d 2e 20 20 24  g azValue[0].  $
6ce0: 32 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  2 will have the 
6cf0: 76 61 6c 75 65 20 61 7a 56 61 6c 75 65 5b 31 5d  value azValue[1]
6d00: 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66 6f 72  .  And.** so for
6d10: 74 68 2e 20 20 49 66 20 61 20 76 61 6c 75 65 20  th.  If a value 
6d20: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
6d30: 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 24 33 20  (for example $3 
6d40: 77 68 65 6e 20 6e 56 61 6c 75 65 3d 3d 32 29 0a  when nValue==2).
6d50: 2a 2a 20 74 68 65 6e 20 69 74 73 20 76 61 6c 75  ** then its valu
6d60: 65 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 0a  e will be NULL..
6d70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6d80: 6e 65 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ne overrides any
6d90: 20 70 72 69 6f 72 20 63 61 6c 6c 2e 0a 2a 2f 0a   prior call..*/.
6da0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  int sqlite3_bind
6db0: 28 73 71 6c 69 74 65 5f 76 6d 20 2a 70 56 6d 2c  (sqlite_vm *pVm,
6dc0: 20 69 6e 74 20 69 2c 20 63 6f 6e 73 74 20 63 68   int i, const ch
6dd0: 61 72 20 2a 7a 56 61 6c 2c 20 69 6e 74 20 6c 65  ar *zVal, int le
6de0: 6e 2c 20 69 6e 74 20 63 6f 70 79 29 7b 0a 20 20  n, int copy){.  
6df0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62  return sqlite3_b
6e00: 69 6e 64 5f 74 65 78 74 28 70 56 6d 2c 20 69 2c  ind_text(pVm, i,
6e10: 20 7a 56 61 6c 2c 20 6c 65 6e 2c 20 63 6f 70 79   zVal, len, copy
6e20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
6e30: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
6e40: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
6e50: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
6e60: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
6e70: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
6e80: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
6e90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
6ea0: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
6eb0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
6ec0: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
6ed0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
6ee0: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
6ef0: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
6f00: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
6f10: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
6f20: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
6f30: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
6f40: 20 20 7d 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d    }.  p->pPrev =
6f50: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
6f60: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
6f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ==0 ){.    p->aO
6f80: 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4f  p = 0;.    p->nO
6f90: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  p = 0;.  }.  for
6fa0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
6fb0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  i++){.    if( p-
6fc0: 3e 61 4f 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d  >aOp[i].p3type==
6fd0: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
6ff0: 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20  ->aOp[i].p3);.  
7000: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
7010: 30 3b 20 69 3c 70 2d 3e 6e 56 61 72 3b 20 69 2b  0; i<p->nVar; i+
7020: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
7030: 7a 56 61 72 5b 69 5d 2e 66 6c 61 67 73 26 4d 45  zVar[i].flags&ME
7040: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73  M_Dyn ){.      s
7050: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 7a 56  qliteFree(p->azV
7060: 61 72 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 7d 0a  ar[i].z);.    }.
7070: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
7080: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69  (p->aOp);.  sqli
7090: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
70a0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
70b0: 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 70 2d  p->aStack);.  p-
70c0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
70d0: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
70e0: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
70f0: 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
7100: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
7110: 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
7120: 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
7130: 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
7140: 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e   now.  Return an
7150: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
7160: 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65   no MoveTo is pe
7170: 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72  nding, this.** r
7180: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68  outine does noth
7190: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ing and returns 
71a0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
71b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
71c0: 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72  sorMoveto(Cursor
71d0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
71e0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
71f0: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
7200: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
7210: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
7220: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
7230: 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
7240: 69 66 28 20 70 2d 3e 69 6e 74 4b 65 79 20 29 7b  if( p->intKey ){
7250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7260: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
7270: 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
7280: 74 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b  toTarget, &res);
7290: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
72a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
72b0: 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c  veto(p->pCursor,
72c0: 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74  (char*)&p->movet
72d0: 6f 54 61 72 67 65 74 2c 73 69 7a 65 6f 66 28 69  oTarget,sizeof(i
72e0: 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d  64),&res);.    }
72f0: 0a 20 20 20 20 70 2d 3e 69 6e 63 72 4b 65 79 20  .    p->incrKey 
7300: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74  = 0;.    p->last
7310: 52 65 63 6e 6f 20 3d 20 6b 65 79 54 6f 49 6e 74  Recno = keyToInt
7320: 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  (p->movetoTarget
7330: 29 3b 0a 20 20 20 20 70 2d 3e 72 65 63 6e 6f 49  );.    p->recnoI
7340: 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b  sValid = res==0;
7350: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
7360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
7370: 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
7380: 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
7390: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  }.    sqlite3_se
73a0: 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  arch_count++;.  
73b0: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
73c0: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
73d0: 63 61 63 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a  cacheValid = 0;.
73e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
73f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7400: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
7410: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
7420: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
7430: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
7440: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
7450: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
7460: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
7470: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
7480: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
7490: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
74a0: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
74b0: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
74c0: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
74d0: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
74e0: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
74f0: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
7500: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
7510: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
7520: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
7530: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
7540: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
7550: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
7560: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
7570: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
7580: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
7590: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
75a0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
75b0: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
75c0: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
75d0: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
75e0: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
75f0: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
7600: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
7610: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
7620: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
7630: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
7640: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
7650: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
7660: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
7670: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
7680: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
7690: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
76a0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
76b0: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
76c0: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
76d0: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
76e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
76f0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
7700: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
7710: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
7720: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
7730: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
7740: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
7750: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
7760: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
7770: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
7780: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
77a0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
77b0: 20 20 20 20 20 20 20 2d 20 20 20 20 20 20 20 20         -        
77c0: 20 20 20 20 4e 6f 74 20 61 20 74 79 70 65 2e 0a      Not a type..
77d0: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
77f0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
7800: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
7810: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
7820: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
7830: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
7840: 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
7870: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
7880: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
7890: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
78a0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
78b0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
78c0: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
78d0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
78e0: 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
78f0: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
7900: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
7910: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
7920: 20 20 20 20 20 37 2e 2e 31 31 20 20 20 20 20 20       7..11      
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
7950: 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
7960: 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
7970: 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
7980: 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
7990: 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
79a0: 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
79b0: 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
79c0: 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  **.*/../*.** Ret
79d0: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
79e0: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
79f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
7a00: 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
7a10: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 63  VdbeSerialType(c
7a20: 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b  onst Mem *pMem){
7a30: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
7a40: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69  Mem->flags;..  i
7a50: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
7a60: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
7a70: 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
7a80: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
7a90: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
7aa0: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
7ab0: 2c 20 32 2c 20 34 20 6f 72 20 38 20 62 79 74 65  , 2, 4 or 8 byte
7ac0: 73 2e 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 20  s. */.    i64 i 
7ad0: 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 69  = pMem->i;.    i
7ae0: 66 28 20 69 3e 3d 2d 31 32 37 20 26 26 20 69 3c  f( i>=-127 && i<
7af0: 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
7b00: 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 33 32 37  .    if( i>=-327
7b10: 36 37 20 26 26 20 69 3c 3d 33 32 37 36 37 20 29  67 && i<=32767 )
7b20: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
7b30: 66 28 20 69 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( i>=-214748364
7b40: 37 20 26 26 20 69 3c 3d 32 31 34 37 34 38 33 36  7 && i<=21474836
7b50: 34 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  47 ) return 3;. 
7b60: 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d     return 4;.  }
7b70: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
7b80: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
7b90: 75 72 6e 20 35 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 5;.  }.  if(
7ba0: 20 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29   flags&MEM_Str )
7bb0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 73 73 75  {.    /* We assu
7bc0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 74 72 69  me that the stri
7bd0: 6e 67 20 69 73 20 4e 55 4c 4c 2d 74 65 72 6d 69  ng is NULL-termi
7be0: 6e 61 74 65 64 2e 20 57 65 20 64 6f 6e 27 74 20  nated. We don't 
7bf0: 73 74 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  store the.    **
7c00: 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 6f 72   NULL-terminator
7c10: 20 2d 20 69 74 20 69 73 20 69 6d 70 6c 69 65 64   - it is implied
7c20: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 73   by the string s
7c30: 74 6f 72 61 67 65 20 63 6c 61 73 73 2e 0a 20 20  torage class..  
7c40: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
7c50: 20 70 4d 65 6d 2d 3e 6e 3e 30 20 29 3b 0a 20 20   pMem->n>0 );.  
7c60: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
7c70: 7a 5b 70 4d 65 6d 2d 3e 6e 2d 31 5d 3d 3d 27 5c  z[pMem->n-1]=='\
7c80: 30 27 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  0' );.    return
7c90: 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 31   (pMem->n*2 + 11
7ca0: 29 3b 20 2f 2a 20 28 70 4d 65 6d 2d 3e 6e 2d 31  ); /* (pMem->n-1
7cb0: 29 2a 32 20 2b 20 31 33 20 2a 2f 0a 20 20 7d 0a  )*2 + 13 */.  }.
7cc0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
7cd0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75  Blob ){.    retu
7ce0: 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20  rn (pMem->n*2 + 
7cf0: 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  12);.  }.  retur
7d00: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
7d10: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
7d20: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
7d30: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
7d40: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
7d50: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
7d60: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
7d70: 79 70 65 4c 65 6e 28 75 36 34 20 73 65 72 69 61  ypeLen(u64 seria
7d80: 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72  l_type){.  asser
7d90: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  t( serial_type!=
7da0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 73 65  0 );.  switch(se
7db0: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 20 20  rial_type){.    
7dc0: 63 61 73 65 20 36 3a 20 72 65 74 75 72 6e 20 30  case 6: return 0
7dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7de0: 20 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20     /* NULL */.  
7df0: 20 20 63 61 73 65 20 31 3a 20 72 65 74 75 72 6e    case 1: return
7e00: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
7e10: 20 20 20 20 20 2f 2a 20 31 20 62 79 74 65 20 69       /* 1 byte i
7e20: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
7e30: 73 65 20 32 3a 20 72 65 74 75 72 6e 20 32 3b 20  se 2: return 2; 
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 2f 2a 20 32 20 62 79 74 65 20 69 6e 74 65 67   /* 2 byte integ
7e60: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 33  er */.    case 3
7e70: 3a 20 72 65 74 75 72 6e 20 34 3b 20 20 20 20 20  : return 4;     
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e90: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 2a  4 byte integer *
7ea0: 2f 0a 20 20 20 20 63 61 73 65 20 34 3a 20 72 65  /.    case 4: re
7eb0: 74 75 72 6e 20 38 3b 20 20 20 20 20 20 20 20 20  turn 8;         
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 38 20 62 79           /* 8 by
7ed0: 74 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  te integer */.  
7ee0: 20 20 63 61 73 65 20 35 3a 20 72 65 74 75 72 6e    case 5: return
7ef0: 20 38 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   8;             
7f00: 20 20 20 20 20 2f 2a 20 38 20 62 79 74 65 20 66       /* 8 byte f
7f10: 6c 6f 61 74 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  loat */.  }.  as
7f20: 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
7f30: 65 3e 3d 31 32 20 29 3b 0a 20 20 72 65 74 75 72  e>=12 );.  retur
7f40: 6e 20 28 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  n ((serial_type-
7f50: 31 32 29 3e 3e 31 29 3b 20 20 20 20 20 20 20 20  12)>>1);        
7f60: 2f 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  /* text or blob 
7f70: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  */.}../*.** Writ
7f80: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
7f90: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
7fa0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
7fb0: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
7fc0: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
7fd0: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
7fe0: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
7ff0: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
8000: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
8010: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8020: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69  s written..*/ .i
8030: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
8040: 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64  rialPut(unsigned
8050: 20 63 68 61 72 20 2a 62 75 66 2c 20 63 6f 6e 73   char *buf, cons
8060: 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  t Mem *pMem){.  
8070: 75 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u64 serial_type 
8080: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
8090: 69 61 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20  ialType(pMem);. 
80a0: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73   int len;..  ass
80b0: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
80c0: 21 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 4e 55  !=0 );. .  /* NU
80d0: 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  LL */.  if( seri
80e0: 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
80f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8100: 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 2a   .  /* Integer *
8110: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
8120: 79 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36 34  ype<5 ){.    i64
8130: 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20   i = pMem->i;.  
8140: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
8150: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
8160: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
8170: 20 20 20 77 68 69 6c 65 28 20 6c 65 6e 2d 2d 20     while( len-- 
8180: 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 6c 65 6e  ){.      buf[len
8190: 5d 20 3d 20 28 69 26 30 78 46 46 29 3b 0a 20 20  ] = (i&0xFF);.  
81a0: 20 20 20 20 69 20 3d 20 69 20 3e 3e 20 38 3b 0a      i = i >> 8;.
81b0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
81c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
81d0: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
81e0: 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _type);.  }..  /
81f0: 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66 28  * Float */.  if(
8200: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35 20   serial_type==5 
8210: 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
8220: 62 79 74 65 20 6f 72 64 65 72 69 6e 67 3f 20 2a  byte ordering? *
8230: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
8240: 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38 20  zeof(double)==8 
8250: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  );.    memcpy(bu
8260: 66 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 38 29 3b  f, &pMem->r, 8);
8270: 0a 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20  .    return 8;. 
8280: 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e   }.  .  /* Strin
8290: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61  g or blob */.  a
82a0: 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
82b0: 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20  pe>=12 );.  len 
82c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
82d0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
82e0: 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70  l_type);.  memcp
82f0: 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
8300: 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c  len);.  return l
8310: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  en;.}../*.** Des
8320: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
8330: 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
8340: 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
8350: 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
8360: 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
8370: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
8380: 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
8390: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
83a0: 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73   read..*/ .int s
83b0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
83c0: 47 65 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  Get(const unsign
83d0: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 36  ed char *buf, u6
83e0: 34 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 4d  4 serial_type, M
83f0: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
8400: 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28   len;..  assert(
8410: 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 20   serial_type!=0 
8420: 29 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  );..  /* memset(
8430: 70 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pMem, 0, sizeof(
8440: 70 4d 65 6d 29 29 3b 20 2a 2f 0a 20 20 70 4d 65  pMem)); */.  pMe
8450: 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
8460: 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 0a 20 20  pMem->z = 0;..  
8470: 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28  /* NULL */.  if(
8480: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
8490: 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ){.    pMem->fla
84a0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
84b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
84c0: 0a 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  . .  /* Integer 
84d0: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
84e0: 74 79 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36  type<5 ){.    i6
84f0: 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  4 i = 0;.    int
8500: 20 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71   n;.    len = sq
8510: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
8520: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
8530: 70 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 75  pe);..    if( bu
8540: 66 5b 30 5d 26 30 78 38 30 20 29 7b 0a 20 20 20  f[0]&0x80 ){.   
8550: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 28 38     for(n=0; n<(8
8560: 2d 6c 65 6e 29 3b 20 6e 2b 2b 29 7b 0a 20 20 20  -len); n++){.   
8570: 20 20 20 20 20 69 20 3d 20 28 69 3c 3c 38 29 2b       i = (i<<8)+
8580: 30 78 46 46 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0xFF;.      }.  
8590: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b    }.    for(n=0;
85a0: 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20   n<len; n++){.  
85b0: 20 20 20 20 69 20 3d 20 69 20 3c 3c 20 38 3b 0a      i = i << 8;.
85c0: 20 20 20 20 20 20 69 20 3d 20 69 20 2b 20 62 75        i = i + bu
85d0: 66 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  f[n];.    }.    
85e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
85f0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
8600: 3e 69 20 3d 20 69 3b 0a 20 20 20 20 72 65 74 75  >i = i;.    retu
8610: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  rn sqlite3VdbeSe
8620: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
8630: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20  al_type);.  }.. 
8640: 20 2f 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69   /* Float */.  i
8650: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
8660: 35 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  5 ){.    /* TODO
8670: 3a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 3f  : byte ordering?
8680: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8690: 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d  sizeof(double)==
86a0: 38 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  8 );.    memcpy(
86b0: 26 70 4d 65 6d 2d 3e 72 2c 20 62 75 66 2c 20 38  &pMem->r, buf, 8
86c0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
86d0: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
86e0: 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 7d     return 8;.  }
86f0: 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20  .  .  /* String 
8700: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73  or blob */.  ass
8710: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
8720: 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20  >=12 );.  len = 
8730: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
8740: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
8750: 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
8760: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
8770: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
8780: 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
8790: 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 2b 31 3b  pMem->n = len+1;
87a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d  .  }else{.    pM
87b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
87c0: 42 6c 6f 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  Blob;.    pMem->
87d0: 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  n = len;.  }..  
87e0: 69 66 28 20 28 70 4d 65 6d 2d 3e 6e 29 3e 4e 42  if( (pMem->n)>NB
87f0: 46 53 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  FS ){.    pMem->
8800: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
8810: 52 61 77 28 20 70 4d 65 6d 2d 3e 6e 20 29 3b 0a  Raw( pMem->n );.
8820: 20 20 20 20 69 66 28 20 21 70 4d 65 6d 2d 3e 7a      if( !pMem->z
8830: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8840: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
8850: 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Mem->flags |= ME
8860: 4d 5f 44 79 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  M_Dyn;.  }else{.
8870: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d      pMem->z = pM
8880: 65 6d 2d 3e 7a 53 68 6f 72 74 3b 0a 20 20 20 20  em->zShort;.    
8890: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pMem->flags |= M
88a0: 45 4d 5f 53 68 6f 72 74 3b 0a 20 20 7d 0a 0a 20  EM_Short;.  }.. 
88b0: 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c   memcpy(pMem->z,
88c0: 20 62 75 66 2c 20 6c 65 6e 29 3b 20 0a 20 20 69   buf, len); .  i
88d0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d  f( pMem->flags&M
88e0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 70 4d  EM_Str ){.    pM
88f0: 65 6d 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 27 5c 30  em->z[len] = '\0
8900: 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  ';.  }..  return
8910: 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   len;.}../*.** C
8920: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
8930: 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
8940: 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
8950: 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
8960: 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
8970: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
8980: 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
8990: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
89a0: 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
89b0: 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
89c0: 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
89d0: 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
89e0: 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
89f0: 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
8a00: 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
8a10: 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
8a20: 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
8a30: 62 79 20 6d 65 6d 63 6d 70 28 29 20 61 6e 64 0a  by memcmp() and.
8a40: 2a 2a 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  ** finally blob'
8a50: 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
8a60: 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
8a70: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
8a80: 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
8a90: 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
8aa0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
8ab0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 4d 65 6d  e3MemCompare(Mem
8ac0: 20 2a 70 4d 65 6d 31 2c 20 4d 65 6d 20 2a 70 4d   *pMem1, Mem *pM
8ad0: 65 6d 32 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  em2){.  int rc;.
8ae0: 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
8af0: 6c 61 67 73 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c  lags = pMem1->fl
8b00: 61 67 73 7c 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  ags|pMem2->flags
8b10: 3b 20 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  ; . .  /* If one
8b20: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
8b30: 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
8b40: 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
8b50: 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
8b60: 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
8b70: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
8b80: 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
8b90: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
8ba0: 75 72 6e 20 28 70 4d 65 6d 32 2d 3e 66 6c 61 67  urn (pMem2->flag
8bb0: 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 70  s&MEM_Null) - (p
8bc0: 4d 65 6d 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Mem1->flags&MEM_
8bd0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
8be0: 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
8bf0: 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
8c00: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
8c10: 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
8c20: 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
8c30: 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
8c40: 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
8c50: 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
8c60: 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
8c70: 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
8c80: 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
8c90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
8ca0: 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
8cb0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
8cc0: 7b 0a 20 20 20 20 69 66 28 20 21 28 70 4d 65 6d  {.    if( !(pMem
8cd0: 31 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  1->flags&(MEM_In
8ce0: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20 29 7b 0a  t|MEM_Real)) ){.
8cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8d00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 28      }.    if( !(
8d10: 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 28 4d 45  pMem2->flags&(ME
8d20: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29  M_Int|MEM_Real))
8d30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8d40: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
8d50: 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
8d60: 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
8d70: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
8d80: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
8d90: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e  .        pMem1->
8da0: 72 20 3d 20 70 4d 65 6d 31 2d 3e 69 3b 0a 20 20  r = pMem1->i;.  
8db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8dc0: 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26 4d 45 4d  pMem2->flags&MEM
8dd0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
8de0: 70 4d 65 6d 32 2d 3e 72 20 3d 20 70 4d 65 6d 32  pMem2->r = pMem2
8df0: 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ->i;.      }.   
8e00: 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 72 20     if( pMem1->r 
8e10: 3c 20 70 4d 65 6d 32 2d 3e 72 20 29 20 72 65 74  < pMem2->r ) ret
8e20: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
8e30: 28 20 70 4d 65 6d 31 2d 3e 72 20 3e 20 70 4d 65  ( pMem1->r > pMe
8e40: 6d 32 2d 3e 72 20 29 20 72 65 74 75 72 6e 20 31  m2->r ) return 1
8e50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
8e60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
8e70: 75 72 6e 20 28 70 4d 65 6d 31 2d 3e 69 20 2d 20  urn (pMem1->i - 
8e80: 70 4d 65 6d 32 2d 3e 69 29 3b 0a 20 20 7d 0a 0a  pMem2->i);.  }..
8e90: 20 20 72 63 20 3d 20 28 70 4d 65 6d 32 2d 3e 66    rc = (pMem2->f
8ea0: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d  lags&MEM_Null) -
8eb0: 20 28 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 26 4d   (pMem1->flags&M
8ec0: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  EM_Null);.  if( 
8ed0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8ee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   rc;.  }..  /* B
8ef0: 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
8f00: 62 65 20 73 74 72 69 6e 67 73 20 6f 72 20 62 6c  be strings or bl
8f10: 6f 62 73 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65  obs. If only one
8f20: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
8f30: 65 6e 0a 20 20 2a 2a 20 74 68 61 74 20 76 61 6c  en.  ** that val
8f40: 75 65 20 69 73 20 6c 65 73 73 2e 20 4f 74 68 65  ue is less. Othe
8f50: 72 77 69 73 65 2c 20 63 6f 6d 70 61 72 65 20 77  rwise, compare w
8f60: 69 74 68 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ith memcmp(). If
8f70: 20 6d 65 6d 63 6d 70 28 29 0a 20 20 2a 2a 20 72   memcmp().  ** r
8f80: 65 74 75 72 6e 73 20 30 20 61 6e 64 20 6f 6e 65  eturns 0 and one
8f90: 20 76 61 6c 75 65 20 69 73 20 6c 6f 6e 67 65 72   value is longer
8fa0: 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2c   than the other,
8fb0: 20 74 68 65 6e 20 74 68 61 74 20 76 61 6c 75 65   then that value
8fc0: 0a 20 20 2a 2a 20 69 73 20 67 72 65 61 74 65 72  .  ** is greater
8fd0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65  ..  */.  rc = me
8fe0: 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70  mcmp(pMem1->z, p
8ff0: 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d  Mem2->z, (pMem1-
9000: 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65  >n>pMem2->n)?pMe
9010: 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b  m2->n:pMem1->n);
9020: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
9030: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9040: 0a 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 31  .  return (pMem1
9050: 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 29 3b  ->n - pMem2->n);
9060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
9070: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 63  llowing is the c
9080: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
9090: 6f 6e 20 66 6f 72 20 28 6e 6f 6e 2d 69 6e 74 65  on for (non-inte
90a0: 67 65 72 29 0a 2a 2a 20 6b 65 79 73 20 69 6e 20  ger).** keys in 
90b0: 74 68 65 20 62 74 72 65 65 73 2e 20 20 54 68 69  the btrees.  Thi
90c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
90d0: 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ns negative, zer
90e0: 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76  o, or.** positiv
90f0: 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 6b  e if the first k
9100: 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ey is less than,
9110: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
9120: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  eater than.** th
9130: 65 20 73 65 63 6f 6e 64 2e 0a 2a 2a 0a 2a 2a 20  e second..**.** 
9140: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
9150: 73 75 6d 65 73 20 74 68 61 74 20 65 61 63 68 20  sumes that each 
9160: 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  key consists of 
9170: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 79 70 65  one or more type
9180: 2f 62 6c 6f 62 0a 2a 2a 20 70 61 69 72 73 2c 20  /blob.** pairs, 
9190: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68  encoded using th
91a0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  e sqlite3VdbeSer
91b0: 69 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ialXXX() functio
91c0: 6e 73 20 61 62 6f 76 65 2e 20 0a 2a 2a 0a 2a 2a  ns above. .**.**
91d0: 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   Following the t
91e0: 79 70 65 2f 62 6c 6f 62 20 70 61 69 72 73 2c 20  ype/blob pairs, 
91f0: 65 61 63 68 20 6b 65 79 20 6d 61 79 20 68 61 76  each key may hav
9200: 65 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20  e a single 0x00 
9210: 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64  byte.** followed
9220: 20 62 79 20 61 20 76 61 72 69 6e 74 2e 20 41 20   by a varint. A 
9230: 6b 65 79 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76  key may only hav
9240: 65 20 74 68 69 73 20 74 72 61 6c 69 6e 67 20 30  e this traling 0
9250: 78 30 30 2f 76 61 72 69 6e 74 0a 2a 2a 20 70 61  x00/varint.** pa
9260: 69 72 20 69 66 20 69 74 20 68 61 73 20 61 74 20  ir if it has at 
9270: 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 74 79  least as many ty
9280: 70 65 2f 62 6c 6f 62 20 70 61 69 72 73 20 61 73  pe/blob pairs as
9290: 20 74 68 65 20 6b 65 79 20 69 74 20 69 73 20 62   the key it is b
92a0: 65 69 6e 67 0a 2a 2a 20 63 6f 6d 70 61 72 65 64  eing.** compared
92b0: 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
92c0: 74 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61 72  te3VdbeKeyCompar
92d0: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
92e0: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
92f0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
9300: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
9310: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
9320: 4b 65 79 32 0a 29 7b 0a 20 20 43 75 72 73 6f 72  Key2.){.  Cursor
9330: 20 2a 70 43 20 3d 20 28 43 75 72 73 6f 72 20 2a   *pC = (Cursor *
9340: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 69 6e 74  )userData;.  int
9350: 20 6f 66 66 73 65 74 31 20 3d 20 30 3b 0a 20 20   offset1 = 0;.  
9360: 69 6e 74 20 6f 66 66 73 65 74 32 20 3d 20 30 3b  int offset2 = 0;
9370: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
9380: 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
9390: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
93a0: 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
93b0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
93c0: 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f  har *aKey2 = (co
93d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
93e0: 72 20 2a 29 70 4b 65 79 32 3b 0a 20 20 0a 20 20  r *)pKey2;.  .  
93f0: 77 68 69 6c 65 28 20 6f 66 66 73 65 74 31 3c 6e  while( offset1<n
9400: 4b 65 79 31 20 26 26 20 6f 66 66 73 65 74 32 3c  Key1 && offset2<
9410: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 4d 65 6d  nKey2 ){.    Mem
9420: 20 6d 65 6d 31 3b 0a 20 20 20 20 4d 65 6d 20 6d   mem1;.    Mem m
9430: 65 6d 32 3b 0a 20 20 20 20 75 36 34 20 73 65 72  em2;.    u64 ser
9440: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
9450: 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  64 serial_type2;
9460: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
9470: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
9480: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
9490: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
94a0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
94b0: 20 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73      offset1 += s
94c0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
94d0: 26 61 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c  &aKey1[offset1],
94e0: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b   &serial_type1);
94f0: 0a 20 20 20 20 6f 66 66 73 65 74 32 20 2b 3d 20  .    offset2 += 
9500: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
9510: 28 26 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d  (&aKey2[offset2]
9520: 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29  , &serial_type2)
9530: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  ;..    /* If eit
9540: 68 65 72 20 6f 66 20 74 68 65 20 76 61 72 69 6e  her of the varin
9550: 74 73 20 6a 75 73 74 20 72 65 61 64 20 69 6e 20  ts just read in 
9560: 61 72 65 20 30 20 28 6e 6f 74 20 61 20 74 79 70  are 0 (not a typ
9570: 65 29 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  e), then.    ** 
9580: 74 68 69 73 20 69 73 20 74 68 65 20 65 6e 64 20  this is the end 
9590: 6f 66 20 74 68 65 20 6b 65 79 73 2e 20 54 68 65  of the keys. The
95a0: 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 20   remaining data 
95b0: 69 6e 20 65 61 63 68 20 6b 65 79 20 69 73 0a 20  in each key is. 
95c0: 20 20 20 2a 2a 20 74 68 65 20 76 61 72 69 6e 74     ** the varint
95d0: 20 72 6f 77 69 64 2e 20 43 6f 6d 70 61 72 65 20   rowid. Compare 
95e0: 74 68 65 73 65 20 61 73 20 73 69 67 6e 65 64 20  these as signed 
95f0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 72 65 74  integers and ret
9600: 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  urn.    ** the r
9610: 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
9620: 20 20 69 66 28 20 21 73 65 72 69 61 6c 5f 74 79    if( !serial_ty
9630: 70 65 31 20 7c 7c 20 21 73 65 72 69 61 6c 5f 74  pe1 || !serial_t
9640: 79 70 65 32 20 29 7b 0a 20 20 20 20 20 20 61 73  ype2 ){.      as
9650: 73 65 72 74 28 20 21 73 65 72 69 61 6c 5f 74 79  sert( !serial_ty
9660: 70 65 31 20 26 26 20 21 73 65 72 69 61 6c 5f 74  pe1 && !serial_t
9670: 79 70 65 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ype2 );.      as
9680: 73 65 72 74 28 20 21 70 43 20 7c 7c 20 21 70 43  sert( !pC || !pC
9690: 2d 3e 69 6e 63 72 4b 65 79 20 29 3b 0a 20 20 20  ->incrKey );.   
96a0: 20 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72     sqlite3GetVar
96b0: 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65  int(&aKey1[offse
96c0: 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  t1], &serial_typ
96d0: 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
96e0: 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65  e3GetVarint(&aKe
96f0: 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20 26 73 65  y2[offset2], &se
9700: 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 20 20  rial_type2);.   
9710: 20 20 20 72 65 74 75 72 6e 20 28 20 28 69 36 34     return ( (i64
9720: 29 73 65 72 69 61 6c 5f 74 79 70 65 31 20 2d 20  )serial_type1 - 
9730: 28 69 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65  (i64)serial_type
9740: 32 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  2 );.    }..    
9750: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
9760: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
9770: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61 63  pace left in eac
9780: 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62 6c  h key for the bl
9790: 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74  ob of.    ** dat
97a0: 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68 65  a to go with the
97b0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75 73   serial type jus
97c0: 74 20 72 65 61 64 2e 20 54 68 69 73 20 61 73 73  t read. This ass
97d0: 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66 0a  ert may fail if.
97e0: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
97f0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  is corrupted.  T
9800: 68 65 6e 20 72 65 61 64 20 74 68 65 20 76 61 6c  hen read the val
9810: 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65 79  ue from each key
9820: 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a   into mem1.    *
9830: 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70 65  * and mem2 respe
9840: 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ctively..    */.
9850: 20 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20 73      offset1 += s
9860: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
9870: 47 65 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65  Get(&aKey1[offse
9880: 74 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  t1], serial_type
9890: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 6f  1, &mem1);.    o
98a0: 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65  ffset2 += sqlite
98b0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
98c0: 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20  aKey2[offset2], 
98d0: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
98e0: 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  em2);..    rc = 
98f0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
9900: 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 29 3b  e(&mem1, &mem2);
9910: 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c  .    if( mem1.fl
9920: 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  ags&MEM_Dyn ){. 
9930: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9940: 6d 65 6d 31 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20  mem1.z);.    }. 
9950: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
9960: 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  s&MEM_Dyn ){.   
9970: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65     sqliteFree(me
9980: 6d 32 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m2.z);.    }.   
9990: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
99a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
99b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
99c0: 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
99d0: 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
99e0: 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69  , but all the fi
99f0: 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
9a00: 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20  point.  ** were 
9a10: 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e  equal. If the in
9a20: 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72  crKey flag is tr
9a30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  ue, then the sec
9a40: 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20  ond key is.  ** 
9a50: 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65  treated as large
9a60: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  r..  */.  if( pC
9a70: 20 26 26 20 70 43 2d 3e 69 6e 63 72 4b 65 79 20   && pC->incrKey 
9a80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
9a90: 66 66 73 65 74 32 3d 3d 6e 4b 65 79 32 20 29 3b  ffset2==nKey2 );
9aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
9ab0: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66 66 73 65    }..  if( offse
9ac0: 74 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  t1<nKey1 ){.    
9ad0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9ae0: 69 66 28 20 6f 66 66 73 65 74 32 3c 6e 4b 65 79  if( offset2<nKey
9af0: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
9b00: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  -1;.  }..  retur
9b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
9b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
9b30: 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
9b40: 6c 65 20 72 6f 77 20 72 65 63 6f 72 64 73 20 73  le row records s
9b50: 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  pecified by .** 
9b60: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
9b70: 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  nd {nKey2, pKey2
9b80: 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e  }, returning a n
9b90: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
9ba0: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
9bb0: 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20  eger if {nKey1, 
9bc0: 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74  pKey1} is less t
9bd0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
9be0: 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
9bf0: 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  n {nKey2, pKey2}
9c00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
9c10: 63 74 69 6f 6e 20 69 73 20 70 72 65 74 74 79 20  ction is pretty 
9c20: 69 6e 65 66 66 69 63 69 65 6e 74 20 61 6e 64 20  inefficient and 
9c30: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65  will probably be
9c40: 20 72 65 70 6c 61 63 65 64 0a 2a 2a 20 62 79 20   replaced.** by 
9c50: 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20 69  something else i
9c60: 6e 20 74 68 65 20 6e 65 61 72 20 66 75 74 75 72  n the near futur
9c70: 65 2e 20 49 74 20 69 73 20 63 75 72 72 65 6e 74  e. It is current
9c80: 6c 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 62  ly required.** b
9c90: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  y compound SELEC
9ca0: 54 20 6f 70 65 72 61 74 6f 72 73 2e 20 0a 2a 2f  T operators. .*/
9cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9cc0: 52 6f 77 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  RowCompare(.  vo
9cd0: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
9ce0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
9cf0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
9d00: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
9d10: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
9d20: 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  .  Cursor *pC = 
9d30: 28 43 75 72 73 6f 72 20 2a 29 75 73 65 72 44 61  (Cursor *)userDa
9d40: 74 61 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74  ta;.  int offset
9d50: 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 66 66  1 = 0;.  int off
9d60: 73 65 74 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  set2 = 0;.  int 
9d70: 74 6f 66 66 73 65 74 31 20 3d 20 30 3b 0a 20 20  toffset1 = 0;.  
9d80: 69 6e 74 20 74 6f 66 66 73 65 74 32 20 3d 20 30  int toffset2 = 0
9d90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
9da0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9db0: 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
9dc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9dd0: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
9de0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
9df0: 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key2 = (const un
9e00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
9e10: 65 79 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ey2;..  assert( 
9e20: 70 43 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pC );.  assert( 
9e30: 70 43 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  pC->nField>0 );.
9e40: 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 70  .  for( i=0; i<p
9e50: 43 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 20 29  C->nField; i++ )
9e60: 7b 0a 20 20 20 20 75 36 34 20 64 75 6d 6d 79 3b  {.    u64 dummy;
9e70: 0a 20 20 20 20 6f 66 66 73 65 74 31 20 2b 3d 20  .    offset1 += 
9e80: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
9e90: 28 26 61 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d  (&aKey1[offset1]
9ea0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 6f  , &dummy);.    o
9eb0: 66 66 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65  ffset2 += sqlite
9ec0: 33 47 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79  3GetVarint(&aKey
9ed0: 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26 64 75 6d  1[offset1], &dum
9ee0: 6d 79 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  my);.  }..  for(
9ef0: 20 69 3d 30 3b 20 69 3c 70 43 2d 3e 6e 46 69 65   i=0; i<pC->nFie
9f00: 6c 64 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 4d  ld; i++ ){.    M
9f10: 65 6d 20 6d 65 6d 31 3b 0a 20 20 20 20 4d 65 6d  em mem1;.    Mem
9f20: 20 6d 65 6d 32 3b 0a 20 20 20 20 75 36 34 20 73   mem2;.    u64 s
9f30: 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20  erial_type1;.   
9f40: 20 75 36 34 20 73 65 72 69 61 6c 5f 74 79 70 65   u64 serial_type
9f50: 32 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  2;.    int rc;..
9f60: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
9f70: 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
9f80: 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
9f90: 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
9fa0: 2f 0a 20 20 20 20 74 6f 66 66 73 65 74 31 20 2b  /.    toffset1 +
9fb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
9fc0: 6e 74 28 26 61 4b 65 79 31 5b 74 6f 66 66 73 65  nt(&aKey1[toffse
9fd0: 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  t1], &serial_typ
9fe0: 65 31 29 3b 0a 20 20 20 20 74 6f 66 66 73 65 74  e1);.    toffset
9ff0: 32 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  2 += sqlite3GetV
a000: 61 72 69 6e 74 28 26 61 4b 65 79 32 5b 74 6f 66  arint(&aKey2[tof
a010: 66 73 65 74 32 5d 2c 20 26 73 65 72 69 61 6c 5f  fset2], &serial_
a020: 74 79 70 65 32 29 3b 0a 0a 20 20 20 20 61 73 73  type2);..    ass
a030: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
a040: 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  1 && serial_type
a050: 32 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73  2 );..    /* Ass
a060: 65 72 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ert that there i
a070: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  s enough space l
a080: 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 20  eft in each key 
a090: 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a  for the blob of.
a0a0: 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 67      ** data to g
a0b0: 6f 20 77 69 74 68 20 74 68 65 20 73 65 72 69 61  o with the seria
a0c0: 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 64  l type just read
a0d0: 2e 20 54 68 69 73 20 61 73 73 65 72 74 20 6d 61  . This assert ma
a0e0: 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a  y fail if.    **
a0f0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
a100: 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 65  rupted.  Then re
a110: 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ad the value fro
a120: 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f 20  m each key into 
a130: 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20  mem1.    ** and 
a140: 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 6c  mem2 respectivel
a150: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f 66  y..    */.    of
a160: 66 73 65 74 31 20 2b 3d 20 73 71 6c 69 74 65 33  fset1 += sqlite3
a170: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
a180: 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 73  Key1[offset1], s
a190: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
a1a0: 6d 31 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 32  m1);.    offset2
a1b0: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
a1c0: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32 5b  erialGet(&aKey2[
a1d0: 6f 66 66 73 65 74 32 5d 2c 20 73 65 72 69 61 6c  offset2], serial
a1e0: 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a  _type2, &mem2);.
a1f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a200: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
a210: 31 2c 20 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69  1, &mem2);.    i
a220: 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 26 4d 45  f( mem1.flags&ME
a230: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73  M_Dyn ){.      s
a240: 71 6c 69 74 65 46 72 65 65 28 6d 65 6d 31 2e 7a  qliteFree(mem1.z
a250: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a260: 20 6d 65 6d 32 2e 66 6c 61 67 73 26 4d 45 4d 5f   mem2.flags&MEM_
a270: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Dyn ){.      sql
a280: 69 74 65 46 72 65 65 28 6d 65 6d 32 2e 7a 29 3b  iteFree(mem2.z);
a290: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a2a0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
a2b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
a2c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
a2d0: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
a2e0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
a2f0: 64 65 78 20 65 6e 74 72 79 2e 20 52 65 61 64 20  dex entry. Read 
a300: 74 68 65 20 72 6f 77 69 64 20 28 76 61 72 69 6e  the rowid (varin
a310: 74 20 6f 63 63 75 72 69 6e 67 20 61 74 0a 2a 2a  t occuring at.**
a320: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a330: 65 6e 74 72 79 20 61 6e 64 20 73 74 6f 72 65 20  entry and store 
a340: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 20 52 65  it in *rowid. Re
a350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
a360: 66 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20  f.** everything 
a370: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
a380: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
a390: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
a3a0: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
a3b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
a3c0: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
a3d0: 20 73 7a 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   sz;.  int rc;. 
a3e0: 20 63 68 61 72 20 62 75 66 5b 31 30 5d 3b 0a 20   char buf[10];. 
a3f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 75 36 34 20   int len;.  u64 
a400: 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r;..  rc = sqlit
a410: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
a420: 43 75 72 2c 20 26 73 7a 29 3b 0a 20 20 69 66 28  Cur, &sz);.  if(
a430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
a450: 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20 28 28 73  .  }.  len = ((s
a460: 7a 3e 31 30 29 3f 31 30 3a 73 7a 29 3b 0a 0a 20  z>10)?10:sz);.. 
a470: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
a480: 20 6c 65 73 73 20 74 68 61 6e 20 32 20 62 79 74   less than 2 byt
a490: 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2c 20 74  es in the key, t
a4a0: 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  his cannot be.  
a4b0: 2a 2a 20 61 20 76 61 6c 69 64 20 69 6e 64 65 78  ** a valid index
a4c0: 20 65 6e 74 72 79 2e 20 49 6e 20 70 72 61 63 74   entry. In pract
a4d0: 69 63 65 20 74 68 69 73 20 63 6f 6d 65 73 20 75  ice this comes u
a4e0: 70 20 66 6f 72 20 61 20 71 75 65 72 79 0a 20 20  p for a query.  
a4f0: 2a 2a 20 6f 66 20 74 68 65 20 73 6f 72 74 20 22  ** of the sort "
a500: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
a510: 4f 4d 20 74 31 3b 22 20 77 68 65 6e 20 74 31 20  OM t1;" when t1 
a520: 69 73 20 61 6e 20 65 6d 70 74 79 20 74 61 62 6c  is an empty tabl
a530: 65 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 69  e.  ** with an i
a540: 6e 64 65 78 20 6f 6e 20 78 2e 20 49 6e 20 74 68  ndex on x. In th
a550: 69 73 20 63 61 73 65 20 6a 75 73 74 20 63 61 6c  is case just cal
a560: 6c 20 74 68 65 20 72 6f 77 69 64 20 30 2e 0a 20  l the rowid 0.. 
a570: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e 3c 32 20   */.  if( len<2 
a580: 29 7b 0a 20 20 20 20 2a 72 6f 77 69 64 20 3d 20  ){.    *rowid = 
a590: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
a5a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
a5b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
a5c0: 65 4b 65 79 28 70 43 75 72 2c 20 73 7a 2d 6c 65  eKey(pCur, sz-le
a5d0: 6e 2c 20 6c 65 6e 2c 20 62 75 66 29 3b 0a 20 20  n, len, buf);.  
a5e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a5f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
a600: 72 63 3b 0a 20 20 7d 0a 0a 20 20 6c 65 6e 2d 2d  rc;.  }..  len--
a610: 3b 0a 20 20 77 68 69 6c 65 28 20 62 75 66 5b 6c  ;.  while( buf[l
a620: 65 6e 2d 31 5d 20 26 26 20 2d 2d 6c 65 6e 20 29  en-1] && --len )
a630: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  ;..  sqlite3GetV
a640: 61 72 69 6e 74 28 26 62 75 66 5b 6c 65 6e 5d 2c  arint(&buf[len],
a650: 20 26 72 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &r);.  *rowid =
a660: 20 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   r;.  return SQL
a670: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
a680: 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
a690: 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
a6a0: 72 20 2a 70 43 2c 20 0a 20 20 69 6e 74 20 6e 4b  r *pC, .  int nK
a6b0: 65 79 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ey, const unsign
a6c0: 65 64 20 63 68 61 72 20 2a 70 4b 65 79 2c 0a 20  ed char *pKey,. 
a6d0: 20 69 6e 74 20 69 67 6e 6f 72 65 72 6f 77 69 64   int ignorerowid
a6e0: 2c 0a 20 20 69 6e 74 20 2a 72 65 73 0a 29 7b 0a  ,.  int *res.){.
a6f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a700: 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 75 36 34  *pCellKey;.  u64
a710: 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74   nCellKey;.  int
a720: 20 66 72 65 65 43 65 6c 6c 4b 65 79 20 3d 20 30   freeCellKey = 0
a730: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
a740: 74 20 6c 65 6e 3b 0a 20 20 42 74 43 75 72 73 6f  t len;.  BtCurso
a750: 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
a760: 75 72 73 6f 72 3b 0a 0a 20 20 73 71 6c 69 74 65  ursor;..  sqlite
a770: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
a780: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
a790: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
a7a0: 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
a7b0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
a7c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
a7d0: 70 43 65 6c 6c 4b 65 79 20 3d 20 28 75 6e 73 69  pCellKey = (unsi
a7e0: 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
a7f0: 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
a800: 28 70 43 75 72 2c 20 6e 43 65 6c 6c 4b 65 79 29  (pCur, nCellKey)
a810: 3b 0a 20 20 69 66 28 20 21 70 43 65 6c 6c 4b 65  ;.  if( !pCellKe
a820: 79 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 4b 65  y ){.    pCellKe
a830: 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  y = (unsigned ch
a840: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a850: 63 52 61 77 28 6e 43 65 6c 6c 4b 65 79 29 3b 0a  cRaw(nCellKey);.
a860: 20 20 20 20 69 66 28 20 21 70 43 65 6c 6c 4b 65      if( !pCellKe
a870: 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
a880: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a890: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 65      }.    freeCe
a8a0: 6c 6c 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 72  llKey = 1;.    r
a8b0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a8c0: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
a8d0: 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 29  llKey, pCellKey)
a8e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a8f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a900: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
a910: 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  lKey);.      ret
a920: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
a930: 7d 0a 20 0a 20 20 6c 65 6e 20 3d 20 6e 43 65 6c  }. .  len = nCel
a940: 6c 4b 65 79 2d 32 3b 0a 20 20 77 68 69 6c 65 28  lKey-2;.  while(
a950: 20 70 43 65 6c 6c 4b 65 79 5b 6c 65 6e 5d 20 26   pCellKey[len] &
a960: 26 20 2d 2d 6c 65 6e 20 29 3b 0a 0a 20 20 69 66  & --len );..  if
a970: 28 20 69 67 6e 6f 72 65 72 6f 77 69 64 20 29 7b  ( ignorerowid ){
a980: 0a 20 20 20 20 6e 4b 65 79 2d 2d 3b 0a 20 20 20  .    nKey--;.   
a990: 20 77 68 69 6c 65 28 20 70 4b 65 79 5b 6e 4b 65   while( pKey[nKe
a9a0: 79 5d 20 26 26 20 2d 2d 6e 4b 65 79 20 29 3b 0a  y] && --nKey );.
a9b0: 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
a9c0: 69 74 65 33 56 64 62 65 4b 65 79 43 6f 6d 70 61  ite3VdbeKeyCompa
a9d0: 72 65 28 70 43 2c 20 6c 65 6e 2c 20 70 43 65 6c  re(pC, len, pCel
a9e0: 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
a9f0: 29 3b 0a 20 20 0a 20 20 69 66 28 20 66 72 65 65  );.  .  if( free
aa00: 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 73  CellKey ){.    s
aa10: 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b  qliteFree(pCellK
aa20: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
aa30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.