/ Hex Artifact Content
Login

Artifact 2824bf88895b901b3a8c9e44527c67530e1c0dcb:


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 69 73  *****.** This is
0180: 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65   the header file
0190: 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   for information
01a0: 20 74 68 61 74 20 69 73 20 70 72 69 76 61 74 65   that is private
01b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e   to the.** VDBE.
01c0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
01d0: 6f 6e 20 75 73 65 64 20 74 6f 20 61 6c 6c 20 62  on used to all b
01e0: 65 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  e at the top of 
01f0: 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 6f  the single.** so
0200: 75 72 63 65 20 63 6f 64 65 20 66 69 6c 65 20 22  urce code file "
0210: 76 64 62 65 2e 63 22 2e 20 20 57 68 65 6e 20 74  vdbe.c".  When t
0220: 68 61 74 20 66 69 6c 65 20 62 65 63 61 6d 65 20  hat file became 
0230: 74 6f 6f 20 62 69 67 20 28 6f 76 65 72 0a 2a 2a  too big (over.**
0240: 20 36 30 30 30 20 6c 69 6e 65 73 20 6c 6f 6e 67   6000 lines long
0250: 29 20 69 74 20 77 61 73 20 73 70 6c 69 74 20 75  ) it was split u
0260: 70 20 69 6e 74 6f 20 73 65 76 65 72 61 6c 20 73  p into several s
0270: 6d 61 6c 6c 65 72 20 66 69 6c 65 73 20 61 6e 64  maller files and
0280: 0a 2a 2a 20 74 68 69 73 20 68 65 61 64 65 72 20  .** this header 
0290: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
02a0: 66 61 63 74 6f 72 65 64 20 6f 75 74 2e 0a 2a 2f  factored out..*/
02b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 6b 65  ../*.** The make
02c0: 66 69 6c 65 20 73 63 61 6e 73 20 74 68 69 73 20  file scans this 
02d0: 73 6f 75 72 63 65 20 66 69 6c 65 20 61 6e 64 20  source file and 
02e0: 63 72 65 61 74 65 73 20 74 68 65 20 66 6f 6c 6c  creates the foll
02f0: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 20 6f  owing.** array o
0300: 66 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  f string constan
0310: 74 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  ts which are the
0320: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 56 44   names of all VD
0330: 42 45 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 20 54  BE opcodes..** T
0340: 68 69 73 20 61 72 72 61 79 20 69 73 20 64 65 66  his array is def
0350: 69 6e 65 64 20 69 6e 20 61 20 73 65 70 61 72 61  ined in a separa
0360: 74 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66  te source code f
0370: 69 6c 65 20 6e 61 6d 65 64 20 6f 70 63 6f 64 65  ile named opcode
0380: 2e 63 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  .c.** which is a
0390: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
03a0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 6d 61  erated by the ma
03b0: 6b 65 66 69 6c 65 2e 0a 2a 2f 0a 65 78 74 65 72  kefile..*/.exter
03c0: 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 4f 70  n char *sqliteOp
03d0: 63 6f 64 65 4e 61 6d 65 73 5b 5d 3b 0a 0a 2f 2a  codeNames[];../*
03e0: 0a 2a 2a 20 53 51 4c 20 69 73 20 74 72 61 6e 73  .** SQL is trans
03f0: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 73 65 71  lated into a seq
0400: 75 65 6e 63 65 20 6f 66 20 69 6e 73 74 72 75 63  uence of instruc
0410: 74 69 6f 6e 73 20 74 6f 20 62 65 0a 2a 2a 20 65  tions to be.** e
0420: 78 65 63 75 74 65 64 20 62 79 20 61 20 76 69 72  xecuted by a vir
0430: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 45  tual machine.  E
0440: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
0450: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a  is an instance.*
0460: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
0470: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
0480: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0490: 56 64 62 65 4f 70 20 4f 70 3b 0a 0a 2f 2a 0a 2a  VdbeOp Op;../*.*
04a0: 2a 20 42 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * Boolean values
04b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69  .*/.typedef unsi
04c0: 67 6e 65 64 20 63 68 61 72 20 42 6f 6f 6c 3b 0a  gned char Bool;.
04d0: 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  ./*.** A cursor 
04e0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 69 6e 74  is a pointer int
04f0: 6f 20 61 20 73 69 6e 67 6c 65 20 42 54 72 65 65  o a single BTree
0500: 20 77 69 74 68 69 6e 20 61 20 64 61 74 61 62 61   within a databa
0510: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20  se file..** The 
0520: 63 75 72 73 6f 72 20 63 61 6e 20 73 65 65 6b 20  cursor can seek 
0530: 74 6f 20 61 20 42 54 72 65 65 20 65 6e 74 72 79  to a BTree entry
0540: 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75 6c   with a particul
0550: 61 72 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 6c 6f  ar key, or.** lo
0560: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 65 6e 74 72  op over all entr
0570: 69 65 73 20 6f 66 20 74 68 65 20 42 74 72 65 65  ies of the Btree
0580: 2e 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20  .  You can also 
0590: 69 6e 73 65 72 74 20 6e 65 77 20 42 54 72 65 65  insert new BTree
05a0: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 6f 72 20 72  .** entries or r
05b0: 65 74 72 69 65 76 65 20 74 68 65 20 6b 65 79 20  etrieve the key 
05c0: 6f 72 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  or data from the
05d0: 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
05e0: 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
05f0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
0600: 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 45 76 65 72 79  to..** .** Every
0610: 20 63 75 72 73 6f 72 20 74 68 61 74 20 74 68 65   cursor that the
0620: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
0630: 20 68 61 73 20 6f 70 65 6e 20 69 73 20 72 65 70   has open is rep
0640: 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 0a 2a  resented by an.*
0650: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
0660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0670: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
0680: 74 68 65 20 43 75 72 73 6f 72 2e 69 73 54 72 69  the Cursor.isTri
0690: 67 67 65 72 52 6f 77 20 66 6c 61 67 20 69 73 20  ggerRow flag is 
06a0: 73 65 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61  set it means tha
06b0: 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73  t this cursor is
06c0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 20 73 69 6e  .** really a sin
06d0: 67 6c 65 20 72 6f 77 20 74 68 61 74 20 72 65 70  gle row that rep
06e0: 72 65 73 65 6e 74 73 20 74 68 65 20 4e 45 57 20  resents the NEW 
06f0: 6f 72 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74 61  or OLD pseudo-ta
0700: 62 6c 65 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20  ble of.** a row 
0710: 74 72 69 67 67 65 72 2e 20 20 54 68 65 20 64 61  trigger.  The da
0720: 74 61 20 66 6f 72 20 74 68 65 20 72 6f 77 20 69  ta for the row i
0730: 73 20 73 74 6f 72 65 64 20 69 6e 20 43 75 72 73  s stored in Curs
0740: 6f 72 2e 70 44 61 74 61 20 61 6e 64 0a 2a 2a 20  or.pData and.** 
0750: 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 20  the rowid is in 
0760: 43 75 72 73 6f 72 2e 69 4b 65 79 2e 0a 2a 2f 0a  Cursor.iKey..*/.
0770: 73 74 72 75 63 74 20 43 75 72 73 6f 72 20 7b 0a  struct Cursor {.
0780: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
0790: 73 6f 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  sor;    /* The c
07a0: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 20  ursor structure 
07b0: 6f 66 20 74 68 65 20 62 61 63 6b 65 6e 64 20 2a  of the backend *
07c0: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 52 65 63 6e  /.  int lastRecn
07d0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  o;        /* Las
07e0: 74 20 72 65 63 6e 6f 20 66 72 6f 6d 20 61 20 4e  t recno from a N
07f0: 65 78 74 20 6f 72 20 4e 65 78 74 49 64 78 20 6f  ext or NextIdx o
0800: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
0810: 74 20 6e 65 78 74 52 6f 77 69 64 3b 20 20 20 20  t nextRowid;    
0820: 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 69      /* Next rowi
0830: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 50  d returned by OP
0840: 5f 4e 65 77 52 6f 77 69 64 20 2a 2f 0a 20 20 42  _NewRowid */.  B
0850: 6f 6f 6c 20 72 65 63 6e 6f 49 73 56 61 6c 69 64  ool recnoIsValid
0860: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
0870: 6c 61 73 74 52 65 63 6e 6f 20 69 73 20 76 61 6c  lastRecno is val
0880: 69 64 20 2a 2f 0a 20 20 42 6f 6f 6c 20 6b 65 79  id */.  Bool key
0890: 41 73 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a  AsData;       /*
08a0: 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 63   The OP_Column c
08b0: 6f 6d 6d 61 6e 64 20 77 6f 72 6b 73 20 6f 6e 20  ommand works on 
08c0: 6b 65 79 20 69 6e 73 74 65 61 64 20 6f 66 20 64  key instead of d
08d0: 61 74 61 20 2a 2f 0a 20 20 42 6f 6f 6c 20 61 74  ata */.  Bool at
08e0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 2f  First;         /
08f0: 2a 20 54 72 75 65 20 69 66 20 70 6f 69 6e 74 69  * True if pointi
0900: 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e 74 72  ng to first entr
0910: 79 20 2a 2f 0a 20 20 42 6f 6f 6c 20 75 73 65 52  y */.  Bool useR
0920: 61 6e 64 6f 6d 52 6f 77 69 64 3b 20 20 2f 2a 20  andomRowid;  /* 
0930: 47 65 6e 65 72 61 74 65 20 6e 65 77 20 72 65 63  Generate new rec
0940: 6f 72 64 20 6e 75 6d 62 65 72 73 20 73 65 6d 69  ord numbers semi
0950: 2d 72 61 6e 64 6f 6d 6c 79 20 2a 2f 0a 20 20 42  -randomly */.  B
0960: 6f 6f 6c 20 6e 75 6c 6c 52 6f 77 3b 20 20 20 20  ool nullRow;    
0970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0980: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
0990: 77 20 77 69 74 68 20 6e 6f 20 64 61 74 61 20 2a  w with no data *
09a0: 2f 0a 20 20 42 6f 6f 6c 20 6e 65 78 74 52 6f 77  /.  Bool nextRow
09b0: 69 64 56 61 6c 69 64 3b 20 20 2f 2a 20 54 72 75  idValid;  /* Tru
09c0: 65 20 69 66 20 74 68 65 20 6e 65 78 74 52 6f 77  e if the nextRow
09d0: 69 64 20 66 69 65 6c 64 20 69 73 20 76 61 6c 69  id field is vali
09e0: 64 20 2a 2f 0a 20 20 42 6f 6f 6c 20 70 73 65 75  d */.  Bool pseu
09f0: 64 6f 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20  doTable;     /* 
0a00: 54 68 69 73 20 69 73 20 61 20 4e 45 57 20 6f 72  This is a NEW or
0a10: 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74 61 62 6c   OLD pseudo-tabl
0a20: 65 73 20 6f 66 20 61 20 74 72 69 67 67 65 72 20  es of a trigger 
0a30: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
0a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
0a50: 70 61 72 61 74 65 20 66 69 6c 65 20 68 6f 6c 64  parate file hold
0a60: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
0a70: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ble */.  int nDa
0a80: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
0a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
0aa0: 73 20 69 6e 20 70 44 61 74 61 20 2a 2f 0a 20 20  s in pData */.  
0ab0: 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
0ac0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
0ad0: 72 20 61 20 4e 45 57 20 6f 72 20 4f 4c 44 20 70  r a NEW or OLD p
0ae0: 73 65 75 64 6f 2d 74 61 62 6c 65 20 2a 2f 0a 20  seudo-table */. 
0af0: 20 69 6e 74 20 69 4b 65 79 3b 20 20 20 20 20 20   int iKey;      
0b00: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f         /* Key fo
0b10: 72 20 74 68 65 20 4e 45 57 20 6f 72 20 4f 4c 44  r the NEW or OLD
0b20: 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 72 6f   pseudo-table ro
0b30: 77 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  w */.};.typedef 
0b40: 73 74 72 75 63 74 20 43 75 72 73 6f 72 20 43 75  struct Cursor Cu
0b50: 72 73 6f 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  rsor;../*.** A s
0b60: 6f 72 74 65 72 20 62 75 69 6c 64 73 20 61 20 6c  orter builds a l
0b70: 69 73 74 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ist of elements 
0b80: 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 20 20 45  to be sorted.  E
0b90: 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 0a 2a  ach element of.*
0ba0: 2a 20 74 68 65 20 6c 69 73 74 20 69 73 20 61 6e  * the list is an
0bb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0bc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0bd0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
0be0: 20 73 74 72 75 63 74 20 53 6f 72 74 65 72 20 53   struct Sorter S
0bf0: 6f 72 74 65 72 3b 0a 73 74 72 75 63 74 20 53 6f  orter;.struct So
0c00: 72 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4b 65  rter {.  int nKe
0c10: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
0c20: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
0c30: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
0c40: 63 68 61 72 20 2a 7a 4b 65 79 3b 20 20 20 20 20  char *zKey;     
0c50: 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 62      /* The key b
0c60: 79 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  y which we will 
0c70: 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  sort */.  int nD
0c80: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
0c90: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
0ca0: 20 69 6e 20 74 68 65 20 64 61 74 61 20 2a 2f 0a   in the data */.
0cb0: 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
0cc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
0cd0: 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
0ce0: 68 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  h this key */.  
0cf0: 53 6f 72 74 65 72 20 2a 70 4e 65 78 74 3b 20 20  Sorter *pNext;  
0d00: 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 74      /* Next in t
0d10: 68 65 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  he list */.};../
0d20: 2a 20 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  * .** Number of 
0d30: 62 75 63 6b 65 74 73 20 75 73 65 64 20 66 6f 72  buckets used for
0d40: 20 6d 65 72 67 65 2d 73 6f 72 74 2e 20 20 0a 2a   merge-sort.  .*
0d50: 2f 0a 23 64 65 66 69 6e 65 20 4e 53 4f 52 54 20  /.#define NSORT 
0d60: 33 30 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72  30../*.** Number
0d70: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 74 72   of bytes of str
0d80: 69 6e 67 20 73 74 6f 72 61 67 65 20 73 70 61 63  ing storage spac
0d90: 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 65  e available to e
0da0: 61 63 68 20 73 74 61 63 6b 0a 2a 2a 20 6c 61 79  ach stack.** lay
0db0: 65 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  er without havin
0dc0: 67 20 74 6f 20 6d 61 6c 6c 6f 63 2e 20 20 4e 42  g to malloc.  NB
0dd0: 46 53 20 69 73 20 73 68 6f 72 74 20 66 6f 72 20  FS is short for 
0de0: 4e 75 6d 62 65 72 20 6f 66 20 42 79 74 65 73 0a  Number of Bytes.
0df0: 2a 2a 20 46 6f 72 20 53 74 72 69 6e 67 73 2e 0a  ** For Strings..
0e00: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 46 53 20  */.#define NBFS 
0e10: 33 32 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  32../*.** A sing
0e20: 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  le level of the 
0e30: 73 74 61 63 6b 20 69 73 20 61 6e 20 69 6e 73 74  stack is an inst
0e40: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0e50: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
0e60: 72 65 2e 20 20 45 78 63 65 70 74 2c 20 73 74 72  re.  Except, str
0e70: 69 6e 67 20 76 61 6c 75 65 73 20 61 72 65 20 73  ing values are s
0e80: 74 6f 72 65 64 20 6f 6e 20 61 20 73 65 70 61 72  tored on a separ
0e90: 61 74 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 6f  ate.** list of o
0ea0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 63 68  f pointers to ch
0eb0: 61 72 61 63 74 65 72 2e 20 20 54 68 65 20 72 65  aracter.  The re
0ec0: 61 73 6f 6e 20 66 6f 72 20 73 74 6f 72 69 6e 67  ason for storing
0ed0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 73 65 70 61  .** strings sepa
0ee0: 72 61 74 65 6c 79 20 69 73 20 73 6f 20 74 68 61  rately is so tha
0ef0: 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 65 61  t they can be ea
0f00: 73 69 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  sily passed.** t
0f10: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
0f20: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75  unction..*/.stru
0f30: 63 74 20 53 74 61 63 6b 20 7b 0a 20 20 69 6e 74  ct Stack {.  int
0f40: 20 69 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   i;         /* I
0f50: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a  nteger value */.
0f60: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
0f70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
0f80: 61 72 61 63 74 65 72 73 20 69 6e 20 73 74 72 69  aracters in stri
0f90: 6e 67 20 76 61 6c 75 65 2c 20 69 6e 63 6c 75 64  ng value, includ
0fa0: 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 20 20 69 6e  ing '\0' */.  in
0fb0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 2f 2a 20  t flags;     /* 
0fc0: 53 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  Some combination
0fd0: 20 6f 66 20 53 54 4b 5f 4e 75 6c 6c 2c 20 53 54   of STK_Null, ST
0fe0: 4b 5f 53 74 72 2c 20 53 54 4b 5f 44 79 6e 2c 20  K_Str, STK_Dyn, 
0ff0: 65 74 63 2e 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  etc. */.  double
1000: 20 72 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c   r;      /* Real
1010: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72   value */.  char
1020: 20 7a 5b 4e 42 46 53 5d 3b 20 20 2f 2a 20 53 70   z[NBFS];  /* Sp
1030: 61 63 65 20 66 6f 72 20 73 68 6f 72 74 20 73 74  ace for short st
1040: 72 69 6e 67 73 20 2a 2f 0a 7d 3b 0a 74 79 70 65  rings */.};.type
1050: 64 65 66 20 73 74 72 75 63 74 20 53 74 61 63 6b  def struct Stack
1060: 20 53 74 61 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20 4d   Stack;../*.** M
1070: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 20  emory cells use 
1080: 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1090: 72 65 20 61 73 20 74 68 65 20 73 74 61 63 6b 20  re as the stack 
10a0: 65 78 63 65 70 74 20 74 68 61 74 20 73 70 61 63  except that spac
10b0: 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 72 62 69  e.** for an arbi
10c0: 74 72 61 72 79 20 73 74 72 69 6e 67 20 69 73 20  trary string is 
10d0: 61 64 64 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  added..*/.struct
10e0: 20 4d 65 6d 20 7b 0a 20 20 53 74 61 63 6b 20 73   Mem {.  Stack s
10f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 76  ;       /* All v
1100: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6d 65 6d  alues of the mem
1110: 6f 72 79 20 63 65 6c 6c 20 62 65 73 69 64 65 73  ory cell besides
1120: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
1130: 72 20 2a 7a 3b 20 20 20 20 20 20 20 2f 2a 20 53  r *z;       /* S
1140: 74 72 69 6e 67 20 76 61 6c 75 65 20 66 6f 72 20  tring value for 
1150: 74 68 69 73 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  this memory cell
1160: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
1170: 74 72 75 63 74 20 4d 65 6d 20 4d 65 6d 3b 0a 0a  truct Mem Mem;..
1180: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
1190: 6c 75 65 73 20 66 6f 72 20 53 74 61 63 6b 2e 66  lues for Stack.f
11a0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
11b0: 53 54 4b 5f 4e 75 6c 6c 20 20 20 20 20 20 30 78  STK_Null      0x
11c0: 30 30 30 31 20 20 20 2f 2a 20 56 61 6c 75 65 20  0001   /* Value 
11d0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69  is NULL */.#defi
11e0: 6e 65 20 53 54 4b 5f 53 74 72 20 20 20 20 20 20  ne STK_Str      
11f0: 20 30 78 30 30 30 32 20 20 20 2f 2a 20 56 61 6c   0x0002   /* Val
1200: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  ue is a string *
1210: 2f 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f 49 6e  /.#define STK_In
1220: 74 20 20 20 20 20 20 20 30 78 30 30 30 34 20 20  t       0x0004  
1230: 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 61 6e 20   /* Value is an 
1240: 69 6e 74 65 67 65 72 20 2a 2f 0a 23 64 65 66 69  integer */.#defi
1250: 6e 65 20 53 54 4b 5f 52 65 61 6c 20 20 20 20 20  ne STK_Real     
1260: 20 30 78 30 30 30 38 20 20 20 2f 2a 20 56 61 6c   0x0008   /* Val
1270: 75 65 20 69 73 20 61 20 72 65 61 6c 20 6e 75 6d  ue is a real num
1280: 62 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ber */.#define S
1290: 54 4b 5f 44 79 6e 20 20 20 20 20 20 20 30 78 30  TK_Dyn       0x0
12a0: 30 31 30 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  010   /* Need to
12b0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65   call sqliteFree
12c0: 28 29 20 6f 6e 20 7a 53 74 61 63 6b 5b 5d 20 2a  () on zStack[] *
12d0: 2f 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f 53 74  /.#define STK_St
12e0: 61 74 69 63 20 20 20 20 30 78 30 30 32 30 20 20  atic    0x0020  
12f0: 20 2f 2a 20 7a 53 74 61 63 6b 5b 5d 20 70 6f 69   /* zStack[] poi
1300: 6e 74 73 20 74 6f 20 61 20 73 74 61 74 69 63 20  nts to a static 
1310: 73 74 72 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  string */.#defin
1320: 65 20 53 54 4b 5f 45 70 68 65 6d 20 20 20 20 20  e STK_Ephem     
1330: 30 78 30 30 34 30 20 20 20 2f 2a 20 7a 53 74 61  0x0040   /* zSta
1340: 63 6b 5b 5d 20 70 6f 69 6e 74 73 20 74 6f 20 61  ck[] points to a
1350: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1360: 6e 67 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 66 6f  ng */../* The fo
1370: 6c 6c 6f 77 69 6e 67 20 53 54 4b 5f 20 76 61 6c  llowing STK_ val
1380: 75 65 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20  ue appears only 
1390: 69 6e 20 41 67 67 45 6c 65 6d 2e 61 4d 65 6d 2e  in AggElem.aMem.
13a0: 73 2e 66 6c 61 67 20 66 69 65 6c 64 73 2e 0a 2a  s.flag fields..*
13b0: 2a 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 74  * It indicates t
13c0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
13d0: 6e 64 69 6e 67 20 41 67 67 45 6c 65 6d 2e 61 4d  nding AggElem.aM
13e0: 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61  em.z points to a
13f0: 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
1400: 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 74  nction context t
1410: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
1420: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 23 64  finalized..*/.#d
1430: 65 66 69 6e 65 20 53 54 4b 5f 41 67 67 43 74 78  efine STK_AggCtx
1440: 20 20 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20      0x0040   /* 
1450: 7a 53 74 61 63 6b 5b 5d 20 70 6f 69 6e 74 73 20  zStack[] points 
1460: 74 6f 20 61 6e 20 61 67 67 20 66 75 6e 63 74 69  to an agg functi
1470: 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 2f  on context */../
1480: 2a 0a 2a 2a 20 54 68 65 20 22 63 6f 6e 74 65 78  *.** The "contex
1490: 74 22 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  t" argument for 
14a0: 61 20 69 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75  a installable fu
14b0: 6e 63 74 69 6f 6e 2e 20 20 41 20 70 6f 69 6e 74  nction.  A point
14c0: 65 72 20 74 6f 20 61 6e 0a 2a 2a 20 69 6e 73 74  er to an.** inst
14d0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
14e0: 75 63 74 75 72 65 20 69 73 20 74 68 65 20 66 69  ucture is the fi
14f0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
1500: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 75 73 65  the routines use
1510: 64 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d.** implement t
1520: 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  he SQL functions
1530: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1540: 20 61 20 74 79 70 65 64 65 66 20 66 6f 72 20 74   a typedef for t
1550: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 6e  his structure in
1560: 20 73 71 6c 69 74 65 2e 68 2e 20 20 53 6f 20 61   sqlite.h.  So a
1570: 6c 6c 20 72 6f 75 74 69 6e 65 73 2c 0a 2a 2a 20  ll routines,.** 
1580: 65 76 65 6e 20 74 68 65 20 70 75 62 6c 69 63 20  even the public 
1590: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  interface to SQL
15a0: 69 74 65 2c 20 63 61 6e 20 75 73 65 20 61 20 70  ite, can use a p
15b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
15c0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
15d0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 68   this file is th
15e0: 65 20 6f 6e 6c 79 20 70 6c 61 63 65 20 77 68 65  e only place whe
15f0: 72 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  re the internal 
1600: 64 65 74 61 69 6c 73 20 6f 66 20 74 68 69 73 0a  details of this.
1610: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65  ** structure are
1620: 20 6b 6e 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68   known..**.** Th
1630: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1640: 64 65 66 69 6e 65 64 20 69 6e 73 69 64 65 20 6f  defined inside o
1650: 66 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65  f vdbe.c because
1660: 20 69 74 20 75 73 65 73 20 73 75 62 73 74 72 75   it uses substru
1670: 63 74 75 72 65 73 0a 2a 2a 20 28 53 74 61 63 6b  ctures.** (Stack
1680: 29 20 77 68 69 63 68 20 61 72 65 20 6f 6e 6c 79  ) which are only
1690: 20 64 65 66 69 6e 65 64 20 74 68 65 72 65 2e 0a   defined there..
16a0: 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  */.struct sqlite
16b0: 5f 66 75 6e 63 20 7b 0a 20 20 46 75 6e 63 44 65  _func {.  FuncDe
16c0: 66 20 2a 70 46 75 6e 63 3b 20 20 20 2f 2a 20 50  f *pFunc;   /* P
16d0: 6f 69 6e 74 65 72 20 74 6f 20 66 75 6e 63 74 69  ointer to functi
16e0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  on information. 
16f0: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
1700: 2f 0a 20 20 53 74 61 63 6b 20 73 3b 20 20 20 20  /.  Stack s;    
1710: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 20 73        /* Small s
1720: 74 72 69 6e 67 73 2c 20 69 6e 74 73 2c 20 61 6e  trings, ints, an
1730: 64 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 73 20  d double values 
1740: 67 6f 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61  go here */.  cha
1750: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 2f  r *z;          /
1760: 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
1770: 69 6e 67 20 64 79 6e 61 6d 69 63 20 73 74 72 69  ing dynamic stri
1780: 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
1790: 76 6f 69 64 20 2a 70 41 67 67 3b 20 20 20 20 20  void *pAgg;     
17a0: 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 63    /* Aggregate c
17b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 75 38 20 69  ontext */.  u8 i
17c0: 73 45 72 72 6f 72 3b 20 20 20 20 20 20 20 2f 2a  sError;       /*
17d0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 66 6f 72   Set to true for
17e0: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 75   an error */.  u
17f0: 38 20 69 73 53 74 65 70 3b 20 20 20 20 20 20 20  8 isStep;       
1800: 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 20 74   /* Current in t
1810: 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
1820: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
1830: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1840: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
1850: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
1860: 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
1870: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  d */.};../*.** A
1880: 6e 20 41 67 67 20 73 74 72 75 63 74 75 72 65 20  n Agg structure 
1890: 64 65 73 63 72 69 62 65 73 20 61 6e 20 41 67 67  describes an Agg
18a0: 72 65 67 61 74 6f 72 2e 20 20 45 61 63 68 20 41  regator.  Each A
18b0: 67 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 2a  gg consists of.*
18c0: 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41  * zero or more A
18d0: 67 67 72 65 67 61 74 6f 72 20 65 6c 65 6d 65 6e  ggregator elemen
18e0: 74 73 20 28 41 67 67 45 6c 65 6d 29 2e 20 20 45  ts (AggElem).  E
18f0: 61 63 68 20 41 67 67 45 6c 65 6d 20 63 6f 6e 74  ach AggElem cont
1900: 61 69 6e 73 0a 2a 2a 20 61 20 6b 65 79 20 61 6e  ains.** a key an
1910: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 76 61  d one or more va
1920: 6c 75 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  lues.  The value
1930: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 70 72  s are used in pr
1940: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 61 67 67 72  ocessing.** aggr
1950: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1960: 69 6e 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68  in a SELECT.  Th
1970: 65 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 6f  e key is used to
1980: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1990: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
19a0: 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 0a 2a  e of a select..*
19b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19c0: 20 41 67 67 20 41 67 67 3b 0a 74 79 70 65 64 65   Agg Agg;.typede
19d0: 66 20 73 74 72 75 63 74 20 41 67 67 45 6c 65 6d  f struct AggElem
19e0: 20 41 67 67 45 6c 65 6d 3b 0a 73 74 72 75 63 74   AggElem;.struct
19f0: 20 41 67 67 20 7b 0a 20 20 69 6e 74 20 6e 4d 65   Agg {.  int nMe
1a00: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
1a10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65   Number of value
1a20: 73 20 73 74 6f 72 65 64 20 69 6e 20 65 61 63 68  s stored in each
1a30: 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 20 20 41 67   AggElem */.  Ag
1a40: 67 45 6c 65 6d 20 2a 70 43 75 72 72 65 6e 74 3b  gElem *pCurrent;
1a50: 20 20 20 2f 2a 20 54 68 65 20 41 67 67 45 6c 65     /* The AggEle
1a60: 6d 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 66  m currently in f
1a70: 6f 63 75 73 20 2a 2f 0a 20 20 48 61 73 68 45 6c  ocus */.  HashEl
1a80: 65 6d 20 2a 70 53 65 61 72 63 68 3b 20 20 20 2f  em *pSearch;   /
1a90: 2a 20 54 68 65 20 68 61 73 68 20 65 6c 65 6d 65  * The hash eleme
1aa0: 6e 74 20 66 6f 72 20 70 43 75 72 72 65 6e 74 20  nt for pCurrent 
1ab0: 2a 2f 0a 20 20 48 61 73 68 20 68 61 73 68 3b 20  */.  Hash hash; 
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
1ad0: 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 61  h table of all a
1ae0: 67 67 72 65 67 61 74 65 20 65 6c 65 6d 65 6e 74  ggregate element
1af0: 73 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  s */.  FuncDef *
1b00: 2a 61 70 46 75 6e 63 3b 20 20 20 20 2f 2a 20 49  *apFunc;    /* I
1b10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1b20: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1b30: 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  ions */.};.struc
1b40: 74 20 41 67 67 45 6c 65 6d 20 7b 0a 20 20 63 68  t AggElem {.  ch
1b50: 61 72 20 2a 7a 4b 65 79 3b 20 20 20 20 20 20 20  ar *zKey;       
1b60: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f     /* The key to
1b70: 20 74 68 69 73 20 41 67 67 45 6c 65 6d 20 2a 2f   this AggElem */
1b80: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20  .  int nKey;    
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ba0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1bb0: 65 20 6b 65 79 2c 20 69 6e 63 6c 75 64 69 6e 67  e key, including
1bc0: 20 27 5c 30 27 20 61 74 20 65 6e 64 20 2a 2f 0a   '\0' at end */.
1bd0: 20 20 4d 65 6d 20 61 4d 65 6d 5b 31 5d 3b 20 20    Mem aMem[1];  
1be0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
1bf0: 6c 75 65 73 20 66 6f 72 20 74 68 69 73 20 41 67  lues for this Ag
1c00: 67 45 6c 65 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  gElem */.};../*.
1c10: 2a 2a 20 41 20 53 65 74 20 73 74 72 75 63 74 75  ** A Set structu
1c20: 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 71  re is used for q
1c30: 75 69 63 6b 20 74 65 73 74 69 6e 67 20 74 6f 20  uick testing to 
1c40: 73 65 65 20 69 66 20 61 20 76 61 6c 75 65 0a 2a  see if a value.*
1c50: 2a 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  * is part of a s
1c60: 6d 61 6c 6c 20 73 65 74 2e 20 20 53 65 74 73 20  mall set.  Sets 
1c70: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
1c80: 65 6d 65 6e 74 20 63 6f 64 65 20 6c 69 6b 65 0a  ement code like.
1c90: 2a 2a 20 74 68 69 73 3a 0a 2a 2a 20 20 20 20 20  ** this:.**     
1ca0: 20 20 20 20 20 20 20 78 2e 79 20 49 4e 20 28 27         x.y IN ('
1cb0: 68 69 27 2c 27 68 6f 6f 27 2c 27 68 75 6d 27 29  hi','hoo','hum')
1cc0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1cd0: 63 74 20 53 65 74 20 53 65 74 3b 0a 73 74 72 75  ct Set Set;.stru
1ce0: 63 74 20 53 65 74 20 7b 0a 20 20 48 61 73 68 20  ct Set {.  Hash 
1cf0: 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  hash;           
1d00: 20 20 2f 2a 20 41 20 73 65 74 20 69 73 20 6a 75    /* A set is ju
1d10: 73 74 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  st a hash table 
1d20: 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  */.  HashElem *p
1d30: 72 65 76 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rev;        /* P
1d40: 72 65 76 69 6f 75 73 6c 79 20 61 63 63 65 73 73  reviously access
1d50: 65 64 20 68 61 73 68 20 65 6c 65 6d 65 6e 20 2a  ed hash elemen *
1d60: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 4b 65  /.};../*.** A Ke
1d70: 79 6c 69 73 74 20 69 73 20 61 20 62 75 6e 63 68  ylist is a bunch
1d80: 20 6f 66 20 6b 65 79 73 20 69 6e 74 6f 20 61 20   of keys into a 
1d90: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 6c  table.  The keyl
1da0: 69 73 74 20 63 61 6e 0a 2a 2a 20 67 72 6f 77 20  ist can.** grow 
1db0: 77 69 74 68 6f 75 74 20 62 6f 75 6e 64 2e 20 20  without bound.  
1dc0: 54 68 65 20 6b 65 79 6c 69 73 74 20 73 74 6f 72  The keylist stor
1dd0: 65 73 20 74 68 65 20 52 4f 57 49 44 73 20 6f 66  es the ROWIDs of
1de0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 72 65 63   database.** rec
1df0: 6f 72 64 73 20 74 68 61 74 20 6e 65 65 64 20 74  ords that need t
1e00: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  o be deleted or 
1e10: 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 74 79 70 65  updated..*/.type
1e20: 64 65 66 20 73 74 72 75 63 74 20 4b 65 79 6c 69  def struct Keyli
1e30: 73 74 20 4b 65 79 6c 69 73 74 3b 0a 73 74 72 75  st Keylist;.stru
1e40: 63 74 20 4b 65 79 6c 69 73 74 20 7b 0a 20 20 69  ct Keylist {.  i
1e50: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
1e60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
1e70: 6f 74 73 20 69 6e 20 61 4b 65 79 5b 5d 20 2a 2f  ots in aKey[] */
1e80: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
1e90: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 77       /* Next unw
1ea0: 72 69 74 74 65 6e 20 73 6c 6f 74 20 69 6e 20 61  ritten slot in a
1eb0: 4b 65 79 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Key[] */.  int n
1ec0: 52 65 61 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  Read;        /* 
1ed0: 4e 65 78 74 20 75 6e 72 65 61 64 20 73 6c 6f 74  Next unread slot
1ee0: 20 69 6e 20 61 4b 65 79 5b 5d 20 2a 2f 0a 20 20   in aKey[] */.  
1ef0: 4b 65 79 6c 69 73 74 20 2a 70 4e 65 78 74 3b 20  Keylist *pNext; 
1f00: 20 20 2f 2a 20 4e 65 78 74 20 62 6c 6f 63 6b 20    /* Next block 
1f10: 6f 66 20 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  of keys */.  int
1f20: 20 61 4b 65 79 5b 31 5d 3b 20 20 20 20 20 20 2f   aKey[1];      /
1f30: 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6b 65  * One or more ke
1f40: 79 73 2e 20 20 45 78 74 72 61 20 73 70 61 63 65  ys.  Extra space
1f50: 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 6e 65   allocated as ne
1f60: 65 64 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  eded */.};../*.*
1f70: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1f80: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
1f90: 68 69 6e 65 2e 20 20 54 68 69 73 20 73 74 72 75  hine.  This stru
1fa0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 74  cture contains t
1fb0: 68 65 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 73  he complete.** s
1fc0: 74 61 74 65 20 6f 66 20 74 68 65 20 76 69 72 74  tate of the virt
1fd0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
1fe0: 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 5f 76  ** The "sqlite_v
1ff0: 6d 22 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  m" structure poi
2000: 6e 74 65 72 20 74 68 61 74 20 69 73 20 72 65 74  nter that is ret
2010: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 5f  urned by sqlite_
2020: 63 6f 6d 70 69 6c 65 28 29 0a 2a 2a 20 69 73 20  compile().** is 
2030: 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
2040: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
2050: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
2060: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 56 64 62  e..*/.struct Vdb
2070: 65 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e {.  sqlite *db
2080: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2090: 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
20a0: 2a 2f 0a 20 20 56 64 62 65 20 2a 70 50 72 65 76  */.  Vdbe *pPrev
20b0: 2c 2a 70 4e 65 78 74 3b 20 2f 2a 20 4c 69 6e 6b  ,*pNext; /* Link
20c0: 65 64 20 6c 69 73 74 20 6f 66 20 56 44 42 45 73  ed list of VDBEs
20d0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 56   with the same V
20e0: 64 62 65 2e 64 62 20 2a 2f 0a 20 20 46 49 4c 45  dbe.db */.  FILE
20f0: 20 2a 74 72 61 63 65 3b 20 20 20 20 20 20 20 20   *trace;        
2100: 2f 2a 20 57 72 69 74 65 20 61 6e 20 65 78 65 63  /* Write an exec
2110: 75 74 69 6f 6e 20 74 72 61 63 65 20 68 65 72 65  ution trace here
2120: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
2130: 0a 20 20 69 6e 74 20 6e 4f 70 3b 20 20 20 20 20  .  int nOp;     
2140: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2150: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
2160: 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 20   in the program 
2170: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 41 6c 6c 6f  */.  int nOpAllo
2180: 63 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  c;       /* Numb
2190: 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f  er of slots allo
21a0: 63 61 74 65 64 20 66 6f 72 20 61 4f 70 5b 5d 20  cated for aOp[] 
21b0: 2a 2f 0a 20 20 4f 70 20 2a 61 4f 70 3b 20 20 20  */.  Op *aOp;   
21c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
21d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 69  e to hold the vi
21e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 27 73 20  rtual machine's 
21f0: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
2200: 20 6e 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20   nLabel;        
2210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61   /* Number of la
2220: 62 65 6c 73 20 75 73 65 64 20 2a 2f 0a 20 20 69  bels used */.  i
2230: 6e 74 20 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20  nt nLabelAlloc; 
2240: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2250: 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  slots allocated 
2260: 69 6e 20 61 4c 61 62 65 6c 5b 5d 20 2a 2f 0a 20  in aLabel[] */. 
2270: 20 69 6e 74 20 2a 61 4c 61 62 65 6c 3b 20 20 20   int *aLabel;   
2280: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
2290: 20 68 6f 6c 64 20 74 68 65 20 6c 61 62 65 6c 73   hold the labels
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 73 3b 20 20   */.  int tos;  
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22c0: 65 78 20 6f 66 20 74 6f 70 20 6f 66 20 73 74 61  ex of top of sta
22d0: 63 6b 20 2a 2f 0a 20 20 53 74 61 63 6b 20 2a 61  ck */.  Stack *a
22e0: 53 74 61 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  Stack;      /* T
22f0: 68 65 20 6f 70 65 72 61 6e 64 20 73 74 61 63 6b  he operand stack
2300: 2c 20 65 78 63 65 70 74 20 73 74 72 69 6e 67 20  , except string 
2310: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
2320: 20 2a 2a 7a 53 74 61 63 6b 3b 20 20 20 20 20 20   **zStack;      
2330: 2f 2a 20 54 65 78 74 20 6f 72 20 62 69 6e 61 72  /* Text or binar
2340: 79 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  y values of the 
2350: 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
2360: 2a 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 2f  **azColName;   /
2370: 2a 20 42 65 63 6f 6d 65 73 20 74 68 65 20 34 74  * Becomes the 4t
2380: 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 63  h parameter to c
2390: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 69 6e  allbacks */.  in
23a0: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
23b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
23c0: 6c 6f 74 73 20 69 6e 20 61 43 73 72 5b 5d 20 2a  lots in aCsr[] *
23d0: 2f 0a 20 20 43 75 72 73 6f 72 20 2a 61 43 73 72  /.  Cursor *aCsr
23e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 65  ;       /* One e
23f0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 20 61  lement of this a
2400: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 6f 70  rray for each op
2410: 65 6e 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 53  en cursor */.  S
2420: 6f 72 74 65 72 20 2a 70 53 6f 72 74 3b 20 20 20  orter *pSort;   
2430: 20 20 20 2f 2a 20 41 20 6c 69 6e 6b 65 64 20 6c     /* A linked l
2440: 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 73 20 74  ist of objects t
2450: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
2460: 20 46 49 4c 45 20 2a 70 46 69 6c 65 3b 20 20 20   FILE *pFile;   
2470: 20 20 20 20 20 2f 2a 20 41 74 20 6d 6f 73 74 20       /* At most 
2480: 6f 6e 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  one open file ha
2490: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ndler */.  int n
24a0: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 2f  Field;         /
24b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 6c 65  * Number of file
24c0: 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 63 68 61   fields */.  cha
24d0: 72 20 2a 2a 61 7a 46 69 65 6c 64 3b 20 20 20 20  r **azField;    
24e0: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
24f0: 68 20 66 69 6c 65 20 66 69 65 6c 64 20 2a 2f 0a  h file field */.
2500: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
2510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2520: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
2530: 56 61 72 69 61 62 6c 65 5b 5d 20 2a 2f 0a 20 20  Variable[] */.  
2540: 63 68 61 72 20 2a 2a 61 7a 56 61 72 3b 20 20 20  char **azVar;   
2550: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 66 6f      /* Values fo
2560: 72 20 74 68 65 20 4f 50 5f 56 61 72 69 61 62 6c  r the OP_Variabl
2570: 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  e opcode */.  in
2580: 74 20 2a 61 6e 56 61 72 3b 20 20 20 20 20 20 20  t *anVar;       
2590: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
25a0: 61 63 68 20 76 61 6c 75 65 20 69 6e 20 61 7a 56  ach value in azV
25b0: 61 72 69 61 62 6c 65 5b 5d 20 2a 2f 0a 20 20 75  ariable[] */.  u
25c0: 38 20 2a 61 62 56 61 72 3b 20 20 20 20 20 20 20  8 *abVar;       
25d0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 61 7a     /* TRUE if az
25e0: 56 61 72 69 61 62 6c 65 5b 69 5d 20 6e 65 65 64  Variable[i] need
25f0: 73 20 74 6f 20 62 65 20 73 71 6c 69 74 65 46 72  s to be sqliteFr
2600: 65 65 28 29 65 64 20 2a 2f 0a 20 20 63 68 61 72  ee()ed */.  char
2610: 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20   *zLine;        
2620: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2630: 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 69 6e  line from the in
2640: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  put file */.  in
2650: 74 20 6e 4c 69 6e 65 41 6c 6c 6f 63 3b 20 20 20  t nLineAlloc;   
2660: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2670: 6f 66 20 73 70 61 63 65 73 20 61 6c 6c 6f 63 61  of spaces alloca
2680: 74 65 64 20 66 6f 72 20 7a 4c 69 6e 65 20 2a 2f  ted for zLine */
2690: 0a 20 20 69 6e 74 20 6d 61 67 69 63 3b 20 20 20  .  int magic;   
26a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26b0: 67 69 63 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  gic number for s
26c0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
26d0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26f0: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
2700: 6c 6f 63 61 74 69 6f 6e 73 20 63 75 72 72 65 6e  locations curren
2710: 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  tly allocated */
2720: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 3b 20 20 20  .  Mem *aMem;   
2730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2740: 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
2750: 6e 73 20 2a 2f 0a 20 20 41 67 67 20 61 67 67 3b  ns */.  Agg agg;
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 2f 2a 20 41 67 67 72 65 67 61 74 65 20 69 6e 66  /* Aggregate inf
2780: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  ormation */.  in
2790: 74 20 6e 53 65 74 3b 20 20 20 20 20 20 20 20 20  t nSet;         
27a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27b0: 6f 66 20 73 65 74 73 20 61 6c 6c 6f 63 61 74 65  of sets allocate
27c0: 64 20 2a 2f 0a 20 20 53 65 74 20 2a 61 53 65 74  d */.  Set *aSet
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27e0: 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 73 65  * An array of se
27f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 6c  ts */.  int nCal
2800: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
2810: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 6c  /* Number of cal
2820: 6c 62 61 63 6b 73 20 69 6e 76 6f 6b 65 64 20 73  lbacks invoked s
2830: 6f 20 66 61 72 20 2a 2f 0a 20 20 4b 65 79 6c 69  o far */.  Keyli
2840: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
2850: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
2860: 52 4f 57 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  ROWIDs */.  int 
2870: 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74  keylistStackDept
2880: 68 3b 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20  h;  /* The size 
2890: 6f 66 20 74 68 65 20 22 6b 65 79 6c 69 73 74 22  of the "keylist"
28a0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 4b 65 79 6c   stack */.  Keyl
28b0: 69 73 74 20 2a 2a 6b 65 79 6c 69 73 74 53 74 61  ist **keylistSta
28c0: 63 6b 3b 20 2f 2a 20 54 68 65 20 73 74 61 63 6b  ck; /* The stack
28d0: 20 75 73 65 64 20 62 79 20 6f 70 63 6f 64 65 73   used by opcodes
28e0: 20 4c 69 73 74 50 75 73 68 20 26 20 4c 69 73 74   ListPush & List
28f0: 50 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  Pop */.  int pc;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20   /* The program 
2920: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2930: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2940: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
2950: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 6e 73   return */.  uns
2960: 69 67 6e 65 64 20 75 6e 69 71 75 65 43 6e 74 3b  igned uniqueCnt;
2970: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
2980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 77 68  OP_MakeRecord wh
2990: 65 6e 20 50 32 21 3d 30 20 2a 2f 0a 20 20 69 6e  en P2!=0 */.  in
29a0: 74 20 65 72 72 6f 72 41 63 74 69 6f 6e 3b 20 20  t errorAction;  
29b0: 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 76 65 72        /* Recover
29c0: 79 20 61 63 74 69 6f 6e 20 74 6f 20 64 6f 20 69  y action to do i
29d0: 6e 20 63 61 73 65 20 6f 66 20 61 6e 20 65 72 72  n case of an err
29e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 64 6f  or */.  int undo
29f0: 54 72 61 6e 73 4f 6e 45 72 72 6f 72 3b 20 20 20  TransOnError;   
2a00: 2f 2a 20 49 66 20 65 72 72 6f 72 2c 20 65 69 74  /* If error, eit
2a10: 68 65 72 20 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  her ROLLBACK or 
2a20: 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 69 6e 74 20  COMMIT */.  int 
2a30: 69 6e 54 65 6d 70 54 72 61 6e 73 3b 20 20 20 20  inTempTrans;    
2a40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2a50: 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
2a60: 74 72 61 6e 73 61 63 74 69 6f 6e 65 64 20 2a 2f  transactioned */
2a70: 0a 20 20 69 6e 74 20 72 65 74 75 72 6e 53 74 61  .  int returnSta
2a80: 63 6b 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 52 65  ck[100];   /* Re
2a90: 74 75 72 6e 20 61 64 64 72 65 73 73 20 73 74 61  turn address sta
2aa0: 63 6b 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20  ck for OP_Gosub 
2ab0: 26 20 4f 50 5f 52 65 74 75 72 6e 20 2a 2f 0a 20  & OP_Return */. 
2ac0: 20 69 6e 74 20 72 65 74 75 72 6e 44 65 70 74 68   int returnDepth
2ad0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ;        /* Next
2ae0: 20 75 6e 75 73 65 64 20 65 6c 65 6d 65 6e 74 20   unused element 
2af0: 69 6e 20 72 65 74 75 72 6e 53 74 61 63 6b 5b 5d  in returnStack[]
2b00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 43 6f   */.  int nResCo
2b10: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
2b20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
2b30: 6e 73 20 69 6e 20 6f 6e 65 20 72 6f 77 20 6f 66  ns in one row of
2b40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2b50: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  */.  char **azRe
2b60: 73 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  sColumn;        
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 2f 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 6f 6e  /* Values for on
2b90: 65 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20  e row of result 
2ba0: 2a 2f 20 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c  */ .  int (*xCal
2bb0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
2bc0: 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b  ,char**,char**);
2bd0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
2be0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
2bf0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 62 41 72  */.  void *pCbAr
2c00: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
2c30: 74 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  t to xCallback()
2c40: 20 2a 2f 0a 20 20 69 6e 74 20 70 6f 70 53 74 61   */.  int popSta
2c50: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck;           /*
2c60: 20 50 6f 70 20 74 68 65 20 73 74 61 63 6b 20 74   Pop the stack t
2c70: 68 69 73 20 6d 75 63 68 20 6f 6e 20 65 6e 74 72  his much on entr
2c80: 79 20 74 6f 20 56 64 62 65 45 78 65 63 28 29 20  y to VdbeExec() 
2c90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
2ca0: 73 67 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sg;          /* 
2cb0: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  Error message wr
2cc0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
2cd0: 75 38 20 65 78 70 6c 61 69 6e 3b 20 20 20 20 20  u8 explain;     
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2cf0: 69 66 20 45 58 50 4c 41 49 4e 20 70 72 65 73 65  if EXPLAIN prese
2d00: 6e 74 20 6f 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  nt on SQL comman
2d10: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  d */.};../*.** T
2d20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2d30: 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   allowed values 
2d40: 66 6f 72 20 56 64 62 65 2e 6d 61 67 69 63 0a 2a  for Vdbe.magic.*
2d50: 2f 0a 23 64 65 66 69 6e 65 20 56 44 42 45 5f 4d  /.#define VDBE_M
2d60: 41 47 49 43 5f 49 4e 49 54 20 20 20 20 20 30 78  AGIC_INIT     0x
2d70: 32 36 62 63 65 61 61 35 20 20 20 20 2f 2a 20 42  26bceaa5    /* B
2d80: 75 69 6c 64 69 6e 67 20 61 20 56 44 42 45 20 70  uilding a VDBE p
2d90: 72 6f 67 72 61 6d 20 2a 2f 0a 23 64 65 66 69 6e  rogram */.#defin
2da0: 65 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  e VDBE_MAGIC_RUN
2db0: 20 20 20 20 20 20 30 78 62 64 66 32 30 64 61 33        0xbdf20da3
2dc0: 20 20 20 20 2f 2a 20 56 44 42 45 20 69 73 20 72      /* VDBE is r
2dd0: 65 61 64 79 20 74 6f 20 65 78 65 63 75 74 65 20  eady to execute 
2de0: 2a 2f 0a 23 64 65 66 69 6e 65 20 56 44 42 45 5f  */.#define VDBE_
2df0: 4d 41 47 49 43 5f 48 41 4c 54 20 20 20 20 20 30  MAGIC_HALT     0
2e00: 78 35 31 39 63 32 39 37 33 20 20 20 20 2f 2a 20  x519c2973    /* 
2e10: 56 44 42 45 20 68 61 73 20 63 6f 6d 70 6c 65 74  VDBE has complet
2e20: 65 64 20 65 78 65 63 75 74 69 6f 6e 20 2a 2f 0a  ed execution */.
2e30: 23 64 65 66 69 6e 65 20 56 44 42 45 5f 4d 41 47  #define VDBE_MAG
2e40: 49 43 5f 44 45 41 44 20 20 20 20 20 30 78 62 36  IC_DEAD     0xb6
2e50: 30 36 63 33 63 38 20 20 20 20 2f 2a 20 54 68 65  06c3c8    /* The
2e60: 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20 64   VDBE has been d
2e70: 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 2f  eallocated */../
2e80: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 20 6d  *.** Here is a m
2e90: 61 63 72 6f 20 74 6f 20 68 61 6e 64 6c 65 20 74  acro to handle t
2ea0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2eb0: 66 20 70 6f 70 70 69 6e 67 20 74 68 65 20 73 74  f popping the st
2ec0: 61 63 6b 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  ack.** once.  Th
2ed0: 69 73 20 6d 61 63 72 6f 20 6f 6e 6c 79 20 77 6f  is macro only wo
2ee0: 72 6b 73 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  rks from within 
2ef0: 74 68 65 20 73 71 6c 69 74 65 56 64 62 65 45 78  the sqliteVdbeEx
2f00: 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ec().** function
2f10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 50  ..*/.#define POP
2f20: 53 54 41 43 4b 20 5c 0a 20 20 61 73 73 65 72 74  STACK \.  assert
2f30: 28 70 2d 3e 74 6f 73 3e 3d 30 29 3b 20 5c 0a 20  (p->tos>=0); \. 
2f40: 20 69 66 28 20 61 53 74 61 63 6b 5b 70 2d 3e 74   if( aStack[p->t
2f50: 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  os].flags & STK_
2f60: 44 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  Dyn ) sqliteFree
2f70: 28 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 29  (zStack[p->tos])
2f80: 3b 20 5c 0a 20 20 70 2d 3e 74 6f 73 2d 2d 3b 0a  ; \.  p->tos--;.
2f90: 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
2fa0: 70 72 6f 74 6f 74 79 70 65 73 0a 2a 2f 0a 76 6f  prototypes.*/.vo
2fb0: 69 64 20 73 71 6c 69 74 65 56 64 62 65 43 6c 65  id sqliteVdbeCle
2fc0: 61 6e 75 70 43 75 72 73 6f 72 28 43 75 72 73 6f  anupCursor(Curso
2fd0: 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  r*);.void sqlite
2fe0: 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28  VdbeSorterReset(
2ff0: 56 64 62 65 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  Vdbe*);.void sql
3000: 69 74 65 56 64 62 65 41 67 67 52 65 73 65 74 28  iteVdbeAggReset(
3010: 41 67 67 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69  Agg*);.void sqli
3020: 74 65 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65  teVdbeKeylistFre
3030: 65 28 4b 65 79 6c 69 73 74 2a 29 3b 0a 76 6f 69  e(Keylist*);.voi
3040: 64 20 73 71 6c 69 74 65 56 64 62 65 50 6f 70 53  d sqliteVdbePopS
3050: 74 61 63 6b 28 56 64 62 65 2a 2c 69 6e 74 29 3b  tack(Vdbe*,int);
3060: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
3070: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
3080: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 76  (VDBE_PROFILE).v
3090: 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65 50 72  oid sqliteVdbePr
30a0: 69 6e 74 4f 70 28 46 49 4c 45 2a 2c 20 69 6e 74  intOp(FILE*, int
30b0: 2c 20 4f 70 2a 29 3b 0a 23 65 6e 64 69 66 0a     , Op*);.#endif.