/ Hex Artifact Content
Login

Artifact 742e257653aa4249fef3c4313f7e414387b6d7f6:


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 57 68 65 6e 20 63 6f 6e  ../*.** When con
02c0: 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  verting from the
02d0: 20 6e 61 74 69 76 65 20 66 6f 72 6d 61 74 20 74   native format t
02e0: 6f 20 74 68 65 20 6b 65 79 20 66 6f 72 6d 61 74  o the key format
02f0: 20 61 6e 64 20 62 61 63 6b 0a 2a 2a 20 61 67 61   and back.** aga
0300: 69 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  in, in addition 
0310: 74 6f 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  to changing the 
0320: 62 79 74 65 20 6f 72 64 65 72 20 77 65 20 69 6e  byte order we in
0330: 76 65 72 74 20 74 68 65 20 68 69 67 68 2d 6f 72  vert the high-or
0340: 64 65 72 0a 2a 2a 20 62 69 74 20 6f 66 20 74 68  der.** bit of th
0350: 65 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61  e most significa
0360: 6e 74 20 62 79 74 65 2e 20 20 54 68 69 73 20 63  nt byte.  This c
0370: 61 75 73 65 73 20 6e 65 67 61 74 69 76 65 20 6e  auses negative n
0380: 75 6d 62 65 72 73 20 74 6f 0a 2a 2a 20 73 6f 72  umbers to.** sor
0390: 74 20 62 65 66 6f 72 65 20 70 6f 73 69 74 69 76  t before positiv
03a0: 65 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65  e numbers in the
03b0: 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69   memcmp() functi
03c0: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6b  on..*/.#define k
03d0: 65 79 54 6f 49 6e 74 28 58 29 20 20 20 28 73 71  eyToInt(X)   (sq
03e0: 6c 69 74 65 33 56 64 62 65 42 79 74 65 53 77 61  lite3VdbeByteSwa
03f0: 70 28 58 29 20 5e 20 30 78 38 30 30 30 30 30 30  p(X) ^ 0x8000000
0400: 30 29 0a 23 64 65 66 69 6e 65 20 69 6e 74 54 6f  0).#define intTo
0410: 4b 65 79 28 58 29 20 20 20 28 73 71 6c 69 74 65  Key(X)   (sqlite
0420: 33 56 64 62 65 42 79 74 65 53 77 61 70 28 28 58  3VdbeByteSwap((X
0430: 29 20 5e 20 30 78 38 30 30 30 30 30 30 30 29 29  ) ^ 0x80000000))
0440: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 6b 65  ../*.** The make
0450: 66 69 6c 65 20 73 63 61 6e 73 20 74 68 69 73 20  file scans this 
0460: 73 6f 75 72 63 65 20 66 69 6c 65 20 61 6e 64 20  source file and 
0470: 63 72 65 61 74 65 73 20 74 68 65 20 66 6f 6c 6c  creates the foll
0480: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 20 6f  owing.** array o
0490: 66 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  f string constan
04a0: 74 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  ts which are the
04b0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 56 44   names of all VD
04c0: 42 45 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 20 54  BE opcodes..** T
04d0: 68 69 73 20 61 72 72 61 79 20 69 73 20 64 65 66  his array is def
04e0: 69 6e 65 64 20 69 6e 20 61 20 73 65 70 61 72 61  ined in a separa
04f0: 74 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66  te source code f
0500: 69 6c 65 20 6e 61 6d 65 64 20 6f 70 63 6f 64 65  ile named opcode
0510: 2e 63 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  .c.** which is a
0520: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
0530: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 6d 61  erated by the ma
0540: 6b 65 66 69 6c 65 2e 0a 2a 2f 0a 65 78 74 65 72  kefile..*/.exter
0550: 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4f  n char *sqlite3O
0560: 70 63 6f 64 65 4e 61 6d 65 73 5b 5d 3b 0a 0a 2f  pcodeNames[];../
0570: 2a 0a 2a 2a 20 53 51 4c 20 69 73 20 74 72 61 6e  *.** SQL is tran
0580: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 73 65  slated into a se
0590: 71 75 65 6e 63 65 20 6f 66 20 69 6e 73 74 72 75  quence of instru
05a0: 63 74 69 6f 6e 73 20 74 6f 20 62 65 0a 2a 2a 20  ctions to be.** 
05b0: 65 78 65 63 75 74 65 64 20 62 79 20 61 20 76 69  executed by a vi
05c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
05d0: 45 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Each instruction
05e0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a   is an instance.
05f0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
0600: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0610: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0620: 20 56 64 62 65 4f 70 20 4f 70 3b 0a 0a 2f 2a 0a   VdbeOp Op;../*.
0630: 2a 2a 20 42 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** Boolean value
0640: 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73  s.*/.typedef uns
0650: 69 67 6e 65 64 20 63 68 61 72 20 42 6f 6f 6c 3b  igned char Bool;
0660: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ../*.** A cursor
0670: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 69 6e   is a pointer in
0680: 74 6f 20 61 20 73 69 6e 67 6c 65 20 42 54 72 65  to a single BTre
0690: 65 20 77 69 74 68 69 6e 20 61 20 64 61 74 61 62  e within a datab
06a0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65  ase file..** The
06b0: 20 63 75 72 73 6f 72 20 63 61 6e 20 73 65 65 6b   cursor can seek
06c0: 20 74 6f 20 61 20 42 54 72 65 65 20 65 6e 74 72   to a BTree entr
06d0: 79 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  y with a particu
06e0: 6c 61 72 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 6c  lar key, or.** l
06f0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 65 6e 74  oop over all ent
0700: 72 69 65 73 20 6f 66 20 74 68 65 20 42 74 72 65  ries of the Btre
0710: 65 2e 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f  e.  You can also
0720: 20 69 6e 73 65 72 74 20 6e 65 77 20 42 54 72 65   insert new BTre
0730: 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 6f 72 20  e.** entries or 
0740: 72 65 74 72 69 65 76 65 20 74 68 65 20 6b 65 79  retrieve the key
0750: 20 6f 72 20 64 61 74 61 20 66 72 6f 6d 20 74 68   or data from th
0760: 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
0770: 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75   cursor.** is cu
0780: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
0790: 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 45 76 65 72   to..** .** Ever
07a0: 79 20 63 75 72 73 6f 72 20 74 68 61 74 20 74 68  y cursor that th
07b0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
07c0: 65 20 68 61 73 20 6f 70 65 6e 20 69 73 20 72 65  e has open is re
07d0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 0a  presented by an.
07e0: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
07f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0800: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
0810: 20 74 68 65 20 43 75 72 73 6f 72 2e 69 73 54 72   the Cursor.isTr
0820: 69 67 67 65 72 52 6f 77 20 66 6c 61 67 20 69 73  iggerRow flag is
0830: 20 73 65 74 20 69 74 20 6d 65 61 6e 73 20 74 68   set it means th
0840: 61 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  at this cursor i
0850: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 20 73 69  s.** really a si
0860: 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 72 65  ngle row that re
0870: 70 72 65 73 65 6e 74 73 20 74 68 65 20 4e 45 57  presents the NEW
0880: 20 6f 72 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74   or OLD pseudo-t
0890: 61 62 6c 65 20 6f 66 0a 2a 2a 20 61 20 72 6f 77  able of.** a row
08a0: 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 20 64   trigger.  The d
08b0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ata for the row 
08c0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 43 75 72  is stored in Cur
08d0: 73 6f 72 2e 70 44 61 74 61 20 61 6e 64 0a 2a 2a  sor.pData and.**
08e0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
08f0: 20 43 75 72 73 6f 72 2e 69 4b 65 79 2e 0a 2a 2f   Cursor.iKey..*/
0900: 0a 73 74 72 75 63 74 20 43 75 72 73 6f 72 20 7b  .struct Cursor {
0910: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
0920: 72 73 6f 72 3b 20 20 20 20 2f 2a 20 54 68 65 20  rsor;    /* The 
0930: 63 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  cursor structure
0940: 20 6f 66 20 74 68 65 20 62 61 63 6b 65 6e 64 20   of the backend 
0950: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 52 65 63  */.  int lastRec
0960: 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  no;        /* La
0970: 73 74 20 72 65 63 6e 6f 20 66 72 6f 6d 20 61 20  st recno from a 
0980: 4e 65 78 74 20 6f 72 20 4e 65 78 74 49 64 78 20  Next or NextIdx 
0990: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
09a0: 6e 74 20 6e 65 78 74 52 6f 77 69 64 3b 20 20 20  nt nextRowid;   
09b0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77       /* Next row
09c0: 69 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  id returned by O
09d0: 50 5f 4e 65 77 52 6f 77 69 64 20 2a 2f 0a 20 20  P_NewRowid */.  
09e0: 42 6f 6f 6c 20 72 65 63 6e 6f 49 73 56 61 6c 69  Bool recnoIsVali
09f0: 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d;    /* True if
0a00: 20 6c 61 73 74 52 65 63 6e 6f 20 69 73 20 76 61   lastRecno is va
0a10: 6c 69 64 20 2a 2f 0a 20 20 42 6f 6f 6c 20 6b 65  lid */.  Bool ke
0a20: 79 41 73 44 61 74 61 3b 20 20 20 20 20 20 20 2f  yAsData;       /
0a30: 2a 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  * The OP_Column 
0a40: 63 6f 6d 6d 61 6e 64 20 77 6f 72 6b 73 20 6f 6e  command works on
0a50: 20 6b 65 79 20 69 6e 73 74 65 61 64 20 6f 66 20   key instead of 
0a60: 64 61 74 61 20 2a 2f 0a 20 20 42 6f 6f 6c 20 61  data */.  Bool a
0a70: 74 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  tFirst;         
0a80: 2f 2a 20 54 72 75 65 20 69 66 20 70 6f 69 6e 74  /* True if point
0a90: 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e 74  ing to first ent
0aa0: 72 79 20 2a 2f 0a 20 20 42 6f 6f 6c 20 75 73 65  ry */.  Bool use
0ab0: 52 61 6e 64 6f 6d 52 6f 77 69 64 3b 20 20 2f 2a  RandomRowid;  /*
0ac0: 20 47 65 6e 65 72 61 74 65 20 6e 65 77 20 72 65   Generate new re
0ad0: 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 73 65 6d  cord numbers sem
0ae0: 69 2d 72 61 6e 64 6f 6d 6c 79 20 2a 2f 0a 20 20  i-randomly */.  
0af0: 42 6f 6f 6c 20 6e 75 6c 6c 52 6f 77 3b 20 20 20  Bool nullRow;   
0b00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0b10: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
0b20: 6f 77 20 77 69 74 68 20 6e 6f 20 64 61 74 61 20  ow with no data 
0b30: 2a 2f 0a 20 20 42 6f 6f 6c 20 6e 65 78 74 52 6f  */.  Bool nextRo
0b40: 77 69 64 56 61 6c 69 64 3b 20 20 2f 2a 20 54 72  widValid;  /* Tr
0b50: 75 65 20 69 66 20 74 68 65 20 6e 65 78 74 52 6f  ue if the nextRo
0b60: 77 69 64 20 66 69 65 6c 64 20 69 73 20 76 61 6c  wid field is val
0b70: 69 64 20 2a 2f 0a 20 20 42 6f 6f 6c 20 70 73 65  id */.  Bool pse
0b80: 75 64 6f 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a  udoTable;     /*
0b90: 20 54 68 69 73 20 69 73 20 61 20 4e 45 57 20 6f   This is a NEW o
0ba0: 72 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74 61 62  r OLD pseudo-tab
0bb0: 6c 65 73 20 6f 66 20 61 20 74 72 69 67 67 65 72  les of a trigger
0bc0: 20 2a 2f 0a 20 20 42 6f 6f 6c 20 64 65 66 65 72   */.  Bool defer
0bd0: 72 65 64 4d 6f 76 65 74 6f 3b 20 20 2f 2a 20 41  redMoveto;  /* A
0be0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0bf0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 69 73  BtreeMoveto() is
0c00: 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 6e 74   needed */.  int
0c10: 20 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 20 20   movetoTarget;  
0c20: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
0c30: 6f 20 74 68 65 20 64 65 66 65 72 72 65 64 20 73  o the deferred s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
0c50: 6f 28 29 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  o() */.  Btree *
0c60: 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pBt;           /
0c70: 2a 20 53 65 70 61 72 61 74 65 20 66 69 6c 65 20  * Separate file 
0c80: 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72  holding temporar
0c90: 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  y table */.  int
0ca0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
0cb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0cc0: 62 79 74 65 73 20 69 6e 20 70 44 61 74 61 20 2a  bytes in pData *
0cd0: 2f 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b  /.  char *pData;
0ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
0cf0: 61 20 66 6f 72 20 61 20 4e 45 57 20 6f 72 20 4f  a for a NEW or O
0d00: 4c 44 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  LD pseudo-table 
0d10: 2a 2f 0a 20 20 69 6e 74 20 69 4b 65 79 3b 20 20  */.  int iKey;  
0d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
0d30: 79 20 66 6f 72 20 74 68 65 20 4e 45 57 20 6f 72  y for the NEW or
0d40: 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74 61 62 6c   OLD pseudo-tabl
0d50: 65 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 74 79 70 65  e row */.};.type
0d60: 64 65 66 20 73 74 72 75 63 74 20 43 75 72 73 6f  def struct Curso
0d70: 72 20 43 75 72 73 6f 72 3b 0a 0a 2f 2a 0a 2a 2a  r Cursor;../*.**
0d80: 20 41 20 73 6f 72 74 65 72 20 62 75 69 6c 64 73   A sorter builds
0d90: 20 61 20 6c 69 73 74 20 6f 66 20 65 6c 65 6d 65   a list of eleme
0da0: 6e 74 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  nts to be sorted
0db0: 2e 20 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  .  Each element 
0dc0: 6f 66 0a 2a 2a 20 74 68 65 20 6c 69 73 74 20 69  of.** the list i
0dd0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
0de0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0df0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0e00: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0e10: 65 72 20 53 6f 72 74 65 72 3b 0a 73 74 72 75 63  er Sorter;.struc
0e20: 74 20 53 6f 72 74 65 72 20 7b 0a 20 20 69 6e 74  t Sorter {.  int
0e30: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   nKey;          
0e40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
0e50: 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  tes in the key *
0e60: 2f 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20  /.  char *zKey; 
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
0e80: 65 79 20 62 79 20 77 68 69 63 68 20 77 65 20 77  ey by which we w
0e90: 69 6c 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e  ill sort */.  in
0ea0: 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  t nData;        
0eb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
0ec0: 79 74 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ytes in the data
0ed0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 44 61 74   */.  char *pDat
0ee0: 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  a;        /* The
0ef0: 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
0f00: 20 77 69 74 68 20 74 68 69 73 20 6b 65 79 20 2a   with this key *
0f10: 2f 0a 20 20 53 6f 72 74 65 72 20 2a 70 4e 65 78  /.  Sorter *pNex
0f20: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
0f30: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 7d  in the list */.}
0f40: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4e 75 6d 62 65 72  ;../* .** Number
0f50: 20 6f 66 20 62 75 63 6b 65 74 73 20 75 73 65 64   of buckets used
0f60: 20 66 6f 72 20 6d 65 72 67 65 2d 73 6f 72 74 2e   for merge-sort.
0f70: 20 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 53    .*/.#define NS
0f80: 4f 52 54 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 4e 75  ORT 30../*.** Nu
0f90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
0fa0: 20 73 74 72 69 6e 67 20 73 74 6f 72 61 67 65 20   string storage 
0fb0: 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
0fc0: 74 6f 20 65 61 63 68 20 73 74 61 63 6b 0a 2a 2a  to each stack.**
0fd0: 20 6c 61 79 65 72 20 77 69 74 68 6f 75 74 20 68   layer without h
0fe0: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 2e  aving to malloc.
0ff0: 20 20 4e 42 46 53 20 69 73 20 73 68 6f 72 74 20    NBFS is short 
1000: 66 6f 72 20 4e 75 6d 62 65 72 20 6f 66 20 42 79  for Number of By
1010: 74 65 73 0a 2a 2a 20 46 6f 72 20 53 74 72 69 6e  tes.** For Strin
1020: 67 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  gs..*/.#define N
1030: 42 46 53 20 33 32 0a 0a 2f 2a 0a 2a 2a 20 41 20  BFS 32../*.** A 
1040: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
1050: 74 68 65 20 73 74 61 63 6b 20 6f 72 20 61 20 73  the stack or a s
1060: 69 6e 67 6c 65 20 6d 65 6d 6f 72 79 20 63 65 6c  ingle memory cel
1070: 6c 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 73 74 61  l.** is an insta
1080: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1090: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
10a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 20 7b  .*/.struct Mem {
10b0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
10d0: 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  r value */.  int
10e0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
1100: 61 72 61 63 74 65 72 73 20 69 6e 20 73 74 72 69  aracters in stri
1110: 6e 67 20 76 61 6c 75 65 2c 20 69 6e 63 6c 75 64  ng value, includ
1120: 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 20 20 69 6e  ing '\0' */.  in
1130: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
1140: 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 62 69 6e    /* Some combin
1150: 61 74 69 6f 6e 20 6f 66 20 4d 45 4d 5f 4e 75 6c  ation of MEM_Nul
1160: 6c 2c 20 4d 45 4d 5f 53 74 72 2c 20 4d 45 4d 5f  l, MEM_Str, MEM_
1170: 44 79 6e 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 64  Dyn, etc. */.  d
1180: 6f 75 62 6c 65 20 72 3b 20 20 20 20 20 20 20 20  ouble r;        
1190: 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65     /* Real value
11a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
11b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
11c0: 69 6e 67 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63  ing value */.  c
11d0: 68 61 72 20 7a 53 68 6f 72 74 5b 4e 42 46 53 5d  har zShort[NBFS]
11e0: 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
11f0: 73 68 6f 72 74 20 73 74 72 69 6e 67 73 20 2a 2f  short strings */
1200: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
1210: 63 74 20 4d 65 6d 20 4d 65 6d 3b 0a 0a 2f 2a 0a  ct Mem Mem;../*.
1220: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
1230: 73 20 66 6f 72 20 4d 65 6d 2e 66 6c 61 67 73 0a  s for Mem.flags.
1240: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45 4d 5f 4e  */.#define MEM_N
1250: 75 6c 6c 20 20 20 20 20 20 30 78 30 30 30 31 20  ull      0x0001 
1260: 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 4e 55    /* Value is NU
1270: 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45  LL */.#define ME
1280: 4d 5f 53 74 72 20 20 20 20 20 20 20 30 78 30 30  M_Str       0x00
1290: 30 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73  02   /* Value is
12a0: 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 23 64 65   a string */.#de
12b0: 66 69 6e 65 20 4d 45 4d 5f 49 6e 74 20 20 20 20  fine MEM_Int    
12c0: 20 20 20 30 78 30 30 30 34 20 20 20 2f 2a 20 56     0x0004   /* V
12d0: 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
12e0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45  er */.#define ME
12f0: 4d 5f 52 65 61 6c 20 20 20 20 20 20 30 78 30 30  M_Real      0x00
1300: 30 38 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73  08   /* Value is
1310: 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 2a   a real number *
1320: 2f 0a 23 64 65 66 69 6e 65 20 4d 45 4d 5f 44 79  /.#define MEM_Dy
1330: 6e 20 20 20 20 20 20 20 30 78 30 30 31 30 20 20  n       0x0010  
1340: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
1350: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e   sqliteFree() on
1360: 20 4d 65 6d 2e 7a 20 2a 2f 0a 23 64 65 66 69 6e   Mem.z */.#defin
1370: 65 20 4d 45 4d 5f 53 74 61 74 69 63 20 20 20 20  e MEM_Static    
1380: 30 78 30 30 32 30 20 20 20 2f 2a 20 4d 65 6d 2e  0x0020   /* Mem.
1390: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  z points to a st
13a0: 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 23  atic string */.#
13b0: 64 65 66 69 6e 65 20 4d 45 4d 5f 45 70 68 65 6d  define MEM_Ephem
13c0: 20 20 20 20 20 30 78 30 30 34 30 20 20 20 2f 2a       0x0040   /*
13d0: 20 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74 6f   Mem.z points to
13e0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74   an ephemeral st
13f0: 72 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ring */.#define 
1400: 4d 45 4d 5f 53 68 6f 72 74 20 20 20 20 20 30 78  MEM_Short     0x
1410: 30 30 38 30 20 20 20 2f 2a 20 4d 65 6d 2e 7a 20  0080   /* Mem.z 
1420: 70 6f 69 6e 74 73 20 74 6f 20 4d 65 6d 2e 7a 53  points to Mem.zS
1430: 68 6f 72 74 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20  hort */../* The 
1440: 66 6f 6c 6c 6f 77 69 6e 67 20 4d 45 4d 5f 20 76  following MEM_ v
1450: 61 6c 75 65 20 61 70 70 65 61 72 73 20 6f 6e 6c  alue appears onl
1460: 79 20 69 6e 20 41 67 67 45 6c 65 6d 2e 61 4d 65  y in AggElem.aMe
1470: 6d 2e 73 2e 66 6c 61 67 20 66 69 65 6c 64 73 2e  m.s.flag fields.
1480: 0a 2a 2a 20 49 74 20 69 6e 64 69 63 61 74 65 73  .** It indicates
1490: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73   that the corres
14a0: 70 6f 6e 64 69 6e 67 20 41 67 67 45 6c 65 6d 2e  ponding AggElem.
14b0: 61 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74 6f  aMem.z points to
14c0: 20 61 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20   a.** aggregate 
14d0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74  function context
14e0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
14f0: 65 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2f 0a  e finalized..*/.
1500: 23 64 65 66 69 6e 65 20 4d 45 4d 5f 41 67 67 43  #define MEM_AggC
1510: 74 78 20 20 20 20 30 78 30 31 30 30 20 20 20 2f  tx    0x0100   /
1520: 2a 20 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74  * Mem.z points t
1530: 6f 20 61 6e 20 61 67 67 20 66 75 6e 63 74 69 6f  o an agg functio
1540: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 2f 2a  n context */../*
1550: 0a 2a 2a 20 54 68 65 20 22 63 6f 6e 74 65 78 74  .** The "context
1560: 22 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61  " argument for a
1570: 20 69 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e   installable fun
1580: 63 74 69 6f 6e 2e 20 20 41 20 70 6f 69 6e 74 65  ction.  A pointe
1590: 72 20 74 6f 20 61 6e 0a 2a 2a 20 69 6e 73 74 61  r to an.** insta
15a0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
15b0: 63 74 75 72 65 20 69 73 20 74 68 65 20 66 69 72  cture is the fir
15c0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
15d0: 68 65 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64  he routines used
15e0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
15f0: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e  e SQL functions.
1600: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
1610: 61 20 74 79 70 65 64 65 66 20 66 6f 72 20 74 68  a typedef for th
1620: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  is structure in 
1630: 73 71 6c 69 74 65 2e 68 2e 20 20 53 6f 20 61 6c  sqlite.h.  So al
1640: 6c 20 72 6f 75 74 69 6e 65 73 2c 0a 2a 2a 20 65  l routines,.** e
1650: 76 65 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69  ven the public i
1660: 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c 69  nterface to SQLi
1670: 74 65 2c 20 63 61 6e 20 75 73 65 20 61 20 70 6f  te, can use a po
1680: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74  inter to this st
1690: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20  ructure..** But 
16a0: 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 68 65  this file is the
16b0: 20 6f 6e 6c 79 20 70 6c 61 63 65 20 77 68 65 72   only place wher
16c0: 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64  e the internal d
16d0: 65 74 61 69 6c 73 20 6f 66 20 74 68 69 73 0a 2a  etails of this.*
16e0: 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20  * structure are 
16f0: 6b 6e 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  known..**.** Thi
1700: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 64  s structure is d
1710: 65 66 69 6e 65 64 20 69 6e 73 69 64 65 20 6f 66  efined inside of
1720: 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20   vdbe.c because 
1730: 69 74 20 75 73 65 73 20 73 75 62 73 74 72 75 63  it uses substruc
1740: 74 75 72 65 73 0a 2a 2a 20 28 4d 65 6d 29 20 77  tures.** (Mem) w
1750: 68 69 63 68 20 61 72 65 20 6f 6e 6c 79 20 64 65  hich are only de
1760: 66 69 6e 65 64 20 74 68 65 72 65 2e 0a 2a 2f 0a  fined there..*/.
1770: 73 74 72 75 63 74 20 73 71 6c 69 74 65 5f 66 75  struct sqlite_fu
1780: 6e 63 20 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  nc {.  FuncDef *
1790: 70 46 75 6e 63 3b 20 20 20 2f 2a 20 50 6f 69 6e  pFunc;   /* Poin
17a0: 74 65 72 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20  ter to function 
17b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 4d 55  information.  MU
17c0: 53 54 20 42 45 20 46 49 52 53 54 20 2a 2f 0a 20  ST BE FIRST */. 
17d0: 20 4d 65 6d 20 73 3b 20 20 20 20 20 20 20 20 20   Mem s;         
17e0: 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
17f0: 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64   value is stored
1800: 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69 64 20   here */.  void 
1810: 2a 70 41 67 67 3b 20 20 20 20 20 20 20 2f 2a 20  *pAgg;       /* 
1820: 41 67 67 72 65 67 61 74 65 20 63 6f 6e 74 65 78  Aggregate contex
1830: 74 20 2a 2f 0a 20 20 75 38 20 69 73 45 72 72 6f  t */.  u8 isErro
1840: 72 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  r;       /* Set 
1850: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 65  to true for an e
1860: 72 72 6f 72 20 2a 2f 0a 20 20 75 38 20 69 73 53  rror */.  u8 isS
1870: 74 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  tep;        /* C
1880: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 20 73 74  urrent in the st
1890: 65 70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ep function */. 
18a0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
18b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18c0: 74 69 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  times that the s
18d0: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  tep function has
18e0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 2a 2f 0a   been called */.
18f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 41 67 67  };../*.** An Agg
1900: 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72   structure descr
1910: 69 62 65 73 20 61 6e 20 41 67 67 72 65 67 61 74  ibes an Aggregat
1920: 6f 72 2e 20 20 45 61 63 68 20 41 67 67 20 63 6f  or.  Each Agg co
1930: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 7a 65 72  nsists of.** zer
1940: 6f 20 6f 72 20 6d 6f 72 65 20 41 67 67 72 65 67  o or more Aggreg
1950: 61 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 28 41  ator elements (A
1960: 67 67 45 6c 65 6d 29 2e 20 20 45 61 63 68 20 41  ggElem).  Each A
1970: 67 67 45 6c 65 6d 20 63 6f 6e 74 61 69 6e 73 0a  ggElem contains.
1980: 2a 2a 20 61 20 6b 65 79 20 61 6e 64 20 6f 6e 65  ** a key and one
1990: 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
19a0: 20 20 54 68 65 20 76 61 6c 75 65 73 20 61 72 65    The values are
19b0: 20 75 73 65 64 20 69 6e 20 70 72 6f 63 65 73 73   used in process
19c0: 69 6e 67 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  ing.** aggregate
19d0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 20   functions in a 
19e0: 53 45 4c 45 43 54 2e 20 20 54 68 65 20 6b 65 79  SELECT.  The key
19f0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
1a00: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 47 52 4f  ement.** the GRO
1a10: 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  UP BY clause of 
1a20: 61 20 73 65 6c 65 63 74 2e 0a 2a 2f 0a 74 79 70  a select..*/.typ
1a30: 65 64 65 66 20 73 74 72 75 63 74 20 41 67 67 20  edef struct Agg 
1a40: 41 67 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72  Agg;.typedef str
1a50: 75 63 74 20 41 67 67 45 6c 65 6d 20 41 67 67 45  uct AggElem AggE
1a60: 6c 65 6d 3b 0a 73 74 72 75 63 74 20 41 67 67 20  lem;.struct Agg 
1a70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  {.  int nMem;   
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a90: 65 72 20 6f 66 20 76 61 6c 75 65 73 20 73 74 6f  er of values sto
1aa0: 72 65 64 20 69 6e 20 65 61 63 68 20 41 67 67 45  red in each AggE
1ab0: 6c 65 6d 20 2a 2f 0a 20 20 41 67 67 45 6c 65 6d  lem */.  AggElem
1ac0: 20 2a 70 43 75 72 72 65 6e 74 3b 20 20 20 2f 2a   *pCurrent;   /*
1ad0: 20 54 68 65 20 41 67 67 45 6c 65 6d 20 63 75 72   The AggElem cur
1ae0: 72 65 6e 74 6c 79 20 69 6e 20 66 6f 63 75 73 20  rently in focus 
1af0: 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  */.  HashElem *p
1b00: 53 65 61 72 63 68 3b 20 20 20 2f 2a 20 54 68 65  Search;   /* The
1b10: 20 68 61 73 68 20 65 6c 65 6d 65 6e 74 20 66 6f   hash element fo
1b20: 72 20 70 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  r pCurrent */.  
1b30: 48 61 73 68 20 68 61 73 68 3b 20 20 20 20 20 20  Hash hash;      
1b40: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
1b50: 6c 65 20 6f 66 20 61 6c 6c 20 61 67 67 72 65 67  le of all aggreg
1b60: 61 74 65 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ate elements */.
1b70: 20 20 46 75 6e 63 44 65 66 20 2a 2a 61 70 46 75    FuncDef **apFu
1b80: 6e 63 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  nc;    /* Inform
1b90: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 67 67 72  ation about aggr
1ba0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1bb0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 41 67 67  */.};.struct Agg
1bc0: 45 6c 65 6d 20 7b 0a 20 20 63 68 61 72 20 2a 7a  Elem {.  char *z
1bd0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Key;          /*
1be0: 20 54 68 65 20 6b 65 79 20 74 6f 20 74 68 69 73   The key to this
1bf0: 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e   AggElem */.  in
1c00: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
1c10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c20: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1c30: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27 5c 30 27  , including '\0'
1c40: 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 4d 65 6d   at end */.  Mem
1c50: 20 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20   aMem[1];       
1c60: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 73 20    /* The values 
1c70: 66 6f 72 20 74 68 69 73 20 41 67 67 45 6c 65 6d  for this AggElem
1c80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1c90: 53 65 74 20 73 74 72 75 63 74 75 72 65 20 69 73  Set structure is
1ca0: 20 75 73 65 64 20 66 6f 72 20 71 75 69 63 6b 20   used for quick 
1cb0: 74 65 73 74 69 6e 67 20 74 6f 20 73 65 65 20 69  testing to see i
1cc0: 66 20 61 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  f a value.** is 
1cd0: 70 61 72 74 20 6f 66 20 61 20 73 6d 61 6c 6c 20  part of a small 
1ce0: 73 65 74 2e 20 20 53 65 74 73 20 61 72 65 20 75  set.  Sets are u
1cf0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1d00: 20 63 6f 64 65 20 6c 69 6b 65 0a 2a 2a 20 74 68   code like.** th
1d10: 69 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  is:.**          
1d20: 20 20 78 2e 79 20 49 4e 20 28 27 68 69 27 2c 27    x.y IN ('hi','
1d30: 68 6f 6f 27 2c 27 68 75 6d 27 29 0a 2a 2f 0a 74  hoo','hum').*/.t
1d40: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 65  ypedef struct Se
1d50: 74 20 53 65 74 3b 0a 73 74 72 75 63 74 20 53 65  t Set;.struct Se
1d60: 74 20 7b 0a 20 20 48 61 73 68 20 68 61 73 68 3b  t {.  Hash hash;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d80: 41 20 73 65 74 20 69 73 20 6a 75 73 74 20 61 20  A set is just a 
1d90: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
1da0: 48 61 73 68 45 6c 65 6d 20 2a 70 72 65 76 3b 20  HashElem *prev; 
1db0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
1dc0: 75 73 6c 79 20 61 63 63 65 73 73 65 64 20 68 61  usly accessed ha
1dd0: 73 68 20 65 6c 65 6d 65 6e 20 2a 2f 0a 7d 3b 0a  sh elemen */.};.
1de0: 0a 2f 2a 0a 2a 2a 20 41 20 4b 65 79 6c 69 73 74  ./*.** A Keylist
1df0: 20 69 73 20 61 20 62 75 6e 63 68 20 6f 66 20 6b   is a bunch of k
1e00: 65 79 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  eys into a table
1e10: 2e 20 20 54 68 65 20 6b 65 79 6c 69 73 74 20 63  .  The keylist c
1e20: 61 6e 0a 2a 2a 20 67 72 6f 77 20 77 69 74 68 6f  an.** grow witho
1e30: 75 74 20 62 6f 75 6e 64 2e 20 20 54 68 65 20 6b  ut bound.  The k
1e40: 65 79 6c 69 73 74 20 73 74 6f 72 65 73 20 74 68  eylist stores th
1e50: 65 20 52 4f 57 49 44 73 20 6f 66 20 64 61 74 61  e ROWIDs of data
1e60: 62 61 73 65 0a 2a 2a 20 72 65 63 6f 72 64 73 20  base.** records 
1e70: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1e80: 64 65 6c 65 74 65 64 20 6f 72 20 75 70 64 61 74  deleted or updat
1e90: 65 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ed..*/.typedef s
1ea0: 74 72 75 63 74 20 4b 65 79 6c 69 73 74 20 4b 65  truct Keylist Ke
1eb0: 79 6c 69 73 74 3b 0a 73 74 72 75 63 74 20 4b 65  ylist;.struct Ke
1ec0: 79 6c 69 73 74 20 7b 0a 20 20 69 6e 74 20 6e 4b  ylist {.  int nK
1ed0: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
1ee0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
1ef0: 6e 20 61 4b 65 79 5b 5d 20 2a 2f 0a 20 20 69 6e  n aKey[] */.  in
1f00: 74 20 6e 55 73 65 64 3b 20 20 20 20 20 20 20 20  t nUsed;        
1f10: 2f 2a 20 4e 65 78 74 20 75 6e 77 72 69 74 74 65  /* Next unwritte
1f20: 6e 20 73 6c 6f 74 20 69 6e 20 61 4b 65 79 5b 5d  n slot in aKey[]
1f30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b   */.  int nRead;
1f40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f50: 75 6e 72 65 61 64 20 73 6c 6f 74 20 69 6e 20 61  unread slot in a
1f60: 4b 65 79 5b 5d 20 2a 2f 0a 20 20 4b 65 79 6c 69  Key[] */.  Keyli
1f70: 73 74 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  st *pNext;   /* 
1f80: 4e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 6b 65  Next block of ke
1f90: 79 73 20 2a 2f 0a 20 20 69 6e 74 20 61 4b 65 79  ys */.  int aKey
1fa0: 5b 31 5d 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  [1];      /* One
1fb0: 20 6f 72 20 6d 6f 72 65 20 6b 65 79 73 2e 20 20   or more keys.  
1fc0: 45 78 74 72 61 20 73 70 61 63 65 20 61 6c 6c 6f  Extra space allo
1fd0: 63 61 74 65 64 20 61 73 20 6e 65 65 64 65 64 20  cated as needed 
1fe0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 43  */.};../*.** A C
1ff0: 6f 6e 74 65 78 74 20 73 74 6f 72 65 73 20 74 68  ontext stores th
2000: 65 20 6c 61 73 74 20 69 6e 73 65 72 74 20 72 6f  e last insert ro
2010: 77 69 64 2c 20 74 68 65 20 6c 61 73 74 20 73 74  wid, the last st
2020: 61 74 65 6d 65 6e 74 20 63 68 61 6e 67 65 20 63  atement change c
2030: 6f 75 6e 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ount,.** and the
2040: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
2050: 6e 74 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  nt change count 
2060: 28 69 2e 65 2e 20 63 68 61 6e 67 65 73 20 73 69  (i.e. changes si
2070: 6e 63 65 20 6c 61 73 74 20 73 74 61 74 65 6d 65  nce last stateme
2080: 6e 74 29 2e 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73  nt)..** Elements
2090: 20 6f 66 20 43 6f 6e 74 65 78 74 20 73 74 72 75   of Context stru
20a0: 63 74 75 72 65 20 74 79 70 65 20 6d 61 6b 65 20  cture type make 
20b0: 75 70 20 74 68 65 20 43 6f 6e 74 65 78 74 53 74  up the ContextSt
20c0: 61 63 6b 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a  ack, which is.**
20d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
20e0: 43 6f 6e 74 65 78 74 50 75 73 68 20 61 6e 64 20  ContextPush and 
20f0: 43 6f 6e 74 65 78 74 50 6f 70 20 6f 70 63 6f 64  ContextPop opcod
2100: 65 73 20 28 75 73 65 64 20 62 79 20 74 72 69 67  es (used by trig
2110: 67 65 72 73 29 0a 2a 2f 0a 74 79 70 65 64 65 66  gers).*/.typedef
2120: 20 73 74 72 75 63 74 20 43 6f 6e 74 65 78 74 20   struct Context 
2130: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
2140: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20  Context {.  int 
2150: 6c 61 73 74 52 6f 77 69 64 3b 20 20 20 20 2f 2a  lastRowid;    /*
2160: 20 4c 61 73 74 20 69 6e 73 65 72 74 20 72 6f 77   Last insert row
2170: 69 64 20 28 66 72 6f 6d 20 64 62 2d 3e 6c 61 73  id (from db->las
2180: 74 52 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e 74  tRowid) */.  int
2190: 20 6c 73 43 68 61 6e 67 65 3b 20 20 20 20 20 2f   lsChange;     /
21a0: 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74  * Last statement
21b0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 28 66   change count (f
21c0: 72 6f 6d 20 64 62 2d 3e 6c 73 43 68 61 6e 67 65  rom db->lsChange
21d0: 29 20 2a 2f 0a 20 20 69 6e 74 20 63 73 43 68 61  ) */.  int csCha
21e0: 6e 67 65 3b 20 20 20 20 20 2f 2a 20 43 75 72 72  nge;     /* Curr
21f0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 63 68  ent statement ch
2200: 61 6e 67 65 20 63 6f 75 6e 74 20 28 66 72 6f 6d  ange count (from
2210: 20 64 62 2d 3e 63 73 43 68 61 6e 67 65 29 20 2a   db->csChange) *
2220: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
2230: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 76  nstance of the v
2240: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
2250: 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
2260: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
2270: 70 6c 65 74 65 0a 2a 2a 20 73 74 61 74 65 20 6f  plete.** state o
2280: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  f the virtual ma
2290: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
22a0: 20 22 73 71 6c 69 74 65 5f 76 6d 22 20 73 74 72   "sqlite_vm" str
22b0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 20 74  ucture pointer t
22c0: 68 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 20  hat is returned 
22d0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  by sqlite3_compi
22e0: 6c 65 28 29 0a 2a 2a 20 69 73 20 72 65 61 6c 6c  le().** is reall
22f0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
2300: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2310: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
2320: 0a 73 74 72 75 63 74 20 56 64 62 65 20 7b 0a 20  .struct Vdbe {. 
2330: 20 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20   sqlite *db;    
2340: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
2350: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2360: 56 64 62 65 20 2a 70 50 72 65 76 2c 2a 70 4e 65  Vdbe *pPrev,*pNe
2370: 78 74 3b 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  xt; /* Linked li
2380: 73 74 20 6f 66 20 56 44 42 45 73 20 77 69 74 68  st of VDBEs with
2390: 20 74 68 65 20 73 61 6d 65 20 56 64 62 65 2e 64   the same Vdbe.d
23a0: 62 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  b */.  FILE *tra
23b0: 63 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ce;        /* Wr
23c0: 69 74 65 20 61 6e 20 65 78 65 63 75 74 69 6f 6e  ite an execution
23d0: 20 74 72 61 63 65 20 68 65 72 65 2c 20 69 66 20   trace here, if 
23e0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  not NULL */.  in
23f0: 74 20 6e 4f 70 3b 20 20 20 20 20 20 20 20 20 20  t nOp;          
2400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2410: 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 6e 20 74  nstructions in t
2420: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  he program */.  
2430: 69 6e 74 20 6e 4f 70 41 6c 6c 6f 63 3b 20 20 20  int nOpAlloc;   
2440: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2450: 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   slots allocated
2460: 20 66 6f 72 20 61 4f 70 5b 5d 20 2a 2f 0a 20 20   for aOp[] */.  
2470: 4f 70 20 2a 61 4f 70 3b 20 20 20 20 20 20 20 20  Op *aOp;        
2480: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
2490: 68 6f 6c 64 20 74 68 65 20 76 69 72 74 75 61 6c  hold the virtual
24a0: 20 6d 61 63 68 69 6e 65 27 73 20 70 72 6f 67 72   machine's progr
24b0: 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 61 62  am */.  int nLab
24c0: 65 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  el;         /* N
24d0: 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c 73 20  umber of labels 
24e0: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  used */.  int nL
24f0: 61 62 65 6c 41 6c 6c 6f 63 3b 20 20 20 20 2f 2a  abelAlloc;    /*
2500: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
2510: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c   allocated in aL
2520: 61 62 65 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  abel[] */.  int 
2530: 2a 61 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  *aLabel;        
2540: 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
2550: 20 74 68 65 20 6c 61 62 65 6c 73 20 2a 2f 0a 20   the labels */. 
2560: 20 4d 65 6d 20 2a 61 53 74 61 63 6b 3b 20 20 20   Mem *aStack;   
2570: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72       /* The oper
2580: 61 6e 64 20 73 74 61 63 6b 2c 20 65 78 63 65 70  and stack, excep
2590: 74 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20  t string values 
25a0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 54 6f 73 3b 20  */.  Mem *pTos; 
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
25c0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6f 70 65  entry in the ope
25d0: 72 61 6e 64 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rand stack */.  
25e0: 63 68 61 72 20 2a 2a 7a 41 72 67 76 3b 20 20 20  char **zArgv;   
25f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 76 61 6c 75      /* Text valu
2600: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  es used by the c
2610: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61  allback */.  cha
2620: 72 20 2a 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20  r **azColName;  
2630: 20 2f 2a 20 42 65 63 6f 6d 65 73 20 74 68 65 20   /* Becomes the 
2640: 34 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f  4th parameter to
2650: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20   callbacks */.  
2660: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
2670: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2680: 20 73 6c 6f 74 73 20 69 6e 20 61 43 73 72 5b 5d   slots in aCsr[]
2690: 20 2a 2f 0a 20 20 43 75 72 73 6f 72 20 2a 61 43   */.  Cursor *aC
26a0: 73 72 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  sr;       /* One
26b0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 73   element of this
26c0: 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68 20   array for each 
26d0: 6f 70 65 6e 20 63 75 72 73 6f 72 20 2a 2f 0a 20  open cursor */. 
26e0: 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 3b 20   Sorter *pSort; 
26f0: 20 20 20 20 20 2f 2a 20 41 20 6c 69 6e 6b 65 64       /* A linked
2700: 20 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 73   list of objects
2710: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
2720: 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 3b 20  .  FILE *pFile; 
2730: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6d 6f 73         /* At mos
2740: 74 20 6f 6e 65 20 6f 70 65 6e 20 66 69 6c 65 20  t one open file 
2750: 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  handler */.  int
2760: 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
2770: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
2780: 6c 65 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 63  le fields */.  c
2790: 68 61 72 20 2a 2a 61 7a 46 69 65 6c 64 3b 20 20  har **azField;  
27a0: 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65     /* Data for e
27b0: 61 63 68 20 66 69 6c 65 20 66 69 65 6c 64 20 2a  ach file field *
27c0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27e0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
27f0: 61 7a 56 61 72 69 61 62 6c 65 5b 5d 20 2a 2f 0a  azVariable[] */.
2800: 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 72 3b 20    char **azVar; 
2810: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
2820: 66 6f 72 20 74 68 65 20 4f 50 5f 56 61 72 69 61  for the OP_Varia
2830: 62 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ble opcode */.  
2840: 69 6e 74 20 2a 61 6e 56 61 72 3b 20 20 20 20 20  int *anVar;     
2850: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
2860: 20 65 61 63 68 20 76 61 6c 75 65 20 69 6e 20 61   each value in a
2870: 7a 56 61 72 69 61 62 6c 65 5b 5d 20 2a 2f 0a 20  zVariable[] */. 
2880: 20 75 38 20 2a 61 62 56 61 72 3b 20 20 20 20 20   u8 *abVar;     
2890: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
28a0: 61 7a 56 61 72 69 61 62 6c 65 5b 69 5d 20 6e 65  azVariable[i] ne
28b0: 65 64 73 20 74 6f 20 62 65 20 73 71 6c 69 74 65  eds to be sqlite
28c0: 46 72 65 65 28 29 65 64 20 2a 2f 0a 20 20 63 68  Free()ed */.  ch
28d0: 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
28e0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
28f0: 65 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  e line from the 
2900: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
2910: 69 6e 74 20 6e 4c 69 6e 65 41 6c 6c 6f 63 3b 20  int nLineAlloc; 
2920: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2930: 72 20 6f 66 20 73 70 61 63 65 73 20 61 6c 6c 6f  r of spaces allo
2940: 63 61 74 65 64 20 66 6f 72 20 7a 4c 69 6e 65 20  cated for zLine 
2950: 2a 2f 0a 20 20 69 6e 74 20 6d 61 67 69 63 3b 20  */.  int magic; 
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2970: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 66 6f 72  Magic number for
2980: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
29c0: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 63 75 72 72  y locations curr
29d0: 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ently allocated 
29e0: 2a 2f 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 3b 20  */.  Mem *aMem; 
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a00: 54 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  The memory locat
2a10: 69 6f 6e 73 20 2a 2f 0a 20 20 41 67 67 20 61 67  ions */.  Agg ag
2a20: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2a30: 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 69    /* Aggregate i
2a40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2a50: 69 6e 74 20 6e 53 65 74 3b 20 20 20 20 20 20 20  int nSet;       
2a60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a70: 72 20 6f 66 20 73 65 74 73 20 61 6c 6c 6f 63 61  r of sets alloca
2a80: 74 65 64 20 2a 2f 0a 20 20 53 65 74 20 2a 61 53  ted */.  Set *aS
2a90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
2aa0: 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
2ab0: 73 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  sets */.  int nC
2ac0: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
2ad0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2ae0: 61 6c 6c 62 61 63 6b 73 20 69 6e 76 6f 6b 65 64  allbacks invoked
2af0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 4b 65 79   so far */.  Key
2b00: 6c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  list *pList;    
2b10: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2b20: 66 20 52 4f 57 49 44 73 20 2a 2f 0a 20 20 69 6e  f ROWIDs */.  in
2b30: 74 20 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65  t keylistStackDe
2b40: 70 74 68 3b 20 20 2f 2a 20 54 68 65 20 73 69 7a  pth;  /* The siz
2b50: 65 20 6f 66 20 74 68 65 20 22 6b 65 79 6c 69 73  e of the "keylis
2b60: 74 22 20 73 74 61 63 6b 20 2a 2f 0a 20 20 4b 65  t" stack */.  Ke
2b70: 79 6c 69 73 74 20 2a 2a 6b 65 79 6c 69 73 74 53  ylist **keylistS
2b80: 74 61 63 6b 3b 20 2f 2a 20 54 68 65 20 73 74 61  tack; /* The sta
2b90: 63 6b 20 75 73 65 64 20 62 79 20 6f 70 63 6f 64  ck used by opcod
2ba0: 65 73 20 4c 69 73 74 50 75 73 68 20 26 20 4c 69  es ListPush & Li
2bb0: 73 74 50 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 63  stPop */.  int c
2bc0: 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68  ontextStackDepth
2bd0: 3b 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f  ;  /* The size o
2be0: 66 20 74 68 65 20 22 63 6f 6e 74 65 78 74 22 20  f the "context" 
2bf0: 73 74 61 63 6b 20 2a 2f 0a 20 20 43 6f 6e 74 65  stack */.  Conte
2c00: 78 74 20 2a 63 6f 6e 74 65 78 74 53 74 61 63 6b  xt *contextStack
2c10: 3b 20 20 2f 2a 20 53 74 61 63 6b 20 75 73 65 64  ;  /* Stack used
2c20: 20 62 79 20 6f 70 63 6f 64 65 73 20 43 6f 6e 74   by opcodes Cont
2c30: 65 78 74 50 75 73 68 20 26 20 43 6f 6e 74 65 78  extPush & Contex
2c40: 74 50 6f 70 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  tPop*/.  int pc;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20   /* The program 
2c70: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2c80: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2c90: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
2ca0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 6e 73   return */.  uns
2cb0: 69 67 6e 65 64 20 75 6e 69 71 75 65 43 6e 74 3b  igned uniqueCnt;
2cc0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
2cd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 77 68  OP_MakeRecord wh
2ce0: 65 6e 20 50 32 21 3d 30 20 2a 2f 0a 20 20 69 6e  en P2!=0 */.  in
2cf0: 74 20 65 72 72 6f 72 41 63 74 69 6f 6e 3b 20 20  t errorAction;  
2d00: 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 76 65 72        /* Recover
2d10: 79 20 61 63 74 69 6f 6e 20 74 6f 20 64 6f 20 69  y action to do i
2d20: 6e 20 63 61 73 65 20 6f 66 20 61 6e 20 65 72 72  n case of an err
2d30: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 64 6f  or */.  int undo
2d40: 54 72 61 6e 73 4f 6e 45 72 72 6f 72 3b 20 20 20  TransOnError;   
2d50: 2f 2a 20 49 66 20 65 72 72 6f 72 2c 20 65 69 74  /* If error, eit
2d60: 68 65 72 20 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  her ROLLBACK or 
2d70: 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 69 6e 74 20  COMMIT */.  int 
2d80: 69 6e 54 65 6d 70 54 72 61 6e 73 3b 20 20 20 20  inTempTrans;    
2d90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2da0: 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
2db0: 74 72 61 6e 73 61 63 74 69 6f 6e 65 64 20 2a 2f  transactioned */
2dc0: 0a 20 20 69 6e 74 20 72 65 74 75 72 6e 53 74 61  .  int returnSta
2dd0: 63 6b 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 52 65  ck[100];   /* Re
2de0: 74 75 72 6e 20 61 64 64 72 65 73 73 20 73 74 61  turn address sta
2df0: 63 6b 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20  ck for OP_Gosub 
2e00: 26 20 4f 50 5f 52 65 74 75 72 6e 20 2a 2f 0a 20  & OP_Return */. 
2e10: 20 69 6e 74 20 72 65 74 75 72 6e 44 65 70 74 68   int returnDepth
2e20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ;        /* Next
2e30: 20 75 6e 75 73 65 64 20 65 6c 65 6d 65 6e 74 20   unused element 
2e40: 69 6e 20 72 65 74 75 72 6e 53 74 61 63 6b 5b 5d  in returnStack[]
2e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 43 6f   */.  int nResCo
2e60: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
2e70: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
2e80: 6e 73 20 69 6e 20 6f 6e 65 20 72 6f 77 20 6f 66  ns in one row of
2e90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2ea0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  */.  char **azRe
2eb0: 73 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 2f 2a 20  sColumn;     /* 
2ec0: 56 61 6c 75 65 73 20 66 6f 72 20 6f 6e 65 20 72  Values for one r
2ed0: 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 2a 2f 20  ow of result */ 
2ee0: 0a 20 20 69 6e 74 20 70 6f 70 53 74 61 63 6b 3b  .  int popStack;
2ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2f00: 70 20 74 68 65 20 73 74 61 63 6b 20 74 68 69 73  p the stack this
2f10: 20 6d 75 63 68 20 6f 6e 20 65 6e 74 72 79 20 74   much on entry t
2f20: 6f 20 56 64 62 65 45 78 65 63 28 29 20 2a 2f 0a  o VdbeExec() */.
2f30: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
2f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
2f50: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
2f60: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  en here */.  u8 
2f70: 65 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  explain;        
2f80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f90: 45 58 50 4c 41 49 4e 20 70 72 65 73 65 6e 74 20  EXPLAIN present 
2fa0: 6f 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 2a  on SQL command *
2fb0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
2fc0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 6c  following are al
2fd0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72  lowed values for
2fe0: 20 56 64 62 65 2e 6d 61 67 69 63 0a 2a 2f 0a 23   Vdbe.magic.*/.#
2ff0: 64 65 66 69 6e 65 20 56 44 42 45 5f 4d 41 47 49  define VDBE_MAGI
3000: 43 5f 49 4e 49 54 20 20 20 20 20 30 78 32 36 62  C_INIT     0x26b
3010: 63 65 61 61 35 20 20 20 20 2f 2a 20 42 75 69 6c  ceaa5    /* Buil
3020: 64 69 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67  ding a VDBE prog
3030: 72 61 6d 20 2a 2f 0a 23 64 65 66 69 6e 65 20 56  ram */.#define V
3040: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 20 20  DBE_MAGIC_RUN   
3050: 20 20 20 30 78 62 64 66 32 30 64 61 33 20 20 20     0xbdf20da3   
3060: 20 2f 2a 20 56 44 42 45 20 69 73 20 72 65 61 64   /* VDBE is read
3070: 79 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  y to execute */.
3080: 23 64 65 66 69 6e 65 20 56 44 42 45 5f 4d 41 47  #define VDBE_MAG
3090: 49 43 5f 48 41 4c 54 20 20 20 20 20 30 78 35 31  IC_HALT     0x51
30a0: 39 63 32 39 37 33 20 20 20 20 2f 2a 20 56 44 42  9c2973    /* VDB
30b0: 45 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 20  E has completed 
30c0: 65 78 65 63 75 74 69 6f 6e 20 2a 2f 0a 23 64 65  execution */.#de
30d0: 66 69 6e 65 20 56 44 42 45 5f 4d 41 47 49 43 5f  fine VDBE_MAGIC_
30e0: 44 45 41 44 20 20 20 20 20 30 78 62 36 30 36 63  DEAD     0xb606c
30f0: 33 63 38 20 20 20 20 2f 2a 20 54 68 65 20 56 44  3c8    /* The VD
3100: 42 45 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  BE has been deal
3110: 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a  located */../*.*
3120: 2a 20 46 75 6e 63 74 69 6f 6e 20 70 72 6f 74 6f  * Function proto
3130: 74 79 70 65 73 0a 2a 2f 0a 76 6f 69 64 20 73 71  types.*/.void sq
3140: 6c 69 74 65 33 56 64 62 65 43 6c 65 61 6e 75 70  lite3VdbeCleanup
3150: 43 75 72 73 6f 72 28 43 75 72 73 6f 72 2a 29 3b  Cursor(Cursor*);
3160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3170: 65 53 6f 72 74 65 72 52 65 73 65 74 28 56 64 62  eSorterReset(Vdb
3180: 65 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  e*);.void sqlite
3190: 33 56 64 62 65 41 67 67 52 65 73 65 74 28 41 67  3VdbeAggReset(Ag
31a0: 67 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  g*);.void sqlite
31b0: 33 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65  3VdbeKeylistFree
31c0: 28 4b 65 79 6c 69 73 74 2a 29 3b 0a 76 6f 69 64  (Keylist*);.void
31d0: 20 73 71 6c 69 74 65 56 64 62 65 50 6f 70 53 74   sqliteVdbePopSt
31e0: 61 63 6b 28 56 64 62 65 2a 2c 69 6e 74 29 3b 0a  ack(Vdbe*,int);.
31f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3200: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
3210: 6f 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  or*);.int sqlite
3220: 33 56 64 62 65 42 79 74 65 53 77 61 70 28 69 6e  3VdbeByteSwap(in
3230: 74 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t);.#if !defined
3240: 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
3250: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
3260: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
3270: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 2a 2c  bePrintOp(FILE*,
3280: 20 69 6e 74 2c 20 4f 70 2a 29 3b 0a 23 65 6e 64   int, Op*);.#end
3290: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  if.int sqlite3Vd
32a0: 62 65 53 65 72 69 61 6c 69 7a 65 28 63 6f 6e 73  beSerialize(cons
32b0: 74 20 4d 65 6d 20 2a 2c 20 75 6e 73 69 67 6e 65  t Mem *, unsigne
32c0: 64 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 73  d char *);.int s
32d0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
32e0: 4c 65 6e 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 29  Len(const Mem *)
32f0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  ;.int sqlite3Vdb
3300: 65 44 65 73 65 72 69 61 6c 69 7a 65 28 4d 65 6d  eDeserialize(Mem
3310: 20 2a 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e   *, const unsign
3320: 65 64 20 63 68 61 72 20 2a 29 3b 0a 0a 69 6e 74  ed char *);..int
3330: 20 73 71 6c 69 74 65 32 42 74 72 65 65 4b 65 79   sqlite2BtreeKey
3340: 43 6f 6d 70 61 72 65 28 42 74 43 75 72 73 6f 72  Compare(BtCursor
3350: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   *, const void *
3360: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 20  , int, int, int 
3370: 2a 29 3b 0a 0a 0a 0a                             *);....