/ Hex Artifact Content
Login

Artifact bdedf21230581f0cf73a2dcd8fe23f30cf30ebe6:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 6e  *.** The code in
03b0: 20 74 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65   this file imple
03c0: 6d 65 6e 74 73 20 74 68 65 20 56 69 72 74 75 61  ments the Virtua
03d0: 6c 20 44 61 74 61 62 61 73 65 20 45 6e 67 69 6e  l Database Engin
03e0: 65 20 28 56 44 42 45 29 0a 2a 2a 0a 2a 2a 20 54  e (VDBE).**.** T
03f0: 68 65 20 53 51 4c 20 70 61 72 73 65 72 20 67 65  he SQL parser ge
0400: 6e 65 72 61 74 65 73 20 61 20 70 72 6f 67 72 61  nerates a progra
0410: 6d 20 77 68 69 63 68 20 69 73 20 74 68 65 6e 20  m which is then 
0420: 65 78 65 63 75 74 65 64 20 62 79 0a 2a 2a 20 74  executed by.** t
0430: 68 65 20 56 44 42 45 20 74 6f 20 64 6f 20 74 68  he VDBE to do th
0440: 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51  e work of the SQ
0450: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 56 44  L statement.  VD
0460: 42 45 20 70 72 6f 67 72 61 6d 73 20 61 72 65 20  BE programs are 
0470: 0a 2a 2a 20 73 69 6d 69 6c 61 72 20 69 6e 20 66  .** similar in f
0480: 6f 72 6d 20 74 6f 20 61 73 73 65 6d 62 6c 79 20  orm to assembly 
0490: 6c 61 6e 67 75 61 67 65 2e 20 20 54 68 65 20 70  language.  The p
04a0: 72 6f 67 72 61 6d 20 63 6f 6e 73 69 73 74 73 20  rogram consists 
04b0: 6f 66 0a 2a 2a 20 61 20 6c 69 6e 65 61 72 20 73  of.** a linear s
04c0: 65 71 75 65 6e 63 65 20 6f 66 20 6f 70 65 72 61  equence of opera
04d0: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 70 65  tions.  Each ope
04e0: 72 61 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f 70  ration has an op
04f0: 63 6f 64 65 20 0a 2a 2a 20 61 6e 64 20 33 20 6f  code .** and 3 o
0500: 70 65 72 61 6e 64 73 2e 20 20 4f 70 65 72 61 6e  perands.  Operan
0510: 64 73 20 50 31 20 61 6e 64 20 50 32 20 61 72 65  ds P1 and P2 are
0520: 20 69 6e 74 65 67 65 72 73 2e 20 20 4f 70 65 72   integers.  Oper
0530: 61 6e 64 20 50 33 20 0a 2a 2a 20 69 73 20 61 20  and P3 .** is a 
0540: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
0550: 73 74 72 69 6e 67 2e 20 20 20 54 68 65 20 50 32  string.   The P2
0560: 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 62 65   operand must be
0570: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
0580: 2a 20 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 74  * Opcodes will t
0590: 79 70 69 63 61 6c 6c 79 20 69 67 6e 6f 72 65 20  ypically ignore 
05a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 70 65 72  one or more oper
05b0: 61 6e 64 73 2e 20 20 4d 61 6e 79 20 6f 70 63 6f  ands.  Many opco
05c0: 64 65 73 0a 2a 2a 20 69 67 6e 6f 72 65 20 61 6c  des.** ignore al
05d0: 6c 20 74 68 72 65 65 20 6f 70 65 72 61 6e 64 73  l three operands
05e0: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 61 74  ..**.** Computat
05f0: 69 6f 6e 20 72 65 73 75 6c 74 73 20 61 72 65 20  ion results are 
0600: 73 74 6f 72 65 64 20 6f 6e 20 61 20 73 74 61 63  stored on a stac
0610: 6b 2e 20 20 45 61 63 68 20 65 6e 74 72 79 20 6f  k.  Each entry o
0620: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  n the.** stack i
0630: 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65  s either an inte
0640: 67 65 72 20 6f 72 20 61 20 6e 75 6c 6c 2d 74 65  ger or a null-te
0650: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
0660: 20 20 41 6e 0a 2a 2a 20 69 6e 70 6c 69 63 69 74    An.** inplicit
0670: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 72 6f 6d   conversion from
0680: 20 6f 6e 65 20 74 79 70 65 20 74 6f 20 74 68 65   one type to the
0690: 20 6f 74 68 65 72 20 6f 63 63 75 72 73 20 61 73   other occurs as
06a0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a   necessary..** .
06b0: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 63  ** Most of the c
06c0: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
06d0: 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79 20   is taken up by 
06e0: 74 68 65 20 73 71 6c 69 74 65 56 64 62 65 45 78  the sqliteVdbeEx
06f0: 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ec().** function
0700: 20 77 68 69 63 68 20 64 6f 65 73 20 74 68 65 20   which does the 
0710: 77 6f 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65  work of interpre
0720: 74 69 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67  ting a VDBE prog
0730: 72 61 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65  ram..** But othe
0740: 72 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  r routines are a
0750: 6c 73 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20  lso provided to 
0760: 68 65 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67  help in building
0770: 20 75 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d   up.** a program
0780: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20   instruction by 
0790: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
07a0: 2a 2a 20 24 49 64 3a 20 76 64 62 65 2e 63 2c 76  ** $Id: vdbe.c,v
07b0: 20 31 2e 33 38 20 32 30 30 30 2f 30 38 2f 30 32   1.38 2000/08/02
07c0: 20 31 32 3a 32 36 3a 32 39 20 64 72 68 20 45 78   12:26:29 drh Ex
07d0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
07e0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
07f0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0800: 3e 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 69 73 20  >../*.** SQL is 
0810: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
0820: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 69 6e  a sequence of in
0830: 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 62 65  structions to be
0840: 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 62 79 20  .** executed by 
0850: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
0860: 65 2e 20 20 45 61 63 68 20 69 6e 73 74 72 75 63  e.  Each instruc
0870: 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61  tion is an insta
0880: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  nce.** of the fo
0890: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
08a0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
08b0: 72 75 63 74 20 56 64 62 65 4f 70 20 4f 70 3b 0a  ruct VdbeOp Op;.
08c0: 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  ./*.** A cursor 
08d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 69 6e 74  is a pointer int
08e0: 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
08f0: 65 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  e.  The database
0900: 20 66 69 6c 65 0a 2a 2a 20 63 61 6e 20 72 65 70   file.** can rep
0910: 72 65 73 65 6e 74 20 65 69 74 68 65 72 20 61 6e  resent either an
0920: 20 53 51 4c 20 74 61 62 6c 65 20 6f 72 20 61 6e   SQL table or an
0930: 20 53 51 4c 20 69 6e 64 65 78 2e 20 20 45 61 63   SQL index.  Eac
0940: 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 61 20 62  h file is.** a b
0950: 61 67 20 6f 66 20 6b 65 79 2f 64 61 74 61 20 70  ag of key/data p
0960: 61 69 72 73 2e 20 20 54 68 65 20 63 75 72 73 6f  airs.  The curso
0970: 72 20 63 61 6e 20 6c 6f 6f 70 20 6f 76 65 72 20  r can loop over 
0980: 61 6c 6c 20 6b 65 79 2f 64 61 74 61 0a 2a 2a 20  all key/data.** 
0990: 70 61 69 72 73 20 28 69 6e 20 61 6e 20 61 72 62  pairs (in an arb
09a0: 69 74 72 61 72 79 20 6f 72 64 65 72 29 20 6f 72  itrary order) or
09b0: 20 69 74 20 63 61 6e 20 72 65 74 72 69 65 76 65   it can retrieve
09c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a   a particular.**
09d0: 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 67   key/data pair g
09e0: 69 76 65 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  iven a copy of t
09f0: 68 65 20 6b 65 79 2e 0a 2a 2a 20 0a 2a 2a 20 45  he key..** .** E
0a00: 76 65 72 79 20 63 75 72 73 6f 72 20 74 68 61 74  very cursor that
0a10: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
0a20: 68 69 6e 65 20 68 61 73 20 6f 70 65 6e 20 69 73  hine has open is
0a30: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
0a40: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
0a50: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0a60: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
0a70: 72 75 63 74 20 43 75 72 73 6f 72 20 7b 0a 20 20  ruct Cursor {.  
0a80: 44 62 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  DbbeCursor *pCur
0a90: 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 63 75 72  sor;  /* The cur
0aa0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 6f 66  sor structure of
0ab0: 20 74 68 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a   the backend */.
0ac0: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
0ad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
0ae0: 65 78 74 20 69 6e 64 65 78 20 74 6f 20 65 78 74  ext index to ext
0af0: 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 65  ract */.  int ke
0b00: 79 41 73 44 61 74 61 3b 20 20 20 20 20 20 20 20  yAsData;        
0b10: 2f 2a 20 54 68 65 20 4f 50 5f 46 69 65 6c 64 20  /* The OP_Field 
0b20: 63 6f 6d 6d 61 6e 64 20 77 6f 72 6b 73 20 6f 6e  command works on
0b30: 20 6b 65 79 20 69 6e 73 74 65 61 64 20 6f 66 20   key instead of 
0b40: 64 61 74 61 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  data */.};.typed
0b50: 65 66 20 73 74 72 75 63 74 20 43 75 72 73 6f 72  ef struct Cursor
0b60: 20 43 75 72 73 6f 72 3b 0a 0a 2f 2a 0a 2a 2a 20   Cursor;../*.** 
0b70: 41 20 73 6f 72 74 65 72 20 62 75 69 6c 64 73 20  A sorter builds 
0b80: 61 20 6c 69 73 74 20 6f 66 20 65 6c 65 6d 65 6e  a list of elemen
0b90: 74 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e  ts to be sorted.
0ba0: 20 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f    Each element o
0bb0: 66 0a 2a 2a 20 74 68 65 20 6c 69 73 74 20 69 73  f.** the list is
0bc0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0bd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0be0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0bf0: 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 65  def struct Sorte
0c00: 72 20 53 6f 72 74 65 72 3b 0a 73 74 72 75 63 74  r Sorter;.struct
0c10: 20 53 6f 72 74 65 72 20 7b 0a 20 20 69 6e 74 20   Sorter {.  int 
0c20: 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  nKey;           
0c30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
0c40: 65 73 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  es in the key */
0c50: 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20 20  .  char *zKey;  
0c60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
0c70: 79 20 62 79 20 77 68 69 63 68 20 77 65 20 77 69  y by which we wi
0c80: 6c 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74  ll sort */.  int
0c90: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
0ca0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
0cb0: 74 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  tes in the data 
0cc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61  */.  char *pData
0cd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0ce0: 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
0cf0: 77 69 74 68 20 74 68 69 73 20 6b 65 79 20 2a 2f  with this key */
0d00: 0a 20 20 53 6f 72 74 65 72 20 2a 70 4e 65 78 74  .  Sorter *pNext
0d10: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69  ;      /* Next i
0d20: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 7d 3b  n the list */.};
0d30: 0a 0a 2f 2a 20 0a 2a 2a 20 4e 75 6d 62 65 72 20  ../* .** Number 
0d40: 6f 66 20 62 75 63 6b 65 74 73 20 75 73 65 64 20  of buckets used 
0d50: 66 6f 72 20 6d 65 72 67 65 2d 73 6f 72 74 2e 20  for merge-sort. 
0d60: 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 53 4f   .*/.#define NSO
0d70: 52 54 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  RT 30../*.** A s
0d80: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74  ingle level of t
0d90: 68 65 20 73 74 61 63 6b 20 69 73 20 61 6e 20 69  he stack is an i
0da0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0db0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
0dc0: 63 74 75 72 65 2e 20 20 45 78 63 65 70 74 2c 20  cture.  Except, 
0dd0: 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20 61 72  string values ar
0de0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 73 65  e stored on a se
0df0: 70 61 72 61 74 65 0a 2a 2a 20 6c 69 73 74 20 6f  parate.** list o
0e00: 66 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  f of pointers to
0e10: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 65   character.  The
0e20: 20 72 65 61 73 6f 6e 20 66 6f 72 20 73 74 6f 72   reason for stor
0e30: 69 6e 67 0a 2a 2a 20 73 74 72 69 6e 67 73 20 73  ing.** strings s
0e40: 65 70 61 72 61 74 65 6c 79 20 69 73 20 73 6f 20  eparately is so 
0e50: 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
0e60: 20 65 61 73 69 6c 79 20 70 61 73 73 65 64 0a 2a   easily passed.*
0e70: 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  * to the callbac
0e80: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  k function..*/.s
0e90: 74 72 75 63 74 20 53 74 61 63 6b 20 7b 0a 20 20  truct Stack {.  
0ea0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 2f  int i;         /
0eb0: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
0ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
0ed0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ee0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
0ef0: 74 72 69 6e 67 20 76 61 6c 75 65 2c 20 69 6e 63  tring value, inc
0f00: 6c 75 64 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 20  luding '\0' */. 
0f10: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
0f20: 2f 2a 20 53 6f 6d 65 20 63 6f 6d 62 69 6e 61 74  /* Some combinat
0f30: 69 6f 6e 20 6f 66 20 53 54 4b 5f 4e 75 6c 6c 2c  ion of STK_Null,
0f40: 20 53 54 4b 5f 53 74 72 2c 20 53 54 4b 5f 44 79   STK_Str, STK_Dy
0f50: 6e 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 64 6f 75  n, etc. */.  dou
0f60: 62 6c 65 20 72 3b 20 20 20 20 20 20 2f 2a 20 52  ble r;      /* R
0f70: 65 61 6c 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a  eal value */.};.
0f80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0f90: 74 61 63 6b 20 53 74 61 63 6b 3b 0a 0a 2f 2a 0a  tack Stack;../*.
0fa0: 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** Memory cells 
0fb0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 74 72  use the same str
0fc0: 75 63 74 75 72 65 20 61 73 20 74 68 65 20 73 74  ucture as the st
0fd0: 61 63 6b 20 65 78 63 65 70 74 20 74 68 61 74 20  ack except that 
0fe0: 73 70 61 63 65 0a 2a 2a 20 66 6f 72 20 61 6e 20  space.** for an 
0ff0: 61 72 62 69 74 72 61 72 79 20 73 74 72 69 6e 67  arbitrary string
1000: 20 69 73 20 61 64 64 65 64 2e 0a 2a 2f 0a 73 74   is added..*/.st
1010: 72 75 63 74 20 4d 65 6d 20 7b 0a 20 20 53 74 61  ruct Mem {.  Sta
1020: 63 6b 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 41  ck s;       /* A
1030: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
1040: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 65 73   memory cell bes
1050: 69 64 65 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  ides string */. 
1060: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1070: 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c 75 65 20  /* String value 
1080: 66 6f 72 20 74 68 69 73 20 6d 65 6d 6f 72 79 20  for this memory 
1090: 63 65 6c 6c 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  cell */.};.typed
10a0: 65 66 20 73 74 72 75 63 74 20 4d 65 6d 20 4d 65  ef struct Mem Me
10b0: 6d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  m;../*.** Allowe
10c0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 74 61  d values for Sta
10d0: 63 6b 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  ck.flags.*/.#def
10e0: 69 6e 65 20 53 54 4b 5f 4e 75 6c 6c 20 20 20 20  ine STK_Null    
10f0: 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 56 61    0x0001   /* Va
1100: 6c 75 65 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 23  lue is NULL */.#
1110: 64 65 66 69 6e 65 20 53 54 4b 5f 53 74 72 20 20  define STK_Str  
1120: 20 20 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a       0x0002   /*
1130: 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   Value is a stri
1140: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ng */.#define ST
1150: 4b 5f 49 6e 74 20 20 20 20 20 20 20 30 78 30 30  K_Int       0x00
1160: 30 34 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73  04   /* Value is
1170: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 23   an integer */.#
1180: 64 65 66 69 6e 65 20 53 54 4b 5f 52 65 61 6c 20  define STK_Real 
1190: 20 20 20 20 20 30 78 30 30 30 38 20 20 20 2f 2a       0x0008   /*
11a0: 20 56 61 6c 75 65 20 69 73 20 61 20 72 65 61 6c   Value is a real
11b0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 64 65 66 69   number */.#defi
11c0: 6e 65 20 53 54 4b 5f 44 79 6e 20 20 20 20 20 20  ne STK_Dyn      
11d0: 20 30 78 30 30 31 30 20 20 20 2f 2a 20 4e 65 65   0x0010   /* Nee
11e0: 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
11f0: 46 72 65 65 28 29 20 6f 6e 20 7a 53 74 61 63 6b  Free() on zStack
1200: 5b 2a 5d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  [*] */../*.** An
1210: 20 41 67 67 20 73 74 72 75 63 74 75 72 65 20 64   Agg structure d
1220: 65 73 63 72 69 62 65 73 20 61 6e 20 41 67 67 72  escribes an Aggr
1230: 65 67 61 74 6f 72 2e 20 20 45 61 63 68 20 41 67  egator.  Each Ag
1240: 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 2a 2a  g consists of.**
1250: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41 67   zero or more Ag
1260: 67 72 65 67 61 74 6f 72 20 65 6c 65 6d 65 6e 74  gregator element
1270: 73 20 28 41 67 67 45 6c 65 6d 29 2e 20 20 45 61  s (AggElem).  Ea
1280: 63 68 20 41 67 67 45 6c 65 6d 20 63 6f 6e 74 61  ch AggElem conta
1290: 69 6e 73 0a 2a 2a 20 61 20 6b 65 79 20 61 6e 64  ins.** a key and
12a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 76 61 6c   one or more val
12b0: 75 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 73  ues.  The values
12c0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 70 72 6f   are used in pro
12d0: 63 65 73 73 69 6e 67 0a 2a 2a 20 61 67 67 72 65  cessing.** aggre
12e0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
12f0: 6e 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65  n a SELECT.  The
1300: 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 6f 20   key is used to 
1310: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1320: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1330: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 0a 2a 2f   of a select..*/
1340: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1350: 41 67 67 20 41 67 67 3b 0a 74 79 70 65 64 65 66  Agg Agg;.typedef
1360: 20 73 74 72 75 63 74 20 41 67 67 45 6c 65 6d 20   struct AggElem 
1370: 41 67 67 45 6c 65 6d 3b 0a 73 74 72 75 63 74 20  AggElem;.struct 
1380: 41 67 67 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 6d  Agg {.  int nMem
1390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  * Number of valu
13b0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 65 61 63  es stored in eac
13c0: 68 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 20 20 41  h AggElem */.  A
13d0: 67 67 45 6c 65 6d 20 2a 70 43 75 72 72 65 6e 74  ggElem *pCurrent
13e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 67 67  ;     /* The Agg
13f0: 45 6c 65 6d 20 63 75 72 72 65 6e 74 6c 79 20 69  Elem currently i
1400: 6e 20 66 6f 63 75 73 20 2a 2f 0a 20 20 69 6e 74  n focus */.  int
1410: 20 6e 45 6c 65 6d 3b 20 20 20 20 20 20 20 20 20   nElem;         
1420: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1430: 72 20 6f 66 20 41 67 67 45 6c 65 6d 73 20 2a 2f  r of AggElems */
1440: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1460: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20  ber of slots in 
1470: 61 70 48 61 73 68 5b 5d 20 2a 2f 0a 20 20 41 67  apHash[] */.  Ag
1480: 67 45 6c 65 6d 20 2a 2a 61 70 48 61 73 68 3b 20  gElem **apHash; 
1490: 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 61       /* A hash a
14a0: 72 72 61 79 20 66 6f 72 20 6c 6f 6f 6b 69 6e 67  rray for looking
14b0: 20 75 70 20 41 67 67 45 6c 65 6d 73 20 62 79 20   up AggElems by 
14c0: 7a 4b 65 79 20 2a 2f 0a 20 20 41 67 67 45 6c 65  zKey */.  AggEle
14d0: 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
14e0: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
14f0: 6c 20 41 67 67 45 6c 65 6d 73 20 2a 2f 0a 7d 3b  l AggElems */.};
1500: 0a 73 74 72 75 63 74 20 41 67 67 45 6c 65 6d 20  .struct AggElem 
1510: 7b 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20  {.  char *zKey; 
1520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1530: 65 20 6b 65 79 20 74 6f 20 74 68 69 73 20 41 67  e key to this Ag
1540: 67 45 6c 65 6d 20 2a 2f 0a 20 20 41 67 67 45 6c  gElem */.  AggEl
1550: 65 6d 20 2a 70 48 61 73 68 3b 20 20 20 20 20 20  em *pHash;      
1560: 20 20 2f 2a 20 4e 65 78 74 20 41 67 67 45 6c 65    /* Next AggEle
1570: 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1580: 68 61 73 68 20 6f 6e 20 7a 4b 65 79 20 2a 2f 0a  hash on zKey */.
1590: 20 20 41 67 67 45 6c 65 6d 20 2a 70 4e 65 78 74    AggElem *pNext
15a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ;        /* Next
15b0: 20 41 67 67 45 6c 65 6d 20 69 6e 20 61 20 6c 69   AggElem in a li
15c0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
15d0: 2f 0a 20 20 4d 65 6d 20 61 4d 65 6d 5b 31 5d 3b  /.  Mem aMem[1];
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15f0: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 69  e values for thi
1600: 73 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 7d 3b 0a  s AggElem */.};.
1610: 0a 2f 2a 0a 2a 2a 20 41 20 53 65 74 20 73 74 72  ./*.** A Set str
1620: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 66  ucture is used f
1630: 6f 72 20 71 75 69 63 6b 20 74 65 73 74 69 6e 67  or quick testing
1640: 20 74 6f 20 73 65 65 20 69 66 20 61 20 76 61 6c   to see if a val
1650: 75 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66  ue.** is part of
1660: 20 61 20 73 6d 61 6c 6c 20 73 65 74 2e 20 20 53   a small set.  S
1670: 65 74 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ets are used to 
1680: 69 6d 70 6c 65 6d 65 6e 74 20 63 6f 64 65 20 6c  implement code l
1690: 69 6b 65 0a 2a 2a 20 74 68 69 73 3a 0a 2a 2a 20  ike.** this:.** 
16a0: 20 20 20 20 20 20 20 20 20 20 20 78 2e 79 20 49             x.y I
16b0: 4e 20 28 27 68 69 27 2c 27 68 6f 6f 27 2c 27 68  N ('hi','hoo','h
16c0: 75 6d 27 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20  um').*/.typedef 
16d0: 73 74 72 75 63 74 20 53 65 74 20 53 65 74 3b 0a  struct Set Set;.
16e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
16f0: 65 74 45 6c 65 6d 20 53 65 74 45 6c 65 6d 3b 0a  etElem SetElem;.
1700: 73 74 72 75 63 74 20 53 65 74 20 7b 0a 20 20 53  struct Set {.  S
1710: 65 74 45 6c 65 6d 20 2a 70 41 6c 6c 3b 20 20 20  etElem *pAll;   
1720: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 65 6c 65        /* All ele
1730: 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 73 65  ments of this se
1740: 74 20 2a 2f 0a 20 20 53 65 74 45 6c 65 6d 20 2a  t */.  SetElem *
1750: 61 70 48 61 73 68 5b 34 31 5d 3b 20 20 20 2f 2a  apHash[41];   /*
1760: 20 41 20 68 61 73 68 20 61 72 72 61 79 20 66 6f   A hash array fo
1770: 72 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 69  r all elements i
1780: 6e 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  n this set */.};
1790: 0a 73 74 72 75 63 74 20 53 65 74 45 6c 65 6d 20  .struct SetElem 
17a0: 7b 0a 20 20 53 65 74 45 6c 65 6d 20 2a 70 48 61  {.  SetElem *pHa
17b0: 73 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  sh;        /* Ne
17c0: 78 74 20 65 6c 65 6d 65 6e 74 20 77 69 74 68 20  xt element with 
17d0: 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 6f 6e  the same hash on
17e0: 20 7a 4b 65 79 20 2a 2f 0a 20 20 53 65 74 45 6c   zKey */.  SetEl
17f0: 65 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  em *pNext;      
1800: 20 20 2f 2a 20 4e 65 78 74 20 65 6c 65 6d 65 6e    /* Next elemen
1810: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
1820: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 63 68 61  hem all */.  cha
1830: 72 20 7a 4b 65 79 5b 31 5d 3b 20 20 20 20 20 20  r zKey[1];      
1840: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
1850: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a  this key */.};..
1860: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1870: 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  e of the virtual
1880: 20 6d 61 63 68 69 6e 65 0a 2a 2f 0a 73 74 72 75   machine.*/.stru
1890: 63 74 20 56 64 62 65 20 7b 0a 20 20 44 62 62 65  ct Vdbe {.  Dbbe
18a0: 20 2a 70 42 65 3b 20 20 20 20 20 20 20 20 20 20   *pBe;          
18b0: 2f 2a 20 4f 70 61 71 75 65 20 63 6f 6e 74 65 78  /* Opaque contex
18c0: 74 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  t structure used
18d0: 20 62 79 20 44 42 20 62 61 63 6b 65 6e 64 20 2a   by DB backend *
18e0: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 3b  /.  FILE *trace;
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1900: 20 61 6e 20 65 78 65 63 75 74 69 6f 6e 20 74 72   an execution tr
1910: 61 63 65 20 68 65 72 65 2c 20 69 66 20 6e 6f 74  ace here, if not
1920: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e   NULL */.  int n
1930: 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op;            /
1940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74  * Number of inst
1950: 72 75 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  ructions in the 
1960: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
1970: 20 6e 4f 70 41 6c 6c 6f 63 3b 20 20 20 20 20 20   nOpAlloc;      
1980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
1990: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ots allocated fo
19a0: 72 20 61 4f 70 5b 5d 20 2a 2f 0a 20 20 4f 70 20  r aOp[] */.  Op 
19b0: 2a 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *aOp;           
19c0: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
19d0: 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  d the virtual ma
19e0: 63 68 69 6e 65 27 73 20 70 72 6f 67 72 61 6d 20  chine's program 
19f0: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 61 62 65 6c 3b  */.  int nLabel;
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a10: 65 72 20 6f 66 20 6c 61 62 65 6c 73 20 75 73 65  er of labels use
1a20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 61 62 65  d */.  int nLabe
1a30: 6c 41 6c 6c 6f 63 3b 20 20 20 20 2f 2a 20 4e 75  lAlloc;    /* Nu
1a40: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c  mber of slots al
1a50: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 61 62 65  located in aLabe
1a60: 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 4c  l[] */.  int *aL
1a70: 61 62 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  abel;        /* 
1a80: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1a90: 65 20 6c 61 62 65 6c 73 20 2a 2f 0a 20 20 69 6e  e labels */.  in
1aa0: 74 20 74 6f 73 3b 20 20 20 20 20 20 20 20 20 20  t tos;          
1ab0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 6f    /* Index of to
1ac0: 70 20 6f 66 20 73 74 61 63 6b 20 2a 2f 0a 20 20  p of stack */.  
1ad0: 69 6e 74 20 6e 53 74 61 63 6b 41 6c 6c 6f 63 3b  int nStackAlloc;
1ae0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1af0: 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 53 74  he stack */.  St
1b00: 61 63 6b 20 2a 61 53 74 61 63 6b 3b 20 20 20 20  ack *aStack;    
1b10: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e 64    /* The operand
1b20: 20 73 74 61 63 6b 2c 20 65 78 63 65 70 74 20 73   stack, except s
1b30: 74 72 69 6e 67 20 76 61 6c 75 65 73 20 2a 2f 0a  tring values */.
1b40: 20 20 63 68 61 72 20 2a 2a 7a 53 74 61 63 6b 3b    char **zStack;
1b50: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 72        /* Text or
1b60: 20 62 69 6e 61 72 79 20 76 61 6c 75 65 73 20 6f   binary values o
1b70: 66 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20  f the stack */. 
1b80: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 4e 61 6d   char **azColNam
1b90: 65 3b 20 20 20 2f 2a 20 42 65 63 6f 6d 65 73 20  e;   /* Becomes 
1ba0: 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65  the 4th paramete
1bb0: 72 20 74 6f 20 63 61 6c 6c 62 61 63 6b 73 20 2a  r to callbacks *
1bc0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1be0: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 43  r of slots in aC
1bf0: 73 72 5b 5d 20 2a 2f 0a 20 20 43 75 72 73 6f 72  sr[] */.  Cursor
1c00: 20 2a 61 43 73 72 3b 20 20 20 20 20 20 20 2f 2a   *aCsr;       /*
1c10: 20 4f 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74   On element of t
1c20: 68 69 73 20 61 72 72 61 79 20 66 6f 72 20 65 61  his array for ea
1c30: 63 68 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 2a  ch open cursor *
1c40: 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c60: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 70  r of slots in ap
1c70: 4c 69 73 74 5b 5d 20 2a 2f 0a 20 20 46 49 4c 45  List[] */.  FILE
1c80: 20 2a 2a 61 70 4c 69 73 74 3b 20 20 20 20 20 20   **apList;      
1c90: 2f 2a 20 41 6e 20 6f 70 65 6e 20 66 69 6c 65 20  /* An open file 
1ca0: 66 6f 72 20 65 61 63 68 20 6c 69 73 74 20 2a 2f  for each list */
1cb0: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 3b 20 20 20  .  int nSort;   
1cc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cd0: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 70 53   of slots in apS
1ce0: 6f 72 74 5b 5d 20 2a 2f 0a 20 20 53 6f 72 74 65  ort[] */.  Sorte
1cf0: 72 20 2a 2a 61 70 53 6f 72 74 3b 20 20 20 20 2f  r **apSort;    /
1d00: 2a 20 41 6e 20 6f 70 65 6e 20 73 6f 72 74 65 72  * An open sorter
1d10: 20 6c 69 73 74 20 2a 2f 0a 20 20 46 49 4c 45 20   list */.  FILE 
1d20: 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  *pFile;        /
1d30: 2a 20 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 70  * At most one op
1d40: 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  en file handler 
1d50: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d70: 65 72 20 6f 66 20 66 69 6c 65 20 66 69 65 6c 64  er of file field
1d80: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  s */.  char **az
1d90: 46 69 65 6c 64 3b 20 20 20 20 20 2f 2a 20 44 61  Field;     /* Da
1da0: 74 61 20 66 6f 72 20 65 61 63 68 20 66 69 6c 65  ta for each file
1db0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72   field */.  char
1dc0: 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20   *zLine;        
1dd0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
1de0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1df0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  file */.  int nL
1e00: 69 6e 65 41 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a  ineAlloc;     /*
1e10: 20 4e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65   Number of space
1e20: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
1e30: 7a 4c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  zLine */.  int n
1e40: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
1e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
1e60: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 63 75 72  ry locations cur
1e70: 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
1e80: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 3b   */.  Mem *aMem;
1e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ea0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1eb0: 73 20 2a 2f 0a 20 20 41 67 67 20 61 67 67 3b 20  s */.  Agg agg; 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67             /* Ag
1ed0: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
1ee0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ion */.  int nSe
1ef0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1f00: 4e 75 6d 62 65 72 20 6f 66 20 73 65 74 73 20 61  Number of sets a
1f10: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 53 65  llocated */.  Se
1f20: 74 20 2a 61 53 65 74 3b 20 20 20 20 20 20 20 20  t *aSet;        
1f30: 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
1f40: 20 73 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   sets */.  int n
1f50: 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20 2f  Fetch;         /
1f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 46  * Number of OP_F
1f70: 65 74 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  etch instruction
1f80: 73 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 7d 3b  s executed */.};
1f90: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1fa0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
1fb0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
1fc0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 56 64 62  .Vdbe *sqliteVdb
1fd0: 65 43 72 65 61 74 65 28 44 62 62 65 20 2a 70 42  eCreate(Dbbe *pB
1fe0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 0a  e){.  Vdbe *p;..
1ff0: 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c    p = sqliteMall
2000: 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29  oc( sizeof(Vdbe)
2010: 20 29 3b 0a 20 20 70 2d 3e 70 42 65 20 3d 20 70   );.  p->pBe = p
2020: 42 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  Be;.  return p;.
2030: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  }../*.** Turn tr
2040: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
2050: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 64  */.void sqliteVd
2060: 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c  beTrace(Vdbe *p,
2070: 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20   FILE *trace){. 
2080: 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63   p->trace = trac
2090: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  e;.}../*.** Add 
20a0: 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  a new instructio
20b0: 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  n to the list of
20c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75   instructions cu
20d0: 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20  rrent in the.** 
20e0: 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68  VDBE.  Return th
20f0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2100: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
2110: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
2120: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20  rs:.**.**    p  
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69               Poi
2140: 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45  nter to the VDBE
2150: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20  .**.**    op    
2160: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70            The op
2170: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e  code for this in
2180: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20  struction.**.** 
2190: 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20     p1, p2, p3   
21a0: 20 20 20 54 68 72 65 65 20 6f 70 65 72 61 6e 64     Three operand
21b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6c 62 6c 20  s..**.**    lbl 
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 41 20 73 79              A sy
21d0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72  mbolic label for
21e0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
21f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 69  n..**.** Symboli
2200: 63 20 6c 61 62 65 6c 73 20 61 72 65 20 6e 65 67  c labels are neg
2210: 61 74 69 76 65 20 6e 75 6d 62 65 72 73 20 74 68  ative numbers th
2220: 61 74 20 73 74 61 6e 64 20 66 6f 72 20 74 68 65  at stand for the
2230: 20 61 64 64 72 65 73 73 0a 2a 2a 20 6f 66 20 69   address.** of i
2240: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
2250: 20 68 61 76 65 20 79 65 74 20 74 6f 20 62 65 20   have yet to be 
2260: 63 6f 64 65 64 2e 20 20 57 68 65 6e 20 74 68 65  coded.  When the
2270: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
2280: 69 73 20 63 6f 64 65 64 2c 20 69 74 73 20 72 65  is coded, its re
2290: 61 6c 20 61 64 64 72 65 73 73 20 69 73 20 73 75  al address is su
22a0: 62 73 74 69 74 75 74 65 64 20 69 6e 20 74 68 65  bstituted in the
22b0: 20 70 32 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20   p2 field of.** 
22c0: 70 72 69 6f 72 20 61 6e 64 20 73 75 62 73 65 71  prior and subseq
22d0: 75 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  uent instruction
22e0: 73 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  s that have the 
22f0: 6c 62 6c 20 76 61 6c 75 65 20 69 6e 0a 2a 2a 20  lbl value in.** 
2300: 74 68 65 69 72 20 70 32 20 66 69 65 6c 64 73 2e  their p2 fields.
2310: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 64  .*/.int sqliteVd
2320: 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a 70 2c  beAddOp(Vdbe *p,
2330: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
2340: 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63   int p2, const c
2350: 68 61 72 20 2a 70 33 2c 20 69 6e 74 20 6c 62 6c  har *p3, int lbl
2360: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ){.  int i, j;..
2370: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
2380: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 69 66 28 20  p->nOp++;.  if( 
2390: 69 3e 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  i>=p->nOpAlloc )
23a0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a  {.    int oldSiz
23b0: 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b  e = p->nOpAlloc;
23c0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    p->nOpAlloc
23d0: 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   = p->nOpAlloc*2
23e0: 20 2b 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4f   + 10;.    p->aO
23f0: 70 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  p = sqliteReallo
2400: 63 28 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  c(p->aOp, p->nOp
2410: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 4f 70 29  Alloc*sizeof(Op)
2420: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  );.    if( p->aO
2430: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  p==0 ){.      p-
2440: 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  >nOp = 0;.      
2450: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 30 3b  p->nOpAlloc = 0;
2460: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2470: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2480: 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a  t(&p->aOp[oldSiz
2490: 65 5d 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c  e], 0, (p->nOpAl
24a0: 6c 6f 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  loc-oldSize)*siz
24b0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20  eof(Op));.  }.  
24c0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
24d0: 20 3d 20 6f 70 3b 0a 20 20 70 2d 3e 61 4f 70 5b   = op;.  p->aOp[
24e0: 69 5d 2e 70 31 20 3d 20 70 31 3b 0a 20 20 69 66  i].p1 = p1;.  if
24f0: 28 20 70 32 3c 30 20 26 26 20 28 2d 31 2d 70 32  ( p2<0 && (-1-p2
2500: 29 3c 70 2d 3e 6e 4c 61 62 65 6c 20 26 26 20 70  )<p->nLabel && p
2510: 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 70 32 5d 3e  ->aLabel[-1-p2]>
2520: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 70  =0 ){.    p2 = p
2530: 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 70 32 5d 3b  ->aLabel[-1-p2];
2540: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d  .  }.  p->aOp[i]
2550: 2e 70 32 20 3d 20 70 32 3b 0a 20 20 69 66 28 20  .p2 = p2;.  if( 
2560: 70 33 20 26 26 20 70 33 5b 30 5d 20 29 7b 0a 20  p3 && p3[0] ){. 
2570: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 20     p->aOp[i].p3 
2580: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
2590: 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  3);.  }else{.   
25a0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 20 3d 20   p->aOp[i].p3 = 
25b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 62 6c  0;.  }.  if( lbl
25c0: 3c 30 20 26 26 20 28 2d 6c 62 6c 29 3c 3d 70 2d  <0 && (-lbl)<=p-
25d0: 3e 6e 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >nLabel ){.    p
25e0: 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 6c 62 6c 5d  ->aLabel[-1-lbl]
25f0: 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
2600: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
2610: 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 6a      if( p->aOp[j
2620: 5d 2e 70 32 3d 3d 6c 62 6c 20 29 20 70 2d 3e 61  ].p2==lbl ) p->a
2630: 4f 70 5b 6a 5d 2e 70 32 20 3d 20 69 3b 0a 20 20  Op[j].p2 = i;.  
2640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2650: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73   i;.}../*.** Res
2660: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
2670: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
2680: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2690: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
26a0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  e inserted..*/.v
26b0: 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65 52 65  oid sqliteVdbeRe
26c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
26d0: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
26e0: 74 20 6a 3b 0a 20 20 69 66 28 20 78 3c 30 20 26  t j;.  if( x<0 &
26f0: 26 20 28 2d 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65  & (-x)<=p->nLabe
2700: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2710: 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e 4f  el[-1-x] = p->nO
2720: 70 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  p;.    for(j=0; 
2730: 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  j<p->nOp; j++){.
2740: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70        if( p->aOp
2750: 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e 61  [j].p2==x ) p->a
2760: 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e 4f  Op[j].p2 = p->nO
2770: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  p;.    }.  }.}..
2780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2790: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
27a0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
27b0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
27c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 64  .*/.int sqliteVd
27d0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
27e0: 62 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  be *p){.  return
27f0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
2800: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
2810: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
2820: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2830: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2840: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2850: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2860: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2870: 0a 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65 41  .int sqliteVdbeA
2880: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
2890: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
28a0: 70 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  p const *aOp){. 
28b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 66 28   int addr;.  if(
28c0: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 3d   p->nOp + nOp >=
28d0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a   p->nOpAlloc ){.
28e0: 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20      int oldSize 
28f0: 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20  = p->nOpAlloc;. 
2900: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
2910: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b   p->nOpAlloc*2 +
2920: 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20 20 20 70   nOp + 10;.    p
2930: 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 52 65  ->aOp = sqliteRe
2940: 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70 2d  alloc(p->aOp, p-
2950: 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  >nOpAlloc*sizeof
2960: 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  (Op));.    if( p
2970: 2d 3e 61 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ->aOp==0 ){.    
2980: 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20    p->nOp = 0;.  
2990: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
29a0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
29b0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  n 0;.    }.    m
29c0: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
29d0: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70 2d 3e 6e  dSize], 0, (p->n
29e0: 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69 7a 65 29  OpAlloc-oldSize)
29f0: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
2a00: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
2a10: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29  p;.  if( nOp>0 )
2a20: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2a30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2a40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
2a50: 20 70 32 20 3d 20 61 4f 70 5b 69 5d 2e 70 32 3b   p2 = aOp[i].p2;
2a60: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
2a70: 29 20 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44  ) p2 = addr + AD
2a80: 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 73 71  DR(p2);.      sq
2a90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 2c  liteVdbeAddOp(p,
2aa0: 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 2c 20   aOp[i].opcode, 
2ab0: 61 4f 70 5b 69 5d 2e 70 31 2c 20 70 32 2c 20 61  aOp[i].p1, p2, a
2ac0: 4f 70 5b 69 5d 2e 70 33 2c 20 30 29 3b 0a 20 20  Op[i].p3, 0);.  
2ad0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ae0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2af0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b00: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
2b10: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2b20: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2b30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2b40: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2b50: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2b60: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
2b70: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
2b80: 73 69 6e 67 20 73 71 6c 69 74 65 56 64 62 65 41  sing sqliteVdbeA
2b90: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
2ba0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
2bb0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
2bc0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
2bd0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
2be0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  teVdbeChangeP3(V
2bf0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2c00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
2c10: 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  3, int n){.  if(
2c20: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
2c30: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2c40: 7a 50 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  zP3 ){.    sqlit
2c50: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 2d 3e  eSetNString(&p->
2c60: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 2c 20 7a 50  aOp[addr].p3, zP
2c70: 33 2c 20 6e 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  3, n, 0);.  }.}.
2c80: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33  ./*.** If the P3
2c90: 20 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20   operand to the 
2ca0: 73 70 65 63 69 66 69 65 64 20 69 6e 73 74 72 75  specified instru
2cb0: 63 74 69 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a  ction appears.**
2cc0: 20 74 6f 20 62 65 20 61 20 71 75 6f 74 65 64 20   to be a quoted 
2cd0: 73 74 72 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68  string token, th
2ce0: 65 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  en this procedur
2cf0: 65 20 72 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68  e removes .** th
2d00: 65 20 71 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  e quotes..**.** 
2d10: 54 68 65 20 71 75 6f 74 69 6e 67 20 6f 70 65 72  The quoting oper
2d20: 61 74 6f 72 20 63 61 6e 20 62 65 20 65 69 74 68  ator can be eith
2d30: 65 72 20 61 20 67 72 61 76 65 20 61 73 63 65 6e  er a grave ascen
2d40: 74 20 28 41 53 43 49 49 20 30 78 32 37 29 0a 2a  t (ASCII 0x27).*
2d50: 2a 20 6f 72 20 61 20 64 6f 75 62 6c 65 20 71 75  * or a double qu
2d60: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 28 41  ote character (A
2d70: 53 43 49 49 20 30 78 32 32 29 2e 20 20 54 77 6f  SCII 0x22).  Two
2d80: 20 71 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77   quotes in a row
2d90: 0a 2a 2a 20 72 65 73 6f 6c 76 65 20 74 6f 20 62  .** resolve to b
2da0: 65 20 61 20 73 69 6e 67 6c 65 20 61 63 74 75 61  e a single actua
2db0: 6c 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  l quote characte
2dc0: 72 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72  r within the str
2dd0: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
2de0: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2e00: 64 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  dr){.  char *z;.
2e10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20    if( addr<0 || 
2e20: 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 20 72  addr>=p->nOp ) r
2e30: 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 70 2d 3e  eturn;.  z = p->
2e40: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 3b 0a 20 20  aOp[addr].p3;.  
2e50: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 29  sqliteDequote(z)
2e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68  ;.}../*.** On th
2e70: 65 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6f 66  e P3 argument of
2e80: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 73 74 72   the given instr
2e90: 75 63 74 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61  uction, change a
2ea0: 6c 6c 0a 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66  ll.** strings of
2eb0: 20 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72   whitespace char
2ec0: 61 63 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69  acters into a si
2ed0: 6e 67 6c 65 20 73 70 61 63 65 20 61 6e 64 0a 2a  ngle space and.*
2ee0: 2a 20 64 65 6c 65 74 65 20 6c 65 61 64 69 6e 67  * delete leading
2ef0: 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68   and trailing wh
2f00: 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69  itespace..*/.voi
2f10: 64 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70  d sqliteVdbeComp
2f20: 72 65 73 73 53 70 61 63 65 28 56 64 62 65 20 2a  ressSpace(Vdbe *
2f30: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2f40: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69  char *z;.  int i
2f50: 2c 20 6a 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  , j;.  if( addr<
2f60: 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f  0 || addr>=p->nO
2f70: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  p ) return;.  z 
2f80: 3d 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70  = p->aOp[addr].p
2f90: 33 3b 0a 20 20 69 20 3d 20 6a 20 3d 20 30 3b 0a  3;.  i = j = 0;.
2fa0: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
2fb0: 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  (z[i]) ){ i++; }
2fc0: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 29  .  while( z[i] )
2fd0: 7b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  {.    if( isspac
2fe0: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
2ff0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
3000: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
3010: 61 63 65 28 7a 5b 2b 2b 69 5d 29 20 29 7b 7d 0a  ace(z[++i]) ){}.
3020: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3030: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 2b 2b 5d   z[j++] = z[i++]
3040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
3050: 69 6c 65 28 20 69 3e 30 20 26 26 20 69 73 73 70  ile( i>0 && issp
3060: 61 63 65 28 7a 5b 69 2d 31 5d 29 20 29 7b 0a 20  ace(z[i-1]) ){. 
3070: 20 20 20 7a 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20     z[i-1] = 0;. 
3080: 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     i--;.  }.}../
3090: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
30a0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
30b0: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
30c0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
30d0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
30e0: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
30f0: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
3100: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
3110: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
3120: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
3130: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
3140: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
3150: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
3160: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
3170: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
3180: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
3190: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
31a0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
31b0: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
31c0: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
31d0: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
31e0: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
31f0: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
3200: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
3210: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
3220: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
3230: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
3240: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
3250: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
3260: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
3270: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
3280: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
3290: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
32a0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
32b0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
32c0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
32d0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69 6e 74  resolved..*/.int
32e0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
32f0: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
3300: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d   int i;.  i = p-
3310: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 69 66 28  >nLabel++;.  if(
3320: 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c   i>=p->nLabelAll
3330: 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61  oc ){.    p->nLa
3340: 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c  belAlloc = p->nL
3350: 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30  abelAlloc*2 + 10
3360: 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  ;.    p->aLabel 
3370: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
3380: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 70 2d 3e 6e   p->aLabel, p->n
3390: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f  LabelAlloc*sizeo
33a0: 66 28 69 6e 74 29 29 3b 0a 20 20 7d 0a 20 20 69  f(int));.  }.  i
33b0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20  f( p->aLabel==0 
33c0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c  ){.    p->nLabel
33d0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61   = 0;.    p->nLa
33e0: 62 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  belAlloc = 0;.  
33f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3400: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
3410: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31   -1;.  return -1
3420: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
3430: 65 74 20 61 6e 20 41 67 67 20 73 74 72 75 63 74  et an Agg struct
3440: 75 72 65 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c  ure.  Delete all
3450: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a   its contents..*
3460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 41 67  /.static void Ag
3470: 67 52 65 73 65 74 28 41 67 67 20 2a 70 29 7b 0a  gReset(Agg *p){.
3480: 20 20 69 6e 74 20 69 3b 0a 20 20 77 68 69 6c 65    int i;.  while
3490: 28 20 70 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20  ( p->pFirst ){. 
34a0: 20 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65     AggElem *pEle
34b0: 6d 20 3d 20 70 2d 3e 70 46 69 72 73 74 3b 0a 20  m = p->pFirst;. 
34c0: 20 20 20 70 2d 3e 70 46 69 72 73 74 20 3d 20 70     p->pFirst = p
34d0: 45 6c 65 6d 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Elem->pNext;.   
34e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
34f0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Mem; i++){.     
3500: 20 69 66 28 20 70 45 6c 65 6d 2d 3e 61 4d 65 6d   if( pElem->aMem
3510: 5b 69 5d 2e 73 2e 66 6c 61 67 73 20 26 20 53 54  [i].s.flags & ST
3520: 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20  K_Dyn ){.       
3530: 20 73 71 6c 69 74 65 46 72 65 65 28 70 45 6c 65   sqliteFree(pEle
3540: 6d 2d 3e 61 4d 65 6d 5b 69 5d 2e 7a 29 3b 0a 20  m->aMem[i].z);. 
3550: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 45 6c 65   sqliteFree(pEle
3570: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
3580: 46 72 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b  Free(p->apHash);
3590: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
35a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 0a  sizeof(*p));.}..
35b0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 67 69  /*.** Add the gi
35c0: 76 65 6e 20 41 67 67 45 6c 65 6d 20 74 6f 20 74  ven AggElem to t
35d0: 68 65 20 68 61 73 68 20 61 72 72 61 79 0a 2a 2f  he hash array.*/
35e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 41 67 67  .static void Agg
35f0: 45 6e 68 61 73 68 28 41 67 67 20 2a 70 2c 20 41  Enhash(Agg *p, A
3600: 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 29 7b 0a  ggElem *pElem){.
3610: 20 20 69 6e 74 20 68 20 3d 20 73 71 6c 69 74 65    int h = sqlite
3620: 48 61 73 68 4e 6f 43 61 73 65 28 70 45 6c 65 6d  HashNoCase(pElem
3630: 2d 3e 7a 4b 65 79 2c 20 30 29 20 25 20 70 2d 3e  ->zKey, 0) % p->
3640: 6e 48 61 73 68 3b 0a 20 20 70 45 6c 65 6d 2d 3e  nHash;.  pElem->
3650: 70 48 61 73 68 20 3d 20 70 2d 3e 61 70 48 61 73  pHash = p->apHas
3660: 68 5b 68 5d 3b 0a 20 20 70 2d 3e 61 70 48 61 73  h[h];.  p->apHas
3670: 68 5b 68 5d 20 3d 20 70 45 6c 65 6d 3b 0a 7d 0a  h[h] = pElem;.}.
3680: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3690: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 61  e size of the ha
36a0: 73 68 20 61 72 72 61 79 20 74 6f 20 74 68 65 20  sh array to the 
36b0: 61 6d 6f 75 6e 74 20 67 69 76 65 6e 2e 0a 2a 2f  amount given..*/
36c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 41 67 67  .static void Agg
36d0: 52 65 68 61 73 68 28 41 67 67 20 2a 70 2c 20 69  Rehash(Agg *p, i
36e0: 6e 74 20 6e 48 61 73 68 29 7b 0a 20 20 69 6e 74  nt nHash){.  int
36f0: 20 73 69 7a 65 3b 0a 20 20 41 67 67 45 6c 65 6d   size;.  AggElem
3700: 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 70   *pElem;.  if( p
3710: 2d 3e 6e 48 61 73 68 3d 3d 6e 48 61 73 68 20 29  ->nHash==nHash )
3720: 20 72 65 74 75 72 6e 3b 0a 20 20 73 69 7a 65 20   return;.  size 
3730: 3d 20 6e 48 61 73 68 20 2a 20 73 69 7a 65 6f 66  = nHash * sizeof
3740: 28 41 67 67 45 6c 65 6d 2a 29 3b 0a 20 20 70 2d  (AggElem*);.  p-
3750: 3e 61 70 48 61 73 68 20 3d 20 73 71 6c 69 74 65  >apHash = sqlite
3760: 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 70 48 61 73  Realloc(p->apHas
3770: 68 2c 20 73 69 7a 65 20 29 3b 0a 20 20 6d 65 6d  h, size );.  mem
3780: 73 65 74 28 70 2d 3e 61 70 48 61 73 68 2c 20 30  set(p->apHash, 0
3790: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 2d 3e 6e 48  , size);.  p->nH
37a0: 61 73 68 20 3d 20 6e 48 61 73 68 3b 0a 20 20 66  ash = nHash;.  f
37b0: 6f 72 28 70 45 6c 65 6d 3d 70 2d 3e 70 46 69 72  or(pElem=p->pFir
37c0: 73 74 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  st; pElem; pElem
37d0: 3d 70 45 6c 65 6d 2d 3e 70 4e 65 78 74 29 7b 0a  =pElem->pNext){.
37e0: 20 20 20 20 41 67 67 45 6e 68 61 73 68 28 70 2c      AggEnhash(p,
37f0: 20 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a   pElem);.  }.}..
3800: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
3810: 65 77 20 65 6c 65 6d 65 6e 74 20 61 6e 64 20 6d  ew element and m
3820: 61 6b 65 20 69 74 20 74 68 65 20 63 75 72 72 65  ake it the curre
3830: 6e 74 20 65 6c 65 6d 65 6e 74 2e 20 20 0a 2a 2a  nt element.  .**
3840: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
3850: 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69 66  success and 1 if
3860: 20 6d 65 6d 6f 72 79 20 69 73 20 65 78 68 61 75   memory is exhau
3870: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
3880: 69 6e 74 20 41 67 67 49 6e 73 65 72 74 28 41 67  int AggInsert(Ag
3890: 67 20 2a 70 2c 20 63 68 61 72 20 2a 7a 4b 65 79  g *p, char *zKey
38a0: 29 7b 0a 20 20 41 67 67 45 6c 65 6d 20 2a 70 45  ){.  AggElem *pE
38b0: 6c 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  lem;.  int i;.  
38c0: 69 66 28 20 70 2d 3e 6e 48 61 73 68 20 3c 3d 20  if( p->nHash <= 
38d0: 70 2d 3e 6e 45 6c 65 6d 2a 32 20 29 7b 0a 20 20  p->nElem*2 ){.  
38e0: 20 20 41 67 67 52 65 68 61 73 68 28 70 2c 20 70    AggRehash(p, p
38f0: 2d 3e 6e 45 6c 65 6d 2a 32 20 2b 20 31 39 29 3b  ->nElem*2 + 19);
3900: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 48  .  }.  if( p->nH
3910: 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ash==0 ) return 
3920: 31 3b 0a 20 20 70 45 6c 65 6d 20 3d 20 73 71 6c  1;.  pElem = sql
3930: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
3940: 66 28 41 67 67 45 6c 65 6d 29 20 2b 20 73 74 72  f(AggElem) + str
3950: 6c 65 6e 28 7a 4b 65 79 29 20 2b 20 31 20 2b 0a  len(zKey) + 1 +.
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 20 20 28 70 2d 3e 6e 4d 65 6d          (p->nMem
3980: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 45 6c 65 6d  -1)*sizeof(pElem
3990: 2d 3e 61 4d 65 6d 5b 30 5d 29 20 29 3b 0a 20 20  ->aMem[0]) );.  
39a0: 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 20 72  if( pElem==0 ) r
39b0: 65 74 75 72 6e 20 31 3b 0a 20 20 70 45 6c 65 6d  eturn 1;.  pElem
39c0: 2d 3e 7a 4b 65 79 20 3d 20 28 63 68 61 72 2a 29  ->zKey = (char*)
39d0: 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 70 2d 3e  &pElem->aMem[p->
39e0: 6e 4d 65 6d 5d 3b 0a 20 20 73 74 72 63 70 79 28  nMem];.  strcpy(
39f0: 70 45 6c 65 6d 2d 3e 7a 4b 65 79 2c 20 7a 4b 65  pElem->zKey, zKe
3a00: 79 29 3b 0a 20 20 41 67 67 45 6e 68 61 73 68 28  y);.  AggEnhash(
3a10: 70 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 70 45 6c  p, pElem);.  pEl
3a20: 65 6d 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  em->pNext = p->p
3a30: 46 69 72 73 74 3b 0a 20 20 70 2d 3e 70 46 69 72  First;.  p->pFir
3a40: 73 74 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 70 2d  st = pElem;.  p-
3a50: 3e 6e 45 6c 65 6d 2b 2b 3b 0a 20 20 70 2d 3e 70  >nElem++;.  p->p
3a60: 43 75 72 72 65 6e 74 20 3d 20 70 45 6c 65 6d 3b  Current = pElem;
3a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3a80: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
3a90: 20 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 2e   pElem->aMem[i].
3aa0: 73 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75  s.flags = STK_Nu
3ab0: 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
3ac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   0;.}../*.** Get
3ad0: 20 74 68 65 20 41 67 67 45 6c 65 6d 20 63 75 72   the AggElem cur
3ae0: 72 65 6e 74 6c 79 20 69 6e 20 66 6f 63 75 73 0a  rently in focus.
3af0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 67 67 49 6e  */.#define AggIn
3b00: 46 6f 63 75 73 28 50 29 20 20 20 28 28 50 29 2e  Focus(P)   ((P).
3b10: 70 43 75 72 72 65 6e 74 20 3f 20 28 50 29 2e 70  pCurrent ? (P).p
3b20: 43 75 72 72 65 6e 74 20 3a 20 5f 41 67 67 49 6e  Current : _AggIn
3b30: 46 6f 63 75 73 28 26 28 50 29 29 29 0a 73 74 61  Focus(&(P))).sta
3b40: 74 69 63 20 41 67 67 45 6c 65 6d 20 2a 5f 41 67  tic AggElem *_Ag
3b50: 67 49 6e 46 6f 63 75 73 28 41 67 67 20 2a 70 29  gInFocus(Agg *p)
3b60: 7b 0a 20 20 41 67 67 45 6c 65 6d 20 2a 70 46 6f  {.  AggElem *pFo
3b70: 63 75 73 20 3d 20 70 2d 3e 70 46 69 72 73 74 3b  cus = p->pFirst;
3b80: 0a 20 20 69 66 28 20 70 46 6f 63 75 73 20 29 7b  .  if( pFocus ){
3b90: 0a 20 20 20 20 70 2d 3e 70 43 75 72 72 65 6e 74  .    p->pCurrent
3ba0: 20 3d 20 70 46 6f 63 75 73 3b 0a 20 20 7d 65 6c   = pFocus;.  }el
3bb0: 73 65 7b 0a 20 20 20 20 41 67 67 49 6e 73 65 72  se{.    AggInser
3bc0: 74 28 70 2c 22 22 29 3b 0a 20 20 20 20 70 46 6f  t(p,"");.    pFo
3bd0: 63 75 73 20 3d 20 70 2d 3e 70 43 75 72 72 65 6e  cus = p->pCurren
3be0: 74 20 3d 20 70 2d 3e 70 46 69 72 73 74 3b 0a 20  t = p->pFirst;. 
3bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 6f 63   }.  return pFoc
3c00: 75 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  us;.}../*.** Era
3c10: 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  se all informati
3c20: 6f 6e 20 66 72 6f 6d 20 61 20 53 65 74 0a 2a 2f  on from a Set.*/
3c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 74  .static void Set
3c40: 43 6c 65 61 72 28 53 65 74 20 2a 70 29 7b 0a 20  Clear(Set *p){. 
3c50: 20 53 65 74 45 6c 65 6d 20 2a 70 45 6c 65 6d 2c   SetElem *pElem,
3c60: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
3c70: 45 6c 65 6d 3d 70 2d 3e 70 41 6c 6c 3b 20 70 45  Elem=p->pAll; pE
3c80: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 70 4e 65 78 74  lem; pElem=pNext
3c90: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3ca0: 45 6c 65 6d 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Elem->pNext;.   
3cb0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 45 6c 65   sqliteFree(pEle
3cc0: 6d 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  m);.  }.  memset
3cd0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
3ce0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ));.}../*.** Ins
3cf0: 65 72 74 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  ert a new elemen
3d00: 74 20 69 6e 74 6f 20 74 68 65 20 73 65 74 0a 2a  t into the set.*
3d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65  /.static void Se
3d20: 74 49 6e 73 65 72 74 28 53 65 74 20 2a 70 2c 20  tInsert(Set *p, 
3d30: 63 68 61 72 20 2a 7a 4b 65 79 29 7b 0a 20 20 53  char *zKey){.  S
3d40: 65 74 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  etElem *pElem;. 
3d50: 20 69 6e 74 20 68 20 3d 20 73 71 6c 69 74 65 48   int h = sqliteH
3d60: 61 73 68 4e 6f 43 61 73 65 28 7a 4b 65 79 2c 20  ashNoCase(zKey, 
3d70: 30 29 20 25 20 41 72 72 61 79 53 69 7a 65 28 70  0) % ArraySize(p
3d80: 2d 3e 61 70 48 61 73 68 29 3b 0a 20 20 66 6f 72  ->apHash);.  for
3d90: 28 70 45 6c 65 6d 3d 70 2d 3e 61 70 48 61 73 68  (pElem=p->apHash
3da0: 5b 68 5d 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  [h]; pElem; pEle
3db0: 6d 3d 70 45 6c 65 6d 2d 3e 70 48 61 73 68 29 7b  m=pElem->pHash){
3dc0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
3dd0: 70 45 6c 65 6d 2d 3e 7a 4b 65 79 2c 20 7a 4b 65  pElem->zKey, zKe
3de0: 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
3df0: 20 20 7d 0a 20 20 70 45 6c 65 6d 20 3d 20 73 71    }.  pElem = sq
3e00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
3e10: 6f 66 28 2a 70 45 6c 65 6d 29 20 2b 20 73 74 72  of(*pElem) + str
3e20: 6c 65 6e 28 7a 4b 65 79 29 20 29 3b 0a 20 20 69  len(zKey) );.  i
3e30: 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 20 72 65  f( pElem==0 ) re
3e40: 74 75 72 6e 3b 0a 20 20 73 74 72 63 70 79 28 70  turn;.  strcpy(p
3e50: 45 6c 65 6d 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79  Elem->zKey, zKey
3e60: 29 3b 0a 20 20 70 45 6c 65 6d 2d 3e 70 4e 65 78  );.  pElem->pNex
3e70: 74 20 3d 20 70 2d 3e 70 41 6c 6c 3b 0a 20 20 70  t = p->pAll;.  p
3e80: 2d 3e 70 41 6c 6c 20 3d 20 70 45 6c 65 6d 3b 0a  ->pAll = pElem;.
3e90: 20 20 70 45 6c 65 6d 2d 3e 70 48 61 73 68 20 3d    pElem->pHash =
3ea0: 20 70 2d 3e 61 70 48 61 73 68 5b 68 5d 3b 0a 20   p->apHash[h];. 
3eb0: 20 70 2d 3e 61 70 48 61 73 68 5b 68 5d 20 3d 20   p->apHash[h] = 
3ec0: 70 45 6c 65 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pElem;.}../*.** 
3ed0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
3ee0: 6e 20 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e 20  n element is in 
3ef0: 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e  the set.  Return
3f00: 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
3f10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 65 74  /.static int Set
3f20: 54 65 73 74 28 53 65 74 20 2a 70 2c 20 63 68 61  Test(Set *p, cha
3f30: 72 20 2a 7a 4b 65 79 29 7b 0a 20 20 53 65 74 45  r *zKey){.  SetE
3f40: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 6e  lem *pElem;.  in
3f50: 74 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68  t h = sqliteHash
3f60: 4e 6f 43 61 73 65 28 7a 4b 65 79 2c 20 30 29 20  NoCase(zKey, 0) 
3f70: 25 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  % ArraySize(p->a
3f80: 70 48 61 73 68 29 3b 0a 20 20 66 6f 72 28 70 45  pHash);.  for(pE
3f90: 6c 65 6d 3d 70 2d 3e 61 70 48 61 73 68 5b 68 5d  lem=p->apHash[h]
3fa0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 70  ; pElem; pElem=p
3fb0: 45 6c 65 6d 2d 3e 70 48 61 73 68 29 7b 0a 20 20  Elem->pHash){.  
3fc0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 45 6c    if( strcmp(pEl
3fd0: 65 6d 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 29 3d  em->zKey, zKey)=
3fe0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
3ff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4000: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
4010: 74 68 65 20 67 69 76 65 6e 20 73 74 61 63 6b 20  the given stack 
4020: 65 6e 74 69 74 79 20 69 6e 74 6f 20 61 20 73 74  entity into a st
4030: 72 69 6e 67 20 69 66 20 69 74 20 69 73 6e 27 74  ring if it isn't
4040: 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e   one.** already.
4050: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
4060: 6f 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  o if we run out 
4070: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  of memory..**.**
4080: 20 4e 55 4c 4c 73 20 61 72 65 20 63 6f 6e 76 65   NULLs are conve
4090: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 65 6d 70  rted into an emp
40a0: 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64  ty string..*/.#d
40b0: 65 66 69 6e 65 20 53 74 72 69 6e 67 69 66 79 28  efine Stringify(
40c0: 50 2c 49 29 20 5c 0a 20 20 20 28 28 50 2d 3e 61  P,I) \.   ((P->a
40d0: 53 74 61 63 6b 5b 49 5d 2e 66 6c 61 67 73 20 26  Stack[I].flags &
40e0: 20 53 54 4b 5f 53 74 72 29 3d 3d 30 20 3f 20 68   STK_Str)==0 ? h
40f0: 61 72 64 53 74 72 69 6e 67 69 66 79 28 50 2c 49  ardStringify(P,I
4100: 29 20 3a 20 30 29 0a 73 74 61 74 69 63 20 69 6e  ) : 0).static in
4110: 74 20 68 61 72 64 53 74 72 69 6e 67 69 66 79 28  t hardStringify(
4120: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
4130: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4140: 3b 0a 20 20 69 6e 74 20 66 67 20 3d 20 70 2d 3e  ;.  int fg = p->
4150: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 3b  aStack[i].flags;
4160: 0a 20 20 69 66 28 20 66 67 20 26 20 53 54 4b 5f  .  if( fg & STK_
4170: 52 65 61 6c 20 29 7b 0a 20 20 20 20 73 70 72 69  Real ){.    spri
4180: 6e 74 66 28 7a 42 75 66 2c 22 25 67 22 2c 70 2d  ntf(zBuf,"%g",p-
4190: 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 29 3b 0a 20  >aStack[i].r);. 
41a0: 20 7d 65 6c 73 65 20 69 66 28 20 66 67 20 26 20   }else if( fg & 
41b0: 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  STK_Int ){.    s
41c0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
41d0: 2c 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 69 29  ,p->aStack[i].i)
41e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
41f0: 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 22 22  ->zStack[i] = ""
4200: 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b  ;.    p->aStack[
4210: 69 5d 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 70 2d  i].n = 1;.    p-
4220: 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73  >aStack[i].flags
4230: 20 7c 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 20   |= STK_Str;.   
4240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4250: 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20   p->zStack[i] = 
4260: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42 75  sqliteStrDup(zBu
4270: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74  f);.  if( p->zSt
4280: 61 63 6b 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75  ack[i]==0 ) retu
4290: 72 6e 20 31 3b 0a 20 20 70 2d 3e 61 53 74 61 63  rn 1;.  p->aStac
42a0: 6b 5b 69 5d 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  k[i].n = strlen(
42b0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29 2b 31 3b  p->zStack[i])+1;
42c0: 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e  .  p->aStack[i].
42d0: 66 6c 61 67 73 20 7c 3d 20 53 54 4b 5f 53 74 72  flags |= STK_Str
42e0: 7c 53 54 4b 5f 44 79 6e 3b 0a 20 20 72 65 74 75  |STK_Dyn;.  retu
42f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4300: 65 6c 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  elease the memor
4310: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
4320: 68 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 63  h the given stac
4330: 6b 20 6c 65 76 65 6c 0a 2a 2f 0a 23 64 65 66 69  k level.*/.#defi
4340: 6e 65 20 52 65 6c 65 61 73 65 28 50 2c 49 29 20  ne Release(P,I) 
4350: 20 69 66 28 28 50 29 2d 3e 61 53 74 61 63 6b 5b   if((P)->aStack[
4360: 49 5d 2e 66 6c 61 67 73 26 53 54 4b 5f 44 79 6e  I].flags&STK_Dyn
4370: 29 7b 20 68 61 72 64 52 65 6c 65 61 73 65 28 50  ){ hardRelease(P
4380: 2c 49 29 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f  ,I); }.static vo
4390: 69 64 20 68 61 72 64 52 65 6c 65 61 73 65 28 56  id hardRelease(V
43a0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
43b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
43c0: 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 70 2d  zStack[i]);.  p-
43d0: 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a  >zStack[i] = 0;.
43e0: 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66    p->aStack[i].f
43f0: 6c 61 67 73 20 26 3d 20 7e 28 53 54 4b 5f 53 74  lags &= ~(STK_St
4400: 72 7c 53 54 4b 5f 44 79 6e 29 3b 0a 7d 0a 0a 2f  r|STK_Dyn);.}../
4410: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
4420: 20 67 69 76 65 6e 20 73 74 61 63 6b 20 65 6e 74   given stack ent
4430: 69 74 79 20 69 6e 74 6f 20 61 20 69 6e 74 65 67  ity into a integ
4440: 65 72 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f  er if it isn't o
4450: 6e 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 2a  ne.** already..*
4460: 2a 0a 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 73  *.** Any prior s
4470: 74 72 69 6e 67 20 6f 72 20 72 65 61 6c 20 72 65  tring or real re
4480: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
4490: 69 6e 76 61 6c 69 64 61 74 65 64 2e 20 20 0a 2a  invalidated.  .*
44a0: 2a 20 4e 55 4c 4c 73 20 61 72 65 20 63 6f 6e 76  * NULLs are conv
44b0: 65 72 74 65 64 20 69 6e 74 6f 20 30 2e 0a 2a 2f  erted into 0..*/
44c0: 0a 23 64 65 66 69 6e 65 20 49 6e 74 65 67 65 72  .#define Integer
44d0: 69 66 79 28 50 2c 49 29 20 5c 0a 20 20 20 20 69  ify(P,I) \.    i
44e0: 66 28 28 28 50 29 2d 3e 61 53 74 61 63 6b 5b 28  f(((P)->aStack[(
44f0: 49 29 5d 2e 66 6c 61 67 73 26 53 54 4b 5f 49 6e  I)].flags&STK_In
4500: 74 29 3d 3d 30 29 7b 20 68 61 72 64 49 6e 74 65  t)==0){ hardInte
4510: 67 65 72 69 66 79 28 50 2c 49 29 3b 20 7d 0a 73  gerify(P,I); }.s
4520: 74 61 74 69 63 20 76 6f 69 64 20 68 61 72 64 49  tatic void hardI
4530: 6e 74 65 67 65 72 69 66 79 28 56 64 62 65 20 2a  ntegerify(Vdbe *
4540: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28  p, int i){.  if(
4550: 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c   p->aStack[i].fl
4560: 61 67 73 20 26 20 53 54 4b 5f 52 65 61 6c 20 29  ags & STK_Real )
4570: 7b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b  {.    p->aStack[
4580: 69 5d 2e 69 20 3d 20 70 2d 3e 61 53 74 61 63 6b  i].i = p->aStack
4590: 5b 69 5d 2e 72 3b 0a 20 20 20 20 52 65 6c 65 61  [i].r;.    Relea
45a0: 73 65 28 70 2c 20 69 29 3b 0a 20 20 7d 65 6c 73  se(p, i);.  }els
45b0: 65 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b  e if( p->aStack[
45c0: 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53  i].flags & STK_S
45d0: 74 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 74  tr ){.    p->aSt
45e0: 61 63 6b 5b 69 5d 2e 69 20 3d 20 61 74 6f 69 28  ack[i].i = atoi(
45f0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a 20  p->zStack[i]);. 
4600: 20 20 20 52 65 6c 65 61 73 65 28 70 2c 20 69 29     Release(p, i)
4610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4620: 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 69 20 3d 20  ->aStack[i].i = 
4630: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 53 74 61  0;.  }.  p->aSta
4640: 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 53 54  ck[i].flags = ST
4650: 4b 5f 49 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K_Int;.}../*.** 
4660: 47 65 74 20 61 20 76 61 6c 69 64 20 52 65 61 6c  Get a valid Real
4670: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
4680: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 73 74  for the given st
4690: 61 63 6b 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a  ack element..**.
46a0: 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 73 74 72  ** Any prior str
46b0: 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 20 72  ing or integer r
46c0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
46d0: 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a 20 4e 55   retained..** NU
46e0: 4c 4c 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  LLs are converte
46f0: 64 20 69 6e 74 6f 20 30 2e 30 2e 0a 2a 2f 0a 23  d into 0.0..*/.#
4700: 64 65 66 69 6e 65 20 52 65 61 6c 69 66 79 28 50  define Realify(P
4710: 2c 49 29 20 5c 0a 20 20 20 20 69 66 28 28 28 50  ,I) \.    if(((P
4720: 29 2d 3e 61 53 74 61 63 6b 5b 28 49 29 5d 2e 66  )->aStack[(I)].f
4730: 6c 61 67 73 26 53 54 4b 5f 52 65 61 6c 29 3d 3d  lags&STK_Real)==
4740: 30 29 7b 20 68 61 72 64 52 65 61 6c 69 66 79 28  0){ hardRealify(
4750: 50 2c 49 29 3b 20 7d 0a 73 74 61 74 69 63 20 76  P,I); }.static v
4760: 6f 69 64 20 68 61 72 64 52 65 61 6c 69 66 79 28  oid hardRealify(
4770: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
4780: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
4790: 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [i].flags & STK_
47a0: 53 74 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  Str ){.    p->aS
47b0: 74 61 63 6b 5b 69 5d 2e 72 20 3d 20 61 74 6f 66  tack[i].r = atof
47c0: 28 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a  (p->zStack[i]);.
47d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
47e0: 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26  Stack[i].flags &
47f0: 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20   STK_Int ){.    
4800: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 20 3d  p->aStack[i].r =
4810: 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 69 3b   p->aStack[i].i;
4820: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
4830: 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 20 3d 20 30  >aStack[i].r = 0
4840: 2e 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 53 74  .0;.  }.  p->aSt
4850: 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 7c 3d 20  ack[i].flags |= 
4860: 53 54 4b 5f 52 65 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  STK_Real;.}../*.
4870: 2a 2a 20 50 6f 70 20 74 68 65 20 73 74 61 63 6b  ** Pop the stack
4880: 20 4e 20 74 69 6d 65 73 2e 20 20 46 72 65 65 20   N times.  Free 
4890: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  any memory assoc
48a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  iated with the.*
48b0: 2a 20 70 6f 70 70 65 64 20 73 74 61 63 6b 20 65  * popped stack e
48c0: 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  lements..*/.stat
48d0: 69 63 20 76 6f 69 64 20 50 6f 70 53 74 61 63 6b  ic void PopStack
48e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
48f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 63  {.  if( p->zStac
4900: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  k==0 ) return;. 
4910: 20 77 68 69 6c 65 28 20 70 2d 3e 74 6f 73 3e 3d   while( p->tos>=
4920: 30 20 26 26 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20  0 && N-->0 ){.  
4930: 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 74 6f 73    int i = p->tos
4940: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  --;.    if( p->a
4950: 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26  Stack[i].flags &
4960: 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20   STK_Dyn ){.    
4970: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
4980: 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 20 20  zStack[i]);.    
4990: 7d 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b  }.    p->aStack[
49a0: 69 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  i].flags = 0;.  
49b0: 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d    p->zStack[i] =
49c0: 20 30 3b 0a 20 20 7d 20 20 20 20 0a 7d 0a 0a 2f   0;.  }    .}../
49d0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 73  *.** Make sure s
49e0: 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
49f0: 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
4a00: 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 73 74  at least N.** st
4a10: 61 63 6b 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41  ack elements.  A
4a20: 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
4a30: 61 6c 20 73 74 61 63 6b 20 73 70 61 63 65 20 69  al stack space i
4a40: 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  f.** necessary..
4a50: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
4a60: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 6e 6f  n success and no
4a70: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  n-zero if there 
4a80: 61 72 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  are memory.** al
4a90: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 2e  location errors.
4aa0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 65 65 64  .*/.#define Need
4ab0: 53 74 61 63 6b 28 50 2c 4e 29 20 28 28 28 50 29  Stack(P,N) (((P)
4ac0: 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 3c 3d 28  ->nStackAlloc<=(
4ad0: 4e 29 29 20 3f 20 68 61 72 64 4e 65 65 64 53 74  N)) ? hardNeedSt
4ae0: 61 63 6b 28 50 2c 4e 29 20 3a 20 30 29 0a 73 74  ack(P,N) : 0).st
4af0: 61 74 69 63 20 69 6e 74 20 68 61 72 64 4e 65 65  atic int hardNee
4b00: 64 53 74 61 63 6b 28 56 64 62 65 20 2a 70 2c 20  dStack(Vdbe *p, 
4b10: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6f 6c  int N){.  int ol
4b20: 64 41 6c 6c 6f 63 3b 0a 20 20 69 6e 74 20 69 3b  dAlloc;.  int i;
4b30: 0a 20 20 69 66 28 20 4e 3e 3d 70 2d 3e 6e 53 74  .  if( N>=p->nSt
4b40: 61 63 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ackAlloc ){.    
4b50: 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  oldAlloc = p->nS
4b60: 74 61 63 6b 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  tackAlloc;.    p
4b70: 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 20 3d 20  ->nStackAlloc = 
4b80: 4e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61  N + 20;.    p->a
4b90: 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 52 65  Stack = sqliteRe
4ba0: 61 6c 6c 6f 63 28 70 2d 3e 61 53 74 61 63 6b 2c  alloc(p->aStack,
4bb0: 20 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 2a   p->nStackAlloc*
4bc0: 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b  sizeof(p->aStack
4bd0: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 7a 53  [0]));.    p->zS
4be0: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 52 65 61  tack = sqliteRea
4bf0: 6c 6c 6f 63 28 70 2d 3e 7a 53 74 61 63 6b 2c 20  lloc(p->zStack, 
4c00: 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 2a 73  p->nStackAlloc*s
4c10: 69 7a 65 6f 66 28 63 68 61 72 2a 29 29 3b 0a 20  izeof(char*));. 
4c20: 20 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b     if( p->aStack
4c30: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 53 74 61 63 6b  ==0 || p->zStack
4c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4c50: 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63  iteFree(p->aStac
4c60: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
4c70: 46 72 65 65 28 70 2d 3e 7a 53 74 61 63 6b 29 3b  Free(p->zStack);
4c80: 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b  .      p->aStack
4c90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 7a   = 0;.      p->z
4ca0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Stack = 0;.     
4cb0: 20 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 20   p->nStackAlloc 
4cc0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
4cd0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 1;.    }.    f
4ce0: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
4cf0: 3c 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 3b  <p->nStackAlloc;
4d00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4d10: 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20  zStack[i] = 0;. 
4d20: 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69       p->aStack[i
4d30: 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ].flags = 0;.   
4d40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4d50: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
4d60: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
4d70: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
4d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4d90: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
4da0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
4db0: 73 6f 72 73 2c 20 6c 69 73 74 2c 20 61 6e 64 2f  sors, list, and/
4dc0: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
4dd0: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
4de0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4df0: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
4e00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 50  p){.  int i;.  P
4e10: 6f 70 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f  opStack(p, p->to
4e20: 73 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  s+1);.  sqliteFr
4e30: 65 65 28 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 29  ee(p->azColName)
4e40: 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65  ;.  p->azColName
4e50: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
4e60: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
4e70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
4e80: 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 20  aCsr[i].pCursor 
4e90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  ){.      sqliteD
4ea0: 62 62 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  bbeCloseCursor(p
4eb0: 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f  ->aCsr[i].pCurso
4ec0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 73  r);.      p->aCs
4ed0: 72 5b 69 5d 2e 70 43 75 72 73 6f 72 20 3d 20 30  r[i].pCursor = 0
4ee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4ef0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 73 72  liteFree(p->aCsr
4f00: 29 3b 0a 20 20 70 2d 3e 61 43 73 72 20 3d 20 30  );.  p->aCsr = 0
4f10: 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  p->nCursor =
4f20: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
4f30: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
4f40: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b      if( p->aMem[
4f50: 69 5d 2e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b  i].s.flags & STK
4f60: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  _Dyn ){.      sq
4f70: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d  liteFree(p->aMem
4f80: 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  [i].z);.    }.  
4f90: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4fa0: 2d 3e 61 4d 65 6d 29 3b 0a 20 20 70 2d 3e 61 4d  ->aMem);.  p->aM
4fb0: 65 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4d 65  em = 0;.  p->nMe
4fc0: 6d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  m = 0;.  for(i=0
4fd0: 3b 20 69 3c 70 2d 3e 6e 4c 69 73 74 3b 20 69 2b  ; i<p->nList; i+
4fe0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
4ff0: 70 4c 69 73 74 5b 69 5d 20 29 7b 0a 20 20 20 20  pList[i] ){.    
5000: 20 20 73 71 6c 69 74 65 44 62 62 65 43 6c 6f 73    sqliteDbbeClos
5010: 65 54 65 6d 70 46 69 6c 65 28 70 2d 3e 70 42 65  eTempFile(p->pBe
5020: 2c 20 70 2d 3e 61 70 4c 69 73 74 5b 69 5d 29 3b  , p->apList[i]);
5030: 0a 20 20 20 20 20 20 70 2d 3e 61 70 4c 69 73 74  .      p->apList
5040: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
5050: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
5060: 70 2d 3e 61 70 4c 69 73 74 29 3b 0a 20 20 70 2d  p->apList);.  p-
5070: 3e 61 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70  >apList = 0;.  p
5080: 2d 3e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66  ->nList = 0;.  f
5090: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 6f  or(i=0; i<p->nSo
50a0: 72 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 6f  rt; i++){.    So
50b0: 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20  rter *pSorter;. 
50c0: 20 20 20 77 68 69 6c 65 28 20 28 70 53 6f 72 74     while( (pSort
50d0: 65 72 20 3d 20 70 2d 3e 61 70 53 6f 72 74 5b 69  er = p->apSort[i
50e0: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ])!=0 ){.      p
50f0: 2d 3e 61 70 53 6f 72 74 5b 69 5d 20 3d 20 70 53  ->apSort[i] = pS
5100: 6f 72 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  orter->pNext;.  
5110: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5120: 53 6f 72 74 65 72 2d 3e 7a 4b 65 79 29 3b 0a 20  Sorter->zKey);. 
5130: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
5140: 70 53 6f 72 74 65 72 2d 3e 70 44 61 74 61 29 3b  pSorter->pData);
5150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
5160: 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 20 20  e(pSorter);.    
5170: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
5180: 65 65 28 70 2d 3e 61 70 53 6f 72 74 29 3b 0a 20  ee(p->apSort);. 
5190: 20 70 2d 3e 61 70 53 6f 72 74 20 3d 20 30 3b 0a   p->apSort = 0;.
51a0: 20 20 70 2d 3e 6e 53 6f 72 74 20 3d 20 30 3b 0a    p->nSort = 0;.
51b0: 20 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 20 29    if( p->pFile )
51c0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69  {.    if( p->pFi
51d0: 6c 65 21 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f  le!=stdin ) fclo
51e0: 73 65 28 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20  se(p->pFile);.  
51f0: 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a    p->pFile = 0;.
5200: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 46    }.  if( p->azF
5210: 69 65 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ield ){.    sqli
5220: 74 65 46 72 65 65 28 70 2d 3e 61 7a 46 69 65 6c  teFree(p->azFiel
5230: 64 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 46 69 65  d);.    p->azFie
5240: 6c 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  ld = 0;.  }.  p-
5250: 3e 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 69  >nField = 0;.  i
5260: 66 28 20 70 2d 3e 7a 4c 69 6e 65 20 29 7b 0a 20  f( p->zLine ){. 
5270: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
5280: 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 70 2d 3e  >zLine);.    p->
5290: 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zLine = 0;.  }. 
52a0: 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d   p->nLineAlloc =
52b0: 20 30 3b 0a 20 20 41 67 67 52 65 73 65 74 28 26   0;.  AggReset(&
52c0: 70 2d 3e 61 67 67 29 3b 0a 20 20 66 6f 72 28 69  p->agg);.  for(i
52d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 74 3b 20 69  =0; i<p->nSet; i
52e0: 2b 2b 29 7b 0a 20 20 20 20 53 65 74 43 6c 65 61  ++){.    SetClea
52f0: 72 28 26 70 2d 3e 61 53 65 74 5b 69 5d 29 3b 0a  r(&p->aSet[i]);.
5300: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
5310: 28 70 2d 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e  (p->aSet);.  p->
5320: 61 53 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  aSet = 0;.  p->n
5330: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
5340: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
5350: 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
5360: 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c 65 74   sqliteVdbeDelet
5370: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
5380: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
5390: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
53a0: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  nup(p);.  if( p-
53b0: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 7b 0a  >nOpAlloc==0 ){.
53c0: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a      p->aOp = 0;.
53d0: 20 20 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a      p->nOp = 0;.
53e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
53f0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5400: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
5410: 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20 7d  >aOp[i].p3);.  }
5420: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
5430: 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 46  >aOp);.  sqliteF
5440: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
5450: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5460: 61 53 74 61 63 6b 29 3b 0a 20 20 73 71 6c 69 74  aStack);.  sqlit
5470: 65 46 72 65 65 28 70 2d 3e 7a 53 74 61 63 6b 29  eFree(p->zStack)
5480: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
5490: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 72  );.}../*.** A tr
54a0: 61 6e 73 6c 61 74 69 6f 6e 20 66 72 6f 6d 20 6f  anslation from o
54b0: 70 63 6f 64 65 20 6e 75 6d 62 65 72 73 20 74 6f  pcode numbers to
54c0: 20 6f 70 63 6f 64 65 20 6e 61 6d 65 73 2e 20 20   opcode names.  
54d0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
54e0: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
54f0: 67 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  g only..**.** If
5500: 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 75 6d 65   any of the nume
5510: 72 69 63 20 4f 50 5f 20 76 61 6c 75 65 73 20 66  ric OP_ values f
5520: 6f 72 20 6f 70 63 6f 64 65 73 20 64 65 66 69 6e  or opcodes defin
5530: 65 64 20 69 6e 20 73 71 6c 69 74 65 56 64 62 65  ed in sqliteVdbe
5540: 2e 68 0a 2a 2a 20 63 68 61 6e 67 65 2c 20 62 65  .h.** change, be
5550: 20 73 75 72 65 20 74 6f 20 63 68 61 6e 67 65 20   sure to change 
5560: 74 68 69 73 20 61 72 72 61 79 20 74 6f 20 6d 61  this array to ma
5570: 74 63 68 2e 20 20 59 6f 75 20 63 61 6e 20 75 73  tch.  You can us
5580: 65 20 74 68 65 0a 2a 2a 20 22 6f 70 4e 61 6d 65  e the.** "opName
5590: 73 2e 61 77 6b 22 20 61 77 6b 20 73 63 72 69 70  s.awk" awk scrip
55a0: 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  t which is part 
55b0: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 74 72  of the source tr
55c0: 65 65 20 74 6f 20 72 65 67 65 6e 65 72 61 74 65  ee to regenerate
55d0: 0a 2a 2a 20 74 68 69 73 20 61 72 72 61 79 2c 20  .** this array, 
55e0: 74 68 65 6e 20 63 6f 70 79 20 61 6e 64 20 70 61  then copy and pa
55f0: 73 74 65 20 69 74 20 69 6e 74 6f 20 74 68 69 73  ste it into this
5600: 20 66 69 6c 65 2c 20 69 66 20 79 6f 75 20 77 61   file, if you wa
5610: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nt..*/.static ch
5620: 61 72 20 2a 7a 4f 70 4e 61 6d 65 5b 5d 20 3d 20  ar *zOpName[] = 
5630: 7b 20 30 2c 0a 20 20 22 4f 70 65 6e 22 2c 20 20  { 0,.  "Open",  
5640: 20 20 20 20 20 20 20 20 20 22 43 6c 6f 73 65 22           "Close"
5650: 2c 20 20 20 20 20 20 20 20 20 20 22 46 65 74 63  ,          "Fetc
5660: 68 22 2c 20 20 20 20 20 20 20 20 20 20 22 46 63  h",          "Fc
5670: 6e 74 22 2c 0a 20 20 22 4e 65 77 22 2c 20 20 20  nt",.  "New",   
5680: 20 20 20 20 20 20 20 20 20 22 50 75 74 22 2c 20           "Put", 
5690: 20 20 20 20 20 20 20 20 20 20 20 22 44 69 73 74             "Dist
56a0: 69 6e 63 74 22 2c 20 20 20 20 20 20 20 22 46 6f  inct",       "Fo
56b0: 75 6e 64 22 2c 0a 20 20 22 4e 6f 74 46 6f 75 6e  und",.  "NotFoun
56c0: 64 22 2c 20 20 20 20 20 20 20 22 44 65 6c 65 74  d",       "Delet
56d0: 65 22 2c 20 20 20 20 20 20 20 20 20 22 46 69 65  e",         "Fie
56e0: 6c 64 22 2c 20 20 20 20 20 20 20 20 20 20 22 4b  ld",          "K
56f0: 65 79 41 73 44 61 74 61 22 2c 0a 20 20 22 4b 65  eyAsData",.  "Ke
5700: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  y",            "
5710: 52 65 77 69 6e 64 22 2c 20 20 20 20 20 20 20 20  Rewind",        
5720: 20 22 4e 65 78 74 22 2c 20 20 20 20 20 20 20 20   "Next",        
5730: 20 20 20 22 44 65 73 74 72 6f 79 22 2c 0a 20 20     "Destroy",.  
5740: 22 52 65 6f 72 67 61 6e 69 7a 65 22 2c 20 20 20  "Reorganize",   
5750: 20 20 22 52 65 73 65 74 49 64 78 22 2c 20 20 20    "ResetIdx",   
5760: 20 20 20 20 22 4e 65 78 74 49 64 78 22 2c 20 20      "NextIdx",  
5770: 20 20 20 20 20 20 22 50 75 74 49 64 78 22 2c 0a        "PutIdx",.
5780: 20 20 22 44 65 6c 65 74 65 49 64 78 22 2c 20 20    "DeleteIdx",  
5790: 20 20 20 20 22 4d 65 6d 4c 6f 61 64 22 2c 20 20      "MemLoad",  
57a0: 20 20 20 20 20 20 22 4d 65 6d 53 74 6f 72 65 22        "MemStore"
57b0: 2c 20 20 20 20 20 20 20 22 4c 69 73 74 4f 70 65  ,       "ListOpe
57c0: 6e 22 2c 0a 20 20 22 4c 69 73 74 57 72 69 74 65  n",.  "ListWrite
57d0: 22 2c 20 20 20 20 20 20 22 4c 69 73 74 52 65 77  ",      "ListRew
57e0: 69 6e 64 22 2c 20 20 20 20 20 22 4c 69 73 74 52  ind",     "ListR
57f0: 65 61 64 22 2c 20 20 20 20 20 20 20 22 4c 69 73  ead",       "Lis
5800: 74 43 6c 6f 73 65 22 2c 0a 20 20 22 53 6f 72 74  tClose",.  "Sort
5810: 4f 70 65 6e 22 2c 20 20 20 20 20 20 20 22 53 6f  Open",       "So
5820: 72 74 50 75 74 22 2c 20 20 20 20 20 20 20 20 22  rtPut",        "
5830: 53 6f 72 74 4d 61 6b 65 52 65 63 22 2c 20 20 20  SortMakeRec",   
5840: 20 22 53 6f 72 74 4d 61 6b 65 4b 65 79 22 2c 0a   "SortMakeKey",.
5850: 20 20 22 53 6f 72 74 22 2c 20 20 20 20 20 20 20    "Sort",       
5860: 20 20 20 20 22 53 6f 72 74 4e 65 78 74 22 2c 20      "SortNext", 
5870: 20 20 20 20 20 20 22 53 6f 72 74 4b 65 79 22 2c        "SortKey",
5880: 20 20 20 20 20 20 20 20 22 53 6f 72 74 43 61 6c          "SortCal
5890: 6c 62 61 63 6b 22 2c 0a 20 20 22 53 6f 72 74 43  lback",.  "SortC
58a0: 6c 6f 73 65 22 2c 20 20 20 20 20 20 22 46 69 6c  lose",      "Fil
58b0: 65 4f 70 65 6e 22 2c 20 20 20 20 20 20 20 22 46  eOpen",       "F
58c0: 69 6c 65 52 65 61 64 22 2c 20 20 20 20 20 20 20  ileRead",       
58d0: 22 46 69 6c 65 46 69 65 6c 64 22 2c 0a 20 20 22  "FileField",.  "
58e0: 46 69 6c 65 43 6c 6f 73 65 22 2c 20 20 20 20 20  FileClose",     
58f0: 20 22 41 67 67 52 65 73 65 74 22 2c 20 20 20 20   "AggReset",    
5900: 20 20 20 22 41 67 67 46 6f 63 75 73 22 2c 20 20     "AggFocus",  
5910: 20 20 20 20 20 22 41 67 67 49 6e 63 72 22 2c 0a       "AggIncr",.
5920: 20 20 22 41 67 67 4e 65 78 74 22 2c 20 20 20 20    "AggNext",    
5930: 20 20 20 20 22 41 67 67 53 65 74 22 2c 20 20 20      "AggSet",   
5940: 20 20 20 20 20 20 22 41 67 67 47 65 74 22 2c 20        "AggGet", 
5950: 20 20 20 20 20 20 20 20 22 53 65 74 49 6e 73 65          "SetInse
5960: 72 74 22 2c 0a 20 20 22 53 65 74 46 6f 75 6e 64  rt",.  "SetFound
5970: 22 2c 20 20 20 20 20 20 20 22 53 65 74 4e 6f 74  ",       "SetNot
5980: 46 6f 75 6e 64 22 2c 20 20 20 20 22 53 65 74 43  Found",    "SetC
5990: 6c 65 61 72 22 2c 20 20 20 20 20 20 20 22 4d 61  lear",       "Ma
59a0: 6b 65 52 65 63 6f 72 64 22 2c 0a 20 20 22 4d 61  keRecord",.  "Ma
59b0: 6b 65 4b 65 79 22 2c 20 20 20 20 20 20 20 20 22  keKey",        "
59c0: 47 6f 74 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Goto",          
59d0: 20 22 49 66 22 2c 20 20 20 20 20 20 20 20 20 20   "If",          
59e0: 20 20 20 22 48 61 6c 74 22 2c 0a 20 20 22 43 6f     "Halt",.  "Co
59f0: 6c 75 6d 6e 43 6f 75 6e 74 22 2c 20 20 20 20 22  lumnCount",    "
5a00: 43 6f 6c 75 6d 6e 4e 61 6d 65 22 2c 20 20 20 20  ColumnName",    
5a10: 20 22 43 61 6c 6c 62 61 63 6b 22 2c 20 20 20 20   "Callback",    
5a20: 20 20 20 22 49 6e 74 65 67 65 72 22 2c 0a 20 20     "Integer",.  
5a30: 22 53 74 72 69 6e 67 22 2c 20 20 20 20 20 20 20  "String",       
5a40: 20 20 22 4e 75 6c 6c 22 2c 20 20 20 20 20 20 20    "Null",       
5a50: 20 20 20 20 22 50 6f 70 22 2c 20 20 20 20 20 20      "Pop",      
5a60: 20 20 20 20 20 20 22 44 75 70 22 2c 0a 20 20 22        "Dup",.  "
5a70: 50 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  Pull",          
5a80: 20 22 41 64 64 22 2c 20 20 20 20 20 20 20 20 20   "Add",         
5a90: 20 20 20 22 41 64 64 49 6d 6d 22 2c 20 20 20 20     "AddImm",    
5aa0: 20 20 20 20 20 22 53 75 62 74 72 61 63 74 22 2c       "Subtract",
5ab0: 0a 20 20 22 4d 75 6c 74 69 70 6c 79 22 2c 20 20  .  "Multiply",  
5ac0: 20 20 20 20 20 22 44 69 76 69 64 65 22 2c 20 20       "Divide",  
5ad0: 20 20 20 20 20 20 20 22 4d 69 6e 22 2c 20 20 20         "Min",   
5ae0: 20 20 20 20 20 20 20 20 20 22 4d 61 78 22 2c 0a           "Max",.
5af0: 20 20 22 4c 69 6b 65 22 2c 20 20 20 20 20 20 20    "Like",       
5b00: 20 20 20 20 22 47 6c 6f 62 22 2c 20 20 20 20 20      "Glob",     
5b10: 20 20 20 20 20 20 22 45 71 22 2c 20 20 20 20 20        "Eq",     
5b20: 20 20 20 20 20 20 20 20 22 4e 65 22 2c 0a 20 20          "Ne",.  
5b30: 22 4c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  "Lt",           
5b40: 20 20 22 4c 65 22 2c 20 20 20 20 20 20 20 20 20    "Le",         
5b50: 20 20 20 20 22 47 74 22 2c 20 20 20 20 20 20 20      "Gt",       
5b60: 20 20 20 20 20 20 22 47 65 22 2c 0a 20 20 22 49        "Ge",.  "I
5b70: 73 4e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  sNull",         
5b80: 22 4e 6f 74 4e 75 6c 6c 22 2c 20 20 20 20 20 20  "NotNull",      
5b90: 20 20 22 4e 65 67 61 74 69 76 65 22 2c 20 20 20    "Negative",   
5ba0: 20 20 20 20 22 41 6e 64 22 2c 0a 20 20 22 4f 72      "And",.  "Or
5bb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
5bc0: 4e 6f 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  Not",           
5bd0: 20 22 43 6f 6e 63 61 74 22 2c 20 20 20 20 20 20   "Concat",      
5be0: 20 20 20 22 4e 6f 6f 70 22 2c 0a 7d 3b 0a 0a 2f     "Noop",.};../
5bf0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5c00: 61 6d 65 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  ame of an opcode
5c10: 2c 20 72 65 74 75 72 6e 20 69 74 73 20 6e 75 6d  , return its num
5c20: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
5c30: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
5c40: 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 54 68   match..**.** Th
5c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c60: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
5c70: 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  nd debugging..*/
5c80: 0a 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65 4f  .int sqliteVdbeO
5c90: 70 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  pcode(const char
5ca0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
5cb0: 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  i;.  for(i=1; i<
5cc0: 3d 4f 50 5f 4d 41 58 3b 20 69 2b 2b 29 7b 0a 20  =OP_MAX; i++){. 
5cd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
5ce0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4f 70 4e  ICmp(zName, zOpN
5cf0: 61 6d 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74  ame[i])==0 ) ret
5d00: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
5d10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5d20: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
5d30: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
5d40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
5d50: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
5d60: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
5d70: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 56   same as sqliteV
5d80: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
5d90: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
5da0: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
5db0: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
5dc0: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
5dd0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
5de0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
5df0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
5e00: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
5e10: 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  "..*/.int sqlite
5e20: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
5e30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
5e50: 42 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63  BE */.  sqlite_c
5e60: 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63  allback xCallbac
5e70: 6b 2c 20 2f 2a 20 54 68 65 20 63 61 6c 6c 62 61  k, /* The callba
5e80: 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  ck */.  void *pA
5e90: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
5ea0: 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75 6d 65     /* 1st argume
5eb0: 6e 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 2a  nt to callback *
5ec0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
5ed0: 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Msg            /
5ee0: 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
5ef0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
5f00: 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 63 68   int i, rc;.  ch
5f10: 61 72 20 2a 61 7a 56 61 6c 75 65 5b 36 5d 3b 0a  ar *azValue[6];.
5f20: 20 20 63 68 61 72 20 7a 41 64 64 72 5b 32 30 5d    char zAddr[20]
5f30: 3b 0a 20 20 63 68 61 72 20 7a 50 31 5b 32 30 5d  ;.  char zP1[20]
5f40: 3b 0a 20 20 63 68 61 72 20 7a 50 32 5b 32 30 5d  ;.  char zP2[20]
5f50: 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
5f60: 2a 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 5d  *azColumnNames[]
5f70: 20 3d 20 7b 0a 20 20 20 20 20 22 61 64 64 72 22   = {.     "addr"
5f80: 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22  , "opcode", "p1"
5f90: 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20 30 0a  , "p2", "p3", 0.
5fa0: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 78 43 61 6c    };..  if( xCal
5fb0: 6c 62 61 63 6b 3d 3d 30 20 29 20 72 65 74 75 72  lback==0 ) retur
5fc0: 6e 20 30 3b 0a 20 20 61 7a 56 61 6c 75 65 5b 30  n 0;.  azValue[0
5fd0: 5d 20 3d 20 7a 41 64 64 72 3b 0a 20 20 61 7a 56  ] = zAddr;.  azV
5fe0: 61 6c 75 65 5b 32 5d 20 3d 20 7a 50 31 3b 0a 20  alue[2] = zP1;. 
5ff0: 20 61 7a 56 61 6c 75 65 5b 33 5d 20 3d 20 7a 50   azValue[3] = zP
6000: 32 3b 0a 20 20 61 7a 56 61 6c 75 65 5b 35 5d 20  2;.  azValue[5] 
6010: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  = 0;.  rc = SQLI
6020: 54 45 5f 4f 4b 3b 0a 20 20 2f 2a 20 69 66 28 20  TE_OK;.  /* if( 
6030: 70 7a 45 72 72 4d 73 67 20 29 7b 20 2a 70 7a 45  pzErrMsg ){ *pzE
6040: 72 72 4d 73 67 20 3d 20 30 3b 20 7d 20 2a 2f 0a  rrMsg = 0; } */.
6050: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6060: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
6070: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
6080: 73 70 72 69 6e 74 66 28 7a 41 64 64 72 2c 22 25  sprintf(zAddr,"%
6090: 64 22 2c 69 29 3b 0a 20 20 20 20 73 70 72 69 6e  d",i);.    sprin
60a0: 74 66 28 7a 50 31 2c 22 25 64 22 2c 20 70 2d 3e  tf(zP1,"%d", p->
60b0: 61 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20 20  aOp[i].p1);.    
60c0: 73 70 72 69 6e 74 66 28 7a 50 32 2c 22 25 64 22  sprintf(zP2,"%d"
60d0: 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 29 3b  , p->aOp[i].p2);
60e0: 0a 20 20 20 20 61 7a 56 61 6c 75 65 5b 34 5d 20  .    azValue[4] 
60f0: 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 3b 0a  = p->aOp[i].p3;.
6100: 20 20 20 20 61 7a 56 61 6c 75 65 5b 31 5d 20 3d      azValue[1] =
6110: 20 7a 4f 70 4e 61 6d 65 5b 70 2d 3e 61 4f 70 5b   zOpName[p->aOp[
6120: 69 5d 2e 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  i].opcode];.    
6130: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28 70 41  if( xCallback(pA
6140: 72 67 2c 20 35 2c 20 61 7a 56 61 6c 75 65 2c 20  rg, 5, azValue, 
6150: 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 29 20 29  azColumnNames) )
6160: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6170: 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d  ITE_ABORT;.    }
6180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
61a0: 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 70 6f  arameters are po
61b0: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 68 65  inters to the he
61c0: 61 64 20 6f 66 20 74 77 6f 20 73 6f 72 74 65 64  ad of two sorted
61d0: 20 6c 69 73 74 73 0a 2a 2a 20 6f 66 20 53 6f 72   lists.** of Sor
61e0: 74 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  ter structures. 
61f0: 20 4d 65 72 67 65 20 74 68 65 73 65 20 74 77 6f   Merge these two
6200: 20 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20   lists together 
6210: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
6220: 73 69 6e 67 6c 65 20 73 6f 72 74 65 64 20 6c 69  single sorted li
6230: 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
6240: 65 20 66 6f 72 6d 73 20 74 68 65 20 63 6f 72 65  e forms the core
6250: 20 6f 66 20 74 68 65 20 6d 65 72 67 65 2d 73 6f   of the merge-so
6260: 72 74 0a 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 2e  rt.** algorithm.
6270: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 61  .**.** In the ca
6280: 73 65 20 6f 66 20 61 20 74 69 65 2c 20 6c 65 66  se of a tie, lef
6290: 74 20 73 6f 72 74 73 20 69 6e 20 66 72 6f 6e 74  t sorts in front
62a0: 20 6f 66 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   of right..*/.st
62b0: 61 74 69 63 20 53 6f 72 74 65 72 20 2a 4d 65 72  atic Sorter *Mer
62c0: 67 65 28 53 6f 72 74 65 72 20 2a 70 4c 65 66 74  ge(Sorter *pLeft
62d0: 2c 20 53 6f 72 74 65 72 20 2a 70 52 69 67 68 74  , Sorter *pRight
62e0: 29 7b 0a 20 20 53 6f 72 74 65 72 20 73 48 65 61  ){.  Sorter sHea
62f0: 64 3b 0a 20 20 53 6f 72 74 65 72 20 2a 70 54 61  d;.  Sorter *pTa
6300: 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 73  il;.  pTail = &s
6310: 48 65 61 64 3b 0a 20 20 70 54 61 69 6c 2d 3e 70  Head;.  pTail->p
6320: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Next = 0;.  whil
6330: 65 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  e( pLeft && pRig
6340: 68 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  ht ){.    int c 
6350: 3d 20 73 71 6c 69 74 65 53 6f 72 74 43 6f 6d 70  = sqliteSortComp
6360: 61 72 65 28 70 4c 65 66 74 2d 3e 7a 4b 65 79 2c  are(pLeft->zKey,
6370: 20 70 52 69 67 68 74 2d 3e 7a 4b 65 79 29 3b 0a   pRight->zKey);.
6380: 20 20 20 20 69 66 28 20 63 3c 3d 30 20 29 7b 0a      if( c<=0 ){.
6390: 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65        pTail->pNe
63a0: 78 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  xt = pLeft;.    
63b0: 20 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d    pLeft = pLeft-
63c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
63d0: 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
63e0: 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
63f0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
6400: 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  Right->pNext;.  
6410: 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20    }.    pTail = 
6420: 70 54 61 69 6c 2d 3e 70 4e 65 78 74 3b 0a 20 20  pTail->pNext;.  
6430: 7d 0a 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b  }.  if( pLeft ){
6440: 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65 78  .    pTail->pNex
6450: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  t = pLeft;.  }el
6460: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 29 7b  se if( pRight ){
6470: 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65 78  .    pTail->pNex
6480: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 7d 0a  t = pRight;.  }.
6490: 20 20 72 65 74 75 72 6e 20 73 48 65 61 64 2e 70    return sHead.p
64a0: 4e 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  Next;.}../*.** E
64b0: 78 65 63 75 74 65 20 74 68 65 20 70 72 6f 67 72  xecute the progr
64c0: 61 6d 20 69 6e 20 74 68 65 20 56 44 42 45 2e 0a  am in the VDBE..
64d0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
64e0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
64f0: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
6500: 69 74 74 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20  itten to memory 
6510: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
6520: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
6530: 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 20 69 73  and *pzErrMsg is
6540: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
6550: 6f 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a  o that memory..*
6560: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 70 61 72  * The return par
6570: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
6580: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
6590: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  **.** If the cal
65a0: 6c 62 61 63 6b 20 65 76 65 72 79 20 72 65 74 75  lback every retu
65b0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
65c0: 65 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 20 65  en the program e
65d0: 78 69 74 73 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  xits.** immediat
65e0: 65 6c 79 2e 20 20 4e 6f 20 65 72 72 6f 72 20 6d  ely.  No error m
65f0: 65 73 73 61 67 65 20 62 75 74 20 74 68 65 20 66  essage but the f
6600: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
6610: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
6620: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79  ..**.** A memory
6630: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6640: 72 20 63 61 75 73 65 73 20 74 68 69 73 20 72 6f  r causes this ro
6650: 75 74 69 6e 65 20 74 6f 20 72 65 74 75 72 6e 20  utine to return 
6660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
6670: 61 6e 64 20 61 62 61 6e 64 6f 6e 20 66 75 72 74  and abandon furt
6680: 75 72 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ure processing..
6690: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 66 61 74 61  **.** Other fata
66a0: 6c 20 65 72 72 6f 72 73 20 72 65 74 75 72 6e 20  l errors return 
66b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a  SQLITE_ERROR..**
66c0: 0a 2a 2a 20 49 66 20 61 20 64 61 74 61 62 61 73  .** If a databas
66d0: 65 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  e file could not
66e0: 20 62 65 20 6f 70 65 6e 65 64 20 62 65 63 61 75   be opened becau
66f0: 73 65 20 69 74 20 69 73 20 6c 6f 63 6b 65 64 20  se it is locked 
6700: 62 79 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 64 61  by.** another da
6710: 74 61 62 61 73 65 20 69 6e 73 74 61 6e 63 65 2c  tabase instance,
6720: 20 74 68 65 6e 20 74 68 65 20 78 42 75 73 79 28   then the xBusy(
6730: 29 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  ) callback is in
6740: 76 6f 6b 65 64 0a 2a 2a 20 77 69 74 68 20 70 42  voked.** with pB
6750: 75 73 79 41 72 67 20 61 73 20 69 74 73 20 66 69  usyArg as its fi
6760: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  rst argument, th
6770: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6780: 62 6c 65 20 61 73 20 74 68 65 0a 2a 2a 20 73 65  ble as the.** se
6790: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61  cond argument, a
67a0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
67b0: 20 74 69 6d 65 73 20 74 68 65 20 6f 70 65 6e 20   times the open 
67c0: 68 61 73 20 62 65 65 6e 20 61 74 74 65 6d 70 74  has been attempt
67d0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 74 68 69  ed.** as the thi
67e0: 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  rd argument.  Th
67f0: 65 20 78 42 75 73 79 28 29 20 63 61 6c 6c 62 61  e xBusy() callba
6800: 63 6b 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  ck will typicall
6810: 79 20 77 61 69 74 0a 2a 2a 20 66 6f 72 20 74 68  y wait.** for th
6820: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6830: 74 6f 20 62 65 20 6f 70 65 6e 61 62 6c 65 2c 20  to be openable, 
6840: 74 68 65 6e 20 72 65 74 75 72 6e 2e 20 20 49 66  then return.  If
6850: 20 78 42 75 73 79 28 29 0a 2a 2a 20 72 65 74 75   xBusy().** retu
6860: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e  rns non-zero, an
6870: 6f 74 68 65 72 20 61 74 74 65 6d 70 74 20 69 73  other attempt is
6880: 20 6d 61 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   made to open th
6890: 65 20 66 69 6c 65 2e 20 20 49 66 0a 2a 2a 20 78  e file.  If.** x
68a0: 42 75 73 79 28 29 20 72 65 74 75 72 6e 73 20 7a  Busy() returns z
68b0: 65 72 6f 2c 20 6f 72 20 69 66 20 78 42 75 73 79  ero, or if xBusy
68c0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 65   is NULL, then e
68d0: 78 65 63 75 74 69 6f 6e 20 68 61 6c 74 73 0a 2a  xecution halts.*
68e0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  * and this routi
68f0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
6900: 45 5f 42 55 53 59 2e 0a 2a 2f 0a 69 6e 74 20 73  E_BUSY..*/.int s
6910: 71 6c 69 74 65 56 64 62 65 45 78 65 63 28 0a 20  qliteVdbeExec(. 
6920: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
6930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6940: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 73 71 6c  he VDBE */.  sql
6950: 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78 43 61  ite_callback xCa
6960: 6c 6c 62 61 63 6b 2c 20 2f 2a 20 54 68 65 20 63  llback, /* The c
6970: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
6980: 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
6990: 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 61          /* 1st a
69a0: 72 67 75 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 62  rgument to callb
69b0: 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ack */.  char **
69c0: 70 7a 45 72 72 4d 73 67 2c 20 20 20 20 20 20 20  pzErrMsg,       
69d0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67      /* Error msg
69e0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
69f0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41 72  .  void *pBusyAr
6a00: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g,            /*
6a10: 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f   1st argument to
6a20: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
6a30: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ck */.  int (*xB
6a40: 75 73 79 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  usy)(void*,const
6a50: 20 63 68 61 72 2a 2c 69 6e 74 29 20 20 2f 2a 20   char*,int)  /* 
6a60: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 69  Called when a fi
6a70: 6c 65 20 69 73 20 62 75 73 79 20 2a 2f 0a 29 7b  le is busy */.){
6a80: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6aa0: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   The program cou
6ab0: 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f  nter */.  Op *pO
6ac0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6ad0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
6ae0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
6af0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6b10: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
6b20: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
6b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6b40: 53 70 61 63 65 20 74 6f 20 73 70 72 69 6e 74 66  Space to sprintf
6b50: 28 29 20 61 6e 64 20 69 6e 74 65 67 65 72 20 2a  () and integer *
6b60: 2f 0a 0a 20 20 70 2d 3e 74 6f 73 20 3d 20 2d 31  /..  p->tos = -1
6b70: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
6b80: 4f 4b 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52  OK;.#ifdef MEMOR
6b90: 59 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61 63  Y_DEBUG.  if( ac
6ba0: 63 65 73 73 28 22 76 64 62 65 5f 74 72 61 63 65  cess("vdbe_trace
6bb0: 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ",0)==0 ){.    p
6bc0: 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 65 72 72  ->trace = stderr
6bd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  ;.  }.#endif.  /
6be0: 2a 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29  * if( pzErrMsg )
6bf0: 7b 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b  { *pzErrMsg = 0;
6c00: 20 7d 20 2a 2f 0a 20 20 66 6f 72 28 70 63 3d 30   } */.  for(pc=0
6c10: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
6c20: 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 26 26 20  && pc<p->nOp && 
6c30: 70 63 3e 3d 30 3b 20 70 63 2b 2b 29 7b 0a 20 20  pc>=0; pc++){.  
6c40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
6c50: 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  pc];..    /* Onl
6c60: 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20  y allow tracing 
6c70: 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
6c80: 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f   defined..    */
6c90: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
6ca0: 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65      if( p->trace
6cb0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
6cc0: 66 28 70 2d 3e 74 72 61 63 65 2c 22 25 34 64 20  f(p->trace,"%4d 
6cd0: 25 2d 31 32 73 20 25 34 64 20 25 34 64 20 25 73  %-12s %4d %4d %s
6ce0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 70 63 2c  \n",.        pc,
6cf0: 20 7a 4f 70 4e 61 6d 65 5b 70 4f 70 2d 3e 6f 70   zOpName[pOp->op
6d00: 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20  code], pOp->p1, 
6d10: 70 4f 70 2d 3e 70 32 2c 0a 20 20 20 20 20 20 20  pOp->p2,.       
6d20: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3f 20 70 4f      pOp->p3 ? pO
6d30: 70 2d 3e 70 33 20 3a 20 22 22 29 3b 0a 20 20 20  p->p3 : "");.   
6d40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
6d50: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
6d60: 64 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  de ){.      /* O
6d70: 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 50 32 20  pcode:  Goto P2 
6d80: 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  * *.      **.   
6d90: 20 20 20 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64 69     ** An uncondi
6da0: 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 61  tional jump to a
6db0: 64 64 72 65 73 73 20 50 32 2e 0a 20 20 20 20 20  ddress P2..     
6dc0: 20 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73   ** The next ins
6dd0: 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65  truction execute
6de0: 64 20 77 69 6c 6c 20 62 65 20 0a 20 20 20 20 20  d will be .     
6df0: 20 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69   ** the one at i
6e00: 6e 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65  ndex P2 from the
6e10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 20 20   beginning of.  
6e20: 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 67 72      ** the progr
6e30: 61 6d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  am..      */.   
6e40: 20 20 20 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a     case OP_Goto:
6e50: 20 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20   {.        pc = 
6e60: 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
6e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e80: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
6e90: 63 6f 64 65 3a 20 20 48 61 6c 74 20 2a 20 2a 20  code:  Halt * * 
6ea0: 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
6eb0: 20 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61   ** Exit immedia
6ec0: 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20  tely.  All open 
6ed0: 44 42 73 2c 20 4c 69 73 74 73 2c 20 53 6f 72 74  DBs, Lists, Sort
6ee0: 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65  s, etc are close
6ef0: 64 0a 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d  d.      ** autom
6f00: 61 74 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20  atically..      
6f10: 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  */.      case OP
6f20: 5f 48 61 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  _Halt: {.       
6f30: 20 70 63 20 3d 20 70 2d 3e 6e 4f 70 2d 31 3b 0a   pc = p->nOp-1;.
6f40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6f50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6f60: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72   Opcode: Integer
6f70: 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a   P1 * *.      **
6f80: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  .      ** The in
6f90: 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 69  teger value P1 i
6fa0: 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
6fb0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
6fc0: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
6fd0: 49 6e 74 65 67 65 72 3a 20 7b 0a 20 20 20 20 20  Integer: {.     
6fe0: 20 20 20 69 6e 74 20 69 20 3d 20 2b 2b 70 2d 3e     int i = ++p->
6ff0: 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tos;.        if(
7000: 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d   NeedStack(p, p-
7010: 3e 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  >tos) ) goto no_
7020: 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mem;.        p->
7030: 61 53 74 61 63 6b 5b 69 5d 2e 69 20 3d 20 70 4f  aStack[i].i = pO
7040: 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 70  p->p1;.        p
7050: 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ->aStack[i].flag
7060: 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20  s = STK_Int;.   
7070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7080: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
7090: 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 2a 20 2a  code: String * *
70a0: 20 50 33 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   P3.      **.   
70b0: 20 20 20 2a 2a 20 54 68 65 20 73 74 72 69 6e 67     ** The string
70c0: 20 76 61 6c 75 65 20 50 33 20 69 73 20 70 75 73   value P3 is pus
70d0: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
70e0: 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
70f0: 20 20 20 63 61 73 65 20 4f 50 5f 53 74 72 69 6e     case OP_Strin
7100: 67 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  g: {.        int
7110: 20 69 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20   i = ++p->tos;. 
7120: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a         char *z;.
7130: 20 20 20 20 20 20 20 20 69 66 28 20 4e 65 65 64          if( Need
7140: 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 29  Stack(p, p->tos)
7150: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
7160: 20 20 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d          z = pOp-
7170: 3e 70 33 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >p3;.        if(
7180: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
7190: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63          p->zStac
71a0: 6b 5b 69 5d 20 3d 20 7a 3b 0a 20 20 20 20 20 20  k[i] = z;.      
71b0: 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e    p->aStack[i].n
71c0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31   = strlen(z) + 1
71d0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  ;.        p->aSt
71e0: 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 53  ack[i].flags = S
71f0: 54 4b 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  TK_Str;.        
7200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
7210: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a        /* Opcode:
7220: 20 4e 75 6c 6c 20 2a 20 2a 20 2a 0a 20 20 20 20   Null * * *.    
7230: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 75    **.      ** Pu
7240: 73 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  sh a NULL value 
7250: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
7260: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
7270: 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 0a 20  ase OP_Null: {. 
7280: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 2b         int i = +
7290: 2b 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20  +p->tos;.       
72a0: 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b 28 70   if( NeedStack(p
72b0: 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67 6f 74 6f  , p->tos) ) goto
72c0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20   no_mem;.       
72d0: 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20   p->zStack[i] = 
72e0: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53  0;.        p->aS
72f0: 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20  tack[i].flags = 
7300: 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  STK_Null;.      
7310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7320: 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
7330: 65 3a 20 50 6f 70 20 50 31 20 2a 20 2a 0a 20 20  e: Pop P1 * *.  
7340: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
7350: 50 31 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  P1 elements are 
7360: 70 6f 70 70 65 64 20 6f 66 66 20 6f 66 20 74 68  popped off of th
7370: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 20 61  e top of stack a
7380: 6e 64 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  nd discarded..  
7390: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73      */.      cas
73a0: 65 20 4f 50 5f 50 6f 70 3a 20 7b 0a 20 20 20 20  e OP_Pop: {.    
73b0: 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20      PopStack(p, 
73c0: 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20  pOp->p1);.      
73d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
73e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
73f0: 65 3a 20 44 75 70 20 50 31 20 2a 20 2a 0a 20 20  e: Dup P1 * *.  
7400: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
7410: 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 50 31  A copy of the P1
7420: 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  -th element of t
7430: 68 65 20 73 74 61 63 6b 20 0a 20 20 20 20 20 20  he stack .      
7440: 2a 2a 20 69 73 20 6d 61 64 65 20 61 6e 64 20 70  ** is made and p
7450: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 74  ushed onto the t
7460: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
7470: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  .      ** The to
7480: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
7490: 73 20 65 6c 65 6d 65 6e 74 20 30 2e 20 20 53 6f  s element 0.  So
74a0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e   the.      ** in
74b0: 73 74 72 75 63 74 69 6f 6e 20 22 44 75 70 20 30  struction "Dup 0
74c0: 20 30 20 30 22 20 77 69 6c 6c 20 6d 61 6b 65 20   0 0" will make 
74d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  a copy of the.  
74e0: 20 20 20 20 2a 2a 20 74 6f 70 20 6f 66 20 74 68      ** top of th
74f0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
7500: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
7510: 44 75 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  Dup: {.        i
7520: 6e 74 20 69 20 3d 20 70 2d 3e 74 6f 73 20 2d 20  nt i = p->tos - 
7530: 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20  pOp->p1;.       
7540: 20 69 6e 74 20 6a 20 3d 20 2b 2b 70 2d 3e 74 6f   int j = ++p->to
7550: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  s;.        if( i
7560: 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <0 ) goto not_en
7570: 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20  ough_stack;.    
7580: 20 20 20 20 69 66 28 20 4e 65 65 64 53 74 61 63      if( NeedStac
7590: 6b 28 70 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67  k(p, p->tos) ) g
75a0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
75b0: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 6a 5d      p->aStack[j]
75c0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 3b   = p->aStack[i];
75d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
75e0: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20  aStack[i].flags 
75f0: 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20  & STK_Dyn ){.   
7600: 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b         p->zStack
7610: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  [j] = sqliteMall
7620: 6f 63 28 20 70 2d 3e 61 53 74 61 63 6b 5b 6a 5d  oc( p->aStack[j]
7630: 2e 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  .n );.          
7640: 69 66 28 20 70 2d 3e 7a 53 74 61 63 6b 5b 6a 5d  if( p->zStack[j]
7650: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
7660: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  m;.          mem
7670: 63 70 79 28 70 2d 3e 7a 53 74 61 63 6b 5b 6a 5d  cpy(p->zStack[j]
7680: 2c 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 2c 20  , p->zStack[i], 
7690: 70 2d 3e 61 53 74 61 63 6b 5b 6a 5d 2e 6e 29 3b  p->aStack[j].n);
76a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
76b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74            p->zSt
76c0: 61 63 6b 5b 6a 5d 20 3d 20 70 2d 3e 7a 53 74 61  ack[j] = p->zSta
76d0: 63 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  ck[i];.        }
76e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
76f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
7700: 2a 20 4f 70 63 6f 64 65 3a 20 50 75 6c 6c 20 50  * Opcode: Pull P
7710: 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20  1 * *.      **. 
7720: 20 20 20 20 20 2a 2a 20 54 68 65 20 50 31 2d 74       ** The P1-t
7730: 68 20 65 6c 65 6d 65 6e 74 20 69 73 20 72 65 6d  h element is rem
7740: 6f 76 65 64 20 66 72 6f 6d 20 69 74 73 20 63 75  oved from its cu
7750: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 6f  rrent location o
7760: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  n .      ** the 
7770: 73 74 61 63 6b 20 61 6e 64 20 70 75 73 68 65 64  stack and pushed
7780: 20 62 61 63 6b 20 6f 6e 20 74 6f 70 20 6f 66 20   back on top of 
7790: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 0a  the stack.  The.
77a0: 20 20 20 20 20 20 2a 2a 20 74 6f 70 20 6f 66 20        ** top of 
77b0: 74 68 65 20 73 74 61 63 6b 20 69 73 20 65 6c 65  the stack is ele
77c0: 6d 65 6e 74 20 30 2c 20 73 6f 20 22 50 75 6c 6c  ment 0, so "Pull
77d0: 20 30 20 30 20 30 22 20 69 73 0a 20 20 20 20 20   0 0 0" is.     
77e0: 20 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   ** a no-op..   
77f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
7800: 20 4f 50 5f 50 75 6c 6c 3a 20 7b 0a 20 20 20 20   OP_Pull: {.    
7810: 20 20 20 20 69 6e 74 20 66 72 6f 6d 20 3d 20 70      int from = p
7820: 2d 3e 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31 3b  ->tos - pOp->p1;
7830: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 20  .        int to 
7840: 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20  = p->tos;.      
7850: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
7860: 20 53 74 61 63 6b 20 74 73 3b 0a 20 20 20 20 20   Stack ts;.     
7870: 20 20 20 63 68 61 72 20 2a 74 7a 3b 0a 20 20 20     char *tz;.   
7880: 20 20 20 20 20 69 66 28 20 66 72 6f 6d 3c 30 20       if( from<0 
7890: 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
78a0: 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20  h_stack;.       
78b0: 20 74 73 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b   ts = p->aStack[
78c0: 66 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 20 20 74  from];.        t
78d0: 7a 20 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b 66 72  z = p->zStack[fr
78e0: 6f 6d 5d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  om];.        for
78f0: 28 69 3d 66 72 6f 6d 3b 20 69 3c 74 6f 3b 20 69  (i=from; i<to; i
7900: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ++){.          p
7910: 2d 3e 61 53 74 61 63 6b 5b 69 5d 20 3d 20 70 2d  ->aStack[i] = p-
7920: 3e 61 53 74 61 63 6b 5b 69 2b 31 5d 3b 0a 20 20  >aStack[i+1];.  
7930: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63          p->zStac
7940: 6b 5b 69 5d 20 3d 20 70 2d 3e 7a 53 74 61 63 6b  k[i] = p->zStack
7950: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  [i+1];.        }
7960: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61  .        p->aSta
7970: 63 6b 5b 74 6f 5d 20 3d 20 74 73 3b 0a 20 20 20  ck[to] = ts;.   
7980: 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 74       p->zStack[t
7990: 6f 5d 20 3d 20 74 7a 3b 0a 20 20 20 20 20 20 20  o] = tz;.       
79a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
79b0: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
79c0: 3a 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74 20 50 31  : ColumnCount P1
79d0: 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   * *.      **.  
79e0: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 79 20 74      ** Specify t
79f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
7a00: 75 6d 6e 20 76 61 6c 75 65 73 20 74 68 61 74 20  umn values that 
7a10: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 74  will appear in t
7a20: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 72 61  he.      ** arra
7a30: 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  y passed as the 
7a40: 34 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f  4th parameter to
7a50: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
7a60: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 20 20 20 20  No checking.    
7a70: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 20 49    ** is done.  I
7a80: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
7a90: 77 72 6f 6e 67 2c 20 61 20 63 6f 72 65 64 75 6d  wrong, a coredum
7aa0: 70 20 63 61 6e 20 72 65 73 75 6c 74 2e 0a 20 20  p can result..  
7ab0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73      */.      cas
7ac0: 65 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  e OP_ColumnCount
7ad0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  : {.        p->a
7ae0: 7a 43 6f 6c 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zColName = sqlit
7af0: 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a 43 6f  eRealloc(p->azCo
7b00: 6c 4e 61 6d 65 2c 20 28 70 4f 70 2d 3e 70 31 2b  lName, (pOp->p1+
7b10: 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  1)*sizeof(char*)
7b20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
7b30: 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  ->azColName==0 )
7b40: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
7b50: 20 20 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61        p->azColNa
7b60: 6d 65 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b  me[pOp->p1] = 0;
7b70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7b80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
7b90: 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e  * Opcode: Column
7ba0: 4e 61 6d 65 20 50 31 20 2a 20 50 33 0a 20 20 20  Name P1 * P3.   
7bb0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50     **.      ** P
7bc0: 33 20 62 65 63 6f 6d 65 73 20 74 68 65 20 50 31  3 becomes the P1
7bd0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  -th column name 
7be0: 28 66 69 72 73 74 20 69 73 20 30 29 2e 20 20 41  (first is 0).  A
7bf0: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
7c00: 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ers.      ** to 
7c10: 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  all column names
7c20: 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
7c30: 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72 20  e 4th parameter 
7c40: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  to the callback.
7c50: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 43 6f  .      ** The Co
7c60: 6c 75 6d 6e 43 6f 75 6e 74 20 6f 70 63 6f 64 65  lumnCount opcode
7c70: 20 6d 75 73 74 20 62 65 20 65 78 65 63 75 74 65   must be execute
7c80: 64 20 66 69 72 73 74 20 74 6f 20 61 6c 6c 6f 63  d first to alloc
7c90: 61 74 65 20 73 70 61 63 65 20 74 6f 0a 20 20 20  ate space to.   
7ca0: 20 20 20 2a 2a 20 68 6f 6c 64 20 74 68 65 20 63     ** hold the c
7cb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 46 61  olumn names.  Fa
7cc0: 69 6c 75 72 65 20 74 6f 20 64 6f 20 74 68 69 73  ilure to do this
7cd0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
7ce0: 75 6c 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ult in.      ** 
7cf0: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 20 20 20 20  a coredump..    
7d00: 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20    */.      case 
7d10: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 3a 20 7b  OP_ColumnName: {
7d20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a 43 6f  .        p->azCo
7d30: 6c 4e 61 6d 65 5b 70 4f 70 2d 3e 70 31 5d 20 3d  lName[pOp->p1] =
7d40: 20 70 4f 70 2d 3e 70 33 20 3f 20 70 4f 70 2d 3e   pOp->p3 ? pOp->
7d50: 70 33 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  p3 : "";.       
7d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7d70: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
7d80: 3a 20 43 61 6c 6c 62 61 63 6b 20 50 31 20 2a 20  : Callback P1 * 
7d90: 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
7da0: 20 2a 2a 20 50 6f 70 20 50 31 20 76 61 6c 75 65   ** Pop P1 value
7db0: 73 20 6f 66 66 20 74 68 65 20 73 74 61 63 6b 20  s off the stack 
7dc0: 61 6e 64 20 66 6f 72 6d 20 74 68 65 6d 20 69 6e  and form them in
7dd0: 74 6f 20 61 6e 20 61 72 72 61 79 2e 20 20 54 68  to an array.  Th
7de0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f  en.      ** invo
7df0: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
7e00: 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74  function using t
7e10: 68 65 20 6e 65 77 6c 79 20 66 6f 72 6d 65 64 20  he newly formed 
7e20: 61 72 72 61 79 20 61 73 20 74 68 65 0a 20 20 20  array as the.   
7e30: 20 20 20 2a 2a 20 33 72 64 20 70 61 72 61 6d 65     ** 3rd parame
7e40: 74 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ter..      */.  
7e50: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 61 6c 6c      case OP_Call
7e60: 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 20 20  back: {.        
7e70: 69 6e 74 20 69 20 3d 20 70 2d 3e 74 6f 73 20 2d  int i = p->tos -
7e80: 20 70 4f 70 2d 3e 70 31 20 2b 20 31 3b 0a 20 20   pOp->p1 + 1;.  
7e90: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7ea0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 67       if( i<0 ) g
7eb0: 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
7ec0: 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  tack;.        if
7ed0: 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70  ( NeedStack(p, p
7ee0: 2d 3e 74 6f 73 2b 32 29 20 29 20 67 6f 74 6f 20  ->tos+2) ) goto 
7ef0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20  no_mem;.        
7f00: 66 6f 72 28 6a 3d 69 3b 20 6a 3c 3d 70 2d 3e 74  for(j=i; j<=p->t
7f10: 6f 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  os; j++){.      
7f20: 20 20 20 20 69 66 28 20 28 70 2d 3e 61 53 74 61      if( (p->aSta
7f30: 63 6b 5b 6a 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[j].flags & ST
7f40: 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  K_Null)==0 ){.  
7f50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 74            if( St
7f60: 72 69 6e 67 69 66 79 28 70 2c 20 6a 29 20 29 20  ringify(p, j) ) 
7f70: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
7f80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7f90: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53   }.        p->zS
7fa0: 74 61 63 6b 5b 70 2d 3e 74 6f 73 2b 31 5d 20 3d  tack[p->tos+1] =
7fb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
7fc0: 78 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 7b 0a  xCallback!=0 ){.
7fd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43            if( xC
7fe0: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 70 4f  allback(pArg, pO
7ff0: 70 2d 3e 70 31 2c 20 26 70 2d 3e 7a 53 74 61 63  p->p1, &p->zStac
8000: 6b 5b 69 5d 2c 20 70 2d 3e 61 7a 43 6f 6c 4e 61  k[i], p->azColNa
8010: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
8020: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8030: 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20  E_ABORT;.       
8040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8050: 20 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28         PopStack(
8060: 70 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20  p, pOp->p1);.   
8070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8080: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
8090: 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20  code: Concat P1 
80a0: 50 32 20 50 33 0a 20 20 20 20 20 20 2a 2a 0a 20  P2 P3.      **. 
80b0: 20 20 20 20 20 2a 2a 20 4c 6f 6f 6b 20 61 74 20       ** Look at 
80c0: 74 68 65 20 66 69 72 73 74 20 50 31 20 65 6c 65  the first P1 ele
80d0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61  ments of the sta
80e0: 63 6b 2e 20 20 41 70 70 65 6e 64 20 74 68 65 6d  ck.  Append them
80f0: 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 74   all .      ** t
8100: 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
8110: 20 6c 6f 77 65 73 74 20 65 6c 65 6d 65 6e 74 20   lowest element 
8120: 66 69 72 73 74 2e 20 20 55 73 65 20 50 33 20 61  first.  Use P3 a
8130: 73 20 61 20 73 65 70 61 72 61 74 6f 72 2e 20 20  s a separator.  
8140: 0a 20 20 20 20 20 20 2a 2a 20 50 75 74 20 74 68  .      ** Put th
8150: 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20  e result on the 
8160: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
8170: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
8180: 50 31 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  P1 elements.    
8190: 20 20 2a 2a 20 61 72 65 20 70 6f 70 70 65 64 20    ** are popped 
81a0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 69  from the stack i
81b0: 66 20 50 32 3d 3d 30 20 61 6e 64 20 72 65 74 61  f P2==0 and reta
81c0: 69 6e 65 64 20 69 66 20 50 32 3d 3d 31 2e 0a 20  ined if P2==1.. 
81d0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
81e0: 20 49 66 20 50 33 20 69 73 20 4e 55 4c 4c 2c 20   If P3 is NULL, 
81f0: 74 68 65 6e 20 75 73 65 20 6e 6f 20 73 65 70 61  then use no sepa
8200: 72 61 74 6f 72 2e 20 20 57 68 65 6e 20 50 31 3d  rator.  When P1=
8210: 3d 31 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =1, this routine
8220: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 6b 65 73 20  .      ** makes 
8230: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 6f  a copy of the to
8240: 70 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 20  p stack element 
8250: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
8260: 69 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 72  ined.      ** fr
8270: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
8280: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
8290: 20 20 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74    case OP_Concat
82a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  : {.        char
82b0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   *zNew;.        
82c0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
82d0: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20     int nField;. 
82e0: 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b         int i, j;
82f0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8300: 53 65 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Sep;.        int
8310: 20 6e 53 65 70 3b 0a 0a 20 20 20 20 20 20 20 20   nSep;..        
8320: 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31  nField = pOp->p1
8330: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
8340: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
8350: 20 20 69 66 28 20 7a 53 65 70 3d 3d 30 20 29 20    if( zSep==0 ) 
8360: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20  zSep = "";.     
8370: 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
8380: 28 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  (zSep);.        
8390: 69 66 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69  if( p->tos+1<nFi
83a0: 65 6c 64 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  eld ) goto not_e
83b0: 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20  nough_stack;.   
83c0: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 31 20 2d       nByte = 1 -
83d0: 20 6e 53 65 70 3b 0a 20 20 20 20 20 20 20 20 66   nSep;.        f
83e0: 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65  or(i=p->tos-nFie
83f0: 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b  ld+1; i<=p->tos;
8400: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
8410: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b 69   if( p->aStack[i
8420: 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75  ].flags & STK_Nu
8430: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
8440: 20 20 6e 42 79 74 65 20 2b 3d 20 6e 53 65 70 3b    nByte += nSep;
8450: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8460: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
8470: 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69  ( Stringify(p, i
8480: 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
8490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79  .            nBy
84a0: 74 65 20 2b 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  te += p->aStack[
84b0: 69 5d 2e 6e 20 2d 20 31 20 2b 20 6e 53 65 70 3b  i].n - 1 + nSep;
84c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
84d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
84e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
84f0: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
8500: 20 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30       if( zNew==0
8510: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
8520: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
8530: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e         for(i=p->
8540: 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c  tos-nField+1; i<
8550: 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20  =p->tos; i++){. 
8560: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
8570: 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73  >aStack[i].flags
8580: 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30 20   & STK_Null)==0 
8590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
85a0: 65 6d 63 70 79 28 26 7a 4e 65 77 5b 6a 5d 2c 20  emcpy(&zNew[j], 
85b0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 2c 20 70 2d  p->zStack[i], p-
85c0: 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d 31 29 3b  >aStack[i].n-1);
85d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b  .            j +
85e0: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e  = p->aStack[i].n
85f0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
8600: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
8610: 65 70 3e 30 20 26 26 20 69 3c 70 2d 3e 74 6f 73  ep>0 && i<p->tos
8620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8630: 6d 65 6d 63 70 79 28 26 7a 4e 65 77 5b 6a 5d 2c  memcpy(&zNew[j],
8640: 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20   zSep, nSep);.  
8650: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6e            j += n
8660: 53 65 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Sep;.          }
8670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8680: 20 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 30 3b 0a     zNew[j] = 0;.
8690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
86a0: 3e 70 32 3d 3d 30 20 29 20 50 6f 70 53 74 61 63  >p2==0 ) PopStac
86b0: 6b 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  k(p, nField);.  
86c0: 20 20 20 20 20 20 4e 65 65 64 53 74 61 63 6b 28        NeedStack(
86d0: 70 2c 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a 20 20  p, p->tos+1);.  
86e0: 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a        p->tos++;.
86f0: 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63          p->aStac
8700: 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e 42  k[p->tos].n = nB
8710: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  yte;.        p->
8720: 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66  aStack[p->tos].f
8730: 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53  lags = STK_Str|S
8740: 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20 20 20  TK_Dyn;.        
8750: 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  p->zStack[p->tos
8760: 5d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20  ] = zNew;.      
8770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8780: 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
8790: 65 3a 20 41 64 64 20 2a 20 2a 20 2a 0a 20 20 20  e: Add * * *.   
87a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50     **.      ** P
87b0: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
87c0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
87d0: 20 73 74 61 63 6b 2c 20 61 64 64 20 74 68 65 6d   stack, add them
87e0: 20 74 6f 67 65 74 68 65 72 2c 0a 20 20 20 20 20   together,.     
87f0: 20 2a 2a 20 61 6e 64 20 70 75 73 68 20 74 68 65   ** and push the
8800: 20 72 65 73 75 6c 74 20 62 61 63 6b 20 6f 6e 74   result back ont
8810: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  o the stack.  If
8820: 20 65 69 74 68 65 72 20 65 6c 65 6d 65 6e 74 0a   either element.
8830: 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 73 74        ** is a st
8840: 72 69 6e 67 20 74 68 65 6e 20 69 74 20 69 73 20  ring then it is 
8850: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 64  converted to a d
8860: 6f 75 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  ouble using the 
8870: 61 74 6f 66 28 29 0a 20 20 20 20 20 20 2a 2a 20  atof().      ** 
8880: 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  function before 
8890: 74 68 65 20 61 64 64 69 74 69 6f 6e 2e 0a 20 20  the addition..  
88a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20      */.      /* 
88b0: 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70 6c 79  Opcode: Multiply
88c0: 20 2a 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a   * * *.      **.
88d0: 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65        ** Pop the
88e0: 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
88f0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
8900: 2c 20 6d 75 6c 74 69 70 6c 79 20 74 68 65 6d 20  , multiply them 
8910: 74 6f 67 65 74 68 65 72 2c 0a 20 20 20 20 20 20  together,.      
8920: 2a 2a 20 61 6e 64 20 70 75 73 68 20 74 68 65 20  ** and push the 
8930: 72 65 73 75 6c 74 20 62 61 63 6b 20 6f 6e 74 6f  result back onto
8940: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
8950: 65 69 74 68 65 72 20 65 6c 65 6d 65 6e 74 0a 20  either element. 
8960: 20 20 20 20 20 2a 2a 20 69 73 20 61 20 73 74 72       ** is a str
8970: 69 6e 67 20 74 68 65 6e 20 69 74 20 69 73 20 63  ing then it is c
8980: 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f  onverted to a do
8990: 75 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 61  uble using the a
89a0: 74 6f 66 28 29 0a 20 20 20 20 20 20 2a 2a 20 66  tof().      ** f
89b0: 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74  unction before t
89c0: 68 65 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f  he multiplicatio
89d0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
89e0: 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62    /* Opcode: Sub
89f0: 74 72 61 63 74 20 2a 20 2a 20 2a 0a 20 20 20 20  tract * * *.    
8a00: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 6f    **.      ** Po
8a10: 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c  p the top two el
8a20: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
8a30: 73 74 61 63 6b 2c 20 73 75 62 74 72 61 63 74 20  stack, subtract 
8a40: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 72  the.      ** fir
8a50: 73 74 20 28 77 68 61 74 20 77 61 73 20 6f 6e 20  st (what was on 
8a60: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
8a70: 29 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  ) from the secon
8a80: 64 20 28 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  d (the.      ** 
8a90: 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 0a 20  next on stack). 
8aa0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 75 73 68       ** and push
8ab0: 20 74 68 65 20 72 65 73 75 6c 74 20 62 61 63 6b   the result back
8ac0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
8ad0: 20 20 49 66 20 65 69 74 68 65 72 20 65 6c 65 6d    If either elem
8ae0: 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ent.      ** is 
8af0: 61 20 73 74 72 69 6e 67 20 74 68 65 6e 20 69 74  a string then it
8b00: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
8b10: 20 61 20 64 6f 75 62 6c 65 20 75 73 69 6e 67 20   a double using 
8b20: 74 68 65 20 61 74 6f 66 28 29 0a 20 20 20 20 20  the atof().     
8b30: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 62 65 66   ** function bef
8b40: 6f 72 65 20 74 68 65 20 73 75 62 74 72 61 63 74  ore the subtract
8b50: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
8b60: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 44      /* Opcode: D
8b70: 69 76 69 64 65 20 2a 20 2a 20 2a 0a 20 20 20 20  ivide * * *.    
8b80: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 6f    **.      ** Po
8b90: 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c  p the top two el
8ba0: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
8bb0: 73 74 61 63 6b 2c 20 64 69 76 69 64 65 20 74 68  stack, divide th
8bc0: 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74  e.      ** first
8bd0: 20 28 77 68 61 74 20 77 61 73 20 6f 6e 20 74 6f   (what was on to
8be0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 29 20  p of the stack) 
8bf0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
8c00: 28 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65  (the.      ** ne
8c10: 78 74 20 6f 6e 20 73 74 61 63 6b 29 0a 20 20 20  xt on stack).   
8c20: 20 20 20 2a 2a 20 61 6e 64 20 70 75 73 68 20 74     ** and push t
8c30: 68 65 20 72 65 73 75 6c 74 20 62 61 63 6b 20 6f  he result back o
8c40: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
8c50: 49 66 20 65 69 74 68 65 72 20 65 6c 65 6d 65 6e  If either elemen
8c60: 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  t.      ** is a 
8c70: 73 74 72 69 6e 67 20 74 68 65 6e 20 69 74 20 69  string then it i
8c80: 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  s converted to a
8c90: 20 64 6f 75 62 6c 65 20 75 73 69 6e 67 20 74 68   double using th
8ca0: 65 20 61 74 6f 66 28 29 0a 20 20 20 20 20 20 2a  e atof().      *
8cb0: 2a 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72  * function befor
8cc0: 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 2e 20  e the division. 
8cd0: 20 44 69 76 69 73 69 6f 6e 20 62 79 20 7a 65 72   Division by zer
8ce0: 6f 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  o returns NULL..
8cf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
8d00: 61 73 65 20 4f 50 5f 41 64 64 3a 0a 20 20 20 20  ase OP_Add:.    
8d10: 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61    case OP_Subtra
8d20: 63 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ct:.      case O
8d30: 50 5f 4d 75 6c 74 69 70 6c 79 3a 0a 20 20 20 20  P_Multiply:.    
8d40: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
8d50: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
8d60: 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20  tos = p->tos;.  
8d70: 20 20 20 20 20 20 69 6e 74 20 6e 6f 73 20 3d 20        int nos = 
8d80: 74 6f 73 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  tos - 1;.       
8d90: 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74   if( nos<0 ) got
8da0: 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
8db0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ck;.        if( 
8dc0: 28 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  (p->aStack[tos].
8dd0: 66 6c 61 67 73 20 26 20 70 2d 3e 61 53 74 61 63  flags & p->aStac
8de0: 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53  k[nos].flags & S
8df0: 54 4b 5f 49 6e 74 29 3d 3d 53 54 4b 5f 49 6e 74  TK_Int)==STK_Int
8e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
8e10: 74 20 61 2c 20 62 3b 0a 20 20 20 20 20 20 20 20  t a, b;.        
8e20: 20 20 61 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b    a = p->aStack[
8e30: 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20  tos].i;.        
8e40: 20 20 62 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b    b = p->aStack[
8e50: 6e 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20  nos].i;.        
8e60: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
8e70: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
8e80: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64       case OP_Add
8e90: 3a 20 20 20 20 20 20 20 20 20 62 20 2b 3d 20 61  :         b += a
8ea0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8eb0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
8ec0: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
8ed0: 62 20 2d 3d 20 61 3b 20 20 20 20 20 20 20 62 72  b -= a;       br
8ee0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8ef0: 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c   case OP_Multipl
8f00: 79 3a 20 20 20 20 62 20 2a 3d 20 61 3b 20 20 20  y:    b *= a;   
8f10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f20: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
8f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8f40: 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
8f50: 64 69 76 69 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a  divide_by_zero;.
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
8f70: 2f 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  /= a;.          
8f80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8fa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 50     }.          P
8fb0: 6f 70 53 74 61 63 6b 28 70 2c 20 32 29 3b 0a 20  opStack(p, 2);. 
8fc0: 20 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73 20           p->tos 
8fd0: 3d 20 6e 6f 73 3b 0a 20 20 20 20 20 20 20 20 20  = nos;.         
8fe0: 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e   p->aStack[nos].
8ff0: 69 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 20  i = b;.         
9000: 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e   p->aStack[nos].
9010: 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b  flags = STK_Int;
9020: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9030: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
9040: 20 61 2c 20 62 3b 0a 20 20 20 20 20 20 20 20 20   a, b;.         
9050: 20 52 65 61 6c 69 66 79 28 70 2c 20 74 6f 73 29   Realify(p, tos)
9060: 3b 0a 20 20 20 20 20 20 20 20 20 20 52 65 61 6c  ;.          Real
9070: 69 66 79 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20  ify(p, nos);.   
9080: 20 20 20 20 20 20 20 61 20 3d 20 70 2d 3e 61 53         a = p->aS
9090: 74 61 63 6b 5b 74 6f 73 5d 2e 72 3b 0a 20 20 20  tack[tos].r;.   
90a0: 20 20 20 20 20 20 20 62 20 3d 20 70 2d 3e 61 53         b = p->aS
90b0: 74 61 63 6b 5b 6e 6f 73 5d 2e 72 3b 0a 20 20 20  tack[nos].r;.   
90c0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
90d0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
90e0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
90f0: 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 62  P_Add:         b
9100: 20 2b 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65   += a;       bre
9110: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
9120: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
9130: 3a 20 20 20 20 62 20 2d 3d 20 61 3b 20 20 20 20  :    b -= a;    
9140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9150: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
9160: 6c 74 69 70 6c 79 3a 20 20 20 20 62 20 2a 3d 20  ltiply:    b *= 
9170: 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  a;       break;.
9180: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
9190: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
91a0: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 2e 30 20       if( a==0.0 
91b0: 29 20 67 6f 74 6f 20 64 69 76 69 64 65 5f 62 79  ) goto divide_by
91c0: 5f 7a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20  _zero;.         
91d0: 20 20 20 20 20 62 20 2f 3d 20 61 3b 0a 20 20 20       b /= a;.   
91e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
91f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9200: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9210: 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70        PopStack(p
9220: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
9230: 52 65 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b  Release(p, nos);
9240: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53  .          p->aS
9250: 74 61 63 6b 5b 6e 6f 73 5d 2e 72 20 3d 20 62 3b  tack[nos].r = b;
9260: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53  .          p->aS
9270: 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20  tack[nos].flags 
9280: 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 20 20 20 20  = STK_Real;.    
9290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
92a0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 69 76 69  eak;..      divi
92b0: 64 65 5f 62 79 5f 7a 65 72 6f 3a 0a 20 20 20 20  de_by_zero:.    
92c0: 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20      PopStack(p, 
92d0: 32 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74  2);.        p->t
92e0: 6f 73 20 3d 20 6e 6f 73 3b 0a 20 20 20 20 20 20  os = nos;.      
92f0: 20 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d    p->aStack[nos]
9300: 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c  .flags = STK_Nul
9310: 6c 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  l;.        break
9320: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9330: 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 78 20   /* Opcode: Max 
9340: 2a 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20  * * *.      **. 
9350: 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65 20       ** Pop the 
9360: 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  top two elements
9370: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
9380: 74 68 65 6e 20 70 75 73 68 20 62 61 63 6b 20 74  then push back t
9390: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  he.      ** larg
93a0: 65 73 74 20 6f 66 20 74 68 65 20 74 77 6f 2e 0a  est of the two..
93b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
93c0: 61 73 65 20 4f 50 5f 4d 61 78 3a 20 7b 0a 20 20  ase OP_Max: {.  
93d0: 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20 3d 20        int tos = 
93e0: 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20 20  p->tos;.        
93f0: 69 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d 20  int nos = tos - 
9400: 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  1;.        int f
9410: 74 2c 20 66 6e 3b 0a 20 20 20 20 20 20 20 20 69  t, fn;.        i
9420: 6e 74 20 63 6f 70 79 20 3d 20 30 3b 0a 20 20 20  nt copy = 0;.   
9430: 20 20 20 20 20 69 66 28 20 6e 6f 73 3c 30 20 29       if( nos<0 )
9440: 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
9450: 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  _stack;.        
9460: 66 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 74  ft = p->aStack[t
9470: 6f 73 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 20  os].flags;.     
9480: 20 20 20 66 6e 20 3d 20 70 2d 3e 61 53 74 61 63     fn = p->aStac
9490: 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 3b 0a 20 20  k[nos].flags;.  
94a0: 20 20 20 20 20 20 69 66 28 20 66 6e 20 26 20 53        if( fn & S
94b0: 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  TK_Null ){.     
94c0: 20 20 20 20 20 63 6f 70 79 20 3d 20 31 3b 0a 20       copy = 1;. 
94d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
94e0: 20 28 66 74 20 26 20 66 6e 20 26 20 53 54 4b 5f   (ft & fn & STK_
94f0: 49 6e 74 29 3d 3d 53 54 4b 5f 49 6e 74 20 29 7b  Int)==STK_Int ){
9500: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 70 79 20  .          copy 
9510: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d  = p->aStack[nos]
9520: 2e 69 3c 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73  .i<p->aStack[tos
9530: 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ].i;.        }el
9540: 73 65 20 69 66 28 20 28 20 28 66 74 7c 66 6e 29  se if( ( (ft|fn)
9550: 20 26 20 28 53 54 4b 5f 49 6e 74 7c 53 54 4b 5f   & (STK_Int|STK_
9560: 52 65 61 6c 29 20 29 20 21 3d 30 20 29 7b 0a 20  Real) ) !=0 ){. 
9570: 20 20 20 20 20 20 20 20 20 52 65 61 6c 69 66 79           Realify
9580: 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20  (p, tos);.      
9590: 20 20 20 20 52 65 61 6c 69 66 79 28 70 2c 20 6e      Realify(p, n
95a0: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  os);.          c
95b0: 6f 70 79 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  opy = p->aStack[
95c0: 74 6f 73 5d 2e 72 3e 70 2d 3e 61 53 74 61 63 6b  tos].r>p->aStack
95d0: 5b 6e 6f 73 5d 2e 72 3b 0a 20 20 20 20 20 20 20  [nos].r;.       
95e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
95f0: 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74    Stringify(p, t
9600: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  os);.          S
9610: 74 72 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29  tringify(p, nos)
9620: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 70 79  ;.          copy
9630: 20 3d 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65   = sqliteCompare
9640: 28 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c  (p->zStack[tos],
9650: 70 2d 3e 7a 53 74 61 63 6b 5b 6e 6f 73 5d 29 3e  p->zStack[nos])>
9660: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
9670: 20 20 20 20 20 69 66 28 20 63 6f 70 79 20 29 7b       if( copy ){
9680: 0a 20 20 20 20 20 20 20 20 20 20 52 65 6c 65 61  .          Relea
9690: 73 65 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20  se(p, nos);.    
96a0: 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b        p->aStack[
96b0: 6e 6f 73 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b  nos] = p->aStack
96c0: 5b 74 6f 73 5d 3b 0a 20 20 20 20 20 20 20 20 20  [tos];.         
96d0: 20 70 2d 3e 7a 53 74 61 63 6b 5b 6e 6f 73 5d 20   p->zStack[nos] 
96e0: 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d  = p->zStack[tos]
96f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
9700: 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 30 3b 0a  Stack[tos] = 0;.
9710: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74            p->aSt
9720: 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
9730: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
9740: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 52 65 6c  e{.          Rel
9750: 65 61 73 65 28 70 2c 20 74 6f 73 29 3b 0a 20 20  ease(p, tos);.  
9760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9770: 70 2d 3e 74 6f 73 20 3d 20 6e 6f 73 3b 0a 20 20  p->tos = nos;.  
9780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9790: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
97a0: 70 63 6f 64 65 3a 20 4d 69 6e 20 2a 20 2a 20 2a  pcode: Min * * *
97b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
97c0: 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74  ** Pop the top t
97d0: 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  wo elements from
97e0: 20 74 68 65 20 73 74 61 63 6b 20 74 68 65 6e 20   the stack then 
97f0: 70 75 73 68 20 62 61 63 6b 20 74 68 65 0a 20 20  push back the.  
9800: 20 20 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 6f      ** smaller o
9810: 66 20 74 68 65 20 74 77 6f 2e 20 0a 20 20 20 20  f the two. .    
9820: 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20    */.      case 
9830: 4f 50 5f 4d 69 6e 3a 20 7b 0a 20 20 20 20 20 20  OP_Min: {.      
9840: 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
9850: 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  os;.        int 
9860: 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31 3b 0a 20  nos = tos - 1;. 
9870: 20 20 20 20 20 20 20 69 6e 74 20 66 74 2c 20 66         int ft, f
9880: 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  n;.        int c
9890: 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  opy = 0;.       
98a0: 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74   if( nos<0 ) got
98b0: 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
98c0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 66 74 20 3d  ck;.        ft =
98d0: 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e   p->aStack[tos].
98e0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 66  flags;.        f
98f0: 6e 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f  n = p->aStack[no
9900: 73 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  s].flags;.      
9910: 20 20 69 66 28 20 66 6e 20 26 20 53 54 4b 5f 4e    if( fn & STK_N
9920: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
9930: 20 63 6f 70 79 20 3d 20 31 3b 0a 20 20 20 20 20   copy = 1;.     
9940: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 74 20     }else if( ft 
9950: 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & STK_Null ){.  
9960: 20 20 20 20 20 20 20 20 63 6f 70 79 20 3d 20 30          copy = 0
9970: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
9980: 69 66 28 20 28 66 74 20 26 20 66 6e 20 26 20 53  if( (ft & fn & S
9990: 54 4b 5f 49 6e 74 29 3d 3d 53 54 4b 5f 49 6e 74  TK_Int)==STK_Int
99a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
99b0: 70 79 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 6e  py = p->aStack[n
99c0: 6f 73 5d 2e 69 3e 70 2d 3e 61 53 74 61 63 6b 5b  os].i>p->aStack[
99d0: 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20  tos].i;.        
99e0: 7d 65 6c 73 65 20 69 66 28 20 28 20 28 66 74 7c  }else if( ( (ft|
99f0: 66 6e 29 20 26 20 28 53 54 4b 5f 49 6e 74 7c 53  fn) & (STK_Int|S
9a00: 54 4b 5f 52 65 61 6c 29 20 29 20 21 3d 30 20 29  TK_Real) ) !=0 )
9a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 65 61 6c  {.          Real
9a20: 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20  ify(p, tos);.   
9a30: 20 20 20 20 20 20 20 52 65 61 6c 69 66 79 28 70         Realify(p
9a40: 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  , nos);.        
9a50: 20 20 63 6f 70 79 20 3d 20 70 2d 3e 61 53 74 61    copy = p->aSta
9a60: 63 6b 5b 74 6f 73 5d 2e 72 3c 70 2d 3e 61 53 74  ck[tos].r<p->aSt
9a70: 61 63 6b 5b 6e 6f 73 5d 2e 72 3b 0a 20 20 20 20  ack[nos].r;.    
9a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a90: 20 20 20 20 20 53 74 72 69 6e 67 69 66 79 28 70       Stringify(p
9aa0: 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  , tos);.        
9ab0: 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 6e    Stringify(p, n
9ac0: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  os);.          c
9ad0: 6f 70 79 20 3d 20 73 71 6c 69 74 65 43 6f 6d 70  opy = sqliteComp
9ae0: 61 72 65 28 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f  are(p->zStack[to
9af0: 73 5d 2c 70 2d 3e 7a 53 74 61 63 6b 5b 6e 6f 73  s],p->zStack[nos
9b00: 5d 29 3c 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ])<0;.        }.
9b10: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
9b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 52 65   ){.          Re
9b30: 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a 20  lease(p, nos);. 
9b40: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61           p->aSta
9b50: 63 6b 5b 6e 6f 73 5d 20 3d 20 70 2d 3e 61 53 74  ck[nos] = p->aSt
9b60: 61 63 6b 5b 74 6f 73 5d 3b 0a 20 20 20 20 20 20  ack[tos];.      
9b70: 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 6e 6f      p->zStack[no
9b80: 73 5d 20 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b 74  s] = p->zStack[t
9b90: 6f 73 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  os];.          p
9ba0: 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20  ->zStack[tos] = 
9bb0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
9bc0: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
9bd0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  s = 0;.        }
9be0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9bf0: 52 65 6c 65 61 73 65 28 70 2c 20 74 6f 73 29 3b  Release(p, tos);
9c00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9c10: 20 20 20 70 2d 3e 74 6f 73 20 3d 20 6e 6f 73 3b     p->tos = nos;
9c20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9c30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
9c40: 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d 6d  * Opcode: AddImm
9c50: 20 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a    P1 * *.      *
9c60: 2a 20 0a 20 20 20 20 20 20 2a 2a 20 41 64 64 20  * .      ** Add 
9c70: 74 68 65 20 76 61 6c 75 65 20 50 31 20 74 6f 20  the value P1 to 
9c80: 77 68 61 74 65 76 65 72 20 69 73 20 6f 6e 20 74  whatever is on t
9c90: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
9ca0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9cb0: 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20  case OP_AddImm: 
9cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  {.        int to
9cd0: 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20  s = p->tos;.    
9ce0: 20 20 20 20 69 66 28 20 74 6f 73 3c 30 20 29 20      if( tos<0 ) 
9cf0: 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
9d00: 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 49  stack;.        I
9d10: 6e 74 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73  ntegerify(p, tos
9d20: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53  );.        p->aS
9d30: 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 2b 3d 20 70  tack[tos].i += p
9d40: 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20  Op->p1;.        
9d50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9d60: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a        /* Opcode:
9d70: 20 45 71 20 2a 20 50 32 20 2a 0a 20 20 20 20 20   Eq * P2 *.     
9d80: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 6f 70   **.      ** Pop
9d90: 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65   the top two ele
9da0: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
9db0: 74 61 63 6b 2e 20 20 49 66 20 74 68 65 79 20 61  tack.  If they a
9dc0: 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 0a 20  re equal, then. 
9dd0: 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
9de0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
9df0: 20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 6e 74   Otherwise, cont
9e00: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
9e10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20   instruction..  
9e20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20      */.      /* 
9e30: 4f 70 63 6f 64 65 3a 20 4e 65 20 2a 20 50 32 20  Opcode: Ne * P2 
9e40: 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
9e50: 20 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20   ** Pop the top 
9e60: 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  two elements fro
9e70: 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  m the stack.  If
9e80: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 65 71   they are not eq
9e90: 75 61 6c 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ual, then.      
9ea0: 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  ** jump to instr
9eb0: 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65  uction P2.  Othe
9ec0: 72 77 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20  rwise, continue 
9ed0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
9ee0: 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruction..      *
9ef0: 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  /.      /* Opcod
9f00: 65 3a 20 4c 74 20 2a 20 50 32 20 2a 0a 20 20 20  e: Lt * P2 *.   
9f10: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50     **.      ** P
9f20: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
9f30: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
9f40: 20 73 74 61 63 6b 2e 20 20 49 66 20 73 65 63 6f   stack.  If seco
9f50: 6e 64 20 65 6c 65 6d 65 6e 74 20 28 74 68 65 0a  nd element (the.
9f60: 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 6f 6e        ** next on
9f70: 20 73 74 61 63 6b 29 20 69 73 20 6c 65 73 73 20   stack) is less 
9f80: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 28  than the first (
9f90: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
9fa0: 29 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ), then.      **
9fb0: 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
9fc0: 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65 72 77  tion P2.  Otherw
9fd0: 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  ise, continue to
9fe0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
9ff0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ction..      ** 
a000: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
a010: 6a 75 6d 70 20 69 66 20 4e 4f 53 3c 54 4f 53 2e  jump if NOS<TOS.
a020: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a030: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 2a 20  /* Opcode: Le * 
a040: 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  P2 *.      **.  
a050: 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65 20 74      ** Pop the t
a060: 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  op two elements 
a070: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
a080: 20 49 66 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65   If second eleme
a090: 6e 74 20 28 74 68 65 0a 20 20 20 20 20 20 2a 2a  nt (the.      **
a0a0: 20 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20   next on stack) 
a0b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
a0c0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 66 69 72  equal to the fir
a0d0: 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66 20 73  st (the top of s
a0e0: 74 61 63 6b 29 2c 0a 20 20 20 20 20 20 2a 2a 20  tack),.      ** 
a0f0: 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 69 6e 73  then jump to ins
a100: 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 49 6e 20  truction P2. In 
a110: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d  other words, jum
a120: 70 20 69 66 20 4e 4f 53 3c 3d 54 4f 53 2e 0a 20  p if NOS<=TOS.. 
a130: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a       */.      /*
a140: 20 4f 70 63 6f 64 65 3a 20 47 74 20 2a 20 50 32   Opcode: Gt * P2
a150: 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
a160: 20 20 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70    ** Pop the top
a170: 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72   two elements fr
a180: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  om the stack.  I
a190: 66 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  f second element
a1a0: 20 28 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e   (the.      ** n
a1b0: 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20 69 73  ext on stack) is
a1c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
a1d0: 65 20 66 69 72 73 74 20 28 74 68 65 20 74 6f 70  e first (the top
a1e0: 20 6f 66 20 73 74 61 63 6b 29 2c 0a 20 20 20 20   of stack),.    
a1f0: 20 20 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74    ** then jump t
a200: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
a210: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
a220: 2c 20 6a 75 6d 70 20 69 66 20 4e 4f 53 3e 54 4f  , jump if NOS>TO
a230: 53 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  S..      */.    
a240: 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20    /* Opcode: Ge 
a250: 2a 20 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  * P2 *.      **.
a260: 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65        ** Pop the
a270: 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
a280: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
a290: 2e 20 20 49 66 20 73 65 63 6f 6e 64 20 65 6c 65  .  If second ele
a2a0: 6d 65 6e 74 20 28 74 68 65 20 6e 65 78 74 0a 20  ment (the next. 
a2b0: 20 20 20 20 20 2a 2a 20 6f 6e 20 73 74 61 63 6b       ** on stack
a2c0: 29 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  ) is greater tha
a2d0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
a2e0: 65 20 66 69 72 73 74 20 28 74 68 65 20 74 6f 70  e first (the top
a2f0: 20 6f 66 20 73 74 61 63 6b 29 2c 0a 20 20 20 20   of stack),.    
a300: 20 20 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74    ** then jump t
a310: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
a320: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
a330: 2c 20 6a 75 6d 70 20 69 66 20 4e 4f 53 3e 3d 54  , jump if NOS>=T
a340: 4f 53 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  OS..      */.   
a350: 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 0a 20     case OP_Eq:. 
a360: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a       case OP_Ne:
a370: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  .      case OP_L
a380: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  t:.      case OP
a390: 5f 4c 65 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _Le:.      case 
a3a0: 4f 50 5f 47 74 3a 0a 20 20 20 20 20 20 63 61 73  OP_Gt:.      cas
a3b0: 65 20 4f 50 5f 47 65 3a 20 7b 0a 20 20 20 20 20  e OP_Ge: {.     
a3c0: 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e     int tos = p->
a3d0: 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tos;.        int
a3e0: 20 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31 3b 0a   nos = tos - 1;.
a3f0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
a400: 20 20 20 20 20 20 20 69 6e 74 20 66 74 2c 20 66         int ft, f
a410: 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  n;.        if( n
a420: 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f  os<0 ) goto not_
a430: 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20  enough_stack;.  
a440: 20 20 20 20 20 20 66 74 20 3d 20 70 2d 3e 61 53        ft = p->aS
a450: 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 3b  tack[tos].flags;
a460: 0a 20 20 20 20 20 20 20 20 66 6e 20 3d 20 70 2d  .        fn = p-
a470: 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61  >aStack[nos].fla
a480: 67 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  gs;.        if( 
a490: 28 66 74 20 26 20 66 6e 29 3d 3d 53 54 4b 5f 49  (ft & fn)==STK_I
a4a0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a4b0: 63 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f  c = p->aStack[no
a4c0: 73 5d 2e 69 20 2d 20 70 2d 3e 61 53 74 61 63 6b  s].i - p->aStack
a4d0: 5b 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20  [tos].i;.       
a4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a4f0: 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74    Stringify(p, t
a500: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  os);.          S
a510: 74 72 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29  tringify(p, nos)
a520: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
a530: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 70 2d  sqliteCompare(p-
a540: 3e 7a 53 74 61 63 6b 5b 6e 6f 73 5d 2c 20 70 2d  >zStack[nos], p-
a550: 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 3b 0a 20  >zStack[tos]);. 
a560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a570: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
a580: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
a590: 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20    case OP_Eq:   
a5a0: 20 63 20 3d 20 63 3d 3d 30 3b 20 20 20 20 20 62   c = c==0;     b
a5b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a5c0: 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 63  case OP_Ne:    c
a5d0: 20 3d 20 63 21 3d 30 3b 20 20 20 20 20 62 72 65   = c!=0;     bre
a5e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
a5f0: 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 63 20 3d  se OP_Lt:    c =
a600: 20 63 3c 30 3b 20 20 20 20 20 20 62 72 65 61 6b   c<0;      break
a610: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
a620: 20 4f 50 5f 4c 65 3a 20 20 20 20 63 20 3d 20 63   OP_Le:    c = c
a630: 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  <=0;     break;.
a640: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a650: 50 5f 47 74 3a 20 20 20 20 63 20 3d 20 63 3e 30  P_Gt:    c = c>0
a660: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a670: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
a680: 20 20 20 20 20 20 20 63 20 3d 20 63 3e 3d 30 3b         c = c>=0;
a690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 6f      }.        Po
a6b0: 70 53 74 61 63 6b 28 70 2c 20 32 29 3b 0a 20 20  pStack(p, 2);.  
a6c0: 20 20 20 20 20 20 69 66 28 20 63 20 29 20 70 63        if( c ) pc
a6d0: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
a6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
a700: 70 63 6f 64 65 3a 20 4c 69 6b 65 20 50 31 20 50  pcode: Like P1 P
a710: 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  2 *.      **.   
a720: 20 20 20 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f     ** Pop the to
a730: 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66  p two elements f
a740: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20  rom the stack.  
a750: 54 68 65 20 74 6f 70 2d 6d 6f 73 74 20 69 73 20  The top-most is 
a760: 61 0a 20 20 20 20 20 20 2a 2a 20 22 6c 69 6b 65  a.      ** "like
a770: 22 20 70 61 74 74 65 72 6e 20 2d 2d 20 74 68 65  " pattern -- the
a780: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
a790: 66 20 74 68 65 20 53 51 4c 20 22 4c 49 4b 45 22  f the SQL "LIKE"
a7a0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
a7b0: 20 2a 2a 20 54 68 65 20 6c 6f 77 65 72 20 65 6c   ** The lower el
a7c0: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72  ement is the str
a7d0: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  ing to compare a
a7e0: 67 61 69 6e 73 74 20 74 68 65 20 6c 69 6b 65 0a  gainst the like.
a7f0: 20 20 20 20 20 20 2a 2a 20 70 61 74 74 65 72 6e        ** pattern
a800: 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  .  Jump to P2 if
a810: 20 74 68 65 20 74 77 6f 20 63 6f 6d 70 61 72 65   the two compare
a820: 2c 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  , and fall throu
a830: 67 68 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  gh without.     
a840: 20 2a 2a 20 6a 75 6d 70 69 6e 67 20 69 66 20 74   ** jumping if t
a850: 68 65 79 20 64 6f 20 6e 6f 74 2e 20 20 54 68 65  hey do not.  The
a860: 20 27 25 27 20 69 6e 20 74 68 65 20 74 6f 70 2d   '%' in the top-
a870: 6d 6f 73 74 20 65 6c 65 6d 65 6e 74 20 6d 61 74  most element mat
a880: 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ches.      ** an
a890: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
a8a0: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
a8b0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6c 6f 77  cters in the low
a8c0: 65 72 20 65 6c 65 6d 65 6e 74 2e 20 20 54 68 65  er element.  The
a8d0: 0a 20 20 20 20 20 20 2a 2a 20 27 5f 27 20 63 68  .      ** '_' ch
a8e0: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 74  aracter in the t
a8f0: 6f 70 6d 6f 73 74 20 6d 61 74 63 68 65 73 20 61  opmost matches a
a900: 6e 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63  ny single charac
a910: 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ter of the.     
a920: 20 2a 2a 20 6c 6f 77 65 72 20 65 6c 65 6d 65 6e   ** lower elemen
a930: 74 2e 20 20 43 61 73 65 20 69 73 20 69 67 6e 6f  t.  Case is igno
a940: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6d  red for this com
a950: 70 61 72 69 73 6f 6e 2e 0a 20 20 20 20 20 20 2a  parison..      *
a960: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 50 31  *.      ** If P1
a970: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
a980: 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65 20 74  e sense of the t
a990: 65 73 74 20 69 73 20 69 6e 76 65 72 74 65 64 20  est is inverted 
a9a0: 61 6e 64 20 77 65 0a 20 20 20 20 20 20 2a 2a 20  and we.      ** 
a9b0: 68 61 76 65 20 61 20 22 4e 4f 54 20 4c 49 4b 45  have a "NOT LIKE
a9c0: 22 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  " operator.  The
a9d0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 69 66   jump is made if
a9e0: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
a9f0: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 69 66        ** are dif
aa00: 66 65 72 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  ferent..      */
aa10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  .      case OP_L
aa20: 69 6b 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ike: {.        i
aa30: 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b  nt tos = p->tos;
aa40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 73  .        int nos
aa50: 20 3d 20 74 6f 73 20 2d 20 31 3b 0a 20 20 20 20   = tos - 1;.    
aa60: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
aa70: 20 20 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67     if( nos<0 ) g
aa80: 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
aa90: 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 53 74  tack;.        St
aaa0: 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b  ringify(p, tos);
aab0: 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 69  .        Stringi
aac0: 66 79 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20  fy(p, nos);.    
aad0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 4c 69      c = sqliteLi
aae0: 6b 65 43 6f 6d 70 61 72 65 28 70 2d 3e 7a 53 74  keCompare(p->zSt
aaf0: 61 63 6b 5b 74 6f 73 5d 2c 20 70 2d 3e 7a 53 74  ack[tos], p->zSt
ab00: 61 63 6b 5b 6e 6f 73 5d 29 3b 0a 20 20 20 20 20  ack[nos]);.     
ab10: 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 32     PopStack(p, 2
ab20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ab30: 4f 70 2d 3e 70 31 20 29 20 63 20 3d 20 21 63 3b  Op->p1 ) c = !c;
ab40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
ab50: 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b   pc = pOp->p2-1;
ab60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ab70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
ab80: 2a 20 4f 70 63 6f 64 65 3a 20 47 6c 6f 62 20 50  * Opcode: Glob P
ab90: 31 20 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  1 P2 *.      **.
aba0: 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65        ** Pop the
abb0: 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
abc0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
abd0: 2e 20 20 54 68 65 20 74 6f 70 2d 6d 6f 73 74 20  .  The top-most 
abe0: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 22 67  is a.      ** "g
abf0: 6c 6f 62 22 20 70 61 74 74 65 72 6e 2e 20 20 54  lob" pattern.  T
ac00: 68 65 20 6c 6f 77 65 72 20 65 6c 65 6d 65 6e 74  he lower element
ac10: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 74   is the string t
ac20: 6f 20 63 6f 6d 70 61 72 65 20 0a 20 20 20 20 20  o compare .     
ac30: 20 2a 2a 20 61 67 61 69 6e 73 74 20 74 68 65 20   ** against the 
ac40: 67 6c 6f 62 20 70 61 74 74 65 72 6e 2e 0a 20 20  glob pattern..  
ac50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ac60: 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
ac70: 65 20 74 77 6f 20 63 6f 6d 70 61 72 65 2c 20 61  e two compare, a
ac80: 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
ac90: 77 69 74 68 6f 75 74 0a 20 20 20 20 20 20 2a 2a  without.      **
aca0: 20 6a 75 6d 70 69 6e 67 20 69 66 20 74 68 65 79   jumping if they
acb0: 20 64 6f 20 6e 6f 74 2e 20 20 54 68 65 20 27 2a   do not.  The '*
acc0: 27 20 69 6e 20 74 68 65 20 74 6f 70 2d 6d 6f 73  ' in the top-mos
acd0: 74 20 65 6c 65 6d 65 6e 74 20 6d 61 74 63 68 65  t element matche
ace0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 73  s.      ** any s
acf0: 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
ad00: 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
ad10: 72 73 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20  rs in the lower 
ad20: 65 6c 65 6d 65 6e 74 2e 20 20 54 68 65 0a 20 20  element.  The.  
ad30: 20 20 20 20 2a 2a 20 27 3f 27 20 63 68 61 72 61      ** '?' chara
ad40: 63 74 65 72 20 69 6e 20 74 68 65 20 74 6f 70 6d  cter in the topm
ad50: 6f 73 74 20 6d 61 74 63 68 65 73 20 61 6e 79 20  ost matches any 
ad60: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
ad70: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
ad80: 20 6c 6f 77 65 72 20 65 6c 65 6d 65 6e 74 2e 20   lower element. 
ad90: 20 5b 2e 2e 2e 5d 20 6d 61 74 63 68 65 73 20 61   [...] matches a
ada0: 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63   range of charac
adb0: 74 65 72 73 2e 20 20 5b 5e 2e 2e 2e 5d 0a 20 20  ters.  [^...].  
adc0: 20 20 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 61      ** matches a
add0: 6e 79 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ny character not
ade0: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 20   in the range.  
adf0: 43 61 73 65 20 69 73 20 73 69 67 6e 69 66 69 63  Case is signific
ae00: 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ant.      ** for
ae10: 20 67 6c 6f 62 73 2e 0a 20 20 20 20 20 20 2a 2a   globs..      **
ae20: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 50 31 20  .      ** If P1 
ae30: 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
ae40: 20 73 65 6e 73 65 20 6f 66 20 74 68 65 20 74 65   sense of the te
ae50: 73 74 20 69 73 20 69 6e 76 65 72 74 65 64 20 61  st is inverted a
ae60: 6e 64 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 68  nd we.      ** h
ae70: 61 76 65 20 61 20 22 4e 4f 54 20 47 4c 4f 42 22  ave a "NOT GLOB"
ae80: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
ae90: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 69 66 20  jump is made if 
aea0: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 20  the two values. 
aeb0: 20 20 20 20 20 2a 2a 20 61 72 65 20 64 69 66 66       ** are diff
aec0: 65 72 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  erent..      */.
aed0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 6c        case OP_Gl
aee0: 6f 62 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  ob: {.        in
aef0: 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a  t tos = p->tos;.
af00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 73 20          int nos 
af10: 3d 20 74 6f 73 20 2d 20 31 3b 0a 20 20 20 20 20  = tos - 1;.     
af20: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
af30: 20 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f    if( nos<0 ) go
af40: 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
af50: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 53 74 72  ack;.        Str
af60: 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a  ingify(p, tos);.
af70: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 69 66          Stringif
af80: 79 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 20  y(p, nos);.     
af90: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 47 6c 6f     c = sqliteGlo
afa0: 62 43 6f 6d 70 61 72 65 28 70 2d 3e 7a 53 74 61  bCompare(p->zSta
afb0: 63 6b 5b 74 6f 73 5d 2c 20 70 2d 3e 7a 53 74 61  ck[tos], p->zSta
afc0: 63 6b 5b 6e 6f 73 5d 29 3b 0a 20 20 20 20 20 20  ck[nos]);.      
afd0: 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 32 29    PopStack(p, 2)
afe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
aff0: 70 2d 3e 70 31 20 29 20 63 20 3d 20 21 63 3b 0a  p->p1 ) c = !c;.
b000: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
b010: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a  pc = pOp->p2-1;.
b020: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b030: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b040: 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 2a 20 2a   Opcode: And * *
b050: 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
b060: 20 20 2a 2a 20 50 6f 70 20 74 77 6f 20 76 61 6c    ** Pop two val
b070: 75 65 73 20 6f 66 66 20 74 68 65 20 73 74 61 63  ues off the stac
b080: 6b 2e 20 20 54 61 6b 65 20 74 68 65 20 6c 6f 67  k.  Take the log
b090: 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 0a  ical AND of the.
b0a0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 76 61 6c        ** two val
b0b0: 75 65 73 20 61 6e 64 20 70 75 73 68 20 74 68 65  ues and push the
b0c0: 20 72 65 73 75 6c 74 69 6e 67 20 62 6f 6f 6c 65   resulting boole
b0d0: 61 6e 20 76 61 6c 75 65 20 62 61 63 6b 20 6f 6e  an value back on
b0e0: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
b0f0: 73 74 61 63 6b 2e 20 0a 20 20 20 20 20 20 2a 2f  stack. .      */
b100: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
b110: 3a 20 4f 72 20 2a 20 2a 20 2a 0a 20 20 20 20 20  : Or * * *.     
b120: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 6f 70   **.      ** Pop
b130: 20 74 77 6f 20 76 61 6c 75 65 73 20 6f 66 66 20   two values off 
b140: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 61 6b 65  the stack.  Take
b150: 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20   the logical OR 
b160: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
b170: 74 77 6f 20 76 61 6c 75 65 73 20 61 6e 64 20 70  two values and p
b180: 75 73 68 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ush the resultin
b190: 67 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  g boolean value 
b1a0: 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 0a 20 20  back onto the.  
b1b0: 20 20 20 20 2a 2a 20 73 74 61 63 6b 2e 20 0a 20      ** stack. . 
b1c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
b1d0: 73 65 20 4f 50 5f 41 6e 64 3a 0a 20 20 20 20 20  se OP_And:.     
b1e0: 20 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 0a 20   case OP_Or: {. 
b1f0: 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20 3d         int tos =
b200: 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20   p->tos;.       
b210: 20 69 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d   int nos = tos -
b220: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   1;.        int 
b230: 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  c;.        if( n
b240: 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f  os<0 ) goto not_
b250: 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20  enough_stack;.  
b260: 20 20 20 20 20 20 49 6e 74 65 67 65 72 69 66 79        Integerify
b270: 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20  (p, tos);.      
b280: 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20    Integerify(p, 
b290: 6e 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nos);.        if
b2a0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
b2b0: 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  P_And ){.       
b2c0: 20 20 20 63 20 3d 20 70 2d 3e 61 53 74 61 63 6b     c = p->aStack
b2d0: 5b 74 6f 73 5d 2e 69 20 26 26 20 70 2d 3e 61 53  [tos].i && p->aS
b2e0: 74 61 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a 20 20 20  tack[nos].i;.   
b2f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b300: 20 20 20 20 20 20 63 20 3d 20 70 2d 3e 61 53 74        c = p->aSt
b310: 61 63 6b 5b 74 6f 73 5d 2e 69 20 7c 7c 20 70 2d  ack[tos].i || p-
b320: 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a  >aStack[nos].i;.
b330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b340: 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 32 29    PopStack(p, 2)
b350: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73  ;.        p->tos
b360: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ++;.        p->a
b370: 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 20 3d 20 63  Stack[nos].i = c
b380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  ;.        p->aSt
b390: 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[nos].flags =
b3a0: 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 20 20   STK_Int;.      
b3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b3c0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
b3d0: 65 3a 20 4e 65 67 61 74 69 76 65 20 2a 20 2a 20  e: Negative * * 
b3e0: 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
b3f0: 20 2a 2a 20 54 72 65 61 74 20 74 68 65 20 74 6f   ** Treat the to
b400: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61  p of the stack a
b410: 73 20 61 20 6e 75 6d 65 72 69 63 20 71 75 61 6e  s a numeric quan
b420: 74 69 74 79 2e 20 20 52 65 70 6c 61 63 65 20 69  tity.  Replace i
b430: 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  t.      ** with 
b440: 69 74 73 20 61 64 64 69 74 69 76 65 20 69 6e 76  its additive inv
b450: 65 72 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  erse..      */. 
b460: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 67       case OP_Neg
b470: 61 74 69 76 65 3a 20 7b 0a 20 20 20 20 20 20 20  ative: {.       
b480: 20 69 6e 74 20 74 6f 73 3b 0a 20 20 20 20 20 20   int tos;.      
b490: 20 20 69 66 28 20 28 74 6f 73 20 3d 20 70 2d 3e    if( (tos = p->
b4a0: 74 6f 73 29 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  tos)<0 ) goto no
b4b0: 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a  t_enough_stack;.
b4c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
b4d0: 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
b4e0: 20 26 20 53 54 4b 5f 52 65 61 6c 20 29 7b 0a 20   & STK_Real ){. 
b4f0: 20 20 20 20 20 20 20 20 20 52 65 6c 65 61 73 65           Release
b500: 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20  (p, tos);.      
b510: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f      p->aStack[to
b520: 73 5d 2e 72 20 3d 20 2d 70 2d 3e 61 53 74 61 63  s].r = -p->aStac
b530: 6b 5b 74 6f 73 5d 2e 72 3b 0a 20 20 20 20 20 20  k[tos].r;.      
b540: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f      p->aStack[to
b550: 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 52  s].flags = STK_R
b560: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eal;.        }el
b570: 73 65 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  se if( p->aStack
b580: 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  [tos].flags & ST
b590: 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  K_Int ){.       
b5a0: 20 20 20 52 65 6c 65 61 73 65 28 70 2c 20 74 6f     Release(p, to
b5b0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  s);.          p-
b5c0: 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d  >aStack[tos].i =
b5d0: 20 2d 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d   -p->aStack[tos]
b5e0: 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  .i;.          p-
b5f0: 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  >aStack[tos].fla
b600: 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20  gs = STK_Int;.  
b610: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b620: 20 20 20 20 20 20 20 52 65 61 6c 69 66 79 28 70         Realify(p
b630: 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  , tos);.        
b640: 20 20 52 65 6c 65 61 73 65 28 70 2c 20 74 6f 73    Release(p, tos
b650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
b660: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 20 3d 20  aStack[tos].r = 
b670: 2d 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  -p->aStack[tos].
b680: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
b690: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
b6a0: 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 20 20  s = STK_Real;.  
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
b6d0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a        /* Opcode:
b6e0: 20 4e 6f 74 20 2a 20 2a 20 2a 0a 20 20 20 20 20   Not * * *.     
b6f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 74   **.      ** Int
b700: 65 72 70 72 65 74 20 74 68 65 20 74 6f 70 20 6f  erpret the top o
b710: 66 20 74 68 65 20 73 74 61 63 6b 20 61 73 20 61  f the stack as a
b720: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
b730: 20 52 65 70 6c 61 63 65 20 69 74 0a 20 20 20 20   Replace it.    
b740: 20 20 2a 2a 20 77 69 74 68 20 69 74 73 20 63 6f    ** with its co
b750: 6d 70 6c 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  mplement..      
b760: 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  */.      case OP
b770: 5f 4e 6f 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  _Not: {.        
b780: 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73  int tos = p->tos
b790: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
b7a0: 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  >tos<0 ) goto no
b7b0: 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a  t_enough_stack;.
b7c0: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 69          Integeri
b7d0: 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20  fy(p, tos);.    
b7e0: 20 20 20 20 52 65 6c 65 61 73 65 28 70 2c 20 74      Release(p, t
b7f0: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  os);.        p->
b800: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d 20  aStack[tos].i = 
b810: 21 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  !p->aStack[tos].
b820: 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53  i;.        p->aS
b830: 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
b840: 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 20  = STK_Int;.     
b850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b860: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  }..      /* Opco
b870: 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 0a 20  de: Noop * * *. 
b880: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
b890: 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68   Do nothing.  Th
b8a0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
b8b0: 73 20 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61  s often useful a
b8c0: 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a  s a jump.      *
b8d0: 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  * destination.. 
b8e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
b8f0: 73 65 20 4f 50 5f 4e 6f 6f 70 3a 20 7b 0a 20 20  se OP_Noop: {.  
b900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b910: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
b920: 70 63 6f 64 65 3a 20 49 66 20 2a 20 50 32 20 2a  pcode: If * P2 *
b930: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b940: 2a 2a 20 50 6f 70 20 61 20 73 69 6e 67 6c 65 20  ** Pop a single 
b950: 62 6f 6f 6c 65 61 6e 20 66 72 6f 6d 20 74 68 65  boolean from the
b960: 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 20   stack.  If the 
b970: 62 6f 6f 6c 65 61 6e 20 70 6f 70 70 65 64 20 69  boolean popped i
b980: 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 65 2c  s.      ** true,
b990: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 70 32   then jump to p2
b9a0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 63 6f 6e  .  Otherwise con
b9b0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
b9c0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20  t instruction.. 
b9d0: 20 20 20 20 20 2a 2a 20 41 6e 20 69 6e 74 65 67       ** An integ
b9e0: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 7a  er is false if z
b9f0: 65 72 6f 20 61 6e 64 20 74 72 75 65 20 6f 74 68  ero and true oth
ba00: 65 72 77 69 73 65 2e 20 20 41 20 73 74 72 69 6e  erwise.  A strin
ba10: 67 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 61  g is.      ** fa
ba20: 6c 73 65 20 69 66 20 69 74 20 68 61 73 20 7a 65  lse if it has ze
ba30: 72 6f 20 6c 65 6e 67 74 68 20 61 6e 64 20 74 72  ro length and tr
ba40: 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 20 20  ue otherwise..  
ba50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73      */.      cas
ba60: 65 20 4f 50 5f 49 66 3a 20 7b 0a 20 20 20 20 20  e OP_If: {.     
ba70: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
ba80: 20 20 69 66 28 20 70 2d 3e 74 6f 73 3c 30 20 29    if( p->tos<0 )
ba90: 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
baa0: 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  _stack;.        
bab0: 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20 70 2d  Integerify(p, p-
bac0: 3e 74 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63  >tos);.        c
bad0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e   = p->aStack[p->
bae0: 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20  tos].i;.        
baf0: 50 6f 70 53 74 61 63 6b 28 70 2c 20 31 29 3b 0a  PopStack(p, 1);.
bb00: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
bb10: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a  pc = pOp->p2-1;.
bb20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bb30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
bb40: 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20   Opcode: IsNull 
bb50: 2a 20 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  * P2 *.      **.
bb60: 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 61 20 73        ** Pop a s
bb70: 69 6e 67 6c 65 20 76 61 6c 75 65 20 66 72 6f 6d  ingle value from
bb80: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
bb90: 74 68 65 20 76 61 6c 75 65 20 70 6f 70 70 65 64  the value popped
bba0: 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a   is NULL.      *
bbb0: 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 70  * then jump to p
bbc0: 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20 63 6f  2.  Otherwise co
bbd0: 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65  ntinue to the ne
bbe0: 78 74 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  xt .      ** ins
bbf0: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  truction..      
bc00: 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  */.      case OP
bc10: 5f 49 73 4e 75 6c 6c 3a 20 7b 0a 20 20 20 20 20  _IsNull: {.     
bc20: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
bc30: 20 20 69 66 28 20 70 2d 3e 74 6f 73 3c 30 20 29    if( p->tos<0 )
bc40: 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
bc50: 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  _stack;.        
bc60: 63 20 3d 20 28 70 2d 3e 61 53 74 61 63 6b 5b 70  c = (p->aStack[p
bc70: 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53  ->tos].flags & S
bc80: 54 4b 5f 4e 75 6c 6c 29 21 3d 30 3b 0a 20 20 20  TK_Null)!=0;.   
bc90: 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c       PopStack(p,
bca0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
bcb0: 20 63 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70   c ) pc = pOp->p
bcc0: 32 2d 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  2-1;.        bre
bcd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
bce0: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f     /* Opcode: No
bcf0: 74 4e 75 6c 6c 20 2a 20 50 32 20 2a 0a 20 20 20  tNull * P2 *.   
bd00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50     **.      ** P
bd10: 6f 70 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  op a single valu
bd20: 65 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  e from the stack
bd30: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
bd40: 70 6f 70 70 65 64 20 69 73 20 6e 6f 74 20 61 6e  popped is not an
bd50: 0a 20 20 20 20 20 20 2a 2a 20 65 6d 70 74 79 20  .      ** empty 
bd60: 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 6a 75 6d  string, then jum
bd70: 70 20 74 6f 20 70 32 2e 20 20 4f 74 68 65 72 77  p to p2.  Otherw
bd80: 69 73 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ise continue to 
bd90: 74 68 65 20 6e 65 78 74 20 0a 20 20 20 20 20 20  the next .      
bda0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
bdb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
bdc0: 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20  ase OP_NotNull: 
bdd0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
bdf0: 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74  tos<0 ) goto not
be00: 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20  _enough_stack;. 
be10: 20 20 20 20 20 20 20 63 20 3d 20 28 70 2d 3e 61         c = (p->a
be20: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
be30: 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d  ags & STK_Null)=
be40: 3d 30 3b 0a 20 20 20 20 20 20 20 20 50 6f 70 53  =0;.        PopS
be50: 74 61 63 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  tack(p, 1);.    
be60: 20 20 20 20 69 66 28 20 63 20 29 20 70 63 20 3d      if( c ) pc =
be70: 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20   pOp->p2-1;.    
be80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
be90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63   }..      /* Opc
bea0: 6f 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20  ode: MakeRecord 
beb0: 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  P1 * *.      **.
bec0: 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
bed0: 20 74 68 65 20 74 6f 70 20 50 31 20 65 6e 74 72   the top P1 entr
bee0: 69 65 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b  ies of the stack
bef0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65   into a single e
bf00: 6e 74 72 79 0a 20 20 20 20 20 20 2a 2a 20 73 75  ntry.      ** su
bf10: 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61  itable for use a
bf20: 73 20 61 20 64 61 74 61 20 72 65 63 6f 72 64 20  s a data record 
bf30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
bf40: 20 20 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20    To do this.   
bf50: 20 20 20 2a 2a 20 61 6c 6c 20 65 6e 74 72 69 65     ** all entrie
bf60: 73 20 28 65 78 63 65 70 74 20 4e 55 4c 4c 73 29  s (except NULLs)
bf70: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74   are converted t
bf80: 6f 20 73 74 72 69 6e 67 73 20 61 6e 64 20 0a 20  o strings and . 
bf90: 20 20 20 20 20 2a 2a 20 63 6f 6e 63 61 74 65 6e       ** concaten
bfa0: 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6c 6c 2d  ated.  The null-
bfb0: 74 65 72 6d 69 6e 61 74 6f 72 73 20 61 72 65 20  terminators are 
bfc0: 70 72 65 73 65 72 76 65 64 20 62 79 20 74 68 65  preserved by the
bfd0: 20 63 6f 6e 63 61 74 61 74 69 6f 6e 0a 20 20 20   concatation.   
bfe0: 20 20 20 2a 2a 20 61 6e 64 20 73 65 72 76 65 20     ** and serve 
bff0: 61 73 20 61 20 62 6f 75 6e 64 72 79 20 6d 61 72  as a boundry mar
c000: 6b 65 72 20 62 65 74 77 65 65 6e 20 66 69 65 6c  ker between fiel
c010: 64 73 2e 20 20 54 68 65 20 6c 6f 77 65 73 74 20  ds.  The lowest 
c020: 65 6e 74 72 79 0a 20 20 20 20 20 20 2a 2a 20 6f  entry.      ** o
c030: 6e 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  n the stack is t
c040: 68 65 20 66 69 72 73 74 20 69 6e 20 74 68 65 20  he first in the 
c050: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 61 6e  concatenation an
c060: 64 20 74 68 65 20 74 6f 70 20 6f 66 0a 20 20 20  d the top of.   
c070: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20     ** the stack 
c080: 69 73 20 74 68 65 20 6c 61 73 74 2e 20 20 41 66  is the last.  Af
c090: 74 65 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 61  ter all fields a
c0a0: 72 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 2c  re concatenated,
c0b0: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   an.      ** ind
c0c0: 65 78 20 68 65 61 64 65 72 20 69 73 20 61 64 64  ex header is add
c0d0: 65 64 2e 20 20 54 68 65 20 69 6e 64 65 78 20 68  ed.  The index h
c0e0: 65 61 64 65 72 20 63 6f 6e 73 69 73 74 73 20 6f  eader consists o
c0f0: 66 20 50 31 20 69 6e 74 65 67 65 72 73 0a 20 20  f P1 integers.  
c100: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 6f 6c      ** which hol
c110: 64 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  d the offset of 
c120: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
c130: 20 65 61 63 68 20 66 69 65 6c 64 20 66 72 6f 6d   each field from
c140: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 65   the.      ** be
c150: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
c160: 6f 6d 70 6c 65 74 65 64 20 72 65 63 6f 72 64 20  ompleted record 
c170: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 68 65  including the he
c180: 61 64 65 72 2e 20 20 54 68 65 0a 20 20 20 20 20  ader.  The.     
c190: 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 4e 55   ** index for NU
c1a0: 4c 4c 20 65 6e 74 72 69 65 73 20 69 73 20 30 2e  LL entries is 0.
c1b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c1c0: 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  case OP_MakeReco
c1d0: 72 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68  rd: {.        ch
c1e0: 61 72 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 0a  ar *zNewRecord;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
c200: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e;.        int n
c210: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 69  Field;.        i
c220: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20  nt i, j;.       
c230: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
c240: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70      nField = pOp
c250: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ->p1;.        if
c260: 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69 65 6c  ( p->tos+1<nFiel
c270: 64 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  d ) goto not_eno
c280: 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20  ugh_stack;.     
c290: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
c2a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 74        for(i=p->t
c2b0: 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
c2c0: 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20  p->tos; i++){.  
c2d0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
c2e0: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20  aStack[i].flags 
c2f0: 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & STK_Null)==0 )
c300: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
c310: 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69  ( Stringify(p, i
c320: 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
c330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79  .            nBy
c340: 74 65 20 2b 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  te += p->aStack[
c350: 69 5d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  i].n;.          
c360: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c370: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a      nByte += siz
c380: 65 6f 66 28 69 6e 74 29 2a 6e 46 69 65 6c 64 3b  eof(int)*nField;
c390: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 52 65 63  .        zNewRec
c3a0: 6f 72 64 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ord = sqliteMall
c3b0: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
c3c0: 20 20 20 20 20 69 66 28 20 7a 4e 65 77 52 65 63       if( zNewRec
c3d0: 6f 72 64 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ord==0 ) goto no
c3e0: 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 6a 20  _mem;.        j 
c3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64  = 0;.        add
c400: 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  r = sizeof(int)*
c410: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20  nField;.        
c420: 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69  for(i=p->tos-nFi
c430: 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73  eld+1; i<=p->tos
c440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c450: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b    if( p->aStack[
c460: 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e  i].flags & STK_N
c470: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
c480: 20 20 20 69 6e 74 20 7a 65 72 6f 20 3d 20 30 3b     int zero = 0;
c490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
c4a0: 63 70 79 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b  cpy(&zNewRecord[
c4b0: 6a 5d 2c 20 28 63 68 61 72 2a 29 26 7a 65 72 6f  j], (char*)&zero
c4c0: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  , sizeof(int));.
c4d0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
c4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
c4f0: 63 70 79 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b  cpy(&zNewRecord[
c500: 6a 5d 2c 20 28 63 68 61 72 2a 29 26 61 64 64 72  j], (char*)&addr
c510: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  , sizeof(int));.
c520: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
c530: 20 2b 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d   += p->aStack[i]
c540: 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  .n;.          }.
c550: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 73            j += s
c560: 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20  izeof(int);.    
c570: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
c580: 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c  r(i=p->tos-nFiel
c590: 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20  d+1; i<=p->tos; 
c5a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
c5b0: 69 66 28 20 28 70 2d 3e 61 53 74 61 63 6b 5b 69  if( (p->aStack[i
c5c0: 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75  ].flags & STK_Nu
c5d0: 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ll)==0 ){.      
c5e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4e        memcpy(&zN
c5f0: 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 70 2d 3e  ewRecord[j], p->
c600: 7a 53 74 61 63 6b 5b 69 5d 2c 20 70 2d 3e 61 53  zStack[i], p->aS
c610: 74 61 63 6b 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20  tack[i].n);.    
c620: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 70 2d 3e          j += p->
c630: 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20  aStack[i].n;.   
c640: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c650: 20 7d 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74   }.        PopSt
c660: 61 63 6b 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a  ack(p, nField);.
c670: 20 20 20 20 20 20 20 20 4e 65 65 64 53 74 61 63          NeedStac
c680: 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a  k(p, p->tos+1);.
c690: 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b          p->tos++
c6a0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  ;.        p->aSt
c6b0: 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20  ack[p->tos].n = 
c6c0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70  nByte;.        p
c6d0: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d  ->aStack[p->tos]
c6e0: 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72  .flags = STK_Str
c6f0: 20 7c 20 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20   | STK_Dyn;.    
c700: 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d      p->zStack[p-
c710: 3e 74 6f 73 5d 20 3d 20 7a 4e 65 77 52 65 63 6f  >tos] = zNewReco
c720: 72 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  rd;.        brea
c730: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
c740: 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b    /* Opcode: Mak
c750: 65 4b 65 79 20 50 31 20 50 32 20 2a 0a 20 20 20  eKey P1 P2 *.   
c760: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
c770: 6f 6e 76 65 72 74 20 74 68 65 20 74 6f 70 20 50  onvert the top P
c780: 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  1 entries of the
c790: 20 73 74 61 63 6b 20 69 6e 74 6f 20 61 20 73 69   stack into a si
c7a0: 6e 67 6c 65 20 65 6e 74 72 79 20 73 75 69 74 61  ngle entry suita
c7b0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ble.      ** for
c7c0: 20 75 73 65 20 61 73 20 74 68 65 20 6b 65 79 20   use as the key 
c7d0: 69 6e 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 61  in an index or a
c7e0: 20 73 6f 72 74 2e 20 20 54 68 65 20 74 6f 70 20   sort.  The top 
c7f0: 50 31 20 72 65 63 6f 72 64 73 20 61 72 65 0a 20  P1 records are. 
c800: 20 20 20 20 20 2a 2a 20 63 6f 6e 63 61 74 65 6e       ** concaten
c810: 61 74 65 64 20 77 69 74 68 20 61 20 74 61 62 20  ated with a tab 
c820: 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49 49  character (ASCII
c830: 20 30 78 30 39 29 20 75 73 65 64 20 61 73 20 61   0x09) used as a
c840: 20 72 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a   record.      **
c850: 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
c860: 20 65 6e 74 69 72 65 20 63 6f 6e 63 61 74 65 6e   entire concaten
c870: 61 74 69 6f 6e 20 69 73 20 6e 75 6c 6c 2d 74 65  ation is null-te
c880: 72 6d 69 6e 61 74 65 64 2e 20 20 54 68 65 0a 20  rminated.  The. 
c890: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 73 74 20 65       ** lowest e
c8a0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 63  ntry in the stac
c8b0: 6b 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  k is the first f
c8c0: 69 65 6c 64 20 61 6e 64 20 74 68 65 20 74 6f 70  ield and the top
c8d0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c8e0: 20 73 74 61 63 6b 20 62 65 63 6f 6d 65 73 20 74   stack becomes t
c8f0: 68 65 20 6c 61 73 74 2e 0a 20 20 20 20 20 20 2a  he last..      *
c900: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 50 32  *.      ** If P2
c910: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
c920: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
c930: 65 6e 74 72 69 65 73 20 72 65 6d 61 69 6e 20 6f  entries remain o
c940: 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20  n the stack.    
c950: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
c960: 20 6b 65 79 20 69 73 20 70 75 73 68 65 64 20 6f   key is pushed o
c970: 6e 20 74 6f 70 2e 20 20 49 66 20 50 32 20 69 73  n top.  If P2 is
c980: 20 7a 65 72 6f 2c 20 74 68 65 20 6f 72 69 67 69   zero, the origi
c990: 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  nal.      ** dat
c9a0: 61 20 69 73 20 70 6f 70 70 65 64 20 6f 66 66 20  a is popped off 
c9b0: 74 68 65 20 73 74 61 63 6b 20 66 69 72 73 74 20  the stack first 
c9c0: 74 68 65 6e 20 74 68 65 20 6e 65 77 20 6b 65 79  then the new key
c9d0: 20 69 73 20 70 75 73 68 65 64 0a 20 20 20 20 20   is pushed.     
c9e0: 20 2a 2a 20 62 61 63 6b 20 69 6e 20 69 74 73 20   ** back in its 
c9f0: 70 6c 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  place..      **.
ca00: 20 20 20 20 20 20 2a 2a 20 53 65 65 20 61 6c 73        ** See als
ca10: 6f 20 74 68 65 20 53 6f 72 74 4d 61 6b 65 4b 65  o the SortMakeKe
ca20: 79 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  y opcode..      
ca30: 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  */.      case OP
ca40: 5f 4d 61 6b 65 4b 65 79 3a 20 7b 0a 20 20 20 20  _MakeKey: {.    
ca50: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4b 65      char *zNewKe
ca60: 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  y;.        int n
ca70: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Byte;.        in
ca80: 74 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  t nField;.      
ca90: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 20    int i, j;..   
caa0: 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f       nField = pO
cab0: 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  p->p1;.        i
cac0: 66 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69 65  f( p->tos+1<nFie
cad0: 6c 64 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  ld ) goto not_en
cae0: 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20  ough_stack;.    
caf0: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20      nByte = 0;. 
cb00: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e         for(i=p->
cb10: 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c  tos-nField+1; i<
cb20: 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20  =p->tos; i++){. 
cb30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
cb40: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20  aStack[i].flags 
cb50: 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & STK_Null ){.  
cb60: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2b            nByte+
cb70: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
cb80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
cb90: 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
cba0: 20 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65   i) ) goto no_me
cbb0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  m;.            n
cbc0: 42 79 74 65 20 2b 3d 20 70 2d 3e 61 53 74 61 63  Byte += p->aStac
cbd0: 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 20 20 20 20  k[i].n;.        
cbe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
cbf0: 20 20 20 20 20 20 7a 4e 65 77 4b 65 79 20 3d 20        zNewKey = 
cc00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
cc10: 79 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  yte );.        i
cc20: 66 28 20 7a 4e 65 77 4b 65 79 3d 3d 30 20 29 20  f( zNewKey==0 ) 
cc30: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cc40: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
cc50: 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73      for(i=p->tos
cc60: 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d  -nField+1; i<=p-
cc70: 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >tos; i++){.    
cc80: 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 61 53        if( (p->aS
cc90: 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20  tack[i].flags & 
cca0: 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  STK_Null)==0 ){.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
ccc0: 70 79 28 26 7a 4e 65 77 4b 65 79 5b 6a 5d 2c 20  py(&zNewKey[j], 
ccd0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 2c 20 70 2d  p->zStack[i], p-
cce0: 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d 31 29 3b  >aStack[i].n-1);
ccf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b  .            j +
cd00: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e  = p->aStack[i].n
cd10: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
cd20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
cd30: 70 2d 3e 74 6f 73 20 29 20 7a 4e 65 77 4b 65 79  p->tos ) zNewKey
cd40: 5b 6a 2b 2b 5d 20 3d 20 27 5c 74 27 3b 0a 20 20  [j++] = '\t';.  
cd50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cd60: 7a 4e 65 77 4b 65 79 5b 6a 5d 20 3d 20 30 3b 0a  zNewKey[j] = 0;.
cd70: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
cd80: 3e 70 32 3d 3d 30 20 29 20 50 6f 70 53 74 61 63  >p2==0 ) PopStac
cd90: 6b 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  k(p, nField);.  
cda0: 20 20 20 20 20 20 4e 65 65 64 53 74 61 63 6b 28        NeedStack(
cdb0: 70 2c 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a 20 20  p, p->tos+1);.  
cdc0: 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a        p->tos++;.
cdd0: 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63          p->aStac
cde0: 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e 42  k[p->tos].n = nB
cdf0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  yte;.        p->
ce00: 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66  aStack[p->tos].f
ce10: 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53  lags = STK_Str|S
ce20: 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20 20 20  TK_Dyn;.        
ce30: 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  p->zStack[p->tos
ce40: 5d 20 3d 20 7a 4e 65 77 4b 65 79 3b 0a 20 20 20  ] = zNewKey;.   
ce50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ce60: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
ce70: 63 6f 64 65 3a 20 4f 70 65 6e 20 50 31 20 50 32  code: Open P1 P2
ce80: 20 50 33 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   P3.      **.   
ce90: 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77     ** Open a new
cea0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
ceb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
cec0: 6d 65 64 20 50 33 2e 20 20 47 69 76 65 20 74 68  med P3.  Give th
ced0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 73 6f  e.      ** curso
cee0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
cef0: 50 31 2e 20 20 54 68 65 20 50 31 20 76 61 6c 75  P1.  The P1 valu
cf00: 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 20  es need not be. 
cf10: 20 20 20 20 20 2a 2a 20 63 6f 6e 74 69 67 75 6f       ** contiguo
cf20: 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61  us but all P1 va
cf30: 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  lues should be s
cf40: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 20 20  mall integers.  
cf50: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  It is.      ** a
cf60: 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74  n error for P1 t
cf70: 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 20  o be negative.. 
cf80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
cf90: 20 4f 70 65 6e 20 72 65 61 64 6f 6e 6c 79 20 69   Open readonly i
cfa0: 66 20 50 32 3d 3d 30 20 61 6e 64 20 66 6f 72 20  f P2==0 and for 
cfb0: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
cfc0: 69 6e 67 20 69 66 20 50 32 21 3d 30 2e 0a 20 20  ing if P2!=0..  
cfd0: 20 20 20 20 2a 2a 20 54 68 65 20 66 69 6c 65 20      ** The file 
cfe0: 69 73 20 63 72 65 61 74 65 64 20 69 66 20 69 74  is created if it
cff0: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
d000: 79 20 65 78 69 73 74 20 61 6e 64 20 50 32 21 3d  y exist and P2!=
d010: 30 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  0..      ** If t
d020: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d030: 61 6e 6f 74 68 65 72 20 63 75 72 73 6f 72 20 6f  another cursor o
d040: 70 65 6e 65 64 20 77 69 74 68 20 69 64 65 6e 74  pened with ident
d050: 69 66 69 65 72 20 50 31 2c 0a 20 20 20 20 20 20  ifier P1,.      
d060: 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 6c 64 20  ** then the old 
d070: 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
d080: 20 66 69 72 73 74 2e 20 20 41 6c 6c 20 63 75 72   first.  All cur
d090: 73 6f 72 73 20 61 72 65 0a 20 20 20 20 20 20 2a  sors are.      *
d0a0: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
d0b0: 63 6c 6f 73 65 64 20 77 68 65 6e 20 74 68 65 20  closed when the 
d0c0: 56 44 42 45 20 66 69 6e 69 73 68 65 73 20 65 78  VDBE finishes ex
d0d0: 65 63 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ecution..      *
d0e0: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 50 33  *.      ** If P3
d0f0: 20 69 73 20 6e 75 6c 6c 20 6f 72 20 61 6e 20 65   is null or an e
d100: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 61 20 74  mpty string, a t
d110: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
d120: 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
d130: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
d140: 73 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  s temporary data
d150: 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 75 74  base file is aut
d160: 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 20 20 20 20  omatically .    
d170: 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65    ** deleted whe
d180: 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
d190: 63 6c 6f 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  closed..      */
d1a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4f  .      case OP_O
d1b0: 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  pen: {.        i
d1c0: 6e 74 20 62 75 73 79 20 3d 20 30 3b 0a 20 20 20  nt busy = 0;.   
d1d0: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70       int i = pOp
d1e0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ->p1;.        if
d1f0: 28 20 69 3c 30 20 29 20 67 6f 74 6f 20 62 61 64  ( i<0 ) goto bad
d200: 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20  _instruction;.  
d210: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 2d 3e        if( i>=p->
d220: 6e 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  nCursor ){.     
d230: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
d240: 20 20 20 20 20 20 70 2d 3e 61 43 73 72 20 3d 20        p->aCsr = 
d250: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
d260: 2d 3e 61 43 73 72 2c 20 28 69 2b 31 29 2a 73 69  ->aCsr, (i+1)*si
d270: 7a 65 6f 66 28 43 75 72 73 6f 72 29 20 29 3b 0a  zeof(Cursor) );.
d280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
d290: 3e 61 43 73 72 3d 3d 30 20 29 7b 20 70 2d 3e 6e  >aCsr==0 ){ p->n
d2a0: 43 75 72 73 6f 72 20 3d 20 30 3b 20 67 6f 74 6f  Cursor = 0; goto
d2b0: 20 6e 6f 5f 6d 65 6d 3b 20 7d 0a 20 20 20 20 20   no_mem; }.     
d2c0: 20 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 43       for(j=p->nC
d2d0: 75 72 73 6f 72 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b  ursor; j<=i; j++
d2e0: 29 20 70 2d 3e 61 43 73 72 5b 6a 5d 2e 70 43 75  ) p->aCsr[j].pCu
d2f0: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rsor = 0;.      
d300: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
d310: 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   i+1;.        }e
d320: 6c 73 65 20 69 66 28 20 70 2d 3e 61 43 73 72 5b  lse if( p->aCsr[
d330: 69 5d 2e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  i].pCursor ){.  
d340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 62          sqliteDb
d350: 62 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 2d  beCloseCursor(p-
d360: 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72  >aCsr[i].pCursor
d370: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d380: 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
d390: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 44      rc = sqliteD
d3a0: 62 62 65 4f 70 65 6e 43 75 72 73 6f 72 28 70 2d  bbeOpenCursor(p-
d3b0: 3e 70 42 65 2c 70 4f 70 2d 3e 70 33 2c 70 4f 70  >pBe,pOp->p3,pOp
d3c0: 2d 3e 70 32 2c 26 70 2d 3e 61 43 73 72 5b 69 5d  ->p2,&p->aCsr[i]
d3d0: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
d3e0: 20 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20       switch( rc 
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
d400: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
d410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d420: 20 69 66 28 20 78 42 75 73 79 3d 3d 30 20 7c 7c   if( xBusy==0 ||
d430: 20 28 2a 78 42 75 73 79 29 28 70 42 75 73 79 41   (*xBusy)(pBusyA
d440: 72 67 2c 20 70 4f 70 2d 3e 70 33 2c 20 2b 2b 62  rg, pOp->p3, ++b
d450: 75 73 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  usy)==0 ){.     
d460: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d470: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
d480: 4d 73 67 2c 22 74 61 62 6c 65 20 22 2c 20 70 4f  Msg,"table ", pO
d490: 70 2d 3e 70 33 2c 20 22 20 69 73 20 6c 6f 63 6b  p->p3, " is lock
d4a0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
d4b0: 20 20 20 20 20 20 20 20 20 62 75 73 79 20 3d 20           busy = 
d4c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
d4d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
d4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d500: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
d510: 52 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  RM: {.          
d520: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
d530: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 70 4f  ing(pzErrMsg, pO
d540: 70 2d 3e 70 32 20 3f 20 22 77 72 69 74 65 22 20  p->p2 ? "write" 
d550: 3a 20 22 72 65 61 64 22 2c 0a 20 20 20 20 20 20  : "read",.      
d560: 20 20 20 20 20 20 20 20 20 20 22 20 70 65 72 6d            " perm
d570: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 20 66 6f  ission denied fo
d580: 72 20 74 61 62 6c 65 20 22 2c 20 70 4f 70 2d 3e  r table ", pOp->
d590: 70 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  p3, 0);.        
d5a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d5b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d5c0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d5d0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20  TE_READONLY: {. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d5f0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45  iteSetString(pzE
d600: 72 72 4d 73 67 2c 22 74 61 62 6c 65 20 22 2c 20  rrMsg,"table ", 
d610: 70 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 20 20 20  pOp->p3, .      
d620: 20 20 20 20 20 20 20 20 20 20 20 22 20 69 73 20             " is 
d630: 72 65 61 64 6f 6e 6c 79 22 2c 20 30 29 3b 0a 20  readonly", 0);. 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
d650: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
d660: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
d670: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
d680: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d690: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
d6a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d6b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
d6c0: 49 54 45 5f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20  ITE_OK: {.      
d6d0: 20 20 20 20 20 20 20 20 62 75 73 79 20 3d 20 30          busy = 0
d6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
d710: 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28  .        }while(
d720: 20 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20   busy );.       
d730: 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 69 6e 64 65   p->aCsr[i].inde
d740: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
d750: 2d 3e 61 43 73 72 5b 69 5d 2e 6b 65 79 41 73 44  ->aCsr[i].keyAsD
d760: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ata = 0;.       
d770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d780: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
d790: 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 0a 20  : Close P1 * *. 
d7a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
d7b0: 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   Close a cursor 
d7c0: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
d7d0: 64 20 61 73 20 50 31 2e 20 20 49 66 20 50 31 20  d as P1.  If P1 
d7e0: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  is not.      ** 
d7f0: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
d800: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
d810: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
d820: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
d830: 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 20   OP_Close: {.   
d840: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70       int i = pOp
d850: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ->p1;.        if
d860: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
d870: 43 75 72 73 6f 72 20 26 26 20 70 2d 3e 61 43 73  Cursor && p->aCs
d880: 72 5b 69 5d 2e 70 43 75 72 73 6f 72 20 29 7b 0a  r[i].pCursor ){.
d890: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8a0: 44 62 62 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  DbbeCloseCursor(
d8b0: 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73  p->aCsr[i].pCurs
d8c0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  or);.          p
d8d0: 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f  ->aCsr[i].pCurso
d8e0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
d8f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d900: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d910: 2a 20 4f 70 63 6f 64 65 3a 20 46 65 74 63 68 20  * Opcode: Fetch 
d920: 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  P1 * *.      **.
d930: 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65        ** Pop the
d940: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
d950: 6b 20 61 6e 64 20 75 73 65 20 69 74 73 20 76 61  k and use its va
d960: 6c 75 65 20 61 73 20 61 20 6b 65 79 20 74 6f 20  lue as a key to 
d970: 66 65 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61  fetch.      ** a
d980: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 63 75 72   record from cur
d990: 73 6f 72 20 50 31 2e 20 20 54 68 65 20 6b 65 79  sor P1.  The key
d9a0: 2f 64 61 74 61 20 70 61 69 72 20 69 73 20 68 65  /data pair is he
d9b0: 6c 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  ld.      ** in t
d9c0: 68 65 20 50 31 20 63 75 72 73 6f 72 20 75 6e 74  he P1 cursor unt
d9d0: 69 6c 20 6e 65 65 64 65 64 2e 0a 20 20 20 20 20  il needed..     
d9e0: 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f   */.      case O
d9f0: 50 5f 46 65 74 63 68 3a 20 7b 0a 20 20 20 20 20  P_Fetch: {.     
da00: 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e     int i = pOp->
da10: 70 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  p1;.        int 
da20: 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20  tos = p->tos;.  
da30: 20 20 20 20 20 20 69 66 28 20 74 6f 73 3c 30 20        if( tos<0 
da40: 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
da50: 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20  h_stack;.       
da60: 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70   if( i>=0 && i<p
da70: 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 70 2d 3e  ->nCursor && p->
da80: 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 20  aCsr[i].pCursor 
da90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
daa0: 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e   p->aStack[tos].
dab0: 66 6c 61 67 73 20 26 20 53 54 4b 5f 49 6e 74 20  flags & STK_Int 
dac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
dad0: 71 6c 69 74 65 44 62 62 65 46 65 74 63 68 28 70  qliteDbbeFetch(p
dae0: 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f  ->aCsr[i].pCurso
daf0: 72 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  r, sizeof(int), 
db00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db10: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
db20: 72 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 74 6f  r*)&p->aStack[to
db30: 73 5d 2e 69 29 3b 0a 20 20 20 20 20 20 20 20 20  s].i);.         
db40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
db50: 20 20 20 20 69 66 28 20 53 74 72 69 6e 67 69 66      if( Stringif
db60: 79 28 70 2c 20 74 6f 73 29 20 29 20 67 6f 74 6f  y(p, tos) ) goto
db70: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20   no_mem;.       
db80: 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65 46       sqliteDbbeF
db90: 65 74 63 68 28 70 2d 3e 61 43 73 72 5b 69 5d 2e  etch(p->aCsr[i].
dba0: 70 43 75 72 73 6f 72 2c 20 70 2d 3e 61 53 74 61  pCursor, p->aSta
dbb0: 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 0a 20 20 20 20  ck[tos].n, .    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b         p->zStack
dbe0: 5b 74 6f 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  [tos]);.        
dbf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
dc00: 3e 6e 46 65 74 63 68 2b 2b 3b 0a 20 20 20 20 20  >nFetch++;.     
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 6f 70     }.        Pop
dc20: 53 74 61 63 6b 28 70 2c 20 31 29 3b 0a 20 20 20  Stack(p, 1);.   
dc30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc40: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
dc50: 63 6f 64 65 3a 20 46 63 6e 74 20 2a 20 2a 20 2a  code: Fcnt * * *
dc60: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
dc70: 2a 2a 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67  ** Push an integ
dc80: 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  er onto the stac
dc90: 6b 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  k which is the t
dca0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20  otal number of. 
dcb0: 20 20 20 20 20 2a 2a 20 4f 50 5f 46 65 74 63 68       ** OP_Fetch
dcc0: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
dcd0: 76 65 20 62 65 65 6e 20 65 78 65 63 75 74 65 64  ve been executed
dce0: 20 62 79 20 74 68 69 73 20 76 69 72 74 75 61 6c   by this virtual
dcf0: 20 6d 61 63 68 69 6e 65 2e 0a 20 20 20 20 20 20   machine..      
dd00: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
dd10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
dd20: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
dd30: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 63  t the special fc
dd40: 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 0a 20 20  nt() function.  
dd50: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
dd60: 4c 20 64 69 61 6c 65 63 74 20 74 68 61 74 20 53  L dialect that S
dd70: 51 4c 69 74 65 20 75 6e 64 65 72 73 74 61 6e 64  QLite understand
dd80: 73 2e 20 20 66 63 6e 74 28 29 20 69 73 20 75 73  s.  fcnt() is us
dd90: 65 64 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ed for.      ** 
dda0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
ddb0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ddc0: 20 63 61 73 65 20 4f 50 5f 46 63 6e 74 3a 20 7b   case OP_Fcnt: {
ddd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
dde0: 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20   ++p->tos;.     
ddf0: 20 20 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b     if( NeedStack
de00: 28 70 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67 6f  (p, p->tos) ) go
de10: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
de20: 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e     p->aStack[i].
de30: 69 20 3d 20 70 2d 3e 6e 46 65 74 63 68 3b 0a 20  i = p->nFetch;. 
de40: 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
de50: 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  [i].flags = STK_
de60: 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Int;.        bre
de70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
de80: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69     /* Opcode: Di
de90: 73 74 69 6e 63 74 20 50 31 20 50 32 20 2a 0a 20  stinct P1 P2 *. 
dea0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
deb0: 20 55 73 65 20 74 68 65 20 74 6f 70 20 6f 66 20   Use the top of 
dec0: 74 68 65 20 73 74 61 63 6b 20 61 73 20 61 20 6b  the stack as a k
ded0: 65 79 2e 20 20 49 66 20 61 20 72 65 63 6f 72 64  ey.  If a record
dee0: 20 77 69 74 68 20 74 68 61 74 20 6b 65 79 0a 20   with that key. 
def0: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
df00: 20 65 78 69 73 74 20 69 6e 20 66 69 6c 65 20 50   exist in file P
df10: 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  1, then jump to 
df20: 50 32 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f  P2.  If the reco
df30: 72 64 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  rd.      ** does
df40: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c 20   already exist, 
df50: 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 2e 20  then fall thru. 
df60: 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 6e   The record is n
df70: 6f 74 20 72 65 74 72 69 65 76 65 64 2e 0a 20 20  ot retrieved..  
df80: 20 20 20 20 2a 2a 20 54 68 65 20 6b 65 79 20 69      ** The key i
df90: 73 20 6e 6f 74 20 70 6f 70 70 65 64 20 66 72 6f  s not popped fro
dfa0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  m the stack..   
dfb0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
dfc0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
dfd0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 4e 6f 74 46   similar to NotF
dfe0: 6f 75 6e 64 20 65 78 63 65 70 74 20 74 68 61 74  ound except that
dff0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a   this operation.
e000: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
e010: 74 20 70 6f 70 20 74 68 65 20 6b 65 79 20 66 72  t pop the key fr
e020: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
e030: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20      */.      /* 
e040: 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31  Opcode: Found P1
e050: 20 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20   P2 *.      **. 
e060: 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
e070: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
e080: 20 61 73 20 61 20 6b 65 79 2e 20 20 49 66 20 61   as a key.  If a
e090: 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 61   record with tha
e0a0: 74 20 6b 65 79 0a 20 20 20 20 20 20 2a 2a 20 64  t key.      ** d
e0b0: 6f 65 73 20 65 78 69 73 74 20 69 6e 20 66 69 6c  oes exist in fil
e0c0: 65 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20  e P1, then jump 
e0d0: 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20 72  to P2.  If the r
e0e0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 64  ecord.      ** d
e0f0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
e100: 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 2e 20 20  hen fall thru.  
e110: 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 6e 6f  The record is no
e120: 74 20 72 65 74 72 69 65 76 65 64 2e 0a 20 20 20  t retrieved..   
e130: 20 20 20 2a 2a 20 54 68 65 20 6b 65 79 20 69 73     ** The key is
e140: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
e150: 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stack..      */
e160: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
e170: 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32  : NotFound P1 P2
e180: 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
e190: 20 20 2a 2a 20 55 73 65 20 74 68 65 20 74 6f 70    ** Use the top
e1a0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 73   of the stack as
e1b0: 20 61 20 6b 65 79 2e 20 20 49 66 20 61 20 72 65   a key.  If a re
e1c0: 63 6f 72 64 20 77 69 74 68 20 74 68 61 74 20 6b  cord with that k
e1d0: 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  ey.      ** does
e1e0: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 66 69   not exist in fi
e1f0: 6c 65 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70  le P1, then jump
e200: 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20   to P2.  If the 
e210: 72 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20  record.      ** 
e220: 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e  does exist, then
e230: 20 66 61 6c 6c 20 74 68 72 75 2e 20 20 54 68 65   fall thru.  The
e240: 20 72 65 63 6f 72 64 20 69 73 20 6e 6f 74 20 72   record is not r
e250: 65 74 72 69 65 76 65 64 2e 0a 20 20 20 20 20 20  etrieved..      
e260: 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 70 6f  ** The key is po
e270: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
e280: 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ack..      **.  
e290: 20 20 20 20 2a 2a 20 54 68 65 20 64 69 66 66 65      ** The diffe
e2a0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
e2b0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64  is operation and
e2c0: 20 44 69 73 74 69 6e 63 74 20 69 73 20 74 68 61   Distinct is tha
e2d0: 74 0a 20 20 20 20 20 20 2a 2a 20 44 69 73 74 69  t.      ** Disti
e2e0: 6e 63 74 20 64 6f 65 73 20 6e 6f 74 20 70 6f 70  nct does not pop
e2f0: 20 74 68 65 20 6b 65 79 20 66 72 6f 6d 20 74 68   the key from th
e300: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
e310: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
e320: 44 69 73 74 69 6e 63 74 3a 0a 20 20 20 20 20 20  Distinct:.      
e330: 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  case OP_NotFound
e340: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
e350: 46 6f 75 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20  Found: {.       
e360: 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
e370: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
e380: 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20  s = p->tos;.    
e390: 20 20 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45      int alreadyE
e3a0: 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 20  xists = 0;.     
e3b0: 20 20 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67     if( tos<0 ) g
e3c0: 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
e3d0: 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  tack;.        if
e3e0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
e3f0: 43 75 72 73 6f 72 20 26 26 20 70 2d 3e 61 43 73  Cursor && p->aCs
e400: 72 5b 69 5d 2e 70 43 75 72 73 6f 72 20 29 7b 0a  r[i].pCursor ){.
e410: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
e420: 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  >aStack[tos].fla
e430: 67 73 20 26 20 53 54 4b 5f 49 6e 74 20 29 7b 0a  gs & STK_Int ){.
e440: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 72 65              alre
e450: 61 64 79 45 78 69 73 74 73 20 3d 20 73 71 6c 69  adyExists = sqli
e460: 74 65 44 62 62 65 54 65 73 74 28 70 2d 3e 61 43  teDbbeTest(p->aC
e470: 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 2c 20 73  sr[i].pCursor, s
e480: 69 7a 65 6f 66 28 69 6e 74 29 2c 20 0a 20 20 20  izeof(int), .   
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
e4c0: 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 29  ->aStack[tos].i)
e4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e4e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
e4f0: 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20  f( Stringify(p, 
e500: 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  tos) ) goto no_m
e510: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
e520: 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20  alreadyExists = 
e530: 73 71 6c 69 74 65 44 62 62 65 54 65 73 74 28 70  sqliteDbbeTest(p
e540: 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f  ->aCsr[i].pCurso
e550: 72 2c 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d  r,p->aStack[tos]
e560: 2e 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  .n, .           
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 3b  p->zStack[tos]);
e5a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e5c0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
e5d0: 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  OP_Found ){.    
e5e0: 20 20 20 20 20 20 69 66 28 20 61 6c 72 65 61 64        if( alread
e5f0: 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70  yExists ) pc = p
e600: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
e610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e620: 20 20 20 20 20 69 66 28 20 21 61 6c 72 65 61 64       if( !alread
e630: 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70  yExists ) pc = p
e640: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
e650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e660: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
e670: 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
e680: 20 20 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b          PopStack
e690: 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
e6a0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
e6b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e6c0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77 20 50  /* Opcode: New P
e6d0: 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20  1 * *.      **. 
e6e0: 20 20 20 20 20 2a 2a 20 47 65 74 20 61 20 6e 65       ** Get a ne
e6f0: 77 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6e 6f  w integer key no
e700: 74 20 70 72 65 76 69 6f 75 73 20 75 73 65 64 20  t previous used 
e710: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
e720: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  file.      ** as
e730: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
e740: 72 73 6f 72 20 50 31 20 61 6e 64 20 70 75 73 68  rsor P1 and push
e750: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61   it onto the sta
e760: 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
e770: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 77 3a 20     case OP_New: 
e780: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
e790: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20  = pOp->p1;.     
e7a0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
e7b0: 20 20 69 66 28 20 69 3c 30 20 7c 7c 20 69 3e 3d    if( i<0 || i>=
e7c0: 70 2d 3e 6e 43 75 72 73 6f 72 20 7c 7c 20 70 2d  p->nCursor || p-
e7d0: 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72  >aCsr[i].pCursor
e7e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e7f0: 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   v = 0;.        
e800: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e810: 20 76 20 3d 20 73 71 6c 69 74 65 44 62 62 65 4e   v = sqliteDbbeN
e820: 65 77 28 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43  ew(p->aCsr[i].pC
e830: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
e840: 7d 0a 20 20 20 20 20 20 20 20 4e 65 65 64 53 74  }.        NeedSt
e850: 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31 29  ack(p, p->tos+1)
e860: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73  ;.        p->tos
e870: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ++;.        p->a
e880: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69 20  Stack[p->tos].i 
e890: 3d 20 76 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = v;.        p->
e8a0: 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66  aStack[p->tos].f
e8b0: 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a  lags = STK_Int;.
e8c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e8d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e8e0: 20 4f 70 63 6f 64 65 3a 20 50 75 74 20 50 31 20   Opcode: Put P1 
e8f0: 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  * *.      **.   
e900: 20 20 20 2a 2a 20 57 72 69 74 65 20 61 6e 20 65     ** Write an e
e910: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 64 61  ntry into the da
e920: 74 61 62 61 73 65 20 66 69 6c 65 20 50 31 2e 20  tabase file P1. 
e930: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 0a   A new entry is.
e940: 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64        ** created
e950: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61   if it doesn't a
e960: 6c 72 65 61 64 79 20 65 78 69 73 74 2c 20 6f 72  lready exist, or
e970: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e   the data for an
e980: 20 65 78 69 73 74 69 6e 67 0a 20 20 20 20 20 20   existing.      
e990: 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72  ** entry is over
e9a0: 77 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61  written.  The da
e9b0: 74 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  ta is the value 
e9c0: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
e9d0: 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b  e.      ** stack
e9e0: 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 74 68  .  The key is th
e9f0: 65 20 6e 65 78 74 20 76 61 6c 75 65 20 64 6f 77  e next value dow
ea00: 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  n on the stack. 
ea10: 20 54 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   The stack.     
ea20: 20 2a 2a 20 69 73 20 70 6f 70 70 65 64 20 74 77   ** is popped tw
ea30: 69 63 65 20 62 79 20 74 68 69 73 20 69 6e 73 74  ice by this inst
ea40: 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruction..      *
ea50: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
ea60: 50 75 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  Put: {.        i
ea70: 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b  nt tos = p->tos;
ea80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 73  .        int nos
ea90: 20 3d 20 70 2d 3e 74 6f 73 2d 31 3b 0a 20 20 20   = p->tos-1;.   
eaa0: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70       int i = pOp
eab0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ->p1;.        if
eac0: 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e  ( nos<0 ) goto n
ead0: 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b  ot_enough_stack;
eae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
eaf0: 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
eb00: 72 20 26 26 20 70 2d 3e 61 43 73 72 5b 69 5d 2e  r && p->aCsr[i].
eb10: 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20  pCursor!=0 ){.  
eb20: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b          char *zK
eb30: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ey;.          in
eb40: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  t nKey;.        
eb50: 20 20 69 66 28 20 28 70 2d 3e 61 53 74 61 63 6b    if( (p->aStack
eb60: 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  [nos].flags & ST
eb70: 4b 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  K_Int)==0 ){.   
eb80: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 74 72           if( Str
eb90: 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29 20 29  ingify(p, nos) )
eba0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
ebb0: 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d            nKey =
ebc0: 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e   p->aStack[nos].
ebd0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  n;.            z
ebe0: 4b 65 79 20 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b  Key = p->zStack[
ebf0: 6e 6f 73 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  nos];.          
ec00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ec10: 20 20 20 6e 4b 65 79 20 3d 20 73 69 7a 65 6f 66     nKey = sizeof
ec20: 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  (int);.         
ec30: 20 20 20 7a 4b 65 79 20 3d 20 28 63 68 61 72 2a     zKey = (char*
ec40: 29 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d  )&p->aStack[nos]
ec50: 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  .i;.          }.
ec60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec70: 44 62 62 65 50 75 74 28 70 2d 3e 61 43 73 72 5b  DbbePut(p->aCsr[
ec80: 69 5d 2e 70 43 75 72 73 6f 72 2c 20 6e 4b 65 79  i].pCursor, nKey
ec90: 2c 20 7a 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , zKey,.        
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e  p->aStack[tos].n
ecc0: 2c 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d  , p->zStack[tos]
ecd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ece0: 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c       PopStack(p,
ecf0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   2);.        bre
ed00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
ed10: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65     /* Opcode: De
ed20: 6c 65 74 65 20 50 31 20 2a 20 2a 0a 20 20 20 20  lete P1 * *.    
ed30: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
ed40: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
ed50: 63 6b 20 69 73 20 61 20 6b 65 79 2e 20 20 52 65  ck is a key.  Re
ed60: 6d 6f 76 65 20 74 68 69 73 20 6b 65 79 20 61 6e  move this key an
ed70: 64 20 69 74 73 20 64 61 74 61 0a 20 20 20 20 20  d its data.     
ed80: 20 2a 2a 20 66 72 6f 6d 20 64 61 74 61 62 61 73   ** from databas
ed90: 65 20 66 69 6c 65 20 50 31 2e 20 20 54 68 65 6e  e file P1.  Then
eda0: 20 70 6f 70 20 74 68 65 20 73 74 61 63 6b 20 74   pop the stack t
edb0: 6f 20 64 69 73 63 61 72 64 20 74 68 65 20 6b 65  o discard the ke
edc0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
edd0: 20 20 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65    case OP_Delete
ede0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
edf0: 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20  tos = p->tos;.  
ee00: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f        int i = pO
ee10: 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  p->p1;.        i
ee20: 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20  f( tos<0 ) goto 
ee30: 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
ee40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
ee50: 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73  =0 && i<p->nCurs
ee60: 6f 72 20 26 26 20 70 2d 3e 61 43 73 72 5b 69 5d  or && p->aCsr[i]
ee70: 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20  .pCursor!=0 ){. 
ee80: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
ee90: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Key;.          i
eea0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  nt nKey;.       
eeb0: 20 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b     if( p->aStack
eec0: 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  [tos].flags & ST
eed0: 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  K_Int ){.       
eee0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 73 69 7a 65       nKey = size
eef0: 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  of(int);.       
ef00: 20 20 20 20 20 7a 4b 65 79 20 3d 20 28 63 68 61       zKey = (cha
ef10: 72 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 74 6f  r*)&p->aStack[to
ef20: 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20  s].i;.          
ef30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ef40: 20 20 20 69 66 28 20 53 74 72 69 6e 67 69 66 79     if( Stringify
ef50: 28 70 2c 20 74 6f 73 29 20 29 20 67 6f 74 6f 20  (p, tos) ) goto 
ef60: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20  no_mem;.        
ef70: 20 20 20 20 6e 4b 65 79 20 3d 20 70 2d 3e 61 53      nKey = p->aS
ef80: 74 61 63 6b 5b 74 6f 73 5d 2e 6e 3b 0a 20 20 20  tack[tos].n;.   
ef90: 20 20 20 20 20 20 20 20 20 7a 4b 65 79 20 3d 20           zKey = 
efa0: 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b 0a  p->zStack[tos];.
efb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
efc0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65        sqliteDbbe
efd0: 44 65 6c 65 74 65 28 70 2d 3e 61 43 73 72 5b 69  Delete(p->aCsr[i
efe0: 5d 2e 70 43 75 72 73 6f 72 2c 20 6e 4b 65 79 2c  ].pCursor, nKey,
eff0: 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   zKey);.        
f000: 7d 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74 61  }.        PopSta
f010: 63 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  ck(p, 1);.      
f020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f030: 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
f040: 65 3a 20 4b 65 79 41 73 44 61 74 61 20 50 31 20  e: KeyAsData P1 
f050: 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  P2 *.      **.  
f060: 20 20 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20      ** Turn the 
f070: 6b 65 79 2d 61 73 2d 64 61 74 61 20 6d 6f 64 65  key-as-data mode
f080: 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 20 65   for cursor P1 e
f090: 69 74 68 65 72 20 6f 6e 20 28 69 66 20 50 32 3d  ither on (if P2=
f0a0: 3d 31 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  =1) or.      ** 
f0b0: 6f 66 66 20 28 69 66 20 50 32 3d 3d 30 29 2e 20  off (if P2==0). 
f0c0: 20 49 6e 20 6b 65 79 2d 61 73 2d 64 61 74 61 20   In key-as-data 
f0d0: 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 46 69 65  mode, the OP_Fie
f0e0: 6c 64 20 6f 70 63 6f 64 65 20 70 75 6c 6c 73 0a  ld opcode pulls.
f0f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 6f 66        ** data of
f100: 66 20 6f 66 20 74 68 65 20 6b 65 79 20 72 61 74  f of the key rat
f110: 68 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  her than the dat
f120: 61 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  a.  This is usef
f130: 75 6c 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ul for.      ** 
f140: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6d 70 6f  processing compo
f150: 75 6e 64 20 73 65 6c 65 63 74 73 2e 0a 20 20 20  und selects..   
f160: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
f170: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 3a 20 7b   OP_KeyAsData: {
f180: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
f190: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20   pOp->p1;.      
f1a0: 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c    if( i>=0 && i<
f1b0: 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 70 2d  p->nCursor && p-
f1c0: 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72  >aCsr[i].pCursor
f1d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
f1e0: 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6b 65 79 41   p->aCsr[i].keyA
f1f0: 73 44 61 74 61 20 3d 20 70 4f 70 2d 3e 70 32 3b  sData = pOp->p2;
f200: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f220: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  }..      /* Opco
f230: 64 65 3a 20 46 69 65 6c 64 20 50 31 20 50 32 20  de: Field P1 P2 
f240: 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
f250: 20 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68   ** Interpret th
f260: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 6d 6f  e data in the mo
f270: 73 74 20 72 65 63 65 6e 74 20 66 65 74 63 68 20  st recent fetch 
f280: 66 72 6f 6d 20 63 75 72 73 6f 72 20 50 31 0a 20  from cursor P1. 
f290: 20 20 20 20 20 2a 2a 20 69 73 20 61 20 73 74 72       ** is a str
f2a0: 75 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69  ucture built usi
f2b0: 6e 67 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ng the MakeRecor
f2c0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20  d instruction.. 
f2d0: 20 20 20 20 20 2a 2a 20 50 75 73 68 20 6f 6e 74       ** Push ont
f2e0: 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68 65 20  o the stack the 
f2f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 2d  value of the P2-
f300: 74 68 20 66 69 65 6c 64 20 6f 66 20 74 68 61 74  th field of that
f310: 0a 20 20 20 20 20 20 2a 2a 20 73 74 72 75 63 74  .      ** struct
f320: 75 72 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ure..      ** . 
f330: 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
f340: 65 20 70 75 73 68 65 64 20 69 73 20 6a 75 73 74  e pushed is just
f350: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f360: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 75  e data in the cu
f370: 72 73 6f 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rsor..      ** T
f380: 68 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 67 6f  he value will go
f390: 20 61 77 61 79 20 74 68 65 20 6e 65 78 74 20 74   away the next t
f3a0: 69 6d 65 20 61 20 72 65 63 6f 72 64 20 69 73 20  ime a record is 
f3b0: 66 65 74 63 68 65 64 20 66 72 6f 6d 20 50 31 2c  fetched from P1,
f3c0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 77 68 65  .      ** or whe
f3d0: 6e 20 50 31 20 69 73 20 63 6c 6f 73 65 64 2e 20  n P1 is closed. 
f3e0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
f3f0: 74 68 65 20 73 74 72 69 6e 67 20 28 75 73 69 6e  the string (usin
f400: 67 0a 20 20 20 20 20 20 2a 2a 20 22 43 6f 6e 63  g.      ** "Conc
f410: 61 74 20 31 20 30 20 30 22 29 20 69 66 20 69 74  at 1 0 0") if it
f420: 20 6e 65 65 64 73 20 74 6f 20 70 65 72 73 69 73   needs to persis
f430: 74 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  t longer than th
f440: 61 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  at..      **.   
f450: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 4b 65 79     ** If the Key
f460: 41 73 44 61 74 61 20 6f 70 63 6f 64 65 20 68 61  AsData opcode ha
f470: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 65  s previously exe
f480: 63 75 74 65 64 20 6f 6e 20 74 68 69 73 20 63 75  cuted on this cu
f490: 72 73 6f 72 2c 0a 20 20 20 20 20 20 2a 2a 20 74  rsor,.      ** t
f4a0: 68 65 6e 20 74 68 65 20 66 69 65 6c 64 20 6d 69  hen the field mi
f4b0: 67 68 74 20 62 65 20 65 78 74 72 61 63 74 65 64  ght be extracted
f4c0: 20 66 72 6f 6d 20 74 68 65 20 6b 65 79 20 72 61   from the key ra
f4d0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ther than the.  
f4e0: 20 20 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 20      ** data..   
f4f0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 56     **.      ** V
f500: 69 65 77 65 64 20 66 72 6f 6d 20 61 20 68 69 67  iewed from a hig
f510: 68 65 72 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  her level, this 
f520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 65 74 72  instruction retr
f530: 69 65 76 65 73 20 74 68 65 0a 20 20 20 20 20 20  ieves the.      
f540: 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73  ** data from a s
f550: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
f560: 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 6f 77  a particular row
f570: 20 6f 66 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   of an SQL table
f580: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  .      ** file. 
f590: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
f5a0: 65 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75  e of this instru
f5b0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a  ction should be.
f5c0: 20 20 20 20 20 20 2a 2a 20 22 43 6f 6c 75 6d 6e        ** "Column
f5d0: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 46 69  " instead of "Fi
f5e0: 65 6c 64 22 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  eld"....      */
f5f0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46  .      case OP_F
f600: 69 65 6c 64 3a 20 7b 0a 20 20 20 20 20 20 20 20  ield: {.        
f610: 69 6e 74 20 2a 70 41 64 64 72 3b 0a 20 20 20 20  int *pAddr;.    
f620: 20 20 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 20      int amt;.   
f630: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70       int i = pOp
f640: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  ->p1;.        in
f650: 74 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  t p2 = pOp->p2;.
f660: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20          int tos 
f670: 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 20 20  = ++p->tos;.    
f680: 20 20 20 20 44 62 62 65 43 75 72 73 6f 72 20 2a      DbbeCursor *
f690: 70 43 72 73 72 3b 0a 20 20 20 20 20 20 20 20 63  pCrsr;.        c
f6a0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 20 20 20  har *z;..       
f6b0: 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b 28 70   if( NeedStack(p
f6c0: 2c 20 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f  , tos) ) goto no
f6d0: 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  _mem;.        if
f6e0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
f6f0: 43 75 72 73 6f 72 20 26 26 20 28 70 43 72 73 72  Cursor && (pCrsr
f700: 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43   = p->aCsr[i].pC
f710: 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20  ursor)!=0 ){.   
f720: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 43         if( p->aC
f730: 73 72 5b 69 5d 2e 6b 65 79 41 73 44 61 74 61 20  sr[i].keyAsData 
f740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
f750: 6d 74 20 3d 20 73 71 6c 69 74 65 44 62 62 65 4b  mt = sqliteDbbeK
f760: 65 79 4c 65 6e 67 74 68 28 70 43 72 73 72 29 3b  eyLength(pCrsr);
f770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
f780: 20 61 6d 74 3c 3d 73 69 7a 65 6f 66 28 69 6e 74   amt<=sizeof(int
f790: 29 2a 28 70 32 2b 31 29 20 29 7b 0a 20 20 20 20  )*(p2+1) ){.    
f7a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74            p->aSt
f7b0: 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
f7c0: 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   STK_Null;.     
f7d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f7f0: 20 20 20 20 20 20 20 20 20 20 70 41 64 64 72 20            pAddr 
f800: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 44 62  = (int*)sqliteDb
f810: 62 65 52 65 61 64 4b 65 79 28 70 43 72 73 72 2c  beReadKey(pCrsr,
f820: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 32 29   sizeof(int)*p2)
f830: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f840: 28 20 2a 70 41 64 64 72 3d 3d 30 20 29 7b 0a 20  ( *pAddr==0 ){. 
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f860: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
f870: 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20  s = STK_Null;.  
f880: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
f890: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
f8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
f8b0: 20 73 71 6c 69 74 65 44 62 62 65 52 65 61 64 4b   sqliteDbbeReadK
f8c0: 65 79 28 70 43 72 73 72 2c 20 2a 70 41 64 64 72  ey(pCrsr, *pAddr
f8d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
f8e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
f8f0: 61 6d 74 20 3d 20 73 71 6c 69 74 65 44 62 62 65  amt = sqliteDbbe
f900: 44 61 74 61 4c 65 6e 67 74 68 28 70 43 72 73 72  DataLength(pCrsr
f910: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f920: 66 28 20 61 6d 74 3c 3d 73 69 7a 65 6f 66 28 69  f( amt<=sizeof(i
f930: 6e 74 29 2a 28 70 32 2b 31 29 20 29 7b 0a 20 20  nt)*(p2+1) ){.  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
f950: 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
f960: 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20   = STK_Null;.   
f970: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
f980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
f990: 20 20 20 20 20 20 20 20 20 20 20 20 70 41 64 64              pAdd
f9a0: 72 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  r = (int*)sqlite
f9b0: 44 62 62 65 52 65 61 64 44 61 74 61 28 70 43 72  DbbeReadData(pCr
f9c0: 73 72 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  sr, sizeof(int)*
f9d0: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p2);.           
f9e0: 20 69 66 28 20 2a 70 41 64 64 72 3d 3d 30 20 29   if( *pAddr==0 )
f9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
fa00: 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66  p->aStack[tos].f
fa10: 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b  lags = STK_Null;
fa20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
fa30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
fa40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
fa50: 7a 20 3d 20 73 71 6c 69 74 65 44 62 62 65 52 65  z = sqliteDbbeRe
fa60: 61 64 44 61 74 61 28 70 43 72 73 72 2c 20 2a 70  adData(pCrsr, *p
fa70: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
fa80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
fa90: 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 7a 3b  zStack[tos] = z;
faa0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53  .          p->aS
fab0: 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 73 74  tack[tos].n = st
fac0: 72 6c 65 6e 28 7a 29 20 2b 20 31 3b 0a 20 20 20  rlen(z) + 1;.   
fad0: 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
fae0: 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [tos].flags = ST
faf0: 4b 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 7d  K_Str;.        }
fb00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fb10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
fb20: 2a 20 4f 70 63 6f 64 65 3a 20 4b 65 79 20 50 31  * Opcode: Key P1
fb30: 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   * *.      **.  
fb40: 20 20 20 20 2a 2a 20 50 75 73 68 20 6f 6e 74 6f      ** Push onto
fb50: 20 74 68 65 20 73 74 61 63 6b 20 61 6e 20 69 6e   the stack an in
fb60: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
fb70: 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
fb80: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
fb90: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
fba0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e  current entry in
fbb0: 20 61 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63   a sequential sc
fbc0: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  an of the databa
fbd0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
fbe0: 20 50 31 2e 20 20 54 68 65 20 73 65 71 75 65 6e   P1.  The sequen
fbf0: 74 69 61 6c 20 73 63 61 6e 20 73 68 6f 75 6c 64  tial scan should
fc00: 20 68 61 76 65 20 62 65 65 6e 20 73 74 61 72 74   have been start
fc10: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20  ed using the .  
fc20: 20 20 20 20 2a 2a 20 4e 65 78 74 20 6f 70 63 6f      ** Next opco
fc30: 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
fc40: 20 20 20 63 61 73 65 20 4f 50 5f 4b 65 79 3a 20     case OP_Key: 
fc50: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
fc60: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20  = pOp->p1;.     
fc70: 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b 70     int tos = ++p
fc80: 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 44  ->tos;.        D
fc90: 62 62 65 43 75 72 73 6f 72 20 2a 70 43 72 73 72  bbeCursor *pCrsr
fca0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e  ;..        if( N
fcb0: 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74  eedStack(p, p->t
fcc0: 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  os) ) goto no_me
fcd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
fce0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
fcf0: 73 6f 72 20 26 26 20 28 70 43 72 73 72 20 3d 20  sor && (pCrsr = 
fd00: 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73  p->aCsr[i].pCurs
fd10: 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  or)!=0 ){.      
fd20: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
fd30: 6c 69 74 65 44 62 62 65 52 65 61 64 4b 65 79 28  liteDbbeReadKey(
fd40: 70 43 72 73 72 2c 20 30 29 3b 0a 20 20 20 20 20  pCrsr, 0);.     
fd50: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 43 73 72       if( p->aCsr
fd60: 5b 69 5d 2e 6b 65 79 41 73 44 61 74 61 20 29 7b  [i].keyAsData ){
fd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
fd80: 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 7a 3b  zStack[tos] = z;
fd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
fda0: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
fdb0: 73 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 20  s = STK_Str;.   
fdc0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61           p->aSta
fdd0: 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 73 71 6c 69  ck[tos].n = sqli
fde0: 74 65 44 62 62 65 4b 65 79 4c 65 6e 67 74 68 28  teDbbeKeyLength(
fdf0: 70 43 72 73 72 29 3b 0a 20 20 20 20 20 20 20 20  pCrsr);.        
fe00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fe10: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e       memcpy(&p->
fe20: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 2c 20 7a  aStack[tos].i, z
fe30: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  , sizeof(int));.
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
fe50: 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
fe60: 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20   = STK_Int;.    
fe70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe80: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
fe90: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
fea0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e  /* Opcode: Rewin
feb0: 64 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a  d P1 * *.      *
fec0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
fed0: 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 4b  ext use of the K
fee0: 65 79 20 6f 72 20 46 69 65 6c 64 20 6f 72 20 4e  ey or Field or N
fef0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
ff00: 66 6f 72 20 50 31 20 0a 20 20 20 20 20 20 2a 2a  for P1 .      **
ff10: 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74   will refer to t
ff20: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
ff30: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
ff40: 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
ff50: 20 20 20 20 63 61 73 65 20 4f 50 5f 52 65 77 69      case OP_Rewi
ff60: 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  nd: {.        in
ff70: 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
ff80: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
ff90: 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
ffa0: 26 26 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43  && p->aCsr[i].pC
ffb0: 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20  ursor!=0 ){.    
ffc0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65        sqliteDbbe
ffd0: 52 65 77 69 6e 64 28 70 2d 3e 61 43 73 72 5b 69  Rewind(p->aCsr[i
ffe0: 5d 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].pCursor);.    
fff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
10000 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
10010 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e      /* Opcode: N
10020 65 78 74 20 50 31 20 50 32 20 2a 0a 20 20 20 20  ext P1 P2 *.    
10030 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 64    **.      ** Ad
10040 76 61 6e 63 65 20 50 31 20 74 6f 20 74 68 65 20  vance P1 to the 
10050 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
10060 69 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ir in the file. 
10070 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 72   Or, if there ar
10080 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  e no.      ** mo
10090 72 65 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72  re key/data pair
100a0 73 2c 20 72 65 77 69 6e 64 20 50 31 20 61 6e 64  s, rewind P1 and
100b0 20 6a 75 6d 70 20 74 6f 20 6c 6f 63 61 74 69 6f   jump to locatio
100c0 6e 20 50 32 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  n P2..      */. 
100d0 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
100e0 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t: {.        int
100f0 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
10100 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26        if( i>=0 &
10110 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26  & i<p->nCursor &
10120 26 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75  & p->aCsr[i].pCu
10130 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 20  rsor!=0 ){.     
10140 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 44       if( sqliteD
10150 62 62 65 4e 65 78 74 4b 65 79 28 70 2d 3e 61 43  bbeNextKey(p->aC
10160 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 3d 3d  sr[i].pCursor)==
10170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
10180 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
10190 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
101a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
101b0 70 2d 3e 6e 46 65 74 63 68 2b 2b 3b 0a 20 20 20  p->nFetch++;.   
101c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
101d0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
101e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
101f0 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65   /* Opcode: Rese
10200 74 49 64 78 20 50 31 20 2a 20 2a 0a 20 20 20 20  tIdx P1 * *.    
10210 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
10220 67 69 6e 20 74 72 65 61 74 69 6e 67 20 74 68 65  gin treating the
10230 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 69 6e   current data in
10240 20 63 75 72 73 6f 72 20 50 31 20 61 73 20 61 20   cursor P1 as a 
10250 62 75 6e 63 68 20 6f 66 20 69 6e 74 65 67 65 72  bunch of integer
10260 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 73 20 74  .      ** keys t
10270 6f 20 72 65 63 6f 72 64 73 20 6f 66 20 61 20 28  o records of a (
10280 73 65 70 61 72 61 74 65 29 20 53 51 4c 20 74 61  separate) SQL ta
10290 62 6c 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ble file.  This 
102a0 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
102b0 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20    ** causes the 
102c0 6e 65 77 20 4e 65 78 74 49 64 78 20 69 6e 73 74  new NextIdx inst
102d0 72 75 63 74 69 6f 6e 20 70 75 73 68 20 74 68 65  ruction push the
102e0 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 74   first integer t
102f0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65  able.      ** ke
10300 79 20 69 6e 20 74 68 65 20 64 61 74 61 2e 0a 20  y in the data.. 
10310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
10320 73 65 20 4f 50 5f 52 65 73 65 74 49 64 78 3a 20  se OP_ResetIdx: 
10330 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
10340 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20  = pOp->p1;.     
10350 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69     if( i>=0 && i
10360 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 7b 0a 20  <p->nCursor ){. 
10370 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 73 72           p->aCsr
10380 5b 69 5d 2e 69 6e 64 65 78 20 3d 20 30 3b 0a 20  [i].index = 0;. 
10390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
103a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
103b0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
103c0 3a 20 4e 65 78 74 49 64 78 20 50 31 20 50 32 20  : NextIdx P1 P2 
103d0 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  *.      **.     
103e0 20 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f   ** The P1 curso
103f0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 53  r points to an S
10400 51 4c 20 69 6e 64 65 78 2e 20 20 54 68 65 20 64  QL index.  The d
10410 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 6f 73  ata from the mos
10420 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 63 65 6e  t.      ** recen
10430 74 20 66 65 74 63 68 20 6f 6e 20 74 68 61 74 20  t fetch on that 
10440 63 75 72 73 6f 72 20 63 6f 6e 73 69 73 74 73 20  cursor consists 
10450 6f 66 20 61 20 62 75 6e 63 68 20 6f 66 20 69 6e  of a bunch of in
10460 74 65 67 65 72 73 20 77 68 65 72 65 0a 20 20 20  tegers where.   
10470 20 20 20 2a 2a 20 65 61 63 68 20 69 6e 74 65 67     ** each integ
10480 65 72 20 69 73 20 74 68 65 20 6b 65 79 20 74 6f  er is the key to
10490 20 61 20 72 65 63 6f 72 64 20 69 6e 20 61 6e 20   a record in an 
104a0 53 51 4c 20 74 61 62 6c 65 20 66 69 6c 65 2e 0a  SQL table file..
104b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e        ** This in
104c0 73 74 72 75 63 74 69 6f 6e 20 67 72 61 62 73 20  struction grabs 
104d0 74 68 65 20 6e 65 78 74 20 69 6e 74 65 67 65 72  the next integer
104e0 20 74 61 62 6c 65 20 6b 65 79 20 66 72 6f 6d 20   table key from 
104f0 74 68 65 20 64 61 74 61 0a 20 20 20 20 20 20 2a  the data.      *
10500 2a 20 6f 66 20 50 31 20 61 6e 64 20 70 75 73 68  * of P1 and push
10510 65 73 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  es that integer 
10520 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20  onto the stack. 
10530 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
10540 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e        ** this in
10550 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
10560 63 75 74 65 64 20 61 66 74 65 72 20 61 20 66 65  cuted after a fe
10570 74 63 68 2c 20 74 68 65 20 66 69 72 73 74 20 69  tch, the first i
10580 6e 74 65 67 65 72 20 0a 20 20 20 20 20 20 2a 2a  nteger .      **
10590 20 74 61 62 6c 65 20 6b 65 79 20 69 73 20 70 75   table key is pu
105a0 73 68 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  shed.  Subsequen
105b0 74 20 69 6e 74 65 67 65 72 20 74 61 62 6c 65 20  t integer table 
105c0 6b 65 79 73 20 61 72 65 20 70 75 73 68 65 64 20  keys are pushed 
105d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 61 63  .      ** in eac
105e0 68 20 73 75 62 73 65 71 75 65 6e 74 20 65 78 65  h subsequent exe
105f0 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69  cution of this i
10600 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20  nstruction..    
10610 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
10620 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
10630 72 65 20 69 6e 74 65 67 65 72 20 74 61 62 6c 65  re integer table
10640 20 6b 65 79 73 20 69 6e 20 74 68 65 20 64 61 74   keys in the dat
10650 61 20 6f 66 20 50 31 0a 20 20 20 20 20 20 2a 2a  a of P1.      **
10660 20 77 68 65 6e 20 74 68 69 73 20 69 6e 73 74 72   when this instr
10670 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
10680 65 64 2c 20 74 68 65 6e 20 6e 6f 74 68 69 6e 67  ed, then nothing
10690 20 67 65 74 73 20 70 75 73 68 65 64 20 61 6e 64   gets pushed and
106a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20  .      ** there 
106b0 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  is an immediate 
106c0 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
106d0 69 6f 6e 20 50 32 2e 0a 20 20 20 20 20 20 2a 2f  ion P2..      */
106e0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  .      case OP_N
106f0 65 78 74 49 64 78 3a 20 7b 0a 20 20 20 20 20 20  extIdx: {.      
10700 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
10710 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  1;.        int t
10720 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20  os = ++p->tos;. 
10730 20 20 20 20 20 20 20 44 62 62 65 43 75 72 73 6f         DbbeCurso
10740 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 20 20 20  r *pCrsr;..     
10750 20 20 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b     if( NeedStack
10760 28 70 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67 6f  (p, p->tos) ) go
10770 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
10780 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73     p->zStack[tos
10790 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  ] = 0;.        i
107a0 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  f( i>=0 && i<p->
107b0 6e 43 75 72 73 6f 72 20 26 26 20 28 70 43 72 73  nCursor && (pCrs
107c0 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70  r = p->aCsr[i].p
107d0 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20  Cursor)!=0 ){.  
107e0 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 49 64          int *aId
107f0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  x;.          int
10800 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   nIdx;.         
10810 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 20   int j, k;.     
10820 20 20 20 20 20 6e 49 64 78 20 3d 20 73 71 6c 69       nIdx = sqli
10830 74 65 44 62 62 65 44 61 74 61 4c 65 6e 67 74 68  teDbbeDataLength
10840 28 70 43 72 73 72 29 2f 73 69 7a 65 6f 66 28 69  (pCrsr)/sizeof(i
10850 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  nt);.          a
10860 49 64 78 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Idx = (int*)sqli
10870 74 65 44 62 62 65 52 65 61 64 44 61 74 61 28 70  teDbbeReadData(p
10880 43 72 73 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Crsr, 0);.      
10890 20 20 20 20 69 66 28 20 6e 49 64 78 3e 31 20 29      if( nIdx>1 )
108a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20  {.            k 
108b0 3d 20 2a 28 61 49 64 78 2b 2b 29 3b 0a 20 20 20  = *(aIdx++);.   
108c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 6e           if( k>n
108d0 49 64 78 2d 31 20 29 20 6b 20 3d 20 6e 49 64 78  Idx-1 ) k = nIdx
108e0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  -1;.          }e
108f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
10900 20 6b 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20   k = nIdx;.     
10910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10920 20 66 6f 72 28 6a 3d 70 2d 3e 61 43 73 72 5b 69   for(j=p->aCsr[i
10930 5d 2e 69 6e 64 65 78 3b 20 6a 3c 6b 3b 20 6a 2b  ].index; j<k; j+
10940 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
10950 69 66 28 20 61 49 64 78 5b 6a 5d 21 3d 30 20 29  if( aIdx[j]!=0 )
10960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
10970 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69  p->aStack[tos].i
10980 20 3d 20 61 49 64 78 5b 6a 5d 3b 0a 20 20 20 20   = aIdx[j];.    
10990 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74            p->aSt
109a0 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
109b0 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 20 20   STK_Int;.      
109c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
109d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
109e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
109f0 20 20 20 69 66 28 20 6a 3e 3d 6b 20 29 7b 0a 20     if( j>=k ){. 
10a00 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d             j = -
10a10 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
10a20 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
10a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 70  .            Pop
10a40 53 74 61 63 6b 28 70 2c 20 31 29 3b 0a 20 20 20  Stack(p, 1);.   
10a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10a60 20 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 69 6e     p->aCsr[i].in
10a70 64 65 78 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20  dex = j+1;.     
10a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
10a90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
10aa0 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 75     /* Opcode: Pu
10ab0 74 49 64 78 20 50 31 20 2a 20 2a 0a 20 20 20 20  tIdx P1 * *.    
10ac0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
10ad0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
10ae0 63 6b 20 68 6f 6c 64 20 61 6e 20 53 51 4c 20 69  ck hold an SQL i
10af0 6e 64 65 78 20 6b 65 79 20 28 70 72 6f 62 61 62  ndex key (probab
10b00 6c 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ly made using th
10b10 65 0a 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 4b  e.      ** MakeK
10b20 65 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 29 20  ey instruction) 
10b30 61 6e 64 20 6e 65 78 74 20 6f 6e 20 73 74 61 63  and next on stac
10b40 6b 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  k holds an integ
10b50 65 72 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  er which.      *
10b60 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 61 6e 20  * the key to an 
10b70 53 51 4c 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  SQL table entry.
10b80 20 20 4c 6f 63 61 74 65 20 74 68 65 20 72 65 63    Locate the rec
10b90 6f 72 64 20 69 6e 20 63 75 72 73 6f 72 20 50 31  ord in cursor P1
10ba0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 68  .      ** that h
10bb0 61 73 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  as the same key 
10bc0 61 73 20 6f 6e 20 74 68 65 20 54 4f 53 2e 20 20  as on the TOS.  
10bd0 43 72 65 61 74 65 20 61 20 6e 65 77 20 72 65 63  Create a new rec
10be0 6f 72 64 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ord if.      ** 
10bf0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 6e  necessary.  Then
10c00 20 61 70 70 65 6e 64 20 74 68 65 20 69 6e 74 65   append the inte
10c10 67 65 72 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  ger table key to
10c20 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
10c30 61 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 63 6f  at.      ** reco
10c40 72 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  rd and write it 
10c50 62 61 63 6b 20 74 6f 20 74 68 65 20 50 31 20 66  back to the P1 f
10c60 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
10c70 20 20 20 20 63 61 73 65 20 4f 50 5f 50 75 74 49      case OP_PutI
10c80 64 78 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  dx: {.        in
10c90 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
10ca0 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20 3d         int tos =
10cb0 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20   p->tos;.       
10cc0 20 69 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d   int nos = tos -
10cd0 20 31 3b 0a 20 20 20 20 20 20 20 20 44 62 62 65   1;.        Dbbe
10ce0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
10cf0 20 20 20 20 20 20 20 69 66 28 20 6e 6f 73 3c 30         if( nos<0
10d00 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
10d10 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20  gh_stack;.      
10d20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c    if( i>=0 && i<
10d30 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 28 70  p->nCursor && (p
10d40 43 72 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69  Crsr = p->aCsr[i
10d50 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b  ].pCursor)!=0 ){
10d60 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
10d70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
10d80 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  newVal;.        
10d90 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20    Integerify(p, 
10da0 6e 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nos);.          
10db0 6e 65 77 56 61 6c 20 3d 20 70 2d 3e 61 53 74 61  newVal = p->aSta
10dc0 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a 20 20 20 20 20  ck[nos].i;.     
10dd0 20 20 20 20 20 69 66 28 20 53 74 72 69 6e 67 69       if( Stringi
10de0 66 79 28 70 2c 20 74 6f 73 29 20 29 20 67 6f 74  fy(p, tos) ) got
10df0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
10e00 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 44 62      r = sqliteDb
10e10 62 65 46 65 74 63 68 28 70 43 72 73 72 2c 20 70  beFetch(pCrsr, p
10e20 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c  ->aStack[tos].n,
10e30 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 29   p->zStack[tos])
10e40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10e50 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
10e60 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
10e70 6e 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 74  new record for t
10e80 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  his index */.   
10e90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44           sqliteD
10ea0 62 62 65 50 75 74 28 70 43 72 73 72 2c 20 70 2d  bbePut(pCrsr, p-
10eb0 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20  >aStack[tos].n, 
10ec0 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 0a  p->zStack[tos],.
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10ef0 28 69 6e 74 29 2c 20 28 63 68 61 72 2a 29 26 6e  (int), (char*)&n
10f00 65 77 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ewVal);.        
10f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10f20 20 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74       /* Extend t
10f30 68 65 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f  he existing reco
10f40 72 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rd */.          
10f50 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 20 20    int nIdx;.    
10f60 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 49 64          int *aId
10f70 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  x;.            i
10f80 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
10f90 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e    .            n
10fa0 49 64 78 20 3d 20 73 71 6c 69 74 65 44 62 62 65  Idx = sqliteDbbe
10fb0 44 61 74 61 4c 65 6e 67 74 68 28 70 43 72 73 72  DataLength(pCrsr
10fc0 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  )/sizeof(int);. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
10fe0 49 64 78 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Idx==1 ){.      
10ff0 20 20 20 20 20 20 20 20 61 49 64 78 20 3d 20 73          aIdx = s
11000 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
11010 65 6f 66 28 69 6e 74 29 2a 34 20 29 3b 0a 20 20  eof(int)*4 );.  
11020 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11030 61 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  aIdx==0 ) goto n
11040 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  o_mem;.         
11050 20 20 20 20 20 61 49 64 78 5b 30 5d 20 3d 20 32       aIdx[0] = 2
11060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11070 73 71 6c 69 74 65 44 62 62 65 43 6f 70 79 44 61  sqliteDbbeCopyDa
11080 74 61 28 70 43 72 73 72 2c 20 30 2c 20 73 69 7a  ta(pCrsr, 0, siz
11090 65 6f 66 28 69 6e 74 29 2c 20 28 63 68 61 72 2a  eof(int), (char*
110a0 29 26 61 49 64 78 5b 31 5d 29 3b 0a 20 20 20 20  )&aIdx[1]);.    
110b0 20 20 20 20 20 20 20 20 20 20 61 49 64 78 5b 32            aIdx[2
110c0 5d 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  ] = newVal;.    
110d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
110e0 44 62 62 65 50 75 74 28 70 43 72 73 72 2c 20 70  DbbePut(pCrsr, p
110f0 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c  ->aStack[tos].n,
11100 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c   p->zStack[tos],
11110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11120 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
11130 2a 34 2c 20 28 63 68 61 72 2a 29 61 49 64 78 29  *4, (char*)aIdx)
11140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11150 73 71 6c 69 74 65 46 72 65 65 28 61 49 64 78 29  sqliteFree(aIdx)
11160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
11170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
11180 20 20 20 61 49 64 78 20 3d 20 28 69 6e 74 2a 29     aIdx = (int*)
11190 73 71 6c 69 74 65 44 62 62 65 52 65 61 64 44 61  sqliteDbbeReadDa
111a0 74 61 28 70 43 72 73 72 2c 20 30 29 3b 0a 20 20  ta(pCrsr, 0);.  
111b0 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20              k = 
111c0 61 49 64 78 5b 30 5d 3b 0a 20 20 20 20 20 20 20  aIdx[0];.       
111d0 20 20 20 20 20 20 20 69 66 28 20 6b 3c 6e 49 64         if( k<nId
111e0 78 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x-1 ){.         
111f0 20 20 20 20 20 20 20 61 49 64 78 5b 6b 2b 31 5d         aIdx[k+1]
11200 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
11210 20 20 20 20 20 20 20 20 20 20 20 61 49 64 78 5b             aIdx[
11220 30 5d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  0]++;.          
11230 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65        sqliteDbbe
11240 50 75 74 28 70 43 72 73 72 2c 20 70 2d 3e 61 53  Put(pCrsr, p->aS
11250 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 70 2d 3e  tack[tos].n, p->
11260 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 0a 20 20 20  zStack[tos],.   
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 49 64   sizeof(int)*nId
11290 78 2c 20 28 63 68 61 72 2a 29 61 49 64 78 29 3b  x, (char*)aIdx);
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
112b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
112c0 20 20 20 20 20 20 6e 49 64 78 20 2a 3d 20 32 3b        nIdx *= 2;
112d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112e0 20 61 49 64 78 20 3d 20 73 71 6c 69 74 65 4d 61   aIdx = sqliteMa
112f0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74  lloc( sizeof(int
11300 29 2a 6e 49 64 78 20 29 3b 0a 20 20 20 20 20 20  )*nIdx );.      
11310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 49            if( aI
11320 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  dx==0 ) goto no_
11330 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mem;.           
11340 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65 43       sqliteDbbeC
11350 6f 70 79 44 61 74 61 28 70 43 72 73 72 2c 20 30  opyData(pCrsr, 0
11360 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6b  , sizeof(int)*(k
11370 2b 31 29 2c 20 28 63 68 61 72 2a 29 61 49 64 78  +1), (char*)aIdx
11380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11390 20 20 20 61 49 64 78 5b 6b 2b 31 5d 20 3d 20 6e     aIdx[k+1] = n
113a0 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  ewVal;.         
113b0 20 20 20 20 20 20 20 61 49 64 78 5b 30 5d 2b 2b         aIdx[0]++
113c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
113d0 20 20 73 71 6c 69 74 65 44 62 62 65 50 75 74 28    sqliteDbbePut(
113e0 70 43 72 73 72 2c 20 70 2d 3e 61 53 74 61 63 6b  pCrsr, p->aStack
113f0 5b 74 6f 73 5d 2e 6e 2c 20 70 2d 3e 7a 53 74 61  [tos].n, p->zSta
11400 63 6b 5b 74 6f 73 5d 2c 0a 20 20 20 20 20 20 20  ck[tos],.       
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11420 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 49 64 78 2c  izeof(int)*nIdx,
11430 20 28 63 68 61 72 2a 29 61 49 64 78 29 3b 0a 20   (char*)aIdx);. 
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11450 71 6c 69 74 65 46 72 65 65 28 61 49 64 78 29 3b  qliteFree(aIdx);
11460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
11470 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 20  .            }  
11480 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
11490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
114a0 20 7d 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74   }.        PopSt
114b0 61 63 6b 28 70 2c 20 32 29 3b 0a 20 20 20 20 20  ack(p, 2);.     
114c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
114d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  }..      /* Opco
114e0 64 65 3a 20 44 65 6c 65 74 65 49 64 78 20 50 31  de: DeleteIdx P1
114f0 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   * *.      **.  
11500 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
11510 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 61  f the stack is a
11520 20 6b 65 79 20 61 6e 64 20 6e 65 78 74 20 6f 6e   key and next on
11530 20 73 74 61 63 6b 20 69 73 20 69 6e 74 65 67 65   stack is intege
11540 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68  r.      ** which
11550 20 69 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61   is the key to a
11560 20 72 65 63 6f 72 64 20 69 6e 20 61 6e 20 53 51   record in an SQ
11570 4c 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  L table..      *
11580 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 72 65 63  * Locate the rec
11590 6f 72 64 20 69 6e 20 74 68 65 20 63 75 72 73 6f  ord in the curso
115a0 72 20 50 31 20 28 50 31 20 72 65 70 72 65 73 65  r P1 (P1 represe
115b0 6e 74 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  nts an SQL index
115c0 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
115d0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6b 65 79  has the same key
115e0 20 61 73 20 74 68 65 20 74 6f 70 20 6f 66 20 73   as the top of s
115f0 74 61 63 6b 2e 20 20 54 68 65 6e 20 6c 6f 6f 6b  tack.  Then look
11600 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 20 2a   through.      *
11610 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 61  * the integer ta
11620 62 6c 65 2d 6b 65 79 73 20 63 6f 6e 74 61 69 6e  ble-keys contain
11630 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 20 6f  ed in the data o
11640 66 20 74 68 65 20 50 31 20 72 65 63 6f 72 64 2e  f the P1 record.
11650 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  .      ** Remove
11660 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 61 62   the integer tab
11670 6c 65 2d 6b 65 79 20 74 68 61 74 20 6d 61 74 63  le-key that matc
11680 68 65 73 20 74 68 65 20 4e 4f 53 20 61 6e 64 20  hes the NOS and 
11690 77 72 69 74 65 20 74 68 65 0a 20 20 20 20 20 20  write the.      
116a0 2a 2a 20 72 65 76 69 73 65 64 20 64 61 74 61 20  ** revised data 
116b0 62 61 63 6b 20 74 6f 20 50 31 20 77 69 74 68 20  back to P1 with 
116c0 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20 20  the same key..  
116d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
116e0 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
116f0 72 65 6d 6f 76 65 73 20 74 68 65 20 76 65 72 79  removes the very
11700 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 74 61   last integer ta
11710 62 6c 65 2d 6b 65 79 20 66 72 6f 6d 0a 20 20 20  ble-key from.   
11720 20 20 20 2a 2a 20 74 68 65 20 50 31 20 64 61 74     ** the P1 dat
11730 61 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  a, then the corr
11740 65 73 70 6f 6e 64 69 6e 67 20 50 31 20 72 65 63  esponding P1 rec
11750 6f 72 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ord is deleted..
11760 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
11770 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 49 64 78  ase OP_DeleteIdx
11780 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
11790 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  i = pOp->p1;.   
117a0 20 20 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 70       int tos = p
117b0 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69  ->tos;.        i
117c0 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31  nt nos = tos - 1
117d0 3b 0a 20 20 20 20 20 20 20 20 44 62 62 65 43 75  ;.        DbbeCu
117e0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 20  rsor *pCrsr;.   
117f0 20 20 20 20 20 69 66 28 20 6e 6f 73 3c 30 20 29       if( nos<0 )
11800 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
11810 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  _stack;.        
11820 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  if( i>=0 && i<p-
11830 3e 6e 43 75 72 73 6f 72 20 26 26 20 28 70 43 72  >nCursor && (pCr
11840 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e  sr = p->aCsr[i].
11850 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20  pCursor)!=0 ){. 
11860 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 49           int *aI
11870 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  dx;.          in
11880 74 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 20 20  t nIdx;.        
11890 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20    int j, k;.    
118a0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
118b0 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 56 61         int oldVa
118c0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 49 6e 74  l;.          Int
118d0 65 67 65 72 69 66 79 28 70 2c 20 6e 6f 73 29 3b  egerify(p, nos);
118e0 0a 20 20 20 20 20 20 20 20 20 20 6f 6c 64 56 61  .          oldVa
118f0 6c 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f  l = p->aStack[no
11900 73 5d 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20  s].i;.          
11910 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
11920 20 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f   tos) ) goto no_
11930 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  mem;.          r
11940 20 3d 20 73 71 6c 69 74 65 44 62 62 65 46 65 74   = sqliteDbbeFet
11950 63 68 28 70 43 72 73 72 2c 20 70 2d 3e 61 53 74  ch(pCrsr, p->aSt
11960 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 70 2d 3e 7a  ack[tos].n, p->z
11970 53 74 61 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 20  Stack[tos]);.   
11980 20 20 20 20 20 20 20 69 66 28 20 72 3d 3d 30 20         if( r==0 
11990 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
119a0 20 20 20 6e 49 64 78 20 3d 20 73 71 6c 69 74 65     nIdx = sqlite
119b0 44 62 62 65 44 61 74 61 4c 65 6e 67 74 68 28 70  DbbeDataLength(p
119c0 43 72 73 72 29 2f 73 69 7a 65 6f 66 28 69 6e 74  Crsr)/sizeof(int
119d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 49 64  );.          aId
119e0 78 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  x = (int*)sqlite
119f0 44 62 62 65 52 65 61 64 44 61 74 61 28 70 43 72  DbbeReadData(pCr
11a00 73 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  sr, 0);.        
11a10 20 20 69 66 28 20 28 6e 49 64 78 3d 3d 31 20 26    if( (nIdx==1 &
11a20 26 20 61 49 64 78 5b 30 5d 3d 3d 6f 6c 64 56 61  & aIdx[0]==oldVa
11a30 6c 29 20 7c 7c 20 28 61 49 64 78 5b 30 5d 3d 3d  l) || (aIdx[0]==
11a40 31 20 26 26 20 61 49 64 78 5b 31 5d 3d 3d 6f 6c  1 && aIdx[1]==ol
11a50 64 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  dVal) ){.       
11a60 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65 44       sqliteDbbeD
11a70 65 6c 65 74 65 28 70 43 72 73 72 2c 20 70 2d 3e  elete(pCrsr, p->
11a80 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 70  aStack[tos].n, p
11a90 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 3b 0a  ->zStack[tos]);.
11aa0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
11ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
11ac0 20 61 49 64 78 5b 30 5d 3b 0a 20 20 20 20 20 20   aIdx[0];.      
11ad0 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
11ae0 3c 3d 6b 20 26 26 20 61 49 64 78 5b 6a 5d 21 3d  <=k && aIdx[j]!=
11af0 6f 6c 64 56 61 6c 3b 20 6a 2b 2b 29 7b 7d 0a 20  oldVal; j++){}. 
11b00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
11b10 3e 6b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >k ) break;.    
11b20 20 20 20 20 20 20 20 20 61 49 64 78 5b 6a 5d 20          aIdx[j] 
11b30 3d 20 61 49 64 78 5b 6b 5d 3b 0a 20 20 20 20 20  = aIdx[k];.     
11b40 20 20 20 20 20 20 20 61 49 64 78 5b 6b 5d 20 3d         aIdx[k] =
11b50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
11b60 61 49 64 78 5b 30 5d 2d 2d 3b 0a 20 20 20 20 20  aIdx[0]--;.     
11b70 20 20 20 20 20 20 20 69 66 28 20 61 49 64 78 5b         if( aIdx[
11b80 30 5d 2a 33 20 2b 20 31 20 3c 20 6e 49 64 78 20  0]*3 + 1 < nIdx 
11b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11ba0 20 6e 49 64 78 20 2f 3d 20 32 3b 0a 20 20 20 20   nIdx /= 2;.    
11bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11bc0 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65        sqliteDbbe
11bd0 50 75 74 28 70 43 72 73 72 2c 20 70 2d 3e 61 53  Put(pCrsr, p->aS
11be0 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 70 2d 3e  tack[tos].n, p->
11bf0 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 0a 20 20  zStack[tos], .  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
11c20 6e 74 29 2a 6e 49 64 78 2c 20 28 63 68 61 72 2a  nt)*nIdx, (char*
11c30 29 61 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20  )aIdx);.        
11c40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
11c50 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70        PopStack(p
11c60 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 2);.        br
11c70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
11c80 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 44      /* Opcode: D
11c90 65 73 74 72 6f 79 20 2a 20 2a 20 50 33 0a 20 20  estroy * * P3.  
11ca0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
11cb0 44 72 6f 70 20 74 68 65 20 64 69 73 6b 20 66 69  Drop the disk fi
11cc0 6c 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73  le whose name is
11cd0 20 50 33 2e 20 20 41 6c 6c 20 6b 65 79 2f 64 61   P3.  All key/da
11ce0 74 61 20 70 61 69 72 73 20 69 6e 0a 20 20 20 20  ta pairs in.    
11cf0 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 61 72    ** the file ar
11d00 65 20 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68  e deleted and th
11d10 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
11d20 20 72 65 6d 6f 76 65 64 0a 20 20 20 20 20 20 2a   removed.      *
11d30 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  * from the disk.
11d40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11d50 63 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a  case OP_Destroy:
11d60 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
11d70 65 44 62 62 65 44 72 6f 70 54 61 62 6c 65 28 70  eDbbeDropTable(p
11d80 2d 3e 70 42 65 2c 20 70 4f 70 2d 3e 70 33 29 3b  ->pBe, pOp->p3);
11d90 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11da0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11db0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 72 67 61  * Opcode: Reorga
11dc0 6e 69 7a 65 20 2a 20 2a 20 50 33 0a 20 20 20 20  nize * * P3.    
11dd0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f    **.      ** Co
11de0 6d 70 72 65 73 73 2c 20 6f 70 74 69 6d 69 7a 65  mpress, optimize
11df0 2c 20 61 6e 64 20 74 69 64 79 20 75 70 20 74 68  , and tidy up th
11e00 65 20 47 44 42 4d 20 66 69 6c 65 20 6e 61 6d 65  e GDBM file name
11e10 64 20 62 79 20 50 33 2e 0a 20 20 20 20 20 20 2a  d by P3..      *
11e20 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
11e30 52 65 6f 72 67 61 6e 69 7a 65 3a 20 7b 0a 20 20  Reorganize: {.  
11e40 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62 65        sqliteDbbe
11e50 52 65 6f 72 67 61 6e 69 7a 65 54 61 62 6c 65 28  ReorganizeTable(
11e60 70 2d 3e 70 42 65 2c 20 70 4f 70 2d 3e 70 33 29  p->pBe, pOp->p3)
11e70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
11e80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11e90 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73 74 4f  /* Opcode: ListO
11ea0 70 65 6e 20 50 31 20 2a 20 2a 0a 20 20 20 20 20  pen P1 * *.     
11eb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65   **.      ** Ope
11ec0 6e 20 61 20 66 69 6c 65 20 75 73 65 64 20 66 6f  n a file used fo
11ed0 72 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  r temporary stor
11ee0 61 67 65 20 6f 66 20 69 6e 74 65 67 65 72 20 74  age of integer t
11ef0 61 62 6c 65 20 6b 65 79 73 2e 20 20 50 31 0a 20  able keys.  P1. 
11f00 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 65 72       ** will ser
11f10 76 65 72 20 61 73 20 61 20 68 61 6e 64 6c 65 20  ver as a handle 
11f20 74 6f 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  to this temporar
11f30 79 20 66 69 6c 65 20 66 6f 72 20 66 75 74 75 72  y file for futur
11f40 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72  e.      ** inter
11f50 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 61 6e 6f  actions.  If ano
11f60 74 68 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ther temporary f
11f70 69 6c 65 20 77 69 74 68 20 74 68 65 20 50 31 20  ile with the P1 
11f80 68 61 6e 64 6c 65 20 69 73 0a 20 20 20 20 20 20  handle is.      
11f90 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  ** already opene
11fa0 64 2c 20 74 68 65 20 70 72 69 6f 72 20 66 69 6c  d, the prior fil
11fb0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
11fc0 61 20 6e 65 77 20 6f 6e 65 20 6f 70 65 6e 65 64  a new one opened
11fd0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 74 73  .      ** in its
11fe0 20 70 6c 61 63 65 2e 0a 20 20 20 20 20 20 2a 2f   place..      */
11ff0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  .      case OP_L
12000 69 73 74 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  istOpen: {.     
12010 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e     int i = pOp->
12020 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p1;.        if( 
12030 69 3c 30 20 29 20 67 6f 74 6f 20 62 61 64 5f 69  i<0 ) goto bad_i
12040 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20 20 20  nstruction;.    
12050 20 20 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c      if( i>=p->nL
12060 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
12070 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
12080 20 20 70 2d 3e 61 70 4c 69 73 74 20 3d 20 73 71    p->apList = sq
12090 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
120a0 61 70 4c 69 73 74 2c 20 28 69 2b 31 29 2a 73 69  apList, (i+1)*si
120b0 7a 65 6f 66 28 46 49 4c 45 2a 29 20 29 3b 0a 20  zeof(FILE*) );. 
120c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
120d0 61 70 4c 69 73 74 3d 3d 30 20 29 7b 20 70 2d 3e  apList==0 ){ p->
120e0 6e 4c 69 73 74 20 3d 20 30 3b 20 67 6f 74 6f 20  nList = 0; goto 
120f0 6e 6f 5f 6d 65 6d 3b 20 7d 0a 20 20 20 20 20 20  no_mem; }.      
12100 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4c 69      for(j=p->nLi
12110 73 74 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b 29 20 70  st; j<=i; j++) p
12120 2d 3e 61 70 4c 69 73 74 5b 6a 5d 20 3d 20 30 3b  ->apList[j] = 0;
12130 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c  .          p->nL
12140 69 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20  ist = i+1;.     
12150 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
12160 61 70 4c 69 73 74 5b 69 5d 20 29 7b 0a 20 20 20  apList[i] ){.   
12170 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 62 62         sqliteDbb
12180 65 43 6c 6f 73 65 54 65 6d 70 46 69 6c 65 28 70  eCloseTempFile(p
12190 2d 3e 70 42 65 2c 20 70 2d 3e 61 70 4c 69 73 74  ->pBe, p->apList
121a0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
121b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
121c0 69 74 65 44 62 62 65 4f 70 65 6e 54 65 6d 70 46  iteDbbeOpenTempF
121d0 69 6c 65 28 70 2d 3e 70 42 65 2c 20 26 70 2d 3e  ile(p->pBe, &p->
121e0 61 70 4c 69 73 74 5b 69 5d 29 3b 0a 20 20 20 20  apList[i]);.    
121f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12210 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
12220 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 75 6e  ng(pzErrMsg, "un
12230 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
12240 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 22 2c 20  emporary file", 
12250 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
12260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12270 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
12280 70 63 6f 64 65 3a 20 4c 69 73 74 57 72 69 74 65  pcode: ListWrite
12290 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a   P1 * *.      **
122a0 0a 20 20 20 20 20 20 2a 2a 20 57 72 69 74 65 20  .      ** Write 
122b0 74 68 65 20 69 6e 74 65 67 65 72 20 6f 6e 20 74  the integer on t
122c0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
122d0 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ack.      ** int
122e0 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
122f0 73 74 6f 72 61 67 65 20 66 69 6c 65 20 50 31 2e  storage file P1.
12300 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12310 63 61 73 65 20 4f 50 5f 4c 69 73 74 57 72 69 74  case OP_ListWrit
12320 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e: {.        int
12330 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
12340 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
12350 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63  goto bad_instruc
12360 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
12370 28 20 70 2d 3e 74 6f 73 3c 30 20 29 20 67 6f 74  ( p->tos<0 ) got
12380 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
12390 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ck;.        if( 
123a0 69 3c 70 2d 3e 6e 4c 69 73 74 20 26 26 20 70 2d  i<p->nList && p-
123b0 3e 61 70 4c 69 73 74 5b 69 5d 21 3d 30 20 29 7b  >apList[i]!=0 ){
123c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
123d0 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 49 6e  al;.          In
123e0 74 65 67 65 72 69 66 79 28 70 2c 20 70 2d 3e 74  tegerify(p, p->t
123f0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 76  os);.          v
12400 61 6c 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 70  al = p->aStack[p
12410 2d 3e 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 20 20  ->tos].i;.      
12420 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20      PopStack(p, 
12430 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 77  1);.          fw
12440 72 69 74 65 28 26 76 61 6c 2c 20 73 69 7a 65 6f  rite(&val, sizeo
12450 66 28 69 6e 74 29 2c 20 31 2c 20 70 2d 3e 61 70  f(int), 1, p->ap
12460 4c 69 73 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  List[i]);.      
12470 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
12480 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
12490 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73    /* Opcode: Lis
124a0 74 52 65 77 69 6e 64 20 50 31 20 2a 20 2a 0a 20  tRewind P1 * *. 
124b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
124c0 20 52 65 77 69 6e 64 20 74 68 65 20 74 65 6d 70   Rewind the temp
124d0 6f 72 61 72 79 20 62 75 66 66 65 72 20 50 31 20  orary buffer P1 
124e0 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
124f0 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  nning..      */.
12500 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 69        case OP_Li
12510 73 74 52 65 77 69 6e 64 3a 20 7b 0a 20 20 20 20  stRewind: {.    
12520 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d      int i = pOp-
12530 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >p1;.        if(
12540 20 69 3c 30 20 29 20 67 6f 74 6f 20 62 61 64 5f   i<0 ) goto bad_
12550 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20 20  instruction;.   
12560 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4c       if( i<p->nL
12570 69 73 74 20 26 26 20 70 2d 3e 61 70 4c 69 73 74  ist && p->apList
12580 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]!=0 ){.      
12590 20 20 20 20 72 65 77 69 6e 64 28 70 2d 3e 61 70      rewind(p->ap
125a0 4c 69 73 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  List[i]);.      
125b0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
125c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
125d0 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73    /* Opcode: Lis
125e0 74 52 65 61 64 20 50 31 20 50 32 20 2a 0a 20 20  tRead P1 P2 *.  
125f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
12600 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  Attempt to read 
12610 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  an integer from 
12620 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
12630 65 20 62 75 66 66 65 72 20 50 31 0a 20 20 20 20  e buffer P1.    
12640 20 20 2a 2a 20 61 6e 64 20 70 75 73 68 20 69 74    ** and push it
12650 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
12660 20 20 49 66 20 74 68 65 20 73 74 6f 72 61 67 65    If the storage
12670 20 62 75 66 66 65 72 20 69 73 20 65 6d 70 74 79   buffer is empty
12680 2c 20 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68  , .      ** push
12690 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 69 6e 73   nothing but ins
126a0 74 65 61 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e  tead jump to P2.
126b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
126c0 63 61 73 65 20 4f 50 5f 4c 69 73 74 52 65 61 64  case OP_ListRead
126d0 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
126e0 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  i = pOp->p1;.   
126f0 20 20 20 20 20 69 6e 74 20 76 61 6c 2c 20 61 6d       int val, am
12700 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  t;.        if( i
12710 3c 30 20 7c 7c 20 69 3e 3d 70 2d 3e 6e 4c 69 73  <0 || i>=p->nLis
12720 74 20 7c 7c 20 70 2d 3e 61 70 4c 69 73 74 5b 69  t || p->apList[i
12730 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 62 61 64 5f  ]==0 ) goto bad_
12740 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20 20  instruction;.   
12750 20 20 20 20 20 61 6d 74 20 3d 20 66 72 65 61 64       amt = fread
12760 28 26 76 61 6c 2c 20 73 69 7a 65 6f 66 28 69 6e  (&val, sizeof(in
12770 74 29 2c 20 31 2c 20 70 2d 3e 61 70 4c 69 73 74  t), 1, p->apList
12780 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
12790 28 20 61 6d 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( amt==1 ){.    
127a0 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a        p->tos++;.
127b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 65            if( Ne
127c0 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f  edStack(p, p->to
127d0 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  s) ) goto no_mem
127e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
127f0 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69 20  Stack[p->tos].i 
12800 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  = val;.         
12810 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 74 6f   p->aStack[p->to
12820 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49  s].flags = STK_I
12830 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  nt;.          p-
12840 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20  >zStack[p->tos] 
12850 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12860 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  se{.          pc
12870 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
12880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
128a0 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
128b0 65 3a 20 4c 69 73 74 43 6c 6f 73 65 20 50 31 20  e: ListClose P1 
128c0 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  * *.      **.   
128d0 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20     ** Close the 
128e0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
128f0 65 20 62 75 66 66 65 72 20 61 6e 64 20 64 69 73  e buffer and dis
12900 63 61 72 64 20 69 74 73 20 63 6f 6e 74 65 6e 74  card its content
12910 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
12920 20 20 63 61 73 65 20 4f 50 5f 4c 69 73 74 43 6c    case OP_ListCl
12930 6f 73 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ose: {.        i
12940 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
12950 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
12960 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72  ) goto bad_instr
12970 75 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  uction;.        
12980 69 66 28 20 69 3c 70 2d 3e 6e 4c 69 73 74 20 26  if( i<p->nList &
12990 26 20 70 2d 3e 61 70 4c 69 73 74 5b 69 5d 21 3d  & p->apList[i]!=
129a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
129b0 71 6c 69 74 65 44 62 62 65 43 6c 6f 73 65 54 65  qliteDbbeCloseTe
129c0 6d 70 46 69 6c 65 28 70 2d 3e 70 42 65 2c 20 70  mpFile(p->pBe, p
129d0 2d 3e 61 70 4c 69 73 74 5b 69 5d 29 3b 0a 20 20  ->apList[i]);.  
129e0 20 20 20 20 20 20 20 20 70 2d 3e 61 70 4c 69 73          p->apLis
129f0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[i] = 0;.      
12a00 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
12a10 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
12a20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72    /* Opcode: Sor
12a30 74 4f 70 65 6e 20 50 31 20 2a 20 2a 0a 20 20 20  tOpen P1 * *.   
12a40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
12a50 72 65 61 74 65 20 61 20 6e 65 77 20 73 6f 72 74  reate a new sort
12a60 65 72 20 77 69 74 68 20 69 6e 64 65 78 20 50 31  er with index P1
12a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12a80 63 61 73 65 20 4f 50 5f 53 6f 72 74 4f 70 65 6e  case OP_SortOpen
12a90 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
12aa0 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  i = pOp->p1;.   
12ab0 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 67       if( i<0 ) g
12ac0 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74  oto bad_instruct
12ad0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
12ae0 20 69 3e 3d 70 2d 3e 6e 53 6f 72 74 20 29 7b 0a   i>=p->nSort ){.
12af0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
12b00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
12b10 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 52 65 61  Sort = sqliteRea
12b20 6c 6c 6f 63 28 20 70 2d 3e 61 70 53 6f 72 74 2c  lloc( p->apSort,
12b30 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 53 6f   (i+1)*sizeof(So
12b40 72 74 65 72 2a 29 20 29 3b 0a 20 20 20 20 20 20  rter*) );.      
12b50 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 6f 72      if( p->apSor
12b60 74 3d 3d 30 20 29 7b 20 70 2d 3e 6e 53 6f 72 74  t==0 ){ p->nSort
12b70 20 3d 20 30 3b 20 67 6f 74 6f 20 6e 6f 5f 6d 65   = 0; goto no_me
12b80 6d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66  m; }.          f
12b90 6f 72 28 6a 3d 70 2d 3e 6e 53 6f 72 74 3b 20 6a  or(j=p->nSort; j
12ba0 3c 3d 69 3b 20 6a 2b 2b 29 20 70 2d 3e 61 70 53  <=i; j++) p->apS
12bb0 6f 72 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ort[j] = 0;.    
12bc0 20 20 20 20 20 20 70 2d 3e 6e 53 6f 72 74 20 3d        p->nSort =
12bd0 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i+1;.        }.
12be0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12bf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
12c00 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 50 75 74   Opcode: SortPut
12c10 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a   P1 * *.      **
12c20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 54 4f  .      ** The TO
12c30 53 20 69 73 20 74 68 65 20 6b 65 79 20 61 6e 64  S is the key and
12c40 20 74 68 65 20 4e 4f 53 20 69 73 20 74 68 65 20   the NOS is the 
12c50 64 61 74 61 2e 20 20 50 6f 70 20 62 6f 74 68 20  data.  Pop both 
12c60 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 0a 20  from the stack. 
12c70 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 75 74 20       ** and put 
12c80 74 68 65 6d 20 6f 6e 20 74 68 65 20 73 6f 72 74  them on the sort
12c90 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
12ca0 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 50     case OP_SortP
12cb0 75 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  ut: {.        in
12cc0 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
12cd0 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20 3d         int tos =
12ce0 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20   p->tos;.       
12cf0 20 69 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d   int nos = tos -
12d00 20 31 3b 0a 20 20 20 20 20 20 20 20 53 6f 72 74   1;.        Sort
12d10 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20 20  er *pSorter;.   
12d20 20 20 20 20 20 69 66 28 20 69 3c 30 20 7c 7c 20       if( i<0 || 
12d30 69 3e 3d 70 2d 3e 6e 53 6f 72 74 20 29 20 67 6f  i>=p->nSort ) go
12d40 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69  to bad_instructi
12d50 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
12d60 74 6f 73 3c 31 20 29 20 67 6f 74 6f 20 6e 6f 74  tos<1 ) goto not
12d70 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20  _enough_stack;. 
12d80 20 20 20 20 20 20 20 69 66 28 20 53 74 72 69 6e         if( Strin
12d90 67 69 66 79 28 70 2c 20 74 6f 73 29 20 7c 7c 20  gify(p, tos) || 
12da0 53 74 72 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73  Stringify(p, nos
12db0 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
12dc0 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72  .        pSorter
12dd0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
12de0 20 73 69 7a 65 6f 66 28 53 6f 72 74 65 72 29 20   sizeof(Sorter) 
12df0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12e00 53 6f 72 74 65 72 3d 3d 30 20 29 20 67 6f 74 6f  Sorter==0 ) goto
12e10 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20   no_mem;.       
12e20 20 70 53 6f 72 74 65 72 2d 3e 70 4e 65 78 74 20   pSorter->pNext 
12e30 3d 20 70 2d 3e 61 70 53 6f 72 74 5b 69 5d 3b 0a  = p->apSort[i];.
12e40 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 6f 72          p->apSor
12e50 74 5b 69 5d 20 3d 20 70 53 6f 72 74 65 72 3b 0a  t[i] = pSorter;.
12e60 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d          pSorter-
12e70 3e 6e 4b 65 79 20 3d 20 70 2d 3e 61 53 74 61 63  >nKey = p->aStac
12e80 6b 5b 74 6f 73 5d 2e 6e 3b 0a 20 20 20 20 20 20  k[tos].n;.      
12e90 20 20 70 53 6f 72 74 65 72 2d 3e 7a 4b 65 79 20    pSorter->zKey 
12ea0 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d  = p->zStack[tos]
12eb0 3b 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74 65  ;.        pSorte
12ec0 72 2d 3e 6e 44 61 74 61 20 3d 20 70 2d 3e 61 53  r->nData = p->aS
12ed0 74 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b 0a 20 20 20  tack[nos].n;.   
12ee0 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70 44       pSorter->pD
12ef0 61 74 61 20 3d 20 70 2d 3e 7a 53 74 61 63 6b 5b  ata = p->zStack[
12f00 6e 6f 73 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d  nos];.        p-
12f10 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  >aStack[tos].fla
12f20 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  gs = 0;.        
12f30 70 2d 3e 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66  p->aStack[nos].f
12f40 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
12f50 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d    p->zStack[tos]
12f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
12f70 3e 7a 53 74 61 63 6b 5b 6e 6f 73 5d 20 3d 20 30  >zStack[nos] = 0
12f80 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73  ;.        p->tos
12f90 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 62   -= 2;.        b
12fa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
12fb0 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20       /* Opcode: 
12fc0 53 6f 72 74 4d 61 6b 65 52 65 63 20 50 31 20 2a  SortMakeRec P1 *
12fd0 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
12fe0 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 50 31 20    ** The top P1 
12ff0 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  elements are the
13000 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20   arguments to a 
13010 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 6d 20  callback.  Form 
13020 74 68 65 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  these.      ** e
13030 6c 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73  lements into a s
13040 69 6e 67 6c 65 20 64 61 74 61 20 65 6e 74 72 79  ingle data entry
13050 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   that can be sto
13060 72 65 64 20 6f 6e 20 61 20 73 6f 72 74 65 72 0a  red on a sorter.
13070 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 53        ** using S
13080 6f 72 74 50 75 74 20 61 6e 64 20 6c 61 74 65 72  ortPut and later
13090 20 66 65 64 20 74 6f 20 61 20 63 61 6c 6c 62 61   fed to a callba
130a0 63 6b 20 75 73 69 6e 67 20 53 6f 72 74 43 61 6c  ck using SortCal
130b0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  lback..      */.
130c0 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
130d0 72 74 4d 61 6b 65 52 65 63 3a 20 7b 0a 20 20 20  rtMakeRec: {.   
130e0 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
130f0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 41        char **azA
13100 72 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rg;.        int 
13110 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
13120 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20  nt nField;.     
13130 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20     int i, j;..  
13140 20 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70        nField = p
13150 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20  Op->p1;.        
13160 69 66 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69  if( p->tos+1<nFi
13170 65 6c 64 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  eld ) goto not_e
13180 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20  nough_stack;.   
13190 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a       nByte = 0;.
131a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d          for(i=p-
131b0 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69  >tos-nField+1; i
131c0 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a  <=p->tos; i++){.
131d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
131e0 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ->aStack[i].flag
131f0 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30  s & STK_Null)==0
13200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13210 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
13220 20 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65   i) ) goto no_me
13230 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  m;.            n
13240 42 79 74 65 20 2b 3d 20 70 2d 3e 61 53 74 61 63  Byte += p->aStac
13250 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 20 20 20 20  k[i].n;.        
13260 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
13270 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
13280 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 6e 46  izeof(char*)*(nF
13290 69 65 6c 64 2b 31 29 3b 0a 20 20 20 20 20 20 20  ield+1);.       
132a0 20 61 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 4d   azArg = sqliteM
132b0 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
132c0 20 20 20 20 20 20 20 20 69 66 28 20 61 7a 41 72          if( azAr
132d0 67 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  g==0 ) goto no_m
132e0 65 6d 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  em;.        z = 
132f0 28 63 68 61 72 2a 29 26 61 7a 41 72 67 5b 6e 46  (char*)&azArg[nF
13300 69 65 6c 64 2b 31 5d 3b 0a 20 20 20 20 20 20 20  ield+1];.       
13310 20 66 6f 72 28 6a 3d 30 2c 20 69 3d 70 2d 3e 74   for(j=0, i=p->t
13320 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
13330 70 2d 3e 74 6f 73 3b 20 69 2b 2b 2c 20 6a 2b 2b  p->tos; i++, j++
13340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13350 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c   p->aStack[i].fl
13360 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29  ags & STK_Null )
13370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
13380 41 72 67 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Arg[j] = 0;.    
13390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
133a0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 6a           azArg[j
133b0 5d 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 20  ] = z;.         
133c0 20 20 20 73 74 72 63 70 79 28 7a 2c 20 70 2d 3e     strcpy(z, p->
133d0 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 20 20  zStack[i]);.    
133e0 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 70 2d 3e          z += p->
133f0 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20  aStack[i].n;.   
13400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13410 20 7d 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74   }.        PopSt
13420 61 63 6b 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a  ack(p, nField);.
13430 20 20 20 20 20 20 20 20 4e 65 65 64 53 74 61 63          NeedStac
13440 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a  k(p, p->tos+1);.
13450 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b          p->tos++
13460 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  ;.        p->aSt
13470 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20  ack[p->tos].n = 
13480 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70  nByte;.        p
13490 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d  ->zStack[p->tos]
134a0 20 3d 20 28 63 68 61 72 2a 29 61 7a 41 72 67 3b   = (char*)azArg;
134b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61  .        p->aSta
134c0 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73  ck[p->tos].flags
134d0 20 3d 20 53 54 4b 5f 53 74 72 7c 53 54 4b 5f 44   = STK_Str|STK_D
134e0 79 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  yn;.        brea
134f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
13500 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72    /* Opcode: Sor
13510 74 4d 61 6b 65 4b 65 79 20 50 31 20 2a 20 50 33  tMakeKey P1 * P3
13520 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13530 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 74  ** Convert the t
13540 6f 70 20 66 65 77 20 65 6e 74 72 69 65 73 20 6f  op few entries o
13550 66 20 74 68 65 20 73 74 61 63 6b 20 69 6e 74 6f  f the stack into
13560 20 61 20 73 6f 72 74 20 6b 65 79 2e 20 20 54 68   a sort key.  Th
13570 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
13580 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69  r of stack entri
13590 65 73 20 63 6f 6e 73 75 6d 65 64 20 69 73 20 74  es consumed is t
135a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
135b0 72 61 63 74 65 72 73 20 69 6e 20 0a 20 20 20 20  racters in .    
135c0 20 20 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20    ** the string 
135d0 50 33 2e 20 20 4f 6e 65 20 63 68 61 72 61 63 74  P3.  One charact
135e0 65 72 20 66 72 6f 6d 20 50 33 20 69 73 20 70 72  er from P3 is pr
135f0 65 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  epended to each 
13600 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 2a 2a 20  entry..      ** 
13610 54 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  The first charac
13620 74 65 72 20 6f 66 20 50 33 20 69 73 20 70 72 65  ter of P3 is pre
13630 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6c  pended to the el
13640 65 6d 65 6e 74 20 6c 6f 77 65 73 74 20 69 6e 0a  ement lowest in.
13650 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61        ** the sta
13660 63 6b 20 61 6e 64 20 74 68 65 20 6c 61 73 74 20  ck and the last 
13670 63 68 61 72 61 63 74 65 72 20 6f 66 20 50 33 20  character of P3 
13680 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
13690 68 65 20 74 6f 70 20 6f 66 0a 20 20 20 20 20 20  he top of.      
136a0 2a 2a 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41  ** the stack.  A
136b0 6c 6c 20 73 74 61 63 6b 20 65 6e 74 72 69 65 73  ll stack entries
136c0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
136d0 79 20 61 20 5c 30 30 30 20 63 68 61 72 61 63 74  y a \000 charact
136e0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  er.      ** in t
136f0 68 65 20 72 65 73 75 6c 74 2e 20 20 54 68 65 20  he result.  The 
13700 77 68 6f 6c 65 20 6b 65 79 20 69 73 20 74 65 72  whole key is ter
13710 6d 69 6e 61 74 65 64 20 62 79 20 74 77 6f 20 5c  minated by two \
13720 30 30 30 20 63 68 61 72 61 63 74 65 72 73 0a 20  000 characters. 
13730 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 72 6f 77       ** in a row
13740 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
13750 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65   ** See also the
13760 20 4d 61 6b 65 4b 65 79 20 6f 70 63 6f 64 65 2e   MakeKey opcode.
13770 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13780 63 61 73 65 20 4f 50 5f 53 6f 72 74 4d 61 6b 65  case OP_SortMake
13790 4b 65 79 3a 20 7b 0a 20 20 20 20 20 20 20 20 63  Key: {.        c
137a0 68 61 72 20 2a 7a 4e 65 77 4b 65 79 3b 0a 20 20  har *zNewKey;.  
137b0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
137c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69  .        int nFi
137d0 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  eld;.        int
137e0 20 69 2c 20 6a 2c 20 6b 3b 0a 0a 20 20 20 20 20   i, j, k;..     
137f0 20 20 20 6e 46 69 65 6c 64 20 3d 20 73 74 72 6c     nField = strl
13800 65 6e 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  en(pOp->p3);.   
13810 20 20 20 20 20 69 66 28 20 70 2d 3e 74 6f 73 2b       if( p->tos+
13820 31 3c 6e 46 69 65 6c 64 20 29 20 67 6f 74 6f 20  1<nField ) goto 
13830 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
13840 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20  ;.        nByte 
13850 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 1;.        for
13860 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64  (i=p->tos-nField
13870 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69  +1; i<=p->tos; i
13880 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
13890 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20  f( Stringify(p, 
138a0 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  i) ) goto no_mem
138b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ;.          nByt
138c0 65 20 2b 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69  e += p->aStack[i
138d0 5d 2e 6e 2b 32 3b 0a 20 20 20 20 20 20 20 20 7d  ].n+2;.        }
138e0 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4b 65 79  .        zNewKey
138f0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
13900 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20 20   nByte );.      
13910 20 20 69 66 28 20 7a 4e 65 77 4b 65 79 3d 3d 30    if( zNewKey==0
13920 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
13930 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
13940 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
13950 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 74        for(i=p->t
13960 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
13970 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20  p->tos; i++){.  
13980 20 20 20 20 20 20 20 20 7a 4e 65 77 4b 65 79 5b          zNewKey[
13990 6a 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 33 5b 6b  j++] = pOp->p3[k
139a0 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ++];.          m
139b0 65 6d 63 70 79 28 26 7a 4e 65 77 4b 65 79 5b 6a  emcpy(&zNewKey[j
139c0 5d 2c 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 2c  ], p->zStack[i],
139d0 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d   p->aStack[i].n-
139e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20  1);.          j 
139f0 2b 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e  += p->aStack[i].
13a00 6e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  n-1;.          z
13a10 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20 3d 20 30 3b  NewKey[j++] = 0;
13a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13a30 20 20 20 7a 4e 65 77 4b 65 79 5b 6a 5d 20 3d 20     zNewKey[j] = 
13a40 30 3b 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74  0;.        PopSt
13a50 61 63 6b 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a  ack(p, nField);.
13a60 20 20 20 20 20 20 20 20 4e 65 65 64 53 74 61 63          NeedStac
13a70 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a  k(p, p->tos+1);.
13a80 20 20 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b          p->tos++
13a90 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  ;.        p->aSt
13aa0 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20  ack[p->tos].n = 
13ab0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70  nByte;.        p
13ac0 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d  ->aStack[p->tos]
13ad0 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72  .flags = STK_Str
13ae0 7c 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20  |STK_Dyn;.      
13af0 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74    p->zStack[p->t
13b00 6f 73 5d 20 3d 20 7a 4e 65 77 4b 65 79 3b 0a 20  os] = zNewKey;. 
13b10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13b20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13b30 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20  Opcode: Sort P1 
13b40 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  * *.      **.   
13b50 20 20 20 2a 2a 20 53 6f 72 74 20 61 6c 6c 20 65     ** Sort all e
13b60 6c 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 67  lements on the g
13b70 69 76 65 6e 20 73 6f 72 74 65 72 2e 20 20 54 68  iven sorter.  Th
13b80 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 61  e algorithm is a
13b90 0a 20 20 20 20 20 20 2a 2a 20 6d 65 72 67 65 73  .      ** merges
13ba0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
13bb0 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
13bc0 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
13bd0 6a 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  j;.        j = p
13be0 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20  Op->p1;.        
13bf0 69 66 28 20 6a 3c 30 20 29 20 67 6f 74 6f 20 62  if( j<0 ) goto b
13c00 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a  ad_instruction;.
13c10 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d          if( j<p-
13c20 3e 6e 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  >nSort ){.      
13c30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13c40 20 20 20 20 20 53 6f 72 74 65 72 20 2a 70 45 6c       Sorter *pEl
13c50 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 53 6f  em;.          So
13c60 72 74 65 72 20 2a 61 70 53 6f 72 74 65 72 5b 4e  rter *apSorter[N
13c70 53 4f 52 54 5d 3b 0a 20 20 20 20 20 20 20 20 20  SORT];.         
13c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 53 4f 52   for(i=0; i<NSOR
13c90 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  T; i++){.       
13ca0 20 20 20 20 20 61 70 53 6f 72 74 65 72 5b 69 5d       apSorter[i]
13cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  }.          whil
13cd0 65 28 20 70 2d 3e 61 70 53 6f 72 74 5b 6a 5d 20  e( p->apSort[j] 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
13cf0 45 6c 65 6d 20 3d 20 70 2d 3e 61 70 53 6f 72 74  Elem = p->apSort
13d00 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
13d10 20 70 2d 3e 61 70 53 6f 72 74 5b 6a 5d 20 3d 20   p->apSort[j] = 
13d20 70 45 6c 65 6d 2d 3e 70 4e 65 78 74 3b 0a 20 20  pElem->pNext;.  
13d30 20 20 20 20 20 20 20 20 20 20 70 45 6c 65 6d 2d            pElem-
13d40 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
13d50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13d60 20 69 3c 4e 53 4f 52 54 2d 31 3b 20 69 2b 2b 29   i<NSORT-1; i++)
13d70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13d80 69 66 28 20 61 70 53 6f 72 74 65 72 5b 69 5d 3d  if( apSorter[i]=
13d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13da0 20 20 20 20 20 20 61 70 53 6f 72 74 65 72 5b 69        apSorter[i
13db0 5d 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 20 20 20  ] = pElem;.     
13dc0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13df0 20 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 4d         pElem = M
13e00 65 72 67 65 28 61 70 53 6f 72 74 65 72 5b 69 5d  erge(apSorter[i]
13e10 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  , pElem);.      
13e20 20 20 20 20 20 20 20 20 20 20 61 70 53 6f 72 74            apSort
13e30 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
13e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13e60 20 20 20 20 20 69 66 28 20 69 3e 3d 4e 53 4f 52       if( i>=NSOR
13e70 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  T-1 ){.         
13e80 20 20 20 20 20 61 70 53 6f 72 74 65 72 5b 4e 53       apSorter[NS
13e90 4f 52 54 2d 31 5d 20 3d 20 4d 65 72 67 65 28 61  ORT-1] = Merge(a
13ea0 70 53 6f 72 74 65 72 5b 4e 53 4f 52 54 2d 31 5d  pSorter[NSORT-1]
13eb0 2c 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  ,pElem);.       
13ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13ed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45 6c   }.          pEl
13ee0 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  em = 0;.        
13ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 53 4f    for(i=0; i<NSO
13f00 52 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  RT; i++){.      
13f10 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 4d 65        pElem = Me
13f20 72 67 65 28 61 70 53 6f 72 74 65 72 5b 69 5d 2c  rge(apSorter[i],
13f30 20 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20   pElem);.       
13f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13f50 2d 3e 61 70 53 6f 72 74 5b 6a 5d 20 3d 20 70 45  ->apSort[j] = pE
13f60 6c 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lem;.        }. 
13f70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13f90 4f 70 63 6f 64 65 3a 20 53 6f 72 74 4e 65 78 74  Opcode: SortNext
13fa0 20 50 31 20 50 32 20 2a 0a 20 20 20 20 20 20 2a   P1 P2 *.      *
13fb0 2a 0a 20 20 20 20 20 20 2a 2a 20 50 75 73 68 20  *.      ** Push 
13fc0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
13fd0 20 74 6f 70 6d 6f 73 74 20 65 6c 65 6d 65 6e 74   topmost element
13fe0 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 6f   in the given so
13ff0 72 74 65 72 20 6f 6e 74 6f 20 74 68 65 0a 20 20  rter onto the.  
14000 20 20 20 20 2a 2a 20 73 74 61 63 6b 2c 20 74 68      ** stack, th
14010 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 65 6c  en remove the el
14020 65 6d 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ement from the s
14030 6f 72 74 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  orter..      */.
14040 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
14050 72 74 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  rtNext: {.      
14060 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
14070 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  1;.        if( i
14080 3c 30 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e  <0 ) goto bad_in
14090 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20 20 20 20  struction;.     
140a0 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 53 6f 72     if( i<p->nSor
140b0 74 20 26 26 20 70 2d 3e 61 70 53 6f 72 74 5b 69  t && p->apSort[i
140c0 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
140d0 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65    Sorter *pSorte
140e0 72 20 3d 20 70 2d 3e 61 70 53 6f 72 74 5b 69 5d  r = p->apSort[i]
140f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
14100 70 53 6f 72 74 5b 69 5d 20 3d 20 70 53 6f 72 74  pSort[i] = pSort
14110 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
14120 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20       p->tos++;. 
14130 20 20 20 20 20 20 20 20 20 4e 65 65 64 53 74 61           NeedSta
14140 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 29 3b 0a 20  ck(p, p->tos);. 
14150 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61           p->zSta
14160 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 70 53 6f  ck[p->tos] = pSo
14170 72 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  rter->pData;.   
14180 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
14190 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 70 53 6f  [p->tos].n = pSo
141a0 72 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  rter->nData;.   
141b0 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
141c0 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  [p->tos].flags =
141d0 20 53 54 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e   STK_Str|STK_Dyn
141e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
141f0 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e  teFree(pSorter->
14200 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  zKey);.         
14210 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72   sqliteFree(pSor
14220 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ter);.        }e
14230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
14240 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
14250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14270 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  }..      /* Opco
14280 64 65 3a 20 53 6f 72 74 4b 65 79 20 50 31 20 2a  de: SortKey P1 *
14290 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
142a0 20 20 2a 2a 20 50 75 73 68 20 74 68 65 20 6b 65    ** Push the ke
142b0 79 20 66 6f 72 20 74 68 65 20 74 6f 70 6d 6f 73  y for the topmos
142c0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
142d0 20 73 6f 72 74 65 72 20 6f 6e 74 6f 20 74 68 65   sorter onto the
142e0 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a   stack..      **
142f0 20 42 75 74 20 64 6f 6e 27 74 20 63 68 61 6e 67   But don't chang
14300 65 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 20  e the sorter an 
14310 61 6e 79 20 6f 74 68 65 72 20 77 61 79 2e 0a 20  any other way.. 
14320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
14330 73 65 20 4f 50 5f 53 6f 72 74 4b 65 79 3a 20 7b  se OP_SortKey: {
14340 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
14350 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20   pOp->p1;.      
14360 20 20 69 66 28 20 69 3c 30 20 29 20 67 6f 74 6f    if( i<0 ) goto
14370 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e   bad_instruction
14380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
14390 70 2d 3e 6e 53 6f 72 74 20 26 26 20 70 2d 3e 61  p->nSort && p->a
143a0 70 53 6f 72 74 5b 69 5d 21 3d 30 20 29 7b 0a 20  pSort[i]!=0 ){. 
143b0 20 20 20 20 20 20 20 20 20 53 6f 72 74 65 72 20           Sorter 
143c0 2a 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e 61 70  *pSorter = p->ap
143d0 53 6f 72 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Sort[i];.       
143e0 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20     p->tos++;.   
143f0 20 20 20 20 20 20 20 4e 65 65 64 53 74 61 63 6b         NeedStack
14400 28 70 2c 20 70 2d 3e 74 6f 73 29 3b 0a 20 20 20  (p, p->tos);.   
14410 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
14420 53 74 72 69 6e 67 28 26 70 2d 3e 7a 53 74 61 63  String(&p->zStac
14430 6b 5b 70 2d 3e 74 6f 73 5d 2c 20 70 53 6f 72 74  k[p->tos], pSort
14440 65 72 2d 3e 7a 4b 65 79 2c 20 30 29 3b 0a 20 20  er->zKey, 0);.  
14450 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63          p->aStac
14460 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 70 53  k[p->tos].n = pS
14470 6f 72 74 65 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20  orter->nKey;.   
14480 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
14490 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  [p->tos].flags =
144a0 20 53 54 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e   STK_Str|STK_Dyn
144b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
144c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
144d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63   }..      /* Opc
144e0 6f 64 65 3a 20 53 6f 72 74 43 61 6c 6c 62 61 63  ode: SortCallbac
144f0 6b 20 50 31 20 50 32 20 2a 0a 20 20 20 20 20 20  k P1 P2 *.      
14500 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
14510 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
14520 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 6c 6c   contains a call
14530 62 61 63 6b 20 72 65 63 6f 72 64 20 62 75 69 6c  back record buil
14540 74 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  t using.      **
14550 20 74 68 65 20 53 6f 72 74 4d 61 6b 65 52 65 63   the SortMakeRec
14560 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68 20   operation with 
14570 74 68 65 20 73 61 6d 65 20 50 31 20 76 61 6c 75  the same P1 valu
14580 65 20 61 73 20 74 68 69 73 0a 20 20 20 20 20 20  e as this.      
14590 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ** instruction. 
145a0 20 50 6f 70 20 74 68 69 73 20 72 65 63 6f 72 64   Pop this record
145b0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
145c0 61 6e 64 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20  and invoke the. 
145d0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
145e0 20 6f 6e 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   on it..      */
145f0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53  .      case OP_S
14600 6f 72 74 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  ortCallback: {. 
14610 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
14620 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69  ->tos;.        i
14630 66 28 20 69 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  f( i<0 ) goto no
14640 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a  t_enough_stack;.
14650 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61 6c          if( xCal
14660 6c 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  lback!=0 ){.    
14670 20 20 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62        if( xCallb
14680 61 63 6b 28 70 41 72 67 2c 20 70 4f 70 2d 3e 70  ack(pArg, pOp->p
14690 31 2c 20 28 63 68 61 72 2a 2a 29 70 2d 3e 7a 53  1, (char**)p->zS
146a0 74 61 63 6b 5b 69 5d 2c 20 70 2d 3e 61 7a 43 6f  tack[i], p->azCo
146b0 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
146c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146d0 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20  E_ABORT;.       
146e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
146f0 20 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b 28         PopStack(
14700 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  p, 1);.        b
14710 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
14720 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20       /* Opcode: 
14730 53 6f 72 74 43 6c 6f 73 65 20 50 31 20 2a 20 2a  SortClose P1 * *
14740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14750 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 67 69 76  ** Close the giv
14760 65 6e 20 73 6f 72 74 65 72 20 61 6e 64 20 72 65  en sorter and re
14770 6d 6f 76 65 20 61 6c 6c 20 69 74 73 20 65 6c 65  move all its ele
14780 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ments..      */.
14790 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
147a0 72 74 43 6c 6f 73 65 3a 20 7b 0a 20 20 20 20 20  rtClose: {.     
147b0 20 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74     Sorter *pSort
147c0 65 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  er;.        int 
147d0 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  i = pOp->p1;.   
147e0 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 67       if( i<0 ) g
147f0 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74  oto bad_instruct
14800 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
14810 20 69 3c 70 2d 3e 6e 53 6f 72 74 20 29 7b 0a 20   i<p->nSort ){. 
14820 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
14830 20 28 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e 61   (pSorter = p->a
14840 70 53 6f 72 74 5b 69 5d 29 21 3d 30 20 29 7b 0a  pSort[i])!=0 ){.
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
14860 61 70 53 6f 72 74 5b 69 5d 20 3d 20 70 53 6f 72  apSort[i] = pSor
14870 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ter->pNext;.    
14880 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
14890 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a 4b 65  ree(pSorter->zKe
148a0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
148b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72   sqliteFree(pSor
148c0 74 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  ter->pData);.   
148d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
148e0 46 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20  Free(pSorter);. 
148f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
14910 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
14920 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 46      /* Opcode: F
14930 69 6c 65 4f 70 65 6e 20 2a 20 2a 20 50 33 0a 20  ileOpen * * P3. 
14940 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
14950 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   Open the file n
14960 61 6d 65 64 20 62 79 20 50 33 20 66 6f 72 20 72  amed by P3 for r
14970 65 61 64 69 6e 67 20 75 73 69 6e 67 20 74 68 65  eading using the
14980 20 46 69 6c 65 52 65 61 64 20 6f 70 63 6f 64 65   FileRead opcode
14990 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 50 33  ..      ** If P3
149a0 20 69 73 20 22 73 74 64 69 6e 22 20 74 68 65 6e   is "stdin" then
149b0 20 6f 70 65 6e 20 73 74 61 6e 64 61 72 64 20 69   open standard i
149c0 6e 70 75 74 20 66 6f 72 20 72 65 61 64 69 6e 67  nput for reading
149d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
149e0 20 63 61 73 65 20 4f 50 5f 46 69 6c 65 4f 70 65   case OP_FileOpe
149f0 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n: {.        if(
14a00 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 20 67 6f   pOp->p3==0 ) go
14a10 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69  to bad_instructi
14a20 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
14a30 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  p->pFile ){.    
14a40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69        if( p->pFi
14a50 6c 65 21 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f  le!=stdin ) fclo
14a60 73 65 28 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20  se(p->pFile);.  
14a70 20 20 20 20 20 20 20 20 70 2d 3e 70 46 69 6c 65          p->pFile
14a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14a90 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14aa0 74 65 53 74 72 49 43 6d 70 28 70 4f 70 2d 3e 70  teStrICmp(pOp->p
14ab0 33 2c 22 73 74 64 69 6e 22 29 3d 3d 30 20 29 7b  3,"stdin")==0 ){
14ac0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 46  .          p->pF
14ad0 69 6c 65 20 3d 20 73 74 64 69 6e 3b 0a 20 20 20  ile = stdin;.   
14ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14af0 20 20 20 20 20 20 70 2d 3e 70 46 69 6c 65 20 3d        p->pFile =
14b00 20 66 6f 70 65 6e 28 70 4f 70 2d 3e 70 33 2c 20   fopen(pOp->p3, 
14b10 22 72 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  "r");.        }.
14b20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
14b30 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
14b40 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
14b50 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 22 75  ring(pzErrMsg,"u
14b60 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69  nable to open fi
14b70 6c 65 3a 20 22 2c 20 70 4f 70 2d 3e 70 33 2c 20  le: ", pOp->p3, 
14b80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  0);.          rc
14b90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
14ba0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
14bb0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
14bc0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
14bd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14be0 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 69 6c 65   /* Opcode: File
14bf0 43 6c 6f 73 65 20 2a 20 2a 20 2a 0a 20 20 20 20  Close * * *.    
14c00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6c    **.      ** Cl
14c10 6f 73 65 20 61 20 66 69 6c 65 20 70 72 65 76 69  ose a file previ
14c20 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 75 73 69  ously opened usi
14c30 6e 67 20 46 69 6c 65 4f 70 65 6e 2e 20 20 54 68  ng FileOpen.  Th
14c40 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 20 20  is is a no-op.  
14c50 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
14c60 69 73 20 6e 6f 20 70 72 69 6f 72 20 46 69 6c 65  is no prior File
14c70 4f 70 65 6e 20 63 61 6c 6c 2e 0a 20 20 20 20 20  Open call..     
14c80 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f   */.      case O
14c90 50 5f 46 69 6c 65 43 6c 6f 73 65 3a 20 7b 0a 20  P_FileClose: {. 
14ca0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46         if( p->pF
14cb0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
14cc0 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73   if( p->pFile!=s
14cd0 74 64 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d  tdin ) fclose(p-
14ce0 3e 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >pFile);.       
14cf0 20 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 30 3b     p->pFile = 0;
14d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d10 20 20 20 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c     if( p->azFiel
14d20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
14d30 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 7a 46  qliteFree(p->azF
14d40 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ield);.         
14d50 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30 3b   p->azField = 0;
14d60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d70 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 30     p->nField = 0
14d80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
14d90 3e 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >zLine ){.      
14da0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
14db0 2d 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ->zLine);.      
14dc0 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30      p->zLine = 0
14dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14de0 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f      p->nLineAllo
14df0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  c = 0;.        b
14e00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
14e10 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20       /* Opcode: 
14e20 46 69 6c 65 52 65 61 64 20 50 31 20 50 32 20 50  FileRead P1 P2 P
14e30 33 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  3.      **.     
14e40 20 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c   ** Read a singl
14e50 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
14e60 66 72 6f 6d 20 74 68 65 20 6f 70 65 6e 20 66 69  from the open fi
14e70 6c 65 20 28 74 68 65 20 66 69 6c 65 20 6f 70 65  le (the file ope
14e80 6e 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20  ned using.      
14e90 2a 2a 20 46 69 6c 65 4f 70 65 6e 29 2e 20 20 49  ** FileOpen).  I
14ea0 66 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f  f we reach end-o
14eb0 66 2d 66 69 6c 65 2c 20 6a 75 6d 70 20 69 6d 6d  f-file, jump imm
14ec0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
14ed0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   If.      ** we 
14ee0 61 72 65 20 61 62 6c 65 20 74 6f 20 67 65 74 20  are able to get 
14ef0 61 6e 6f 74 68 65 72 20 6c 69 6e 65 2c 20 73 70  another line, sp
14f00 6c 69 74 20 74 68 65 20 6c 69 6e 65 20 61 70 61  lit the line apa
14f10 72 74 20 75 73 69 6e 67 20 50 33 20 61 73 0a 20  rt using P3 as. 
14f20 20 20 20 20 20 2a 2a 20 61 20 64 65 6c 69 6d 69       ** a delimi
14f30 74 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ter.  There shou
14f40 6c 64 20 62 65 20 50 31 20 66 69 65 6c 64 73 2e  ld be P1 fields.
14f50 20 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 6c    If the input l
14f60 69 6e 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  ine contains.   
14f70 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20     ** more than 
14f80 50 31 20 66 69 65 6c 64 73 2c 20 69 67 6e 6f 72  P1 fields, ignor
14f90 65 20 74 68 65 20 65 78 63 65 73 73 2e 20 20 49  e the excess.  I
14fa0 66 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  f the input line
14fb0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
14fc0 2a 2a 20 66 65 77 65 72 20 74 68 61 6e 20 50 31  ** fewer than P1
14fd0 20 66 69 65 6c 64 73 2c 20 61 73 73 75 6d 65 20   fields, assume 
14fe0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 66 69  the remaining fi
14ff0 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 61 6e 0a  elds contain an.
15000 20 20 20 20 20 20 2a 2a 20 65 6d 70 74 79 20 73        ** empty s
15010 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  tring..      */.
15020 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 69        case OP_Fi
15030 6c 65 52 65 61 64 3a 20 7b 0a 20 20 20 20 20 20  leRead: {.      
15040 20 20 69 6e 74 20 6e 2c 20 65 6f 6c 2c 20 6e 46    int n, eol, nF
15050 69 65 6c 64 2c 20 69 2c 20 63 2c 20 6e 44 65 6c  ield, i, c, nDel
15060 69 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  im;.        char
15070 20 2a 7a 44 65 6c 69 6d 2c 20 2a 7a 3b 0a 20 20   *zDelim, *z;.  
15080 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69        if( p->pFi
15090 6c 65 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6c  le==0 ) goto fil
150a0 65 72 65 61 64 5f 6a 75 6d 70 3b 0a 20 20 20 20  eread_jump;.    
150b0 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70      nField = pOp
150c0 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ->p1;.        if
150d0 28 20 6e 46 69 65 6c 64 3c 3d 30 20 29 20 67 6f  ( nField<=0 ) go
150e0 74 6f 20 66 69 6c 65 72 65 61 64 5f 6a 75 6d 70  to fileread_jump
150f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 46  ;.        if( nF
15100 69 65 6c 64 21 3d 70 2d 3e 6e 46 69 65 6c 64 20  ield!=p->nField 
15110 7c 7c 20 70 2d 3e 61 7a 46 69 65 6c 64 3d 3d 30  || p->azField==0
15120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
15130 3e 61 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74  >azField = sqlit
15140 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a 46 69  eRealloc(p->azFi
15150 65 6c 64 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  eld, sizeof(char
15160 2a 29 2a 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  *)*nField+1);.  
15170 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
15180 7a 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  zField==0 ){.   
15190 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 46 69 65           p->nFie
151a0 6c 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ld = 0;.        
151b0 20 20 20 20 67 6f 74 6f 20 66 69 6c 65 72 65 61      goto filerea
151c0 64 5f 6a 75 6d 70 3b 0a 20 20 20 20 20 20 20 20  d_jump;.        
151d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
151e0 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
151f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15200 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
15210 20 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 20 20     eol = 0;.    
15220 20 20 20 20 77 68 69 6c 65 28 20 65 6f 6c 3d 3d      while( eol==
15230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
15240 66 28 20 70 2d 3e 7a 4c 69 6e 65 3d 3d 30 20 7c  f( p->zLine==0 |
15250 7c 20 6e 2b 32 30 30 3e 70 2d 3e 6e 4c 69 6e 65  | n+200>p->nLine
15260 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
15270 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c       p->nLineAll
15280 6f 63 20 3d 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c  oc = p->nLineAll
15290 6f 63 2a 32 20 2b 20 33 30 30 3b 0a 20 20 20 20  oc*2 + 300;.    
152a0 20 20 20 20 20 20 20 20 70 2d 3e 7a 4c 69 6e 65          p->zLine
152b0 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
152c0 28 70 2d 3e 7a 4c 69 6e 65 2c 20 70 2d 3e 6e 4c  (p->zLine, p->nL
152d0 69 6e 65 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  ineAlloc);.     
152e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 4c         if( p->zL
152f0 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
15300 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65          p->nLine
15310 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  Alloc = 0;.     
15320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69           goto fi
15330 6c 65 72 65 61 64 5f 6a 75 6d 70 3b 0a 20 20 20  leread_jump;.   
15340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15360 20 69 66 28 20 66 67 65 74 73 28 26 70 2d 3e 7a   if( fgets(&p->z
15370 4c 69 6e 65 5b 6e 5d 2c 20 70 2d 3e 6e 4c 69 6e  Line[n], p->nLin
15380 65 41 6c 6c 6f 63 2d 6e 2c 20 70 2d 3e 70 46 69  eAlloc-n, p->pFi
15390 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  le)==0 ){.      
153a0 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20        eol = 1;. 
153b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4c             p->zL
153c0 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
153d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
153e0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
153f0 70 2d 3e 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  p->zLine[n] ){ n
15400 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
15410 20 20 69 66 28 20 6e 3e 30 20 26 26 20 70 2d 3e    if( n>0 && p->
15420 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
15430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15440 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20    n--;.         
15450 20 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 5b 6e 5d       p->zLine[n]
15460 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15470 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
15480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
154a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
154b0 30 20 29 20 67 6f 74 6f 20 66 69 6c 65 72 65 61  0 ) goto filerea
154c0 64 5f 6a 75 6d 70 3b 0a 20 20 20 20 20 20 20 20  d_jump;.        
154d0 7a 20 3d 20 70 2d 3e 7a 4c 69 6e 65 3b 0a 20 20  z = p->zLine;.  
154e0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
154f0 27 5c 5c 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2e  '\\' && z[1]=='.
15500 27 20 26 26 20 7a 5b 32 5d 3d 3d 30 20 29 7b 0a  ' && z[2]==0 ){.
15510 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
15520 69 6c 65 72 65 61 64 5f 6a 75 6d 70 3b 0a 20 20  ileread_jump;.  
15530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15540 7a 44 65 6c 69 6d 20 3d 20 70 4f 70 2d 3e 70 33  zDelim = pOp->p3
15550 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44  ;.        if( zD
15560 65 6c 69 6d 3d 3d 30 20 29 20 7a 44 65 6c 69 6d  elim==0 ) zDelim
15570 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 20 20 20   = "\t";.       
15580 20 63 20 3d 20 7a 44 65 6c 69 6d 5b 30 5d 3b 0a   c = zDelim[0];.
15590 20 20 20 20 20 20 20 20 6e 44 65 6c 69 6d 20 3d          nDelim =
155a0 20 73 74 72 6c 65 6e 28 7a 44 65 6c 69 6d 29 3b   strlen(zDelim);
155b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a 46 69  .        p->azFi
155c0 65 6c 64 5b 30 5d 20 3d 20 7a 3b 0a 20 20 20 20  eld[0] = z;.    
155d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 2a 7a 21      for(i=1; *z!
155e0 3d 30 20 26 26 20 69 3c 3d 6e 46 69 65 6c 64 3b  =0 && i<=nField;
155f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15600 20 69 6e 74 20 66 72 6f 6d 2c 20 74 6f 3b 0a 20   int from, to;. 
15610 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 3d 20           from = 
15620 74 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  to = 0;.        
15630 20 20 77 68 69 6c 65 28 20 7a 5b 66 72 6f 6d 5d    while( z[from]
15640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15650 69 66 28 20 7a 5b 66 72 6f 6d 5d 3d 3d 27 5c 5c  if( z[from]=='\\
15660 27 20 26 26 20 7a 5b 66 72 6f 6d 2b 31 5d 21 3d  ' && z[from+1]!=
15670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15680 20 20 20 7a 5b 74 6f 2b 2b 5d 20 3d 20 7a 5b 66     z[to++] = z[f
15690 72 6f 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  rom+1];.        
156a0 20 20 20 20 20 20 66 72 6f 6d 20 2b 3d 20 32 3b        from += 2;
156b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
156c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
156d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
156e0 20 20 20 69 66 28 20 7a 5b 66 72 6f 6d 5d 3d 3d     if( z[from]==
156f0 63 20 26 26 20 73 74 72 6e 63 6d 70 28 26 7a 5b  c && strncmp(&z[
15700 66 72 6f 6d 5d 2c 7a 44 65 6c 69 6d 2c 6e 44 65  from],zDelim,nDe
15710 6c 69 6d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  lim)==0 ) break;
15720 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 74  .            z[t
15730 6f 2b 2b 5d 20 3d 20 7a 5b 66 72 6f 6d 2b 2b 5d  o++] = z[from++]
15740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15750 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 66 72          if( z[fr
15760 6f 6d 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  om] ){.         
15770 20 20 20 7a 5b 74 6f 5d 20 3d 20 30 3b 0a 20 20     z[to] = 0;.  
15780 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 66            z += f
15790 72 6f 6d 20 2b 20 6e 44 65 6c 69 6d 3b 0a 20 20  rom + nDelim;.  
157a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
157b0 6e 46 69 65 6c 64 20 29 20 70 2d 3e 61 7a 46 69  nField ) p->azFi
157c0 65 6c 64 5b 69 5d 20 3d 20 7a 3b 0a 20 20 20 20  eld[i] = z;.    
157d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
157e0 20 20 20 20 20 20 20 20 20 7a 5b 74 6f 5d 20 3d           z[to] =
157f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
15800 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  z = "";.        
15810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15820 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e        while( i<n
15830 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  Field ){.       
15840 20 20 20 70 2d 3e 61 7a 46 69 65 6c 64 5b 69 2b     p->azField[i+
15850 2b 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  +] = "";.       
15860 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
15870 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
15880 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
15890 2d 66 69 6c 65 2c 20 6f 72 20 69 66 20 61 6e 79  -file, or if any
158a0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
158b0 2c 20 6a 75 6d 70 20 68 65 72 65 2e 0a 20 20 20  , jump here..   
158c0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
158d0 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 20 6a  e will cause a j
158e0 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20  ump to P2 */.   
158f0 20 20 20 66 69 6c 65 72 65 61 64 5f 6a 75 6d 70     fileread_jump
15900 3a 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 70  :.        pc = p
15910 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
15920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15930 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63   }..      /* Opc
15940 6f 64 65 3a 20 46 69 6c 65 46 69 65 6c 64 20 50  ode: FileField P
15950 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20  1 * *.      **. 
15960 20 20 20 20 20 2a 2a 20 50 75 73 68 20 6f 6e 74       ** Push ont
15970 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68 65 20  o the stack the 
15980 50 31 2d 74 68 20 66 69 65 6c 64 20 6f 66 20 74  P1-th field of t
15990 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
159a0 20 72 65 61 64 20 6c 69 6e 65 0a 20 20 20 20 20   read line.     
159b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 70   ** from the inp
159c0 75 74 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  ut file..      *
159d0 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
159e0 46 69 6c 65 46 69 65 6c 64 3a 20 7b 0a 20 20 20  FileField: {.   
159f0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70       int i = pOp
15a00 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20 63 68  ->p1;.        ch
15a10 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  ar *z;.        i
15a20 66 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20  f( NeedStack(p, 
15a30 70 2d 3e 74 6f 73 2b 31 29 20 29 20 67 6f 74 6f  p->tos+1) ) goto
15a40 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20   no_mem;.       
15a50 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70   if( i>=0 && i<p
15a60 2d 3e 6e 46 69 65 6c 64 20 26 26 20 70 2d 3e 61  ->nField && p->a
15a70 7a 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  zField ){.      
15a80 20 20 20 20 7a 20 3d 20 70 2d 3e 61 7a 46 69 65      z = p->azFie
15a90 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  ld[i];.        }
15aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15ab0 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  z = 0;.        }
15ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
15ad0 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20  0 ) z = "";.    
15ae0 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20      p->tos++;.  
15af0 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b        p->aStack[
15b00 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 73 74 72 6c  p->tos].n = strl
15b10 65 6e 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  en(z) + 1;.     
15b20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e     p->zStack[p->
15b30 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20 20 20  tos] = z;.      
15b40 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 74    p->aStack[p->t
15b50 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  os].flags = STK_
15b60 53 74 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Str;.        bre
15b70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
15b80 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65     /* Opcode: Me
15b90 6d 53 74 6f 72 65 20 50 31 20 2a 20 2a 0a 20 20  mStore P1 * *.  
15ba0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15bb0 50 6f 70 20 61 20 73 69 6e 67 6c 65 20 76 61 6c  Pop a single val
15bc0 75 65 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  ue of the stack 
15bd0 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
15be0 61 6c 75 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  alue into memory
15bf0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69  .      ** locati
15c00 6f 6e 20 50 31 2e 20 20 50 31 20 73 68 6f 75 6c  on P1.  P1 shoul
15c10 64 20 62 65 20 61 20 73 6d 61 6c 6c 20 69 6e 74  d be a small int
15c20 65 67 65 72 20 73 69 6e 63 65 20 73 70 61 63 65  eger since space
15c30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
15c40 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 6d      ** for all m
15c50 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
15c60 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 50 31  between 0 and P1
15c70 20 69 6e 63 6c 75 73 69 76 65 2e 0a 20 20 20 20   inclusive..    
15c80 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20    */.      case 
15c90 4f 50 5f 4d 65 6d 53 74 6f 72 65 3a 20 7b 0a 20  OP_MemStore: {. 
15ca0 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
15cb0 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20  Op->p1;.        
15cc0 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73  int tos = p->tos
15cd0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70  ;.        Mem *p
15ce0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  Mem;.        cha
15cf0 72 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 20  r *zOld;.       
15d00 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
15d10 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
15d20 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ck;.        if( 
15d30 69 3e 3d 70 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20  i>=p->nMem ){.  
15d40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64          int nOld
15d50 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   = p->nMem;.    
15d60 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
15d70 69 20 2b 20 35 3b 0a 20 20 20 20 20 20 20 20 20  i + 5;.         
15d80 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c 69 74   p->aMem = sqlit
15d90 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4d 65 6d  eRealloc(p->aMem
15da0 2c 20 70 2d 3e 6e 4d 65 6d 2a 73 69 7a 65 6f 66  , p->nMem*sizeof
15db0 28 70 2d 3e 61 4d 65 6d 5b 30 5d 29 29 3b 0a 20  (p->aMem[0]));. 
15dc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
15dd0 61 4d 65 6d 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  aMem==0 ) goto n
15de0 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  o_mem;.         
15df0 20 69 66 28 20 6e 4f 6c 64 3c 70 2d 3e 6e 4d 65   if( nOld<p->nMe
15e00 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
15e10 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4d 65 6d   memset(&p->aMem
15e20 5b 6e 4f 6c 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  [nOld], 0, sizeo
15e30 66 28 70 2d 3e 61 4d 65 6d 5b 30 5d 29 2a 28 70  f(p->aMem[0])*(p
15e40 2d 3e 6e 4d 65 6d 2d 6e 4f 6c 64 29 29 3b 0a 20  ->nMem-nOld));. 
15e50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15e60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
15e70 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b  m = &p->aMem[i];
15e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
15e90 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b  m->s.flags & STK
15ea0 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
15eb0 20 20 7a 4f 6c 64 20 3d 20 70 4d 65 6d 2d 3e 7a    zOld = pMem->z
15ec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15ed0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
15ee0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
15ef0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73 20 3d         pMem->s =
15f00 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 3b   p->aStack[tos];
15f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
15f20 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b  m->s.flags & STK
15f30 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
15f40 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69    pMem->z = sqli
15f50 74 65 53 74 72 4e 44 75 70 28 70 2d 3e 7a 53 74  teStrNDup(p->zSt
15f60 61 63 6b 5b 74 6f 73 5d 2c 20 70 4d 65 6d 2d 3e  ack[tos], pMem->
15f70 73 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s.n);.          
15f80 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 7c 3d  pMem->s.flags |=
15f90 20 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20   STK_Dyn;.      
15fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15fb0 7a 4f 6c 64 20 29 20 73 71 6c 69 74 65 46 72 65  zOld ) sqliteFre
15fc0 65 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  e(zOld);.       
15fd0 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 31 29 3b   PopStack(p, 1);
15fe0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15ff0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16000 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d 4c 6f 61  * Opcode: MemLoa
16010 64 20 50 31 20 2a 20 2a 0a 20 20 20 20 20 20 2a  d P1 * *.      *
16020 2a 0a 20 20 20 20 20 20 2a 2a 20 50 75 73 68 20  *.      ** Push 
16030 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61  a copy of the va
16040 6c 75 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6c 6f  lue in memory lo
16050 63 61 74 69 6f 6e 20 50 31 20 6f 6e 74 6f 20 74  cation P1 onto t
16060 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20  he stack..      
16070 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  */.      case OP
16080 5f 4d 65 6d 4c 6f 61 64 3a 20 7b 0a 20 20 20 20  _MemLoad: {.    
16090 20 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b      int tos = ++
160a0 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20 20 20  p->tos;.        
160b0 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  int i = pOp->p1;
160c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 65 65  .        if( Nee
160d0 64 53 74 61 63 6b 28 70 2c 20 74 6f 73 29 20 29  dStack(p, tos) )
160e0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
160f0 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 7c 7c        if( i<0 ||
16100 20 69 3e 3d 70 2d 3e 6e 4d 65 6d 20 29 7b 0a 20   i>=p->nMem ){. 
16110 20 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61           p->aSta
16120 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[tos].flags = 
16130 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  STK_Null;.      
16140 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f      p->zStack[to
16150 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
16160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16170 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 20   p->aStack[tos] 
16180 3d 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 73 3b 0a  = p->aMem[i].s;.
16190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
161a0 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  >aStack[tos].fla
161b0 67 73 20 26 20 53 54 4b 5f 53 74 72 20 29 7b 0a  gs & STK_Str ){.
161c0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
161d0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   *z = sqliteMall
161e0 6f 63 28 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73  oc(p->aStack[tos
161f0 5d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ].n);.          
16200 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 67 6f 74    if( z==0 ) got
16210 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
16220 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
16230 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 7a 2c 20 70 2d  p->aMem[i].z, p-
16240 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 29 3b  >aStack[tos].n);
16250 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
16260 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 7a 3b  zStack[tos] = z;
16270 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
16280 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
16290 73 20 7c 3d 20 53 54 4b 5f 44 79 6e 3b 0a 20 20  s |= STK_Dyn;.  
162a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162b0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
162c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
162d0 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67    /* Opcode: Agg
162e0 52 65 73 65 74 20 2a 20 50 32 20 2a 0a 20 20 20  Reset * P2 *.   
162f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 52     **.      ** R
16300 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
16310 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 6e  tor so that it n
16320 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69 6e  o longer contain
16330 73 20 61 6e 79 20 64 61 74 61 2e 0a 20 20 20 20  s any data..    
16340 20 20 2a 2a 20 46 75 74 75 72 65 20 61 67 67 72    ** Future aggr
16350 65 67 61 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20  egator elements 
16360 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 50 32 20  will contain P2 
16370 76 61 6c 75 65 73 20 65 61 63 68 2e 0a 20 20 20  values each..   
16380 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
16390 20 4f 50 5f 41 67 67 52 65 73 65 74 3a 20 7b 0a   OP_AggReset: {.
163a0 20 20 20 20 20 20 20 20 41 67 67 52 65 73 65 74          AggReset
163b0 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20 20 20 20  (&p->agg);.     
163c0 20 20 20 70 2d 3e 61 67 67 2e 6e 4d 65 6d 20 3d     p->agg.nMem =
163d0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
163e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
163f0 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  ..      /* Opcod
16400 65 3a 20 41 67 67 46 6f 63 75 73 20 2a 20 50 32  e: AggFocus * P2
16410 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   *.      **.    
16420 20 20 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70    ** Pop the top
16430 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 6e   of the stack an
16440 64 20 75 73 65 20 74 68 61 74 20 61 73 20 61 6e  d use that as an
16450 20 61 67 67 72 65 67 61 74 6f 72 20 6b 65 79 2e   aggregator key.
16460 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 61 6e    If.      ** an
16470 20 61 67 67 72 65 67 61 74 6f 72 20 77 69 74 68   aggregator with
16480 20 74 68 61 74 20 73 61 6d 65 20 6b 65 79 20 61   that same key a
16490 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 74  lready exists, t
164a0 68 65 6e 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  hen make the.   
164b0 20 20 20 2a 2a 20 61 67 67 72 65 67 61 74 6f 72     ** aggregator
164c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 67 67   the current agg
164d0 72 65 67 61 74 6f 72 20 61 6e 64 20 6a 75 6d 70  regator and jump
164e0 20 74 6f 20 50 32 2e 20 20 49 66 20 6e 6f 20 61   to P2.  If no a
164f0 67 67 72 65 67 61 74 6f 72 0a 20 20 20 20 20 20  ggregator.      
16500 2a 2a 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ** with the give
16510 6e 20 6b 65 79 20 65 78 69 73 74 73 2c 20 63 72  n key exists, cr
16520 65 61 74 65 20 6f 6e 65 20 61 6e 64 20 6d 61 6b  eate one and mak
16530 65 20 69 74 20 63 75 72 72 65 6e 74 20 62 75 74  e it current but
16540 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
16550 20 6a 75 6d 70 2e 0a 20 20 20 20 20 20 2a 2a 0a   jump..      **.
16560 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 64        ** The ord
16570 65 72 20 6f 66 20 61 67 67 72 65 67 61 74 6f 72  er of aggregator
16580 20 6f 70 63 6f 64 65 73 20 69 73 20 69 6d 70 6f   opcodes is impo
16590 72 74 61 6e 74 2e 20 20 54 68 65 20 6f 72 64 65  rtant.  The orde
165a0 72 20 69 73 3a 0a 20 20 20 20 20 20 2a 2a 20 41  r is:.      ** A
165b0 67 67 52 65 73 65 74 20 41 67 67 46 6f 63 75 73  ggReset AggFocus
165c0 20 41 67 67 4e 65 78 74 2e 20 20 49 6e 20 6f 74   AggNext.  In ot
165d0 68 65 72 20 77 6f 72 64 73 2c 20 79 6f 75 20 6d  her words, you m
165e0 75 73 74 20 65 78 65 63 75 74 65 0a 20 20 20 20  ust execute.    
165f0 20 20 2a 2a 20 41 67 67 52 65 73 65 74 20 66 69    ** AggReset fi
16600 72 73 74 2c 20 74 68 65 6e 20 7a 65 72 6f 20 6f  rst, then zero o
16610 72 20 6d 6f 72 65 20 41 67 67 46 6f 63 75 73 20  r more AggFocus 
16620 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74 68 65 6e  operations, then
16630 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
16640 72 20 6d 6f 72 65 20 41 67 67 4e 65 78 74 20 6f  r more AggNext o
16650 70 65 72 61 74 69 6f 6e 73 2e 20 20 59 6f 75 20  perations.  You 
16660 6d 75 73 74 20 6e 6f 74 20 65 78 65 63 75 74 65  must not execute
16670 20 61 6e 20 41 67 67 46 6f 63 75 73 0a 20 20 20   an AggFocus.   
16680 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
16690 20 61 6e 20 41 67 67 4e 65 78 74 20 61 6e 64 20   an AggNext and 
166a0 61 6e 20 41 67 67 52 65 73 65 74 2e 0a 20 20 20  an AggReset..   
166b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
166c0 20 4f 50 5f 41 67 67 46 6f 63 75 73 3a 20 7b 0a   OP_AggFocus: {.
166d0 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20          int tos 
166e0 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20  = p->tos;.      
166f0 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d    AggElem *pElem
16700 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
16710 7a 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 6e  zKey;.        in
16720 74 20 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 20  t nKey;..       
16730 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
16740 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
16750 63 6b 3b 0a 20 20 20 20 20 20 20 20 53 74 72 69  ck;.        Stri
16760 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20  ngify(p, tos);. 
16770 20 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 70 2d         zKey = p-
16780 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b 20 0a 20  >zStack[tos]; . 
16790 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 2d         nKey = p-
167a0 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 3b 0a  >aStack[tos].n;.
167b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
167c0 67 67 2e 6e 48 61 73 68 3c 3d 30 20 29 7b 0a 20  gg.nHash<=0 ){. 
167d0 20 20 20 20 20 20 20 20 20 70 45 6c 65 6d 20 3d           pElem =
167e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
167f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
16800 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   h = sqliteHashN
16810 6f 43 61 73 65 28 7a 4b 65 79 2c 20 6e 4b 65 79  oCase(zKey, nKey
16820 2d 31 29 20 25 20 70 2d 3e 61 67 67 2e 6e 48 61  -1) % p->agg.nHa
16830 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  sh;.          fo
16840 72 28 70 45 6c 65 6d 3d 70 2d 3e 61 67 67 2e 61  r(pElem=p->agg.a
16850 70 48 61 73 68 5b 68 5d 3b 20 70 45 6c 65 6d 3b  pHash[h]; pElem;
16860 20 70 45 6c 65 6d 3d 70 45 6c 65 6d 2d 3e 70 48   pElem=pElem->pH
16870 61 73 68 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ash){.          
16880 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 45 6c    if( strcmp(pEl
16890 65 6d 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 29 3d  em->zKey, zKey)=
168a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
168b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
168c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  }.        if( pE
168d0 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lem ){.         
168e0 20 70 2d 3e 61 67 67 2e 70 43 75 72 72 65 6e 74   p->agg.pCurrent
168f0 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 20 20 20 20   = pElem;.      
16900 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
16910 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   - 1;.        }e
16920 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 41  lse{.          A
16930 67 67 49 6e 73 65 72 74 28 26 70 2d 3e 61 67 67  ggInsert(&p->agg
16940 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , zKey);.       
16950 20 7d 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74   }.        PopSt
16960 61 63 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  ack(p, 1);.     
16970 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 20     break; .     
16980 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63   }..      /* Opc
16990 6f 64 65 3a 20 41 67 67 49 6e 63 72 20 50 31 20  ode: AggIncr P1 
169a0 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  P2 *.      **.  
169b0 20 20 20 20 2a 2a 20 49 6e 63 72 65 61 73 65 20      ** Increase 
169c0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
169d0 65 20 69 6e 20 74 68 65 20 50 32 2d 74 68 20 66  e in the P2-th f
169e0 69 65 6c 64 20 6f 66 20 74 68 65 20 61 67 67 72  ield of the aggr
169f0 65 67 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 65  egate.      ** e
16a00 6c 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 20 69  lement current i
16a10 6e 20 66 6f 63 75 73 20 62 79 20 61 6e 20 61 6d  n focus by an am
16a20 6f 75 6e 74 20 50 31 2e 0a 20 20 20 20 20 20 2a  ount P1..      *
16a30 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  /.      case OP_
16a40 41 67 67 49 6e 63 72 3a 20 7b 0a 20 20 20 20 20  AggIncr: {.     
16a50 20 20 20 41 67 67 45 6c 65 6d 20 2a 70 46 6f 63     AggElem *pFoc
16a60 75 73 20 3d 20 41 67 67 49 6e 46 6f 63 75 73 28  us = AggInFocus(
16a70 70 2d 3e 61 67 67 29 3b 0a 20 20 20 20 20 20 20  p->agg);.       
16a80 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 32   int i = pOp->p2
16a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
16aa0 6f 63 75 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  ocus==0 ) goto n
16ab0 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  o_mem;.        i
16ac0 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  f( i>=0 && i<p->
16ad0 61 67 67 2e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  agg.nMem ){.    
16ae0 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
16af0 3d 20 26 70 46 6f 63 75 73 2d 3e 61 4d 65 6d 5b  = &pFocus->aMem[
16b00 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
16b10 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 21  ( pMem->s.flags!
16b20 3d 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20  =STK_Int ){.    
16b30 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
16b40 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  ->s.flags & STK_
16b50 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Int ){.         
16b60 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
16b70 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
16b80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
16b90 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  ->s.flags & STK_
16ba0 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
16bb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73 2e 69 20        pMem->s.i 
16bc0 3d 20 70 4d 65 6d 2d 3e 73 2e 72 3b 0a 20 20 20  = pMem->s.r;.   
16bd0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
16be0 66 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73  f( pMem->s.flags
16bf0 20 26 20 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20   & STK_Str ){.  
16c00 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
16c10 2d 3e 73 2e 69 20 3d 20 61 74 6f 69 28 70 4d 65  ->s.i = atoi(pMe
16c20 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  m->z);.         
16c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c40 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73 2e          pMem->s.
16c50 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  i = 0;.         
16c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16c70 20 69 66 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61   if( pMem->s.fla
16c80 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 20 73  gs & STK_Dyn ) s
16c90 71 6c 69 74 65 46 72 65 65 28 70 4d 65 6d 2d 3e  qliteFree(pMem->
16ca0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
16cb0 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  pMem->z = 0;.   
16cc0 20 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73           pMem->s
16cd0 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74  .flags = STK_Int
16ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16cf0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73 2e          pMem->s.
16d00 69 20 2b 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  i += pOp->p1;.  
16d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16d20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16d30 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 3a        /* Opcode:
16d40 20 41 67 67 53 65 74 20 2a 20 50 32 20 2a 0a 20   AggSet * P2 *. 
16d50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16d60 20 4d 6f 76 65 20 74 68 65 20 74 6f 70 20 6f 66   Move the top of
16d70 20 74 68 65 20 73 74 61 63 6b 20 69 6e 74 6f 20   the stack into 
16d80 74 68 65 20 50 32 2d 74 68 20 66 69 65 6c 64 20  the P2-th field 
16d90 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
16da0 20 20 20 20 20 2a 2a 20 61 67 67 72 65 67 61 74       ** aggregat
16db0 65 2e 20 20 53 74 72 69 6e 67 20 76 61 6c 75 65  e.  String value
16dc0 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64  s are duplicated
16dd0 20 69 6e 74 6f 20 6e 65 77 20 6d 65 6d 6f 72 79   into new memory
16de0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16df0 20 63 61 73 65 20 4f 50 5f 41 67 67 53 65 74 3a   case OP_AggSet:
16e00 20 7b 0a 20 20 20 20 20 20 20 20 41 67 67 45 6c   {.        AggEl
16e10 65 6d 20 2a 70 46 6f 63 75 73 20 3d 20 41 67 67  em *pFocus = Agg
16e20 49 6e 46 6f 63 75 73 28 70 2d 3e 61 67 67 29 3b  InFocus(p->agg);
16e30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
16e40 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
16e50 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
16e60 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  os;.        if( 
16e70 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74  tos<0 ) goto not
16e80 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20  _enough_stack;. 
16e90 20 20 20 20 20 20 20 69 66 28 20 70 46 6f 63 75         if( pFocu
16ea0 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  s==0 ) goto no_m
16eb0 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  em;.        if( 
16ec0 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 61 67 67  i>=0 && i<p->agg
16ed0 2e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  .nMem ){.       
16ee0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
16ef0 70 46 6f 63 75 73 2d 3e 61 4d 65 6d 5b 69 5d 3b  pFocus->aMem[i];
16f00 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
16f10 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 20  *zOld;.         
16f20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61   if( pMem->s.fla
16f30 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a  gs & STK_Dyn ){.
16f40 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64              zOld
16f50 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
16f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16f70 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20           zOld = 
16f80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
16f90 20 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 73           pMem->s
16fa0 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73   = p->aStack[tos
16fb0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
16fc0 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26   pMem->s.flags &
16fd0 20 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20   STK_Str ){.    
16fe0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
16ff0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17000 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e  p->aStack[tos].n
17010 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17020 69 66 28 20 70 4d 65 6d 2d 3e 7a 3d 3d 30 20 29  if( pMem->z==0 )
17030 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
17040 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
17050 28 70 4d 65 6d 2d 3e 7a 2c 20 70 2d 3e 7a 53 74  (pMem->z, p->zSt
17060 61 63 6b 5b 74 6f 73 5d 2c 20 70 4d 65 6d 2d 3e  ack[tos], pMem->
17070 73 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s.n);.          
17080 20 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20    pMem->s.flags 
17090 7c 3d 20 53 54 4b 5f 53 74 72 7c 53 54 4b 5f 44  |= STK_Str|STK_D
170a0 79 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  yn;.          }.
170b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f            if( zO
170c0 6c 64 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  ld ) sqliteFree(
170d0 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  zOld);.        }
170e0 0a 20 20 20 20 20 20 20 20 50 6f 70 53 74 61 63  .        PopStac
170f0 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
17100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17110 0a 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  .      /* Opcode
17120 3a 20 41 67 67 47 65 74 20 2a 20 50 32 20 2a 0a  : AggGet * P2 *.
17130 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17140 2a 20 50 75 73 68 20 61 20 6e 65 77 20 65 6e 74  * Push a new ent
17150 72 79 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ry onto the stac
17160 6b 20 77 68 69 63 68 20 69 73 20 61 20 63 6f 70  k which is a cop
17170 79 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 66  y of the P2-th f
17180 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ield.      ** of
17190 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 67 67   the current agg
171a0 72 65 67 61 74 65 2e 20 20 53 74 72 69 6e 67 73  regate.  Strings
171b0 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
171c0 74 65 64 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  ted so.      ** 
171d0 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20 77 69  string values wi
171e0 6c 6c 20 62 65 20 65 70 68 65 6d 65 72 61 6c 2e  ll be ephemeral.
171f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17200 63 61 73 65 20 4f 50 5f 41 67 67 47 65 74 3a 20  case OP_AggGet: 
17210 7b 0a 20 20 20 20 20 20 20 20 41 67 67 45 6c 65  {.        AggEle
17220 6d 20 2a 70 46 6f 63 75 73 20 3d 20 41 67 67 49  m *pFocus = AggI
17230 6e 46 6f 63 75 73 28 70 2d 3e 61 67 67 29 3b 0a  nFocus(p->agg);.
17240 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
17250 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
17260 20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b 70 2d 3e   int tos = ++p->
17270 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tos;.        if(
17280 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 74 6f   NeedStack(p, to
17290 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  s) ) goto no_mem
172a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
172b0 6f 63 75 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  ocus==0 ) goto n
172c0 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  o_mem;.        i
172d0 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  f( i>=0 && i<p->
172e0 61 67 67 2e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  agg.nMem ){.    
172f0 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
17300 3d 20 26 70 46 6f 63 75 73 2d 3e 61 4d 65 6d 5b  = &pFocus->aMem[
17310 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  i];.          p-
17320 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 70  >aStack[tos] = p
17330 4d 65 6d 2d 3e 73 3b 0a 20 20 20 20 20 20 20 20  Mem->s;.        
17340 20 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d    p->zStack[tos]
17350 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
17360 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b        p->aStack[
17370 74 6f 73 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 53  tos].flags &= ~S
17380 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20 20 20  TK_Dyn;.        
17390 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
173a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
173b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 4e 65  /* Opcode: AggNe
173c0 78 74 20 2a 20 50 32 20 2a 0a 20 20 20 20 20 20  xt * P2 *.      
173d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65  **.      ** Make
173e0 20 74 68 65 20 6e 65 78 74 20 61 67 67 72 65 67   the next aggreg
173f0 61 74 65 20 76 61 6c 75 65 20 74 68 65 20 63 75  ate value the cu
17400 72 72 65 6e 74 20 61 67 67 72 65 67 61 74 65 2e  rrent aggregate.
17410 20 20 54 68 65 20 70 72 69 6f 72 0a 20 20 20 20    The prior.    
17420 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 20 69    ** aggregate i
17430 73 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 61  s deleted.  If a
17440 6c 6c 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  ll aggregate val
17450 75 65 73 20 68 61 76 65 20 62 65 65 6e 20 63 6f  ues have been co
17460 6e 73 75 6d 65 64 2c 0a 20 20 20 20 20 20 2a 2a  nsumed,.      **
17470 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 20 20 20   jump to P2..   
17480 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17490 68 65 20 6f 72 64 65 72 20 6f 66 20 61 67 67 72  he order of aggr
174a0 65 67 61 74 6f 72 20 6f 70 63 6f 64 65 73 20 69  egator opcodes i
174b0 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68  s important.  Th
174c0 65 20 6f 72 64 65 72 20 69 73 3a 0a 20 20 20 20  e order is:.    
174d0 20 20 2a 2a 20 41 67 67 52 65 73 65 74 20 41 67    ** AggReset Ag
174e0 67 46 6f 63 75 73 20 41 67 67 4e 65 78 74 2e 20  gFocus AggNext. 
174f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17500 20 79 6f 75 20 6d 75 73 74 20 65 78 65 63 75 74   you must execut
17510 65 0a 20 20 20 20 20 20 2a 2a 20 41 67 67 52 65  e.      ** AggRe
17520 73 65 74 20 66 69 72 73 74 2c 20 74 68 65 6e 20  set first, then 
17530 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41 67 67  zero or more Agg
17540 46 6f 63 75 73 20 6f 70 65 72 61 74 69 6f 6e 73  Focus operations
17550 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
17560 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41 67 67  zero or more Agg
17570 4e 65 78 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  Next operations.
17580 20 20 59 6f 75 20 6d 75 73 74 20 6e 6f 74 20 65    You must not e
17590 78 65 63 75 74 65 20 61 6e 20 41 67 67 46 6f 63  xecute an AggFoc
175a0 75 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 62  us.      ** in b
175b0 65 74 77 65 65 6e 20 61 6e 20 41 67 67 4e 65 78  etween an AggNex
175c0 74 20 61 6e 64 20 61 6e 20 41 67 67 52 65 73 65  t and an AggRese
175d0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
175e0 20 20 63 61 73 65 20 4f 50 5f 41 67 67 4e 65 78    case OP_AggNex
175f0 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
17600 20 70 2d 3e 61 67 67 2e 6e 48 61 73 68 20 29 7b   p->agg.nHash ){
17610 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 67  .          p->ag
17620 67 2e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  g.nHash = 0;.   
17630 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
17640 65 28 70 2d 3e 61 67 67 2e 61 70 48 61 73 68 29  e(p->agg.apHash)
17650 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
17660 67 67 2e 61 70 48 61 73 68 20 3d 20 30 3b 0a 20  gg.apHash = 0;. 
17670 20 20 20 20 20 20 20 20 20 70 2d 3e 61 67 67 2e           p->agg.
17680 70 43 75 72 72 65 6e 74 20 3d 20 70 2d 3e 61 67  pCurrent = p->ag
17690 67 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  g.pFirst;.      
176a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
176b0 67 67 2e 70 43 75 72 72 65 6e 74 3d 3d 70 2d 3e  gg.pCurrent==p->
176c0 61 67 67 2e 70 46 69 72 73 74 20 26 26 20 70 2d  agg.pFirst && p-
176d0 3e 61 67 67 2e 70 43 75 72 72 65 6e 74 21 3d 30  >agg.pCurrent!=0
176e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
176f0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 41  t i;.          A
17700 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20  ggElem *pElem = 
17710 70 2d 3e 61 67 67 2e 70 43 75 72 72 65 6e 74 3b  p->agg.pCurrent;
17720 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17730 3d 30 3b 20 69 3c 70 2d 3e 61 67 67 2e 6e 4d 65  =0; i<p->agg.nMe
17740 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
17750 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d 2d 3e       if( pElem->
17760 61 4d 65 6d 5b 69 5d 2e 73 2e 66 6c 61 67 73 20  aMem[i].s.flags 
17770 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20  & STK_Dyn ){.   
17780 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17790 65 46 72 65 65 28 70 45 6c 65 6d 2d 3e 61 4d 65  eFree(pElem->aMe
177a0 6d 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 20  m[i].z);.       
177b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
177c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
177d0 61 67 67 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  agg.pCurrent = p
177e0 2d 3e 61 67 67 2e 70 46 69 72 73 74 20 3d 20 70  ->agg.pFirst = p
177f0 45 6c 65 6d 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Elem->pNext;.   
17800 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
17810 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  e(pElem);.      
17820 20 20 20 20 70 2d 3e 61 67 67 2e 6e 45 6c 65 6d      p->agg.nElem
17830 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
17840 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 67 67        if( p->agg
17850 2e 70 43 75 72 72 65 6e 74 3d 3d 30 20 29 7b 0a  .pCurrent==0 ){.
17860 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70            pc = p
17870 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 20 20  Op->p2-1;.      
17880 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17890 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
178a0 20 20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74    /* Opcode: Set
178b0 43 6c 65 61 72 20 50 31 20 2a 20 2a 0a 20 20 20  Clear P1 * *.   
178c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 52     **.      ** R
178d0 65 6d 6f 76 65 20 61 6c 6c 20 65 6c 65 6d 65 6e  emove all elemen
178e0 74 73 20 66 72 6f 6d 20 74 68 65 20 50 31 2d 74  ts from the P1-t
178f0 68 20 53 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  h Set..      */.
17900 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 65        case OP_Se
17910 74 43 6c 65 61 72 3a 20 7b 0a 20 20 20 20 20 20  tClear: {.      
17920 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
17930 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  1;.        if( i
17940 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 53 65 74  >=0 && i<p->nSet
17950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
17960 74 43 6c 65 61 72 28 26 70 2d 3e 61 53 65 74 5b  tClear(&p->aSet[
17970 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
17980 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17990 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
179a0 4f 70 63 6f 64 65 3a 20 53 65 74 49 6e 73 65 72  Opcode: SetInser
179b0 74 20 50 31 20 2a 20 50 33 0a 20 20 20 20 20 20  t P1 * P3.      
179c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 53  **.      ** If S
179d0 65 74 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 65  et P1 does not e
179e0 78 69 73 74 20 74 68 65 6e 20 63 72 65 61 74 65  xist then create
179f0 20 69 74 2e 20 20 54 68 65 6e 20 69 6e 73 65 72   it.  Then inser
17a00 74 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  t value.      **
17a10 20 50 33 20 69 6e 74 6f 20 74 68 61 74 20 73 65   P3 into that se
17a20 74 2e 20 20 49 66 20 50 33 20 69 73 20 4e 55 4c  t.  If P3 is NUL
17a30 4c 2c 20 74 68 65 6e 20 69 6e 73 65 72 74 20 74  L, then insert t
17a40 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20  he top of the.  
17a50 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 6e 74      ** stack int
17a60 6f 20 74 68 65 20 73 65 74 2e 0a 20 20 20 20 20  o the set..     
17a70 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 4f   */.      case O
17a80 50 5f 53 65 74 49 6e 73 65 72 74 3a 20 7b 0a 20  P_SetInsert: {. 
17a90 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
17aa0 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20 20 20 20  Op->p1;.        
17ab0 69 66 28 20 70 2d 3e 6e 53 65 74 3c 3d 69 20 29  if( p->nSet<=i )
17ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
17ad0 53 65 74 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Set = sqliteReal
17ae0 6c 6f 63 28 70 2d 3e 61 53 65 74 2c 20 28 69 2b  loc(p->aSet, (i+
17af0 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 65  1)*sizeof(p->aSe
17b00 74 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  t[0]) );.       
17b10 20 20 20 69 66 28 20 70 2d 3e 61 53 65 74 3d 3d     if( p->aSet==
17b20 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
17b30 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
17b40 74 28 26 70 2d 3e 61 53 65 74 5b 70 2d 3e 6e 53  t(&p->aSet[p->nS
17b50 65 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  et], 0, sizeof(p
17b60 2d 3e 61 53 65 74 5b 30 5d 29 2a 28 69 2b 31 20  ->aSet[0])*(i+1 
17b70 2d 20 70 2d 3e 6e 53 65 74 29 29 3b 0a 20 20 20  - p->nSet));.   
17b80 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 74 20 3d         p->nSet =
17b90 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i+1;.        }.
17ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
17bb0 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >p3 ){.         
17bc0 20 53 65 74 49 6e 73 65 72 74 28 26 70 2d 3e 61   SetInsert(&p->a
17bd0 53 65 74 5b 69 5d 2c 20 70 4f 70 2d 3e 70 33 29  Set[i], pOp->p3)
17be0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17bf0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74  .          int t
17c00 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20  os = p->tos;.   
17c10 20 20 20 20 20 20 20 69 66 28 20 74 6f 73 3c 30         if( tos<0
17c20 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
17c30 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20 20 20  gh_stack;.      
17c40 20 20 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c      Stringify(p,
17c50 20 74 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20   tos);.         
17c60 20 53 65 74 49 6e 73 65 72 74 28 26 70 2d 3e 61   SetInsert(&p->a
17c70 53 65 74 5b 69 5d 2c 20 70 2d 3e 7a 53 74 61 63  Set[i], p->zStac
17c80 6b 5b 74 6f 73 5d 29 3b 0a 20 20 20 20 20 20 20  k[tos]);.       
17c90 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 31     PopStack(p, 1
17ca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17cc0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70    }..      /* Op
17cd0 63 6f 64 65 3a 20 53 65 74 46 6f 75 6e 64 20 50  code: SetFound P
17ce0 31 20 50 32 20 2a 0a 20 20 20 20 20 20 2a 2a 0a  1 P2 *.      **.
17cf0 20 20 20 20 20 20 2a 2a 20 50 6f 70 20 74 68 65        ** Pop the
17d00 20 73 74 61 63 6b 20 6f 6e 63 65 20 61 6e 64 20   stack once and 
17d10 63 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  compare the valu
17d20 65 20 70 6f 70 70 65 64 20 6f 66 66 20 77 69 74  e popped off wit
17d30 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
17d40 6f 6e 74 65 6e 74 73 20 6f 66 20 73 65 74 20 50  ontents of set P
17d50 31 2e 20 20 49 66 20 74 68 65 20 65 6c 65 6d 65  1.  If the eleme
17d60 6e 74 20 70 6f 70 70 65 64 20 65 78 69 73 74 73  nt popped exists
17d70 20 69 6e 20 73 65 74 20 50 31 2c 0a 20 20 20 20   in set P1,.    
17d80 20 20 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74    ** then jump t
17d90 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
17da0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20   fall through.. 
17db0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
17dc0 73 65 20 4f 50 5f 53 65 74 46 6f 75 6e 64 3a 20  se OP_SetFound: 
17dd0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
17de0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 20  = pOp->p1;.     
17df0 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e     int tos = p->
17e00 74 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tos;.        if(
17e10 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f   tos<0 ) goto no
17e20 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a  t_enough_stack;.
17e30 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 69 66          Stringif
17e40 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20  y(p, tos);.     
17e50 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69     if( i>=0 && i
17e60 3c 70 2d 3e 6e 53 65 74 20 26 26 20 53 65 74 54  <p->nSet && SetT
17e70 65 73 74 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2c  est(&p->aSet[i],
17e80 20 70 2d 3e 7a 53 74 61 63 6b 5b 74 6f 73 5d 29   p->zStack[tos])
17e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63   ){.          pc
17ea0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
17eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17ec0 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 31 29    PopStack(p, 1)
17ed0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
17ee0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17ef0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74 4e 6f  /* Opcode: SetNo
17f00 74 46 6f 75 6e 64 20 50 31 20 50 32 20 2a 0a 20  tFound P1 P2 *. 
17f10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17f20 20 50 6f 70 20 74 68 65 20 73 74 61 63 6b 20 6f   Pop the stack o
17f30 6e 63 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20  nce and compare 
17f40 74 68 65 20 76 61 6c 75 65 20 70 6f 70 70 65 64  the value popped
17f50 20 6f 66 66 20 77 69 74 68 20 74 68 65 0a 20 20   off with the.  
17f60 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20      ** contents 
17f70 6f 66 20 73 65 74 20 50 31 2e 20 20 49 66 20 74  of set P1.  If t
17f80 68 65 20 65 6c 65 6d 65 6e 74 20 70 6f 70 70 65  he element poppe
17f90 64 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  d does not exist
17fa0 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 73  s in .      ** s
17fb0 65 74 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70  et P1, then jump
17fc0 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69   to P2.  Otherwi
17fd0 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  se fall through.
17fe0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17ff0 63 61 73 65 20 4f 50 5f 53 65 74 4e 6f 74 46 6f  case OP_SetNotFo
18000 75 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  und: {.        i
18010 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
18020 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 73 20          int tos 
18030 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20 20 20 20  = p->tos;.      
18040 20 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f    if( tos<0 ) go
18050 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
18060 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 53 74 72  ack;.        Str
18070 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a  ingify(p, tos);.
18080 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
18090 20 26 26 20 69 3c 70 2d 3e 6e 53 65 74 20 26 26   && i<p->nSet &&
180a0 20 21 53 65 74 54 65 73 74 28 26 70 2d 3e 61 53   !SetTest(&p->aS
180b0 65 74 5b 69 5d 2c 20 70 2d 3e 7a 53 74 61 63 6b  et[i], p->zStack
180c0 5b 74 6f 73 5d 29 20 29 7b 0a 20 20 20 20 20 20  [tos]) ){.      
180d0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
180e0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
180f0 20 20 20 20 20 20 20 20 50 6f 70 53 74 61 63 6b          PopStack
18100 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
18110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
18120 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 74 68 65        /* An othe
18130 72 20 6f 70 63 6f 64 65 20 69 73 20 69 6c 6c 65  r opcode is ille
18140 67 61 6c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a  gal....      */.
18150 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
18160 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
18170 28 7a 42 75 66 2c 22 25 64 22 2c 70 4f 70 2d 3e  (zBuf,"%d",pOp->
18180 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  opcode);.       
18190 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
181a0 28 70 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e  (pzErrMsg, "unkn
181b0 6f 77 6e 20 6f 70 63 6f 64 65 20 22 2c 20 7a 42  own opcode ", zB
181c0 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
181d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
181e0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 62 72  RNAL;.        br
181f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18200 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   }..    /* The f
18210 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 64  ollowing code ad
18220 64 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  ds nothing to th
18230 65 20 61 63 74 75 61 6c 20 66 75 6e 63 74 69 6f  e actual functio
18240 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  nality.    ** of
18250 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 49   the program.  I
18260 74 20 69 73 20 6f 6e 6c 79 20 68 65 72 65 20 66  t is only here f
18270 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
18280 65 62 75 67 67 69 6e 67 2e 0a 20 20 20 20 2a 2a  ebugging..    **
18290 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
182a0 6e 64 2c 20 69 74 20 64 6f 65 73 20 62 75 72 6e  nd, it does burn
182b0 20 43 50 55 20 63 79 63 6c 65 73 20 65 76 65 72   CPU cycles ever
182c0 79 20 74 69 6d 65 20 74 68 72 6f 75 67 68 0a 20  y time through. 
182d0 20 20 20 2a 2a 20 74 68 65 20 65 76 61 6c 75 61     ** the evalua
182e0 74 6f 72 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65  tor loop.  So we
182f0 20 63 61 6e 20 6c 65 61 76 65 20 69 74 20 6f 75   can leave it ou
18300 74 20 77 68 65 6e 20 4e 44 45 42 55 47 20 69 73  t when NDEBUG is
18310 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f   defined..    */
18320 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18330 20 20 20 20 69 66 28 20 70 63 3c 2d 31 20 7c 7c      if( pc<-1 ||
18340 20 70 63 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20   pc>=p->nOp ){. 
18350 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
18360 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22  ring(pzErrMsg, "
18370 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
18380 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 20   out of range", 
18390 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  0);.      rc = S
183a0 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
183b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
183c0 3e 74 72 61 63 65 20 26 26 20 70 2d 3e 74 6f 73  >trace && p->tos
183d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
183e0 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
183f0 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 53 74 61  f(p->trace, "Sta
18400 63 6b 3a 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  ck:");.      for
18410 28 69 3d 70 2d 3e 74 6f 73 3b 20 69 3e 3d 30 20  (i=p->tos; i>=0 
18420 26 26 20 69 3e 70 2d 3e 74 6f 73 2d 35 3b 20 69  && i>p->tos-5; i
18430 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
18440 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c   p->aStack[i].fl
18450 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29  ags & STK_Null )
18460 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
18470 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 20  ntf(p->trace, " 
18480 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
18490 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 53 74  }else if( p->aSt
184a0 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53  ack[i].flags & S
184b0 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  TK_Int ){.      
184c0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74      fprintf(p->t
184d0 72 61 63 65 2c 20 22 20 69 3a 25 64 22 2c 20 70  race, " i:%d", p
184e0 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 69 29 3b 0a  ->aStack[i].i);.
184f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
18500 28 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66  ( p->aStack[i].f
18510 6c 61 67 73 20 26 20 53 54 4b 5f 52 65 61 6c 20  lags & STK_Real 
18520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
18530 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 20 22  intf(p->trace, "
18540 20 72 3a 25 67 22 2c 20 70 2d 3e 61 53 74 61 63   r:%g", p->aStac
18550 6b 5b 69 5d 2e 72 29 3b 0a 20 20 20 20 20 20 20  k[i].r);.       
18560 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 53   }else if( p->aS
18570 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20  tack[i].flags & 
18580 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  STK_Str ){.     
18590 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 74 61       if( p->aSta
185a0 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
185b0 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20  K_Dyn ){.       
185c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
185d0 74 72 61 63 65 2c 20 22 20 7a 3a 5b 25 2e 31 31  trace, " z:[%.11
185e0 73 5d 22 2c 20 70 2d 3e 7a 53 74 61 63 6b 5b 69  s]", p->zStack[i
185f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]);.          }e
18600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
18610 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63   fprintf(p->trac
18620 65 2c 20 22 20 73 3a 5b 25 2e 31 31 73 5d 22 2c  e, " s:[%.11s]",
18630 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a   p->zStack[i]);.
18640 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18660 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
18670 74 72 61 63 65 2c 20 22 20 3f 3f 3f 22 29 3b 0a  trace, " ???");.
18680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18690 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
186a0 70 2d 3e 74 72 61 63 65 2c 22 5c 6e 22 29 3b 0a  p->trace,"\n");.
186b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
186c0 0a 0a 63 6c 65 61 6e 75 70 3a 0a 20 20 43 6c 65  ..cleanup:.  Cle
186d0 61 6e 75 70 28 70 29 3b 0a 20 20 72 65 74 75 72  anup(p);.  retur
186e0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  n rc;..  /* Jump
186f0 20 74 6f 20 68 65 72 65 20 69 66 20 61 20 6d 61   to here if a ma
18700 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 20 20 49  lloc() fails.  I
18710 74 27 73 20 68 61 72 64 20 74 6f 20 67 65 74 20  t's hard to get 
18720 61 20 6d 61 6c 6c 6f 63 28 29 0a 20 20 2a 2a 20  a malloc().  ** 
18730 74 6f 20 66 61 69 6c 20 6f 6e 20 61 20 6d 6f 64  to fail on a mod
18740 65 72 6e 20 56 4d 20 63 6f 6d 70 75 74 65 72 2c  ern VM computer,
18750 20 73 6f 20 74 68 69 73 20 63 6f 64 65 20 69 73   so this code is
18760 20 75 6e 74 65 73 74 65 64 2e 0a 20 20 2a 2f 0a   untested..  */.
18770 6e 6f 5f 6d 65 6d 3a 0a 20 20 43 6c 65 61 6e 75  no_mem:.  Cleanu
18780 70 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  p(p);.  sqliteSe
18790 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
187a0 2c 20 22 6f 75 74 20 6f 72 20 6d 65 6d 6f 72 79  , "out or memory
187b0 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
187c0 31 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  1;..  /* Jump to
187d0 20 68 65 72 65 20 69 66 20 61 20 6f 70 65 72 61   here if a opera
187e0 74 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  tor is encounter
187f0 65 64 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ed that requires
18800 20 6d 6f 72 65 20 73 74 61 63 6b 0a 20 20 2a 2a   more stack.  **
18810 20 6f 70 65 72 61 6e 64 73 20 74 68 61 6e 20 61   operands than a
18820 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
18830 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 73 74  ilable on the st
18840 61 63 6b 2e 0a 20 20 2a 2f 0a 6e 6f 74 5f 65 6e  ack..  */.not_en
18850 6f 75 67 68 5f 73 74 61 63 6b 3a 0a 20 20 73 70  ough_stack:.  sp
18860 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c  rintf(zBuf,"%d",
18870 70 63 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  pc);.  sqliteSet
18880 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
18890 20 22 74 6f 6f 20 66 65 77 20 6f 70 65 72 61 6e   "too few operan
188a0 64 73 20 6f 6e 20 73 74 61 63 6b 20 61 74 20 22  ds on stack at "
188b0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 63  , zBuf, 0);.  rc
188c0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
188d0 41 4c 3b 0a 20 20 67 6f 74 6f 20 63 6c 65 61 6e  AL;.  goto clean
188e0 75 70 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  up;..  /* Jump h
188f0 65 72 65 20 69 66 20 61 6e 20 69 6c 6c 65 67 61  ere if an illega
18900 6c 20 6f 72 20 69 6c 6c 66 6f 72 6d 65 64 20 69  l or illformed i
18910 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
18920 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 62 61 64  ecuted..  */.bad
18930 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3a 0a 20 20  _instruction:.  
18940 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64  sprintf(zBuf,"%d
18950 22 2c 70 63 29 3b 0a 20 20 73 71 6c 69 74 65 53  ",pc);.  sqliteS
18960 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
18970 67 2c 20 22 69 6c 6c 65 67 61 6c 20 6f 70 65 72  g, "illegal oper
18980 61 74 69 6f 6e 20 61 74 20 22 2c 20 7a 42 75 66  ation at ", zBuf
18990 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  , 0);.  rc = SQL
189a0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
189b0 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 7d 0a  goto cleanup;.}.