/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7d9bb3701ea00576c5d5fb3f3de63af7b7304241:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56  implements the V
01a0: 69 72 74 75 61 6c 20 44 61 74 61 62 61 73 65 20  irtual Database 
01b0: 45 6e 67 69 6e 65 20 28 56 44 42 45 29 0a 2a 2a  Engine (VDBE).**
01c0: 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61 72 73  .** The SQL pars
01d0: 65 72 20 67 65 6e 65 72 61 74 65 73 20 61 20 70  er generates a p
01e0: 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69 73 20  rogram which is 
01f0: 74 68 65 6e 20 65 78 65 63 75 74 65 64 20 62 79  then executed by
0200: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74 6f 20  .** the VDBE to 
0210: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  do the work of t
0220: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
0230: 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61 6d 73  .  VDBE programs
0240: 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c 61 72   are .** similar
0250: 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73 73 65   in form to asse
0260: 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e 20 20  mbly language.  
0270: 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 6e 73  The program cons
0280: 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c 69 6e  ists of.** a lin
0290: 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ear sequence of 
02a0: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45 61 63  operations.  Eac
02b0: 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20  h operation has 
02c0: 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20 61 6e  an opcode .** an
02d0: 64 20 33 20 6f 70 65 72 61 6e 64 73 2e 20 20 4f  d 3 operands.  O
02e0: 70 65 72 61 6e 64 73 20 50 31 20 61 6e 64 20 50  perands P1 and P
02f0: 32 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 20  2 are integers. 
0300: 20 4f 70 65 72 61 6e 64 20 50 33 20 0a 2a 2a 20   Operand P3 .** 
0310: 69 73 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  is a null-termin
0320: 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20 20 54  ated string.   T
0330: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6d 75  he P2 operand mu
0340: 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
0350: 76 65 2e 0a 2a 2a 20 4f 70 63 6f 64 65 73 20 77  ve..** Opcodes w
0360: 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 20 69 67  ill typically ig
0370: 6e 6f 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  nore one or more
0380: 20 6f 70 65 72 61 6e 64 73 2e 20 20 4d 61 6e 79   operands.  Many
0390: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 67 6e 6f   opcodes.** igno
03a0: 72 65 20 61 6c 6c 20 74 68 72 65 65 20 6f 70 65  re all three ope
03b0: 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  rands..**.** Com
03c0: 70 75 74 61 74 69 6f 6e 20 72 65 73 75 6c 74 73  putation results
03d0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 61   are stored on a
03e0: 20 73 74 61 63 6b 2e 20 20 45 61 63 68 20 65 6e   stack.  Each en
03f0: 74 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 74  try on the.** st
0400: 61 63 6b 20 69 73 20 65 69 74 68 65 72 20 61 6e  ack is either an
0410: 20 69 6e 74 65 67 65 72 2c 20 61 20 6e 75 6c 6c   integer, a null
0420: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0430: 6e 67 2c 20 61 20 66 6c 6f 61 74 69 6e 67 20 70  ng, a floating p
0440: 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2c 20  oint.** number, 
0450: 6f 72 20 74 68 65 20 53 51 4c 20 22 4e 55 4c 4c  or the SQL "NULL
0460: 22 20 76 61 6c 75 65 2e 20 20 41 6e 20 69 6e 70  " value.  An inp
0470: 6c 69 63 69 74 20 63 6f 6e 76 65 72 73 69 6f 6e  licit conversion
0480: 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 74 79 70   from one.** typ
0490: 65 20 74 6f 20 74 68 65 20 6f 74 68 65 72 20 6f  e to the other o
04a0: 63 63 75 72 73 20 61 73 20 6e 65 63 65 73 73 61  ccurs as necessa
04b0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 4d 6f 73 74 20  ry..** .** Most 
04c0: 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 20 74  of the code in t
04d0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 61 6b 65  his file is take
04e0: 6e 20 75 70 20 62 79 20 74 68 65 20 73 71 6c 69  n up by the sqli
04f0: 74 65 56 64 62 65 45 78 65 63 28 29 0a 2a 2a 20  teVdbeExec().** 
0500: 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 64  function which d
0510: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
0520: 69 6e 74 65 72 70 72 65 74 69 6e 67 20 61 20 56  interpreting a V
0530: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 20  DBE program..** 
0540: 42 75 74 20 6f 74 68 65 72 20 72 6f 75 74 69 6e  But other routin
0550: 65 73 20 61 72 65 20 61 6c 73 6f 20 70 72 6f 76  es are also prov
0560: 69 64 65 64 20 74 6f 20 68 65 6c 70 20 69 6e 20  ided to help in 
0570: 62 75 69 6c 64 69 6e 67 20 75 70 0a 2a 2a 20 61  building up.** a
0580: 20 70 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63   program instruc
0590: 74 69 6f 6e 20 62 79 20 69 6e 73 74 72 75 63 74  tion by instruct
05a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ion..**.** $Id: 
05b0: 76 64 62 65 2e 63 2c 76 20 31 2e 31 35 36 20 32  vdbe.c,v 1.156 2
05c0: 30 30 32 2f 30 36 2f 31 34 20 32 32 3a 33 38 3a  002/06/14 22:38:
05d0: 34 33 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  43 drh Exp $.*/.
05e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
05f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0600: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <ctype.h>../*.**
0610: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
0620: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
0630: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 76  s incremented ev
0640: 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 73 6f  ery time a curso
0650: 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74 68  r.** moves, eith
0660: 65 72 20 62 79 20 74 68 65 20 4f 50 5f 4d 6f 76  er by the OP_Mov
0670: 65 54 6f 20 6f 72 20 74 68 65 20 4f 50 5f 4e 65  eTo or the OP_Ne
0680: 78 74 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20  xt opcode.  The 
0690: 74 65 73 74 0a 2a 2a 20 70 72 6f 63 65 64 75 72  test.** procedur
06a0: 65 73 20 75 73 65 20 74 68 69 73 20 69 6e 66 6f  es use this info
06b0: 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20  rmation to make 
06c0: 73 75 72 65 20 74 68 61 74 20 69 6e 64 69 63 65  sure that indice
06d0: 73 20 61 72 65 0a 2a 2a 20 77 6f 72 6b 69 6e 67  s are.** working
06e0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 69   correctly..*/.i
06f0: 6e 74 20 73 71 6c 69 74 65 5f 73 65 61 72 63 68  nt sqlite_search
0700: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
0710: 2a 2a 20 53 51 4c 20 69 73 20 74 72 61 6e 73 6c  ** SQL is transl
0720: 61 74 65 64 20 69 6e 74 6f 20 61 20 73 65 71 75  ated into a sequ
0730: 65 6e 63 65 20 6f 66 20 69 6e 73 74 72 75 63 74  ence of instruct
0740: 69 6f 6e 73 20 74 6f 20 62 65 0a 2a 2a 20 65 78  ions to be.** ex
0750: 65 63 75 74 65 64 20 62 79 20 61 20 76 69 72 74  ecuted by a virt
0760: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 45 61  ual machine.  Ea
0770: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
0780: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  s an instance.**
0790: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
07a0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
07b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
07c0: 64 62 65 4f 70 20 4f 70 3b 0a 0a 2f 2a 0a 2a 2a  dbeOp Op;../*.**
07d0: 20 42 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 0a   Boolean values.
07e0: 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  */.typedef unsig
07f0: 6e 65 64 20 63 68 61 72 20 42 6f 6f 6c 3b 0a 0a  ned char Bool;..
0800: 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  /*.** A cursor i
0810: 73 20 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  s a pointer into
0820: 20 61 20 73 69 6e 67 6c 65 20 42 54 72 65 65 20   a single BTree 
0830: 77 69 74 68 69 6e 20 61 20 64 61 74 61 62 61 73  within a databas
0840: 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 63  e file..** The c
0850: 75 72 73 6f 72 20 63 61 6e 20 73 65 65 6b 20 74  ursor can seek t
0860: 6f 20 61 20 42 54 72 65 65 20 65 6e 74 72 79 20  o a BTree entry 
0870: 77 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61  with a particula
0880: 72 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 6c 6f 6f  r key, or.** loo
0890: 70 20 6f 76 65 72 20 61 6c 6c 20 65 6e 74 72 69  p over all entri
08a0: 65 73 20 6f 66 20 74 68 65 20 42 74 72 65 65 2e  es of the Btree.
08b0: 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 69    You can also i
08c0: 6e 73 65 72 74 20 6e 65 77 20 42 54 72 65 65 0a  nsert new BTree.
08d0: 2a 2a 20 65 6e 74 72 69 65 73 20 6f 72 20 72 65  ** entries or re
08e0: 74 72 69 65 76 65 20 74 68 65 20 6b 65 79 20 6f  trieve the key o
08f0: 72 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  r data from the 
0900: 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
0910: 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
0920: 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
0930: 6f 2e 0a 2a 2a 20 0a 2a 2a 20 45 76 65 72 79 20  o..** .** Every 
0940: 63 75 72 73 6f 72 20 74 68 61 74 20 74 68 65 20  cursor that the 
0950: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
0960: 68 61 73 20 6f 70 65 6e 20 69 73 20 72 65 70 72  has open is repr
0970: 65 73 65 6e 74 65 64 20 62 79 20 61 6e 0a 2a 2a  esented by an.**
0980: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0990: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
09a0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
09b0: 43 75 72 73 6f 72 20 7b 0a 20 20 42 74 43 75 72  Cursor {.  BtCur
09c0: 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20 20 20  sor *pCursor;   
09d0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 73   /* The cursor s
09e0: 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20  tructure of the 
09f0: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
0a00: 20 6c 61 73 74 52 65 63 6e 6f 3b 20 20 20 20 20   lastRecno;     
0a10: 20 20 20 2f 2a 20 4c 61 73 74 20 72 65 63 6e 6f     /* Last recno
0a20: 20 66 72 6f 6d 20 61 20 4e 65 78 74 20 6f 72 20   from a Next or 
0a30: 4e 65 78 74 49 64 78 20 6f 70 65 72 61 74 69 6f  NextIdx operatio
0a40: 6e 20 2a 2f 0a 20 20 42 6f 6f 6c 20 72 65 63 6e  n */.  Bool recn
0a50: 6f 49 73 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20  oIsValid;    /* 
0a60: 54 72 75 65 20 69 66 20 6c 61 73 74 52 65 63 6e  True if lastRecn
0a70: 6f 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  o is valid */.  
0a80: 42 6f 6f 6c 20 6b 65 79 41 73 44 61 74 61 3b 20  Bool keyAsData; 
0a90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f        /* The OP_
0aa0: 43 6f 6c 75 6d 6e 20 63 6f 6d 6d 61 6e 64 20 77  Column command w
0ab0: 6f 72 6b 73 20 6f 6e 20 6b 65 79 20 69 6e 73 74  orks on key inst
0ac0: 65 61 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  ead of data */. 
0ad0: 20 42 6f 6f 6c 20 61 74 46 69 72 73 74 3b 20 20   Bool atFirst;  
0ae0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0af0: 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 66 69  f pointing to fi
0b00: 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  rst entry */.  B
0b10: 6f 6f 6c 20 75 73 65 52 61 6e 64 6f 6d 52 6f 77  ool useRandomRow
0b20: 69 64 3b 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  id;  /* Generate
0b30: 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
0b40: 65 72 73 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 6c  ers semi-randoml
0b50: 79 20 2a 2f 0a 20 20 42 6f 6f 6c 20 6e 75 6c 6c  y */.  Bool null
0b60: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Row;         /* 
0b70: 54 72 75 65 20 69 66 20 70 6f 69 6e 74 69 6e 67  True if pointing
0b80: 20 74 6f 20 61 20 72 6f 77 20 77 69 74 68 20 6e   to a row with n
0b90: 6f 20 64 61 74 61 20 2a 2f 0a 20 20 42 74 72 65  o data */.  Btre
0ba0: 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  e *pBt;         
0bb0: 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 66 69    /* Separate fi
0bc0: 6c 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  le holding tempo
0bd0: 72 61 72 79 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b  rary table */.};
0be0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bf0: 43 75 72 73 6f 72 20 43 75 72 73 6f 72 3b 0a 0a  Cursor Cursor;..
0c00: 2f 2a 0a 2a 2a 20 41 20 73 6f 72 74 65 72 20 62  /*.** A sorter b
0c10: 75 69 6c 64 73 20 61 20 6c 69 73 74 20 6f 66 20  uilds a list of 
0c20: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 62 65 20 73  elements to be s
0c30: 6f 72 74 65 64 2e 20 20 45 61 63 68 20 65 6c 65  orted.  Each ele
0c40: 6d 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 6c  ment of.** the l
0c50: 69 73 74 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ist is an instan
0c60: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0c70: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0c80: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c90: 20 53 6f 72 74 65 72 20 53 6f 72 74 65 72 3b 0a   Sorter Sorter;.
0ca0: 73 74 72 75 63 74 20 53 6f 72 74 65 72 20 7b 0a  struct Sorter {.
0cb0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
0cc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0cd0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
0ce0: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  key */.  char *z
0cf0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
0d00: 54 68 65 20 6b 65 79 20 62 79 20 77 68 69 63 68  The key by which
0d10: 20 77 65 20 77 69 6c 6c 20 73 6f 72 74 20 2a 2f   we will sort */
0d20: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
0d30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d40: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
0d50: 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20   data */.  char 
0d60: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f  *pData;        /
0d70: 2a 20 54 68 65 20 64 61 74 61 20 61 73 73 6f 63  * The data assoc
0d80: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
0d90: 6b 65 79 20 2a 2f 0a 20 20 53 6f 72 74 65 72 20  key */.  Sorter 
0da0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
0db0: 4e 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  Next in the list
0dc0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4e   */.};../* .** N
0dd0: 75 6d 62 65 72 20 6f 66 20 62 75 63 6b 65 74 73  umber of buckets
0de0: 20 75 73 65 64 20 66 6f 72 20 6d 65 72 67 65 2d   used for merge-
0df0: 73 6f 72 74 2e 20 20 0a 2a 2f 0a 23 64 65 66 69  sort.  .*/.#defi
0e00: 6e 65 20 4e 53 4f 52 54 20 33 30 0a 0a 2f 2a 0a  ne NSORT 30../*.
0e10: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** Number of byt
0e20: 65 73 20 6f 66 20 73 74 72 69 6e 67 20 73 74 6f  es of string sto
0e30: 72 61 67 65 20 73 70 61 63 65 20 61 76 61 69 6c  rage space avail
0e40: 61 62 6c 65 20 74 6f 20 65 61 63 68 20 73 74 61  able to each sta
0e50: 63 6b 0a 2a 2a 20 6c 61 79 65 72 20 77 69 74 68  ck.** layer with
0e60: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6d 61  out having to ma
0e70: 6c 6c 6f 63 2e 20 20 4e 42 46 53 20 69 73 20 73  lloc.  NBFS is s
0e80: 68 6f 72 74 20 66 6f 72 20 4e 75 6d 62 65 72 20  hort for Number 
0e90: 6f 66 20 42 79 74 65 73 0a 2a 2a 20 46 6f 72 20  of Bytes.** For 
0ea0: 53 74 72 69 6e 67 73 2e 0a 2a 2f 0a 23 64 65 66  Strings..*/.#def
0eb0: 69 6e 65 20 4e 42 46 53 20 33 32 0a 0a 2f 2a 0a  ine NBFS 32../*.
0ec0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  ** A single leve
0ed0: 6c 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  l of the stack i
0ee0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
0ef0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0f00: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 45 78  * structure.  Ex
0f10: 63 65 70 74 2c 20 73 74 72 69 6e 67 20 76 61 6c  cept, string val
0f20: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
0f30: 6e 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  n a separate.** 
0f40: 6c 69 73 74 20 6f 66 20 6f 66 20 70 6f 69 6e 74  list of of point
0f50: 65 72 73 20 74 6f 20 63 68 61 72 61 63 74 65 72  ers to character
0f60: 2e 20 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f  .  The reason fo
0f70: 72 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 73 74 72  r storing.** str
0f80: 69 6e 67 73 20 73 65 70 61 72 61 74 65 6c 79 20  ings separately 
0f90: 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  is so that they 
0fa0: 63 61 6e 20 62 65 20 65 61 73 69 6c 79 20 70 61  can be easily pa
0fb0: 73 73 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  ssed.** to the c
0fc0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
0fd0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 74 61 63  ..*/.struct Stac
0fe0: 6b 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  k {.  int i;    
0ff0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
1000: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  value */.  int n
1010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1020: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
1030: 73 20 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  s in string valu
1040: 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27 5c 30  e, including '\0
1050: 27 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  ' */.  int flags
1060: 3b 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f  ;     /* Some co
1070: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 53 54 4b  mbination of STK
1080: 5f 4e 75 6c 6c 2c 20 53 54 4b 5f 53 74 72 2c 20  _Null, STK_Str, 
1090: 53 54 4b 5f 44 79 6e 2c 20 65 74 63 2e 20 2a 2f  STK_Dyn, etc. */
10a0: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 20 20 20 20  .  double r;    
10b0: 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20    /* Real value 
10c0: 2a 2f 0a 20 20 63 68 61 72 20 7a 5b 4e 42 46 53  */.  char z[NBFS
10d0: 5d 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72  ];  /* Space for
10e0: 20 73 68 6f 72 74 20 73 74 72 69 6e 67 73 20 2a   short strings *
10f0: 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  /.};.typedef str
1100: 75 63 74 20 53 74 61 63 6b 20 53 74 61 63 6b 3b  uct Stack Stack;
1110: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 63  ../*.** Memory c
1120: 65 6c 6c 73 20 75 73 65 20 74 68 65 20 73 61 6d  ells use the sam
1130: 65 20 73 74 72 75 63 74 75 72 65 20 61 73 20 74  e structure as t
1140: 68 65 20 73 74 61 63 6b 20 65 78 63 65 70 74 20  he stack except 
1150: 74 68 61 74 20 73 70 61 63 65 0a 2a 2a 20 66 6f  that space.** fo
1160: 72 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 73  r an arbitrary s
1170: 74 72 69 6e 67 20 69 73 20 61 64 64 65 64 2e 0a  tring is added..
1180: 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 20 7b 0a  */.struct Mem {.
1190: 20 20 53 74 61 63 6b 20 73 3b 20 20 20 20 20 20    Stack s;      
11a0: 20 2f 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 6f   /* All values o
11b0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
11c0: 6c 20 62 65 73 69 64 65 73 20 73 74 72 69 6e 67  l besides string
11d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
11e0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 76       /* String v
11f0: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 6d 65  alue for this me
1200: 6d 6f 72 79 20 63 65 6c 6c 20 2a 2f 0a 7d 3b 0a  mory cell */.};.
1210: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
1220: 65 6d 20 4d 65 6d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  em Mem;../*.** A
1230: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
1240: 72 20 53 74 61 63 6b 2e 66 6c 61 67 73 0a 2a 2f  r Stack.flags.*/
1250: 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f 4e 75 6c  .#define STK_Nul
1260: 6c 20 20 20 20 20 20 30 78 30 30 30 31 20 20 20  l      0x0001   
1270: 2f 2a 20 56 61 6c 75 65 20 69 73 20 4e 55 4c 4c  /* Value is NULL
1280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f   */.#define STK_
1290: 53 74 72 20 20 20 20 20 20 20 30 78 30 30 30 32  Str       0x0002
12a0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 61     /* Value is a
12b0: 20 73 74 72 69 6e 67 20 2a 2f 0a 23 64 65 66 69   string */.#defi
12c0: 6e 65 20 53 54 4b 5f 49 6e 74 20 20 20 20 20 20  ne STK_Int      
12d0: 20 30 78 30 30 30 34 20 20 20 2f 2a 20 56 61 6c   0x0004   /* Val
12e0: 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
12f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f   */.#define STK_
1300: 52 65 61 6c 20 20 20 20 20 20 30 78 30 30 30 38  Real      0x0008
1310: 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 61     /* Value is a
1320: 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 2a 2f 0a   real number */.
1330: 23 64 65 66 69 6e 65 20 53 54 4b 5f 44 79 6e 20  #define STK_Dyn 
1340: 20 20 20 20 20 20 30 78 30 30 31 30 20 20 20 2f        0x0010   /
1350: 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  * Need to call s
1360: 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e 20 7a  qliteFree() on z
1370: 53 74 61 63 6b 5b 2a 5d 20 2a 2f 0a 23 64 65 66  Stack[*] */.#def
1380: 69 6e 65 20 53 54 4b 5f 53 74 61 74 69 63 20 20  ine STK_Static  
1390: 20 20 30 78 30 30 32 30 20 20 20 2f 2a 20 7a 53    0x0020   /* zS
13a0: 74 61 63 6b 5b 5d 20 70 6f 69 6e 74 73 20 74 6f  tack[] points to
13b0: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
13c0: 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c   */../* The foll
13d0: 6f 77 69 6e 67 20 53 54 4b 5f 20 76 61 6c 75 65  owing STK_ value
13e0: 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
13f0: 20 41 67 67 45 6c 65 6d 2e 61 4d 65 6d 2e 73 2e   AggElem.aMem.s.
1400: 66 6c 61 67 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  flag fields..** 
1410: 49 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  It indicates tha
1420: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1430: 69 6e 67 20 41 67 67 45 6c 65 6d 2e 61 4d 65 6d  ing AggElem.aMem
1440: 2e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 2a  .z points to a.*
1450: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
1460: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 74 68 61  tion context tha
1470: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 69  t needs to be fi
1480: 6e 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 23 64 65 66  nalized..*/.#def
1490: 69 6e 65 20 53 54 4b 5f 41 67 67 43 74 78 20 20  ine STK_AggCtx  
14a0: 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20 7a 53    0x0040   /* zS
14b0: 74 61 63 6b 5b 5d 20 70 6f 69 6e 74 73 20 74 6f  tack[] points to
14c0: 20 61 6e 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   an agg function
14d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 2f 2a 0a   context */../*.
14e0: 2a 2a 20 54 68 65 20 22 63 6f 6e 74 65 78 74 22  ** The "context"
14f0: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61 20   argument for a 
1500: 69 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63  installable func
1510: 74 69 6f 6e 2e 20 20 41 20 70 6f 69 6e 74 65 72  tion.  A pointer
1520: 20 74 6f 20 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e   to an.** instan
1530: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1540: 74 75 72 65 20 69 73 20 74 68 65 20 66 69 72 73  ture is the firs
1550: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
1560: 65 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64 0a  e routines used.
1570: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ** implement the
1580: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
1590: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
15a0: 20 74 79 70 65 64 65 66 20 66 6f 72 20 74 68 69   typedef for thi
15b0: 73 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 73  s structure in s
15c0: 71 6c 69 74 65 2e 68 2e 20 20 53 6f 20 61 6c 6c  qlite.h.  So all
15d0: 20 72 6f 75 74 69 6e 65 73 2c 0a 2a 2a 20 65 76   routines,.** ev
15e0: 65 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  en the public in
15f0: 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c 69 74  terface to SQLit
1600: 65 2c 20 63 61 6e 20 75 73 65 20 61 20 70 6f 69  e, can use a poi
1610: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
1620: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1630: 68 69 73 20 66 69 6c 65 20 69 73 20 74 68 65 20  his file is the 
1640: 6f 6e 6c 79 20 70 6c 61 63 65 20 77 68 65 72 65  only place where
1650: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65   the internal de
1660: 74 61 69 6c 73 20 6f 66 20 74 68 69 73 0a 2a 2a  tails of this.**
1670: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 6b   structure are k
1680: 6e 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nown..**.** This
1690: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65   structure is de
16a0: 66 69 6e 65 64 20 69 6e 73 69 64 65 20 6f 66 20  fined inside of 
16b0: 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20 69  vdbe.c because i
16c0: 74 20 75 73 65 73 20 73 75 62 73 74 72 75 63 74  t uses substruct
16d0: 75 72 65 73 0a 2a 2a 20 28 53 74 61 63 6b 29 20  ures.** (Stack) 
16e0: 77 68 69 63 68 20 61 72 65 20 6f 6e 6c 79 20 64  which are only d
16f0: 65 66 69 6e 65 64 20 74 68 65 72 65 2e 0a 2a 2f  efined there..*/
1700: 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65 5f 66  .struct sqlite_f
1710: 75 6e 63 20 7b 0a 20 20 46 75 6e 63 44 65 66 20  unc {.  FuncDef 
1720: 2a 70 46 75 6e 63 3b 20 20 20 2f 2a 20 50 6f 69  *pFunc;   /* Poi
1730: 6e 74 65 72 20 74 6f 20 66 75 6e 63 74 69 6f 6e  nter to function
1740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 4d   information.  M
1750: 55 53 54 20 42 45 20 46 49 52 53 54 20 2a 2f 0a  UST BE FIRST */.
1760: 20 20 53 74 61 63 6b 20 73 3b 20 20 20 20 20 20    Stack s;      
1770: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 20 73 74 72      /* Small str
1780: 69 6e 67 73 2c 20 69 6e 74 73 2c 20 61 6e 64 20  ings, ints, and 
1790: 64 6f 75 62 6c 65 20 76 61 6c 75 65 73 20 67 6f  double values go
17a0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20   here */.  char 
17b0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *z;          /* 
17c0: 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
17d0: 67 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  g dynamic string
17e0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 76 6f   results */.  vo
17f0: 69 64 20 2a 70 41 67 67 3b 20 20 20 20 20 20 20  id *pAgg;       
1800: 2f 2a 20 41 67 67 72 65 67 61 74 65 20 63 6f 6e  /* Aggregate con
1810: 74 65 78 74 20 2a 2f 0a 20 20 75 38 20 69 73 45  text */.  u8 isE
1820: 72 72 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 53  rror;       /* S
1830: 65 74 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  et to true for a
1840: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 75 38 20  n error */.  u8 
1850: 69 73 53 74 65 70 3b 20 20 20 20 20 20 20 20 2f  isStep;        /
1860: 2a 20 43 75 72 72 65 6e 74 20 69 6e 20 74 68 65  * Current in the
1870: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 2a   step function *
1880: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
1890: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18a0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74 68  of times that th
18b0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
18c0: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
18d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
18e0: 41 67 67 20 73 74 72 75 63 74 75 72 65 20 64 65  Agg structure de
18f0: 73 63 72 69 62 65 73 20 61 6e 20 41 67 67 72 65  scribes an Aggre
1900: 67 61 74 6f 72 2e 20 20 45 61 63 68 20 41 67 67  gator.  Each Agg
1910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20   consists of.** 
1920: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41 67 67  zero or more Agg
1930: 72 65 67 61 74 6f 72 20 65 6c 65 6d 65 6e 74 73  regator elements
1940: 20 28 41 67 67 45 6c 65 6d 29 2e 20 20 45 61 63   (AggElem).  Eac
1950: 68 20 41 67 67 45 6c 65 6d 20 63 6f 6e 74 61 69  h AggElem contai
1960: 6e 73 0a 2a 2a 20 61 20 6b 65 79 20 61 6e 64 20  ns.** a key and 
1970: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  one or more valu
1980: 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  es.  The values 
1990: 61 72 65 20 75 73 65 64 20 69 6e 20 70 72 6f 63  are used in proc
19a0: 65 73 73 69 6e 67 0a 2a 2a 20 61 67 67 72 65 67  essing.** aggreg
19b0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
19c0: 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20   a SELECT.  The 
19d0: 6b 65 79 20 69 73 20 75 73 65 64 20 74 6f 20 69  key is used to i
19e0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  mplement.** the 
19f0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1a00: 6f 66 20 61 20 73 65 6c 65 63 74 2e 0a 2a 2f 0a  of a select..*/.
1a10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41  typedef struct A
1a20: 67 67 20 41 67 67 3b 0a 74 79 70 65 64 65 66 20  gg Agg;.typedef 
1a30: 73 74 72 75 63 74 20 41 67 67 45 6c 65 6d 20 41  struct AggElem A
1a40: 67 67 45 6c 65 6d 3b 0a 73 74 72 75 63 74 20 41  ggElem;.struct A
1a50: 67 67 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  gg {.  int nMem;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a70: 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20  umber of values 
1a80: 73 74 6f 72 65 64 20 69 6e 20 65 61 63 68 20 41  stored in each A
1a90: 67 67 45 6c 65 6d 20 2a 2f 0a 20 20 41 67 67 45  ggElem */.  AggE
1aa0: 6c 65 6d 20 2a 70 43 75 72 72 65 6e 74 3b 20 20  lem *pCurrent;  
1ab0: 20 2f 2a 20 54 68 65 20 41 67 67 45 6c 65 6d 20   /* The AggElem 
1ac0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 66 6f 63  currently in foc
1ad0: 75 73 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  us */.  HashElem
1ae0: 20 2a 70 53 65 61 72 63 68 3b 20 20 20 2f 2a 20   *pSearch;   /* 
1af0: 54 68 65 20 68 61 73 68 20 65 6c 65 6d 65 6e 74  The hash element
1b00: 20 66 6f 72 20 70 43 75 72 72 65 6e 74 20 2a 2f   for pCurrent */
1b10: 0a 20 20 48 61 73 68 20 68 61 73 68 3b 20 20 20  .  Hash hash;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
1b30: 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 61 67 67  table of all agg
1b40: 72 65 67 61 74 65 20 65 6c 65 6d 65 6e 74 73 20  regate elements 
1b50: 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 2a 61  */.  FuncDef **a
1b60: 70 46 75 6e 63 3b 20 20 20 20 2f 2a 20 49 6e 66  pFunc;    /* Inf
1b70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1b80: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b90: 6e 73 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  ns */.};.struct 
1ba0: 41 67 67 45 6c 65 6d 20 7b 0a 20 20 63 68 61 72  AggElem {.  char
1bb0: 20 2a 7a 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *zKey;         
1bc0: 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 74   /* The key to t
1bd0: 68 69 73 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 20  his AggElem */. 
1be0: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
1bf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c00: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1c10: 6b 65 79 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27  key, including '
1c20: 5c 30 27 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20  \0' at end */.  
1c30: 4d 65 6d 20 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  Mem aMem[1];    
1c40: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
1c50: 65 73 20 66 6f 72 20 74 68 69 73 20 41 67 67 45  es for this AggE
1c60: 6c 65 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lem */.};../*.**
1c70: 20 41 20 53 65 74 20 73 74 72 75 63 74 75 72 65   A Set structure
1c80: 20 69 73 20 75 73 65 64 20 66 6f 72 20 71 75 69   is used for qui
1c90: 63 6b 20 74 65 73 74 69 6e 67 20 74 6f 20 73 65  ck testing to se
1ca0: 65 20 69 66 20 61 20 76 61 6c 75 65 0a 2a 2a 20  e if a value.** 
1cb0: 69 73 20 70 61 72 74 20 6f 66 20 61 20 73 6d 61  is part of a sma
1cc0: 6c 6c 20 73 65 74 2e 20 20 53 65 74 73 20 61 72  ll set.  Sets ar
1cd0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1ce0: 65 6e 74 20 63 6f 64 65 20 6c 69 6b 65 0a 2a 2a  ent code like.**
1cf0: 20 74 68 69 73 3a 0a 2a 2a 20 20 20 20 20 20 20   this:.**       
1d00: 20 20 20 20 20 78 2e 79 20 49 4e 20 28 27 68 69       x.y IN ('hi
1d10: 27 2c 27 68 6f 6f 27 2c 27 68 75 6d 27 29 0a 2a  ','hoo','hum').*
1d20: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1d30: 20 53 65 74 20 53 65 74 3b 0a 73 74 72 75 63 74   Set Set;.struct
1d40: 20 53 65 74 20 7b 0a 20 20 48 61 73 68 20 68 61   Set {.  Hash ha
1d50: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
1d60: 2f 2a 20 41 20 73 65 74 20 69 73 20 6a 75 73 74  /* A set is just
1d70: 20 61 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f   a hash table */
1d80: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 72 65  .  HashElem *pre
1d90: 76 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  v;        /* Pre
1da0: 76 69 6f 75 73 6c 79 20 61 63 63 65 73 73 65 64  viously accessed
1db0: 20 68 61 73 68 20 65 6c 65 6d 65 6e 20 2a 2f 0a   hash elemen */.
1dc0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 4b 65 79 6c  };../*.** A Keyl
1dd0: 69 73 74 20 69 73 20 61 20 62 75 6e 63 68 20 6f  ist is a bunch o
1de0: 66 20 6b 65 79 73 20 69 6e 74 6f 20 61 20 74 61  f keys into a ta
1df0: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 6c 69 73  ble.  The keylis
1e00: 74 20 63 61 6e 0a 2a 2a 20 67 72 6f 77 20 77 69  t can.** grow wi
1e10: 74 68 6f 75 74 20 62 6f 75 6e 64 2e 20 20 54 68  thout bound.  Th
1e20: 65 20 6b 65 79 6c 69 73 74 20 73 74 6f 72 65 73  e keylist stores
1e30: 20 74 68 65 20 52 4f 57 49 44 73 20 6f 66 20 64   the ROWIDs of d
1e40: 61 74 61 62 61 73 65 0a 2a 2a 20 72 65 63 6f 72  atabase.** recor
1e50: 64 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ds that need to 
1e60: 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 75 70  be deleted or up
1e70: 64 61 74 65 64 2e 0a 2a 2f 0a 74 79 70 65 64 65  dated..*/.typede
1e80: 66 20 73 74 72 75 63 74 20 4b 65 79 6c 69 73 74  f struct Keylist
1e90: 20 4b 65 79 6c 69 73 74 3b 0a 73 74 72 75 63 74   Keylist;.struct
1ea0: 20 4b 65 79 6c 69 73 74 20 7b 0a 20 20 69 6e 74   Keylist {.  int
1eb0: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f   nKey;         /
1ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  * Number of slot
1ed0: 73 20 69 6e 20 61 4b 65 79 5b 5d 20 2a 2f 0a 20  s in aKey[] */. 
1ee0: 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 20 20   int nUsed;     
1ef0: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 77 72 69     /* Next unwri
1f00: 74 74 65 6e 20 73 6c 6f 74 20 69 6e 20 61 4b 65  tten slot in aKe
1f10: 79 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  y[] */.  int nRe
1f20: 61 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ad;        /* Ne
1f30: 78 74 20 75 6e 72 65 61 64 20 73 6c 6f 74 20 69  xt unread slot i
1f40: 6e 20 61 4b 65 79 5b 5d 20 2a 2f 0a 20 20 4b 65  n aKey[] */.  Ke
1f50: 79 6c 69 73 74 20 2a 70 4e 65 78 74 3b 20 20 20  ylist *pNext;   
1f60: 2f 2a 20 4e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  /* Next block of
1f70: 20 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 61   keys */.  int a
1f80: 4b 65 79 5b 31 5d 3b 20 20 20 20 20 20 2f 2a 20  Key[1];      /* 
1f90: 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6b 65 79 73  One or more keys
1fa0: 2e 20 20 45 78 74 72 61 20 73 70 61 63 65 20 61  .  Extra space a
1fb0: 6c 6c 6f 63 61 74 65 64 20 61 73 20 6e 65 65 64  llocated as need
1fc0: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ed */.};../*.** 
1fd0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1fe0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1ff0: 6e 65 0a 2a 2f 0a 73 74 72 75 63 74 20 56 64 62  ne.*/.struct Vdb
2000: 65 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e {.  sqlite *db
2010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2020: 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
2030: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
2040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 61 71           /* Opaq
2050: 75 65 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63  ue context struc
2060: 74 75 72 65 20 75 73 65 64 20 62 79 20 44 42 20  ture used by DB 
2070: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 46 49 4c  backend */.  FIL
2080: 45 20 2a 74 72 61 63 65 3b 20 20 20 20 20 20 20  E *trace;       
2090: 20 2f 2a 20 57 72 69 74 65 20 61 6e 20 65 78 65   /* Write an exe
20a0: 63 75 74 69 6f 6e 20 74 72 61 63 65 20 68 65 72  cution trace her
20b0: 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  e, if not NULL *
20c0: 2f 0a 20 20 69 6e 74 20 6e 4f 70 3b 20 20 20 20  /.  int nOp;    
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e0: 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  r of instruction
20f0: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
2100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 41 6c 6c   */.  int nOpAll
2110: 6f 63 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  oc;       /* Num
2120: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c  ber of slots all
2130: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 5b 5d  ocated for aOp[]
2140: 20 2a 2f 0a 20 20 4f 70 20 2a 61 4f 70 3b 20 20   */.  Op *aOp;  
2150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2160: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ce to hold the v
2170: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 27 73  irtual machine's
2180: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e   program */.  in
2190: 74 20 6e 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  t nLabel;       
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
21b0: 61 62 65 6c 73 20 75 73 65 64 20 2a 2f 0a 20 20  abels used */.  
21c0: 69 6e 74 20 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b  int nLabelAlloc;
21d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21e0: 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   slots allocated
21f0: 20 69 6e 20 61 4c 61 62 65 6c 5b 5d 20 2a 2f 0a   in aLabel[] */.
2200: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 3b 20 20    int *aLabel;  
2210: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
2220: 6f 20 68 6f 6c 64 20 74 68 65 20 6c 61 62 65 6c  o hold the label
2230: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 73 3b 20  s */.  int tos; 
2240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2250: 64 65 78 20 6f 66 20 74 6f 70 20 6f 66 20 73 74  dex of top of st
2260: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  ack */.  int nSt
2270: 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20 2f 2a 20  ackAlloc;    /* 
2280: 53 69 7a 65 20 6f 66 20 74 68 65 20 73 74 61 63  Size of the stac
2290: 6b 20 2a 2f 0a 20 20 53 74 61 63 6b 20 2a 61 53  k */.  Stack *aS
22a0: 74 61 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54 68  tack;      /* Th
22b0: 65 20 6f 70 65 72 61 6e 64 20 73 74 61 63 6b 2c  e operand stack,
22c0: 20 65 78 63 65 70 74 20 73 74 72 69 6e 67 20 76   except string v
22d0: 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  alues */.  char 
22e0: 2a 2a 7a 53 74 61 63 6b 3b 20 20 20 20 20 20 2f  **zStack;      /
22f0: 2a 20 54 65 78 74 20 6f 72 20 62 69 6e 61 72 79  * Text or binary
2300: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 73   values of the s
2310: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2320: 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 2f 2a  *azColName;   /*
2330: 20 42 65 63 6f 6d 65 73 20 74 68 65 20 34 74 68   Becomes the 4th
2340: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 63 61   parameter to ca
2350: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 69 6e 74  llbacks */.  int
2360: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
2370: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
2380: 6f 74 73 20 69 6e 20 61 43 73 72 5b 5d 20 2a 2f  ots in aCsr[] */
2390: 0a 20 20 43 75 72 73 6f 72 20 2a 61 43 73 72 3b  .  Cursor *aCsr;
23a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 65 6c         /* One el
23b0: 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 20 61 72  ement of this ar
23c0: 72 61 79 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ray for each ope
23d0: 6e 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4b 65  n cursor */.  Ke
23e0: 79 6c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  ylist *pList;   
23f0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 52    /* A list of R
2400: 4f 57 49 44 73 20 2a 2f 0a 20 20 53 6f 72 74 65  OWIDs */.  Sorte
2410: 72 20 2a 70 53 6f 72 74 3b 20 20 20 20 20 20 2f  r *pSort;      /
2420: 2a 20 41 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  * A linked list 
2430: 6f 66 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65  of objects to be
2440: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 46 49 4c   sorted */.  FIL
2450: 45 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20  E *pFile;       
2460: 20 2f 2a 20 41 74 20 6d 6f 73 74 20 6f 6e 65 20   /* At most one 
2470: 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
2480: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c  r */.  int nFiel
2490: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  d;         /* Nu
24a0: 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 66 69 65  mber of file fie
24b0: 6c 64 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  lds */.  char **
24c0: 61 7a 46 69 65 6c 64 3b 20 20 20 20 20 2f 2a 20  azField;     /* 
24d0: 44 61 74 61 20 66 6f 72 20 65 61 63 68 20 66 69  Data for each fi
24e0: 6c 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68  le field */.  ch
24f0: 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
2500: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
2510: 6e 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ne from the inpu
2520: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
2530: 6e 4c 69 6e 65 41 6c 6c 6f 63 3b 20 20 20 20 20  nLineAlloc;     
2540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 70 61  /* Number of spa
2550: 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ces allocated fo
2560: 72 20 7a 4c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  r zLine */.  int
2570: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
2580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
2590: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 63  mory locations c
25a0: 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74  urrently allocat
25b0: 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 61 4d 65  ed */.  Mem *aMe
25c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  m;          /* T
25d0: 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  he memory locati
25e0: 6f 6e 73 20 2a 2f 0a 20 20 41 67 67 20 61 67 67  ons */.  Agg agg
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2600: 41 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  Aggregate inform
2610: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
2620: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Set;           /
2630: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 74 73  * Number of sets
2640: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
2650: 53 65 74 20 2a 61 53 65 74 3b 20 20 20 20 20 20  Set *aSet;      
2660: 20 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20      /* An array 
2670: 6f 66 20 73 65 74 73 20 2a 2f 0a 20 20 69 6e 74  of sets */.  int
2680: 20 6e 43 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20   nCallback;     
2690: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61   /* Number of ca
26a0: 6c 6c 62 61 63 6b 73 20 69 6e 76 6f 6b 65 64 20  llbacks invoked 
26b0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20  so far */.  int 
26c0: 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  iLimit;         
26d0: 2f 2a 20 4c 69 6d 69 74 20 6f 6e 20 74 68 65 20  /* Limit on the 
26e0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 62 61  number of callba
26f0: 63 6b 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f  cks remaining */
2700: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 20  .  int iOffset; 
2710: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2720: 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
2730: 67 20 74 6f 20 64 6f 20 63 61 6c 6c 62 61 63 6b  g to do callback
2740: 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 65 79 6c 69  s */.  int keyli
2750: 73 74 53 74 61 63 6b 44 65 70 74 68 3b 20 20 2f  stStackDepth;  /
2760: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
2770: 65 20 22 6b 65 79 6c 69 73 74 22 20 73 74 61 63  e "keylist" stac
2780: 6b 20 2a 2f 0a 20 20 4b 65 79 6c 69 73 74 20 2a  k */.  Keylist *
2790: 2a 6b 65 79 6c 69 73 74 53 74 61 63 6b 3b 20 2f  *keylistStack; /
27a0: 2a 20 54 68 65 20 73 74 61 63 6b 20 75 73 65 64  * The stack used
27b0: 20 62 79 20 6f 70 63 6f 64 65 73 20 4c 69 73 74   by opcodes List
27c0: 50 75 73 68 20 26 20 4c 69 73 74 50 6f 70 20 2a  Push & ListPop *
27d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
27e0: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
27f0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
2800: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
2810: 65 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69  eVdbeCreate(sqli
2820: 74 65 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  te *db){.  Vdbe 
2830: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
2840: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 56  Malloc( sizeof(V
2850: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
2860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2870: 20 70 2d 3e 70 42 74 20 3d 20 64 62 2d 3e 70 42   p->pBt = db->pB
2880: 65 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  e;.  p->db = db;
2890: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
28a0: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69  /*.** Turn traci
28b0: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a  ng on or off.*/.
28c0: 76 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65 54  void sqliteVdbeT
28d0: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
28e0: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
28f0: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
2900: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
2910: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
2920: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
2930: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
2940: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
2950: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
2960: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2970: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
2980: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
2990: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
29a0: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
29b0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
29c0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
29d0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
29e0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
29f0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
2a00: 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20 20  p1, p2          
2a10: 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68 65  First two of the
2a20: 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20   three possible 
2a30: 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  operands..**.** 
2a40: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 56 64  Use the sqliteVd
2a50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
2a60: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
2a70: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
2a80: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 56 64 62  ** the sqliteVdb
2a90: 65 43 68 61 6e 67 65 50 33 28 29 20 66 75 6e 63  eChangeP3() func
2aa0: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
2ab0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2ac0: 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P3.** operand..*
2ad0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65  /.int sqliteVdbe
2ae0: 41 64 64 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  AddOp(Vdbe *p, i
2af0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
2b00: 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p2){.  int i;
2b10: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
2b20: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 69 66    p->nOp++;.  if
2b30: 28 20 69 3e 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  ( i>=p->nOpAlloc
2b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53   ){.    int oldS
2b50: 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ize = p->nOpAllo
2b60: 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77 3b  c;.    Op *aNew;
2b70: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    p->nOpAlloc
2b80: 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   = p->nOpAlloc*2
2b90: 20 2b 20 31 30 30 3b 0a 20 20 20 20 61 4e 65 77   + 100;.    aNew
2ba0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
2bb0: 28 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 41  (p->aOp, p->nOpA
2bc0: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 4f 70 29 29  lloc*sizeof(Op))
2bd0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
2be0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  0 ){.      p->nO
2bf0: 70 41 6c 6c 6f 63 20 3d 20 6f 6c 64 53 69 7a 65  pAlloc = oldSize
2c00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
2c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
2c20: 4f 70 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 6d  Op = aNew;.    m
2c30: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
2c40: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70 2d 3e 6e  dSize], 0, (p->n
2c50: 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69 7a 65 29  OpAlloc-oldSize)
2c60: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
2c70: 7d 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  }.  p->aOp[i].op
2c80: 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 2d 3e  code = op;.  p->
2c90: 61 4f 70 5b 69 5d 2e 70 31 20 3d 20 70 31 3b 0a  aOp[i].p1 = p1;.
2ca0: 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 2d    if( p2<0 && (-
2cb0: 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61 62 65 6c 20  1-p2)<p->nLabel 
2cc0: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d  && p->aLabel[-1-
2cd0: 70 32 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 70 32  p2]>=0 ){.    p2
2ce0: 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d   = p->aLabel[-1-
2cf0: 70 32 5d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4f  p2];.  }.  p->aO
2d00: 70 5b 69 5d 2e 70 32 20 3d 20 70 32 3b 0a 20 20  p[i].p2 = p2;.  
2d10: 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 20 3d 20 30  p->aOp[i].p3 = 0
2d20: 3b 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33  ;.  p->aOp[i].p3
2d30: 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45  type = P3_NOTUSE
2d40: 44 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  D;.  return i;.}
2d50: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2d60: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
2d70: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
2d80: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
2d90: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
2da0: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
2db0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
2dc0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
2dd0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
2de0: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
2df0: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
2e00: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
2e10: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
2e20: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
2e30: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
2e40: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
2e50: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
2e60: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
2e70: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
2e80: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
2e90: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
2ea0: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
2eb0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
2ec0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
2ed0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
2ee0: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
2ef0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2f00: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
2f10: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
2f20: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
2f30: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
2f40: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
2f50: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
2f60: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
2f70: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
2f80: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
2f90: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
2fa0: 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65 4d 61  int sqliteVdbeMa
2fb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
2fc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
2fd0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
2fe0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
2ff0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
3000: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *aNew;.    p->n
3010: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e  LabelAlloc = p->
3020: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
3030: 31 30 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  10;.    aNew = s
3040: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
3050: 3e 61 4c 61 62 65 6c 2c 20 70 2d 3e 6e 4c 61 62  >aLabel, p->nLab
3060: 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  elAlloc*sizeof(p
3070: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
3080: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
3090: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
30a0: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
30b0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4c 61 62     }.    p->aLab
30c0: 65 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  el = aNew;.  }. 
30d0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
30e0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
30f0: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  el = 0;.    p->n
3100: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a  LabelAlloc = 0;.
3110: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3120: 7d 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d  }.  p->aLabel[i]
3130: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
3140: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
3150: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
3160: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
3170: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3180: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
3190: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
31a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65  .void sqliteVdbe
31b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
31c0: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
31d0: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 78 3c 30  int j;.  if( x<0
31e0: 20 26 26 20 28 2d 78 29 3c 3d 70 2d 3e 6e 4c 61   && (-x)<=p->nLa
31f0: 62 65 6c 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  bel && p->aOp ){
3200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  .    if( p->aLab
3210: 65 6c 5b 2d 31 2d 78 5d 3d 3d 70 2d 3e 6e 4f 70  el[-1-x]==p->nOp
3220: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
3230: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
3240: 5b 2d 31 2d 78 5d 3c 30 20 29 3b 0a 20 20 20 20  [-1-x]<0 );.    
3250: 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 20  p->aLabel[-1-x] 
3260: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 66 6f  = p->nOp;.    fo
3270: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4f 70 3b  r(j=0; j<p->nOp;
3280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
3290: 20 70 2d 3e 61 4f 70 5b 6a 5d 2e 70 32 3d 3d 78   p->aOp[j].p2==x
32a0: 20 29 20 70 2d 3e 61 4f 70 5b 6a 5d 2e 70 32 20   ) p->aOp[j].p2 
32b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
32c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
32d0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
32e0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
32f0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
3300: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
3310: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
3320: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
3330: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
3340: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
3350: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
3360: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
3370: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
3380: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
3390: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
33a0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
33b0: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
33c0: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
33d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
33e0: 2c 20 56 64 62 65 4f 70 20 63 6f 6e 73 74 20 2a  , VdbeOp const *
33f0: 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  aOp){.  int addr
3400: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
3410: 20 6e 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c   nOp >= p->nOpAl
3420: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
3430: 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41  ldSize = p->nOpA
3440: 6c 6c 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e  lloc;.    Op *aN
3450: 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c  ew;.    p->nOpAl
3460: 6c 6f 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc = p->nOpAllo
3470: 63 2a 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a  c*2 + nOp + 10;.
3480: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
3490: 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c  eRealloc(p->aOp,
34a0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a   p->nOpAlloc*siz
34b0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66  eof(Op));.    if
34c0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
34d0: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
34e0: 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20   oldSize;.      
34f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3500: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65      p->aOp = aNe
3510: 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  w;.    memset(&p
3520: 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20  ->aOp[oldSize], 
3530: 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d  0, (p->nOpAlloc-
3540: 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28  oldSize)*sizeof(
3550: 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  Op));.  }.  addr
3560: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
3570: 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e   nOp>0 ){.    in
3580: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
3590: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  ; i<nOp; i++){. 
35a0: 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 61 4f       int p2 = aO
35b0: 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 70  p[i].p2;.      p
35c0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 20 3d 20  ->aOp[i+addr] = 
35d0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  aOp[i];.      if
35e0: 28 20 70 32 3c 30 20 29 20 70 2d 3e 61 4f 70 5b  ( p2<0 ) p->aOp[
35f0: 69 2b 61 64 64 72 5d 2e 70 32 20 3d 20 61 64 64  i+addr].p2 = add
3600: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3610: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 2b 61 64 64      p->aOp[i+add
3620: 72 5d 2e 70 33 74 79 70 65 20 3d 20 61 4f 70 5b  r].p3type = aOp[
3630: 69 5d 2e 70 33 20 3f 20 50 33 5f 53 54 41 54 49  i].p3 ? P3_STATI
3640: 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  C : P3_NOTUSED;.
3650: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
3660: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
3670: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
3680: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3690: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
36a0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
36b0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
36c0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
36d0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
36e0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
36f0: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3700: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3710: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
3720: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
3730: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
3740: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
3750: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3760: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
3770: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
3780: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
3790: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
37a0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
37b0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
37c0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
37d0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
37e0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
37f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3800: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3810: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
3820: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3830: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3840: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3850: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
3860: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
3870: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56  .*/.void sqliteV
3880: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
3890: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
38a0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
38b0: 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 69  t( val>=0 );.  i
38c0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
38d0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
38e0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
38f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3900: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3910: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3920: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3930: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3940: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3950: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3960: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3970: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3980: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3990: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
39a0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 56  ay using sqliteV
39b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
39c0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
39d0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
39e0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
39f0: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
3a00: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
3a10: 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  3 operand is dyn
3a20: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
3a30: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
3a40: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
3a50: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
3a60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3a70: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  iteMalloc()..** 
3a80: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
3a90: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
3aa0: 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e   of zP3 up to an
3ab0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
3ac0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
3ad0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
3ae0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
3af0: 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP3..**.** If
3b00: 20 6e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69   n==P3_STATIC  i
3b10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33  t means that zP3
3b20: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3b30: 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74   a constant stat
3b40: 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64  ic.** string and
3b50: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
3b60: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 20  y the pointer.  
3b70: 6e 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 6d 65  n==P3_POINTER me
3b80: 61 6e 73 20 7a 50 33 20 69 73 0a 2a 2a 20 61 20  ans zP3 is.** a 
3b90: 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20  pointer to some 
3ba0: 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
3bb0: 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  n a string..**.*
3bc0: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
3bd0: 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68   change P3 on th
3be0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3bf0: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
3c00: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3c10: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
3c20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3c30: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
3c40: 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP3, int n){.  O
3c50: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 3d  p *pOp;.  if( p=
3c60: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  =0 || p->aOp==0 
3c70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3c80: 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d  addr<0 || addr>=
3c90: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64  p->nOp ){.    ad
3ca0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
3cb0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20  .    if( addr<0 
3cc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
3cd0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3ce0: 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  dr];.  if( pOp->
3cf0: 70 33 20 26 26 20 70 4f 70 2d 3e 70 33 74 79 70  p3 && pOp->p3typ
3d00: 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b  e==P3_DYNAMIC ){
3d10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3d20: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f  pOp->p3);.    pO
3d30: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 7d 0a 20  p->p3 = 0;.  }. 
3d40: 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20   if( zP3==0 ){. 
3d50: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a     pOp->p3 = 0;.
3d60: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
3d70: 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P3_NOTUSED;.  
3d80: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3d90: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3da0: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
3db0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a  Op->p3type = n;.
3dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
3dd0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
3de0: 4f 70 2d 3e 70 33 2c 20 7a 50 33 2c 20 6e 2c 20  Op->p3, zP3, n, 
3df0: 30 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  0);.    pOp->p3t
3e00: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
3e10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
3e20: 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64  f the P3 operand
3e30: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
3e40: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 70  d instruction ap
3e50: 70 65 61 72 73 0a 2a 2a 20 74 6f 20 62 65 20 61  pears.** to be a
3e60: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 74   quoted string t
3e70: 6f 6b 65 6e 2c 20 74 68 65 6e 20 74 68 69 73 20  oken, then this 
3e80: 70 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76 65  procedure remove
3e90: 73 20 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 73  s .** the quotes
3ea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 6f 74  ..**.** The quot
3eb0: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  ing operator can
3ec0: 20 62 65 20 65 69 74 68 65 72 20 61 20 67 72 61   be either a gra
3ed0: 76 65 20 61 73 63 65 6e 74 20 28 41 53 43 49 49  ve ascent (ASCII
3ee0: 20 30 78 32 37 29 0a 2a 2a 20 6f 72 20 61 20 64   0x27).** or a d
3ef0: 6f 75 62 6c 65 20 71 75 6f 74 65 20 63 68 61 72  ouble quote char
3f00: 61 63 74 65 72 20 28 41 53 43 49 49 20 30 78 32  acter (ASCII 0x2
3f10: 32 29 2e 20 20 54 77 6f 20 71 75 6f 74 65 73 20  2).  Two quotes 
3f20: 69 6e 20 61 20 72 6f 77 0a 2a 2a 20 72 65 73 6f  in a row.** reso
3f30: 6c 76 65 20 74 6f 20 62 65 20 61 20 73 69 6e 67  lve to be a sing
3f40: 6c 65 20 61 63 74 75 61 6c 20 71 75 6f 74 65 20  le actual quote 
3f50: 63 68 61 72 61 63 74 65 72 20 77 69 74 68 69 6e  character within
3f60: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
3f70: 76 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65 44  void sqliteVdbeD
3f80: 65 71 75 6f 74 65 50 33 28 56 64 62 65 20 2a 70  equoteP3(Vdbe *p
3f90: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 4f  , int addr){.  O
3fa0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p *pOp;.  if( p-
3fb0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 61 64 64 72 3c  >aOp==0 || addr<
3fc0: 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f  0 || addr>=p->nO
3fd0: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  p ) return;.  pO
3fe0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3ff0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  ];.  if( pOp->p3
4000: 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33 5b 30  ==0 || pOp->p3[0
4010: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  ]==0 ) return;. 
4020: 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65   if( pOp->p3type
4030: 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29 20 72  ==P3_POINTER ) r
4040: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70  eturn;.  if( pOp
4050: 2d 3e 70 33 74 79 70 65 21 3d 50 33 5f 44 59 4e  ->p3type!=P3_DYN
4060: 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d  AMIC ){.    pOp-
4070: 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 44  >p3 = sqliteStrD
4080: 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  up(pOp->p3);.   
4090: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
40a0: 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20  3_DYNAMIC;.  }. 
40b0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
40c0: 4f 70 2d 3e 70 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Op->p3);.}../*.*
40d0: 2a 20 4f 6e 20 74 68 65 20 50 33 20 61 72 67 75  * On the P3 argu
40e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
40f0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 63  n instruction, c
4100: 68 61 6e 67 65 20 61 6c 6c 0a 2a 2a 20 73 74 72  hange all.** str
4110: 69 6e 67 73 20 6f 66 20 77 68 69 74 65 73 70 61  ings of whitespa
4120: 63 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ce characters in
4130: 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 70 61 63  to a single spac
4140: 65 20 61 6e 64 0a 2a 2a 20 64 65 6c 65 74 65 20  e and.** delete 
4150: 6c 65 61 64 69 6e 67 20 61 6e 64 20 74 72 61 69  leading and trai
4160: 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 2e  ling whitespace.
4170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56  .*/.void sqliteV
4180: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
4190: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
41a0: 64 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  dr){.  char *z;.
41b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 4f 70    int i, j;.  Op
41c0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
41d0: 61 4f 70 3d 3d 30 20 7c 7c 20 61 64 64 72 3c 30  aOp==0 || addr<0
41e0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
41f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
4200: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4210: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 74  ;.  if( pOp->p3t
4220: 79 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20  ype==P3_POINTER 
4230: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
4240: 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33   }.  if( pOp->p3
4250: 74 79 70 65 21 3d 50 33 5f 44 59 4e 41 4d 49 43  type!=P3_DYNAMIC
4260: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   ){.    pOp->p3 
4270: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4280: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f 70  Op->p3);.    pOp
4290: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
42a0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20 20 7a 20 3d  NAMIC;.  }.  z =
42b0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
42c0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
42d0: 20 69 20 3d 20 6a 20 3d 20 30 3b 0a 20 20 77 68   i = j = 0;.  wh
42e0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69  ile( isspace(z[i
42f0: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 77  ]) ){ i++; }.  w
4300: 68 69 6c 65 28 20 7a 5b 69 5d 20 29 7b 0a 20 20  hile( z[i] ){.  
4310: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 7a 5b    if( isspace(z[
4320: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 7a 5b 6a  i]) ){.      z[j
4330: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
4340: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
4350: 7a 5b 2b 2b 69 5d 29 20 29 7b 7d 0a 20 20 20 20  z[++i]) ){}.    
4360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a  }else{.      z[j
4370: 2b 2b 5d 20 3d 20 7a 5b 69 2b 2b 5d 3b 0a 20 20  ++] = z[i++];.  
4380: 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
4390: 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   j>0 && isspace(
43a0: 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20  z[j-1]) ){ j--; 
43b0: 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a  }.  z[j] = 0;.}.
43c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
43d0: 77 69 6e 67 20 67 72 6f 75 70 20 6f 72 20 72 6f  wing group or ro
43e0: 75 74 69 6e 65 73 20 61 72 65 20 65 6d 70 6c 6f  utines are emplo
43f0: 79 65 64 20 62 79 20 69 6e 73 74 61 6c 6c 61 62  yed by installab
4400: 6c 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  le functions.** 
4410: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 69 72 20  to return their 
4420: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  results..**.** T
4430: 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  he sqlite_set_re
4440: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 72 6f  sult_string() ro
4450: 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
4460: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 74  d to return a st
4470: 72 69 6e 67 0a 2a 2a 20 76 61 6c 75 65 20 6f 72  ring.** value or
4480: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 4e 55 4c   to return a NUL
4490: 4c 2e 20 20 54 6f 20 72 65 74 75 72 6e 20 61 20  L.  To return a 
44a0: 4e 55 4c 4c 2c 20 70 61 73 73 20 69 6e 20 4e 55  NULL, pass in NU
44b0: 4c 4c 20 66 6f 72 20 7a 52 65 73 75 6c 74 2e 0a  LL for zResult..
44c0: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
44d0: 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  e of the string 
44e0: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
44f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 73 6f 20 69  ine returns so i
4500: 74 20 69 73 20 73 61 66 65 0a 2a 2a 20 74 6f 20  t is safe.** to 
4510: 70 61 73 73 20 69 6e 20 61 20 65 70 68 65 6d 65  pass in a epheme
4520: 72 61 6c 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ral string..**.*
4530: 2a 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73  * sqlite_set_res
4540: 75 6c 74 5f 65 72 72 6f 72 28 29 20 77 6f 72 6b  ult_error() work
4550: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 5f 73 65  s like sqlite_se
4560: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
4570: 29 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  ) except.** that
4580: 20 69 74 20 73 69 67 6e 61 6c 73 20 61 20 66 61   it signals a fa
4590: 74 61 6c 20 65 72 72 6f 72 2e 20 20 54 68 65 20  tal error.  The 
45a0: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 2c  string argument,
45b0: 20 69 66 20 61 6e 79 2c 20 69 73 20 74 68 65 0a   if any, is the.
45c0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
45d0: 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  .  If the argume
45e0: 6e 74 20 69 73 20 4e 55 4c 4c 20 61 20 67 65 6e  nt is NULL a gen
45f0: 65 72 69 63 20 73 75 62 73 74 69 74 75 74 65 20  eric substitute 
4600: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
4610: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
4620: 54 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72  The sqlite_set_r
4630: 65 73 75 6c 74 5f 69 6e 74 28 29 20 61 6e 64 20  esult_int() and 
4640: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
4650: 74 5f 64 6f 75 62 6c 65 28 29 20 73 65 74 20 74  t_double() set t
4660: 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
4670: 75 65 20 6f 66 20 74 68 65 20 75 73 65 72 20 66  ue of the user f
4680: 75 6e 63 74 69 6f 6e 20 74 6f 20 61 6e 20 69 6e  unction to an in
4690: 74 65 67 65 72 20 6f 72 20 61 20 64 6f 75 62 6c  teger or a doubl
46a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
46b0: 6f 75 74 69 6e 65 73 20 61 72 65 20 64 65 66 69  outines are defi
46c0: 6e 65 64 20 68 65 72 65 20 69 6e 20 76 64 62 65  ned here in vdbe
46d0: 2e 63 20 62 65 63 61 75 73 65 20 74 68 65 79 20  .c because they 
46e0: 64 65 70 65 6e 64 20 6f 6e 20 6b 6e 6f 77 69 6e  depend on knowin
46f0: 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  g.** the interna
4700: 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ls of the sqlite
4710: 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72 65 20  _func structure 
4720: 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20 64 65  which is only de
4730: 66 69 6e 65 64 20 69 6e 20 74 68 61 74 0a 2a 2a  fined in that.**
4740: 20 6f 6e 65 20 73 6f 75 72 63 65 20 66 69 6c 65   one source file
4750: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
4760: 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  e_set_result_str
4770: 69 6e 67 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ing(sqlite_func 
4780: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
4790: 7a 52 65 73 75 6c 74 2c 20 69 6e 74 20 6e 29 7b  zResult, int n){
47a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
47b0: 73 53 74 65 70 20 29 3b 0a 20 20 69 66 28 20 70  sStep );.  if( p
47c0: 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  ->s.flags & STK_
47d0: 44 79 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Dyn ){.    sqlit
47e0: 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 7d  eFree(p->z);.  }
47f0: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d  .  if( zResult==
4800: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 2e 66 6c  0 ){.    p->s.fl
4810: 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a  ags = STK_Null;.
4820: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70      n = 0;.    p
4830: 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ->z = 0;.    p->
4840: 73 2e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  s.n = 0;.  }else
4850: 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  {.    if( n<0 ) 
4860: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75  n = strlen(zResu
4870: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 4e  lt);.    if( n<N
4880: 42 46 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  BFS-1 ){.      m
4890: 65 6d 63 70 79 28 70 2d 3e 73 2e 7a 2c 20 7a 52  emcpy(p->s.z, zR
48a0: 65 73 75 6c 74 2c 20 6e 29 3b 0a 20 20 20 20 20  esult, n);.     
48b0: 20 70 2d 3e 73 2e 7a 5b 6e 5d 20 3d 20 30 3b 0a   p->s.z[n] = 0;.
48c0: 20 20 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67 73        p->s.flags
48d0: 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 20 20   = STK_Str;.    
48e0: 20 20 70 2d 3e 7a 20 3d 20 70 2d 3e 73 2e 7a 3b    p->z = p->s.z;
48f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4900: 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d    p->z = sqliteM
4910: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
4920: 20 20 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a      if( p->z ){.
4930: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
4940: 2d 3e 7a 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29  ->z, zResult, n)
4950: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 5b 6e  ;.        p->z[n
4960: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
4970: 20 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20       p->s.flags 
4980: 3d 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f  = STK_Str | STK_
4990: 44 79 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Dyn;.    }.    p
49a0: 2d 3e 73 2e 6e 20 3d 20 6e 2b 31 3b 0a 20 20 7d  ->s.n = n+1;.  }
49b0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
49c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 73 65  }.void sqlite_se
49d0: 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 73 71 6c  t_result_int(sql
49e0: 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 69 6e 74  ite_func *p, int
49f0: 20 69 52 65 73 75 6c 74 29 7b 0a 20 20 61 73 73   iResult){.  ass
4a00: 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65 70 20  ert( !p->isStep 
4a10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e 66 6c  );.  if( p->s.fl
4a20: 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b  ags & STK_Dyn ){
4a30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4a40: 70 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  p->z);.  }.  p->
4a50: 73 2e 69 20 3d 20 69 52 65 73 75 6c 74 3b 0a 20  s.i = iResult;. 
4a60: 20 70 2d 3e 73 2e 66 6c 61 67 73 20 3d 20 53 54   p->s.flags = ST
4a70: 4b 5f 49 6e 74 3b 0a 7d 0a 76 6f 69 64 20 73 71  K_Int;.}.void sq
4a80: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
4a90: 64 6f 75 62 6c 65 28 73 71 6c 69 74 65 5f 66 75  double(sqlite_fu
4aa0: 6e 63 20 2a 70 2c 20 64 6f 75 62 6c 65 20 72 52  nc *p, double rR
4ab0: 65 73 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74  esult){.  assert
4ac0: 28 20 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a  ( !p->isStep );.
4ad0: 20 20 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73    if( p->s.flags
4ae0: 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20   & STK_Dyn ){.  
4af0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
4b00: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 72  z);.  }.  p->s.r
4b10: 20 3d 20 72 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = rResult;.  p-
4b20: 3e 73 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 52  >s.flags = STK_R
4b30: 65 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  eal;.}.void sqli
4b40: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65 72  te_set_result_er
4b50: 72 6f 72 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ror(sqlite_func 
4b60: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
4b70: 7a 4d 73 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  zMsg, int n){.  
4b80: 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74  assert( !p->isSt
4b90: 65 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 5f 73  ep );.  sqlite_s
4ba0: 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67  et_result_string
4bb0: 28 70 2c 20 7a 4d 73 67 2c 20 6e 29 3b 0a 20 20  (p, zMsg, n);.  
4bc0: 70 2d 3e 69 73 45 72 72 6f 72 20 3d 20 31 3b 0a  p->isError = 1;.
4bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  }../*.** Extract
4be0: 20 74 68 65 20 75 73 65 72 20 64 61 74 61 20 66   the user data f
4bf0: 72 6f 6d 20 61 20 73 71 6c 69 74 65 5f 66 75 6e  rom a sqlite_fun
4c00: 63 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  c structure and 
4c10: 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
4c20: 74 65 72 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a  ter to it..**.**
4c30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4c40: 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e   defined here in
4c50: 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20   vdbe.c because 
4c60: 69 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e  it depends on kn
4c70: 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74  owing.** the int
4c80: 65 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71  ernals of the sq
4c90: 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74  lite_func struct
4ca0: 75 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c  ure which is onl
4cb0: 79 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 61  y defined in tha
4cc0: 74 0a 2a 2a 20 6f 6e 65 20 73 6f 75 72 63 65 20  t.** one source 
4cd0: 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  file..*/.void *s
4ce0: 71 6c 69 74 65 5f 75 73 65 72 5f 64 61 74 61 28  qlite_user_data(
4cf0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b  sqlite_func *p){
4d00: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
4d10: 70 2d 3e 70 46 75 6e 63 20 29 3b 0a 20 20 72 65  p->pFunc );.  re
4d20: 74 75 72 6e 20 70 2d 3e 70 46 75 6e 63 2d 3e 70  turn p->pFunc->p
4d30: 55 73 65 72 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  UserData;.}../*.
4d40: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 72  ** Allocate or r
4d50: 65 74 75 72 6e 20 74 68 65 20 61 67 67 72 65 67  eturn the aggreg
4d60: 61 74 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ate context for 
4d70: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  a user function.
4d80: 20 20 41 20 6e 65 77 0a 2a 2a 20 63 6f 6e 74 65    A new.** conte
4d90: 78 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  xt is allocated 
4da0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  on the first cal
4db0: 6c 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  l.  Subsequent c
4dc0: 61 6c 6c 73 20 72 65 74 75 72 6e 20 74 68 65 0a  alls return the.
4dd0: 2a 2a 20 73 61 6d 65 20 63 6f 6e 74 65 78 74 20  ** same context 
4de0: 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
4df0: 64 20 6f 6e 20 70 72 69 6f 72 20 63 61 6c 6c 73  d on prior calls
4e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4e10: 74 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20  tine is defined 
4e20: 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62  here in vdbe.c b
4e30: 65 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64  ecause it depend
4e40: 73 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20  s on knowing.** 
4e50: 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66  the internals of
4e60: 20 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63   the sqlite_func
4e70: 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68   structure which
4e80: 20 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64   is only defined
4e90: 20 69 6e 20 74 68 61 74 0a 2a 2a 20 6f 6e 65 20   in that.** one 
4ea0: 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a  source file..*/.
4eb0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 5f 61 67 67  void *sqlite_agg
4ec0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 73  regate_context(s
4ed0: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 69  qlite_func *p, i
4ee0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 61 73 73  nt nByte){.  ass
4ef0: 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 46 75  ert( p && p->pFu
4f00: 6e 63 20 26 26 20 70 2d 3e 70 46 75 6e 63 2d 3e  nc && p->pFunc->
4f10: 78 53 74 65 70 20 29 3b 0a 20 20 69 66 28 20 70  xStep );.  if( p
4f20: 2d 3e 70 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pAgg==0 ){.   
4f30: 20 69 66 28 20 6e 42 79 74 65 3c 3d 4e 42 46 53   if( nByte<=NBFS
4f40: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 41 67   ){.      p->pAg
4f50: 67 20 3d 20 28 76 6f 69 64 2a 29 70 2d 3e 7a 3b  g = (void*)p->z;
4f60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4f70: 20 20 70 2d 3e 70 41 67 67 20 3d 20 73 71 6c 69    p->pAgg = sqli
4f80: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
4f90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4fa0: 65 74 75 72 6e 20 70 2d 3e 70 41 67 67 3b 0a 7d  eturn p->pAgg;.}
4fb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
4fd0: 65 73 20 74 68 65 20 53 74 65 70 20 66 75 6e 63  es the Step func
4fe0: 74 69 6f 6e 20 6f 66 20 61 20 61 67 67 72 65 67  tion of a aggreg
4ff0: 61 74 65 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a  ate has been .**
5000: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
5010: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
5020: 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20 76  efined here in v
5030: 64 62 65 2e 63 20 62 65 63 61 75 73 65 20 69 74  dbe.c because it
5040: 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f 77   depends on know
5050: 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72  ing.** the inter
5060: 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69  nals of the sqli
5070: 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72  te_func structur
5080: 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20  e which is only 
5090: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 61 74 0a  defined in that.
50a0: 2a 2a 20 6f 6e 65 20 73 6f 75 72 63 65 20 66 69  ** one source fi
50b0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
50c0: 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  e_aggregate_coun
50d0: 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70  t(sqlite_func *p
50e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  ){.  assert( p &
50f0: 26 20 70 2d 3e 70 46 75 6e 63 20 26 26 20 70 2d  & p->pFunc && p-
5100: 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 20 29 3b  >pFunc->xStep );
5110: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 63 6e 74  .  return p->cnt
5120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
5130: 20 61 6e 20 41 67 67 20 73 74 72 75 63 74 75 72   an Agg structur
5140: 65 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  e.  Delete all i
5150: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 0a 2a 2a  ts contents. .**
5160: 0a 2a 2a 20 46 6f 72 20 69 6e 73 74 61 6c 6c 61  .** For installa
5170: 62 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  ble aggregate fu
5180: 6e 63 74 69 6f 6e 73 2c 20 69 66 20 74 68 65 20  nctions, if the 
5190: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 68 61  step function ha
51a0: 73 20 62 65 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64  s been.** called
51b0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
51c0: 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69  finalizer functi
51d0: 6f 6e 20 68 61 73 20 61 6c 73 6f 20 62 65 65 6e  on has also been
51e0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 0a 2a 2a   called.  The.**
51f0: 20 66 69 6e 61 6c 69 7a 65 72 20 6d 69 67 68 74   finalizer might
5200: 20 6e 65 65 64 20 74 6f 20 66 72 65 65 20 6d 65   need to free me
5210: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 61 6c  mory that was al
5220: 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72 74 20  located as part 
5230: 6f 66 20 69 74 73 0a 2a 2a 20 70 72 69 76 61 74  of its.** privat
5240: 65 20 63 6f 6e 74 65 78 74 2e 20 20 49 66 20 74  e context.  If t
5250: 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68 61 73  he finalizer has
5260: 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c 65 64   not been called
5270: 20 79 65 74 2c 20 63 61 6c 6c 20 69 74 0a 2a 2a   yet, call it.**
5280: 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   now..*/.static 
5290: 76 6f 69 64 20 41 67 67 52 65 73 65 74 28 41 67  void AggReset(Ag
52a0: 67 20 2a 70 41 67 67 29 7b 0a 20 20 69 6e 74 20  g *pAgg){.  int 
52b0: 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  i;.  HashElem *p
52c0: 3b 0a 20 20 66 6f 72 28 70 20 3d 20 73 71 6c 69  ;.  for(p = sqli
52d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 41 67  teHashFirst(&pAg
52e0: 67 2d 3e 68 61 73 68 29 3b 20 70 3b 20 70 20 3d  g->hash); p; p =
52f0: 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28   sqliteHashNext(
5300: 70 29 29 7b 0a 20 20 20 20 41 67 67 45 6c 65 6d  p)){.    AggElem
5310: 20 2a 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65   *pElem = sqlite
5320: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
5330: 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 61   assert( pAgg->a
5340: 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20  pFunc!=0 );.    
5350: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 2d  for(i=0; i<pAgg-
5360: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
5370: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
5380: 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a  pElem->aMem[i];.
5390: 20 20 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e        if( pAgg->
53a0: 61 70 46 75 6e 63 5b 69 5d 20 26 26 20 28 70 4d  apFunc[i] && (pM
53b0: 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54  em->s.flags & ST
53c0: 4b 5f 41 67 67 43 74 78 29 21 3d 30 20 29 7b 0a  K_AggCtx)!=0 ){.
53d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 66          sqlite_f
53e0: 75 6e 63 20 63 74 78 3b 0a 20 20 20 20 20 20 20  unc ctx;.       
53f0: 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 41 67   ctx.pFunc = pAg
5400: 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a 20 20  g->apFunc[i];.  
5410: 20 20 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67        ctx.s.flag
5420: 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20  s = STK_Null;.  
5430: 20 20 20 20 20 20 63 74 78 2e 7a 20 3d 20 30 3b        ctx.z = 0;
5440: 0a 20 20 20 20 20 20 20 20 63 74 78 2e 70 41 67  .        ctx.pAg
5450: 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  g = pMem->z;.   
5460: 20 20 20 20 20 63 74 78 2e 63 6e 74 20 3d 20 70       ctx.cnt = p
5470: 4d 65 6d 2d 3e 73 2e 69 3b 0a 20 20 20 20 20 20  Mem->s.i;.      
5480: 20 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20 30    ctx.isStep = 0
5490: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 69 73  ;.        ctx.is
54a0: 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Error = 0;.     
54b0: 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75 6e     (*pAgg->apFun
54c0: 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65 29  c[i]->xFinalize)
54d0: 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20  (&ctx);.        
54e0: 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 26  if( pMem->z!=0 &
54f0: 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d  & pMem->z!=pMem-
5500: 3e 73 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  >s.z ){.        
5510: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4d 65    sqliteFree(pMe
5520: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  m->z);.        }
5530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5540: 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26   pMem->s.flags &
5550: 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20   STK_Dyn ){.    
5560: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5570: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d  Mem->z);.      }
5580: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5590: 65 46 72 65 65 28 70 45 6c 65 6d 29 3b 0a 20 20  eFree(pElem);.  
55a0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
55b0: 65 61 72 28 26 70 41 67 67 2d 3e 68 61 73 68 29  ear(&pAgg->hash)
55c0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
55d0: 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20 20  Agg->apFunc);.  
55e0: 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20 30  pAgg->apFunc = 0
55f0: 3b 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72 65  ;.  pAgg->pCurre
5600: 6e 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e  nt = 0;.  pAgg->
5610: 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20 70  pSearch = 0;.  p
5620: 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d  Agg->nMem = 0;.}
5630: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
5640: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 61 6e 64   new element and
5650: 20 6d 61 6b 65 20 69 74 20 74 68 65 20 63 75 72   make it the cur
5660: 72 65 6e 74 20 65 6c 65 6d 65 6e 74 2e 20 20 0a  rent element.  .
5670: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
5680: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20  n success and 1 
5690: 69 66 20 6d 65 6d 6f 72 79 20 69 73 20 65 78 68  if memory is exh
56a0: 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  austed..*/.stati
56b0: 63 20 69 6e 74 20 41 67 67 49 6e 73 65 72 74 28  c int AggInsert(
56c0: 41 67 67 20 2a 70 2c 20 63 68 61 72 20 2a 7a 4b  Agg *p, char *zK
56d0: 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 7b 0a 20  ey, int nKey){. 
56e0: 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 2c   AggElem *pElem,
56f0: 20 2a 70 4f 6c 64 3b 0a 20 20 69 6e 74 20 69 3b   *pOld;.  int i;
5700: 0a 20 20 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74  .  pElem = sqlit
5710: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5720: 41 67 67 45 6c 65 6d 29 20 2b 20 6e 4b 65 79 20  AggElem) + nKey 
5730: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
5740: 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 6e 4d            (p->nM
5750: 65 6d 2d 31 29 2a 73 69 7a 65 6f 66 28 70 45 6c  em-1)*sizeof(pEl
5760: 65 6d 2d 3e 61 4d 65 6d 5b 30 5d 29 20 29 3b 0a  em->aMem[0]) );.
5770: 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29    if( pElem==0 )
5780: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 45 6c   return 1;.  pEl
5790: 65 6d 2d 3e 7a 4b 65 79 20 3d 20 28 63 68 61 72  em->zKey = (char
57a0: 2a 29 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 70  *)&pElem->aMem[p
57b0: 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 6d 65 6d 63 70  ->nMem];.  memcp
57c0: 79 28 70 45 6c 65 6d 2d 3e 7a 4b 65 79 2c 20 7a  y(pElem->zKey, z
57d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 70 45  Key, nKey);.  pE
57e0: 6c 65 6d 2d 3e 6e 4b 65 79 20 3d 20 6e 4b 65 79  lem->nKey = nKey
57f0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
5800: 65 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  eHashInsert(&p->
5810: 68 61 73 68 2c 20 70 45 6c 65 6d 2d 3e 7a 4b 65  hash, pElem->zKe
5820: 79 2c 20 70 45 6c 65 6d 2d 3e 6e 4b 65 79 2c 20  y, pElem->nKey, 
5830: 70 45 6c 65 6d 29 3b 0a 20 20 69 66 28 20 70 4f  pElem);.  if( pO
5840: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ld!=0 ){.    ass
5850: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 45 6c 65 6d  ert( pOld==pElem
5860: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   );  /* Malloc f
5870: 61 69 6c 65 64 20 6f 6e 20 69 6e 73 65 72 74 20  ailed on insert 
5880: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5890: 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 72 65 74  e(pOld);.    ret
58a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
58b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
58c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 45 6c 65 6d   i++){.    pElem
58d0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 73 2e 66 6c 61 67  ->aMem[i].s.flag
58e0: 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20  s = STK_Null;.  
58f0: 7d 0a 20 20 70 2d 3e 70 43 75 72 72 65 6e 74 20  }.  p->pCurrent 
5900: 3d 20 70 45 6c 65 6d 3b 0a 20 20 72 65 74 75 72  = pElem;.  retur
5910: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
5920: 74 20 74 68 65 20 41 67 67 45 6c 65 6d 20 63 75  t the AggElem cu
5930: 72 72 65 6e 74 6c 79 20 69 6e 20 66 6f 63 75 73  rrently in focus
5940: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 67 67 49  .*/.#define AggI
5950: 6e 46 6f 63 75 73 28 50 29 20 20 20 28 28 50 29  nFocus(P)   ((P)
5960: 2e 70 43 75 72 72 65 6e 74 20 3f 20 28 50 29 2e  .pCurrent ? (P).
5970: 70 43 75 72 72 65 6e 74 20 3a 20 5f 41 67 67 49  pCurrent : _AggI
5980: 6e 46 6f 63 75 73 28 26 28 50 29 29 29 0a 73 74  nFocus(&(P))).st
5990: 61 74 69 63 20 41 67 67 45 6c 65 6d 20 2a 5f 41  atic AggElem *_A
59a0: 67 67 49 6e 46 6f 63 75 73 28 41 67 67 20 2a 70  ggInFocus(Agg *p
59b0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
59c0: 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73  Elem = sqliteHas
59d0: 68 46 69 72 73 74 28 26 70 2d 3e 68 61 73 68 29  hFirst(&p->hash)
59e0: 3b 0a 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30  ;.  if( pElem==0
59f0: 20 29 7b 0a 20 20 20 20 41 67 67 49 6e 73 65 72   ){.    AggInser
5a00: 74 28 70 2c 22 22 2c 31 29 3b 0a 20 20 20 20 70  t(p,"",1);.    p
5a10: 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73  Elem = sqliteHas
5a20: 68 46 69 72 73 74 28 26 70 2d 3e 68 61 73 68 29  hFirst(&p->hash)
5a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
5a40: 45 6c 65 6d 20 3f 20 73 71 6c 69 74 65 48 61 73  Elem ? sqliteHas
5a50: 68 44 61 74 61 28 70 45 6c 65 6d 29 20 3a 20 30  hData(pElem) : 0
5a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
5a70: 72 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  rt the given sta
5a80: 63 6b 20 65 6e 74 69 74 79 20 69 6e 74 6f 20 61  ck entity into a
5a90: 20 73 74 72 69 6e 67 20 69 66 20 69 74 20 69 73   string if it is
5aa0: 6e 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61  n't one.** alrea
5ab0: 64 79 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  dy.  Return non-
5ac0: 7a 65 72 6f 20 69 66 20 77 65 20 72 75 6e 20 6f  zero if we run o
5ad0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  ut of memory..**
5ae0: 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 63 6f  .** NULLs are co
5af0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
5b00: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
5b10: 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 69  .#define Stringi
5b20: 66 79 28 50 2c 49 29 20 5c 0a 20 20 20 28 28 50  fy(P,I) \.   ((P
5b30: 2d 3e 61 53 74 61 63 6b 5b 49 5d 2e 66 6c 61 67  ->aStack[I].flag
5b40: 73 20 26 20 53 54 4b 5f 53 74 72 29 3d 3d 30 20  s & STK_Str)==0 
5b50: 3f 20 68 61 72 64 53 74 72 69 6e 67 69 66 79 28  ? hardStringify(
5b60: 50 2c 49 29 20 3a 20 30 29 0a 73 74 61 74 69 63  P,I) : 0).static
5b70: 20 69 6e 74 20 68 61 72 64 53 74 72 69 6e 67 69   int hardStringi
5b80: 66 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  fy(Vdbe *p, int 
5b90: 69 29 7b 0a 20 20 53 74 61 63 6b 20 2a 70 53 74  i){.  Stack *pSt
5ba0: 61 63 6b 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  ack = &p->aStack
5bb0: 5b 69 5d 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  [i];.  char **pz
5bc0: 53 74 61 63 6b 20 3d 20 26 70 2d 3e 7a 53 74 61  Stack = &p->zSta
5bd0: 63 6b 5b 69 5d 3b 0a 20 20 69 6e 74 20 66 67 20  ck[i];.  int fg 
5be0: 3d 20 70 53 74 61 63 6b 2d 3e 66 6c 61 67 73 3b  = pStack->flags;
5bf0: 0a 20 20 69 66 28 20 66 67 20 26 20 53 54 4b 5f  .  if( fg & STK_
5c00: 52 65 61 6c 20 29 7b 0a 20 20 20 20 73 70 72 69  Real ){.    spri
5c10: 6e 74 66 28 70 53 74 61 63 6b 2d 3e 7a 2c 22 25  ntf(pStack->z,"%
5c20: 2e 31 35 67 22 2c 70 53 74 61 63 6b 2d 3e 72 29  .15g",pStack->r)
5c30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 67  ;.  }else if( fg
5c40: 20 26 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20   & STK_Int ){.  
5c50: 20 20 73 70 72 69 6e 74 66 28 70 53 74 61 63 6b    sprintf(pStack
5c60: 2d 3e 7a 2c 22 25 64 22 2c 70 53 74 61 63 6b 2d  ->z,"%d",pStack-
5c70: 3e 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >i);.  }else{.  
5c80: 20 20 70 53 74 61 63 6b 2d 3e 7a 5b 30 5d 20 3d    pStack->z[0] =
5c90: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 7a 53 74 61   0;.  }.  *pzSta
5ca0: 63 6b 20 3d 20 70 53 74 61 63 6b 2d 3e 7a 3b 0a  ck = pStack->z;.
5cb0: 20 20 70 53 74 61 63 6b 2d 3e 6e 20 3d 20 73 74    pStack->n = st
5cc0: 72 6c 65 6e 28 2a 70 7a 53 74 61 63 6b 29 2b 31  rlen(*pzStack)+1
5cd0: 3b 0a 20 20 70 53 74 61 63 6b 2d 3e 66 6c 61 67  ;.  pStack->flag
5ce0: 73 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 72  s = STK_Str;.  r
5cf0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5d00: 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6d 65  * Release the me
5d10: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
5d20: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
5d30: 74 61 63 6b 20 6c 65 76 65 6c 0a 2a 2f 0a 23 64  tack level.*/.#d
5d40: 65 66 69 6e 65 20 52 65 6c 65 61 73 65 28 50 2c  efine Release(P,
5d50: 49 29 20 20 69 66 28 28 50 29 2d 3e 61 53 74 61  I)  if((P)->aSta
5d60: 63 6b 5b 49 5d 2e 66 6c 61 67 73 26 53 54 4b 5f  ck[I].flags&STK_
5d70: 44 79 6e 29 7b 20 68 61 72 64 52 65 6c 65 61 73  Dyn){ hardReleas
5d80: 65 28 50 2c 49 29 3b 20 7d 0a 73 74 61 74 69 63  e(P,I); }.static
5d90: 20 76 6f 69 64 20 68 61 72 64 52 65 6c 65 61 73   void hardReleas
5da0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
5db0: 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
5dc0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29 3b 0a 20  p->zStack[i]);. 
5dd0: 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20   p->zStack[i] = 
5de0: 30 3b 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69  0;.  p->aStack[i
5df0: 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 28 53 54 4b  ].flags &= ~(STK
5e00: 5f 53 74 72 7c 53 54 4b 5f 44 79 6e 7c 53 54 4b  _Str|STK_Dyn|STK
5e10: 5f 53 74 61 74 69 63 29 3b 0a 7d 0a 0a 2f 2a 0a  _Static);.}../*.
5e20: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 67  ** Convert the g
5e30: 69 76 65 6e 20 73 74 61 63 6b 20 65 6e 74 69 74  iven stack entit
5e40: 79 20 69 6e 74 6f 20 61 20 69 6e 74 65 67 65 72  y into a integer
5e50: 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e 65   if it isn't one
5e60: 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a  .** already..**.
5e70: 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 73 74 72  ** Any prior str
5e80: 69 6e 67 20 6f 72 20 72 65 61 6c 20 72 65 70 72  ing or real repr
5e90: 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 69 6e  esentation is in
5ea0: 76 61 6c 69 64 61 74 65 64 2e 20 20 0a 2a 2a 20  validated.  .** 
5eb0: 4e 55 4c 4c 73 20 61 72 65 20 63 6f 6e 76 65 72  NULLs are conver
5ec0: 74 65 64 20 69 6e 74 6f 20 30 2e 0a 2a 2f 0a 23  ted into 0..*/.#
5ed0: 64 65 66 69 6e 65 20 49 6e 74 65 67 65 72 69 66  define Integerif
5ee0: 79 28 50 2c 49 29 20 5c 0a 20 20 20 20 69 66 28  y(P,I) \.    if(
5ef0: 28 28 50 29 2d 3e 61 53 74 61 63 6b 5b 28 49 29  ((P)->aStack[(I)
5f00: 5d 2e 66 6c 61 67 73 26 53 54 4b 5f 49 6e 74 29  ].flags&STK_Int)
5f10: 3d 3d 30 29 7b 20 68 61 72 64 49 6e 74 65 67 65  ==0){ hardIntege
5f20: 72 69 66 79 28 50 2c 49 29 3b 20 7d 0a 73 74 61  rify(P,I); }.sta
5f30: 74 69 63 20 76 6f 69 64 20 68 61 72 64 49 6e 74  tic void hardInt
5f40: 65 67 65 72 69 66 79 28 56 64 62 65 20 2a 70 2c  egerify(Vdbe *p,
5f50: 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
5f60: 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ->aStack[i].flag
5f70: 73 20 26 20 53 54 4b 5f 52 65 61 6c 20 29 7b 0a  s & STK_Real ){.
5f80: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d      p->aStack[i]
5f90: 2e 69 20 3d 20 28 69 6e 74 29 70 2d 3e 61 53 74  .i = (int)p->aSt
5fa0: 61 63 6b 5b 69 5d 2e 72 3b 0a 20 20 20 20 52 65  ack[i].r;.    Re
5fb0: 6c 65 61 73 65 28 70 2c 20 69 29 3b 0a 20 20 7d  lease(p, i);.  }
5fc0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 53 74 61  else if( p->aSta
5fd0: 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
5fe0: 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 70 2d 3e  K_Str ){.    p->
5ff0: 61 53 74 61 63 6b 5b 69 5d 2e 69 20 3d 20 61 74  aStack[i].i = at
6000: 6f 69 28 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 29  oi(p->zStack[i])
6010: 3b 0a 20 20 20 20 52 65 6c 65 61 73 65 28 70 2c  ;.    Release(p,
6020: 20 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i);.  }else{.  
6030: 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 69    p->aStack[i].i
6040: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61   = 0;.  }.  p->a
6050: 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d  Stack[i].flags =
6060: 20 53 54 4b 5f 49 6e 74 3b 0a 7d 0a 0a 2f 2a 0a   STK_Int;.}../*.
6070: 2a 2a 20 47 65 74 20 61 20 76 61 6c 69 64 20 52  ** Get a valid R
6080: 65 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  eal representati
6090: 6f 6e 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  on for the given
60a0: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 2e 0a   stack element..
60b0: 2a 2a 0a 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20  **.** Any prior 
60c0: 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65  string or intege
60d0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
60e0: 20 69 73 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a   is retained..**
60f0: 20 4e 55 4c 4c 73 20 61 72 65 20 63 6f 6e 76 65   NULLs are conve
6100: 72 74 65 64 20 69 6e 74 6f 20 30 2e 30 2e 0a 2a  rted into 0.0..*
6110: 2f 0a 23 64 65 66 69 6e 65 20 52 65 61 6c 69 66  /.#define Realif
6120: 79 28 50 2c 49 29 20 5c 0a 20 20 20 20 69 66 28  y(P,I) \.    if(
6130: 28 28 50 29 2d 3e 61 53 74 61 63 6b 5b 28 49 29  ((P)->aStack[(I)
6140: 5d 2e 66 6c 61 67 73 26 53 54 4b 5f 52 65 61 6c  ].flags&STK_Real
6150: 29 3d 3d 30 29 7b 20 68 61 72 64 52 65 61 6c 69  )==0){ hardReali
6160: 66 79 28 50 2c 49 29 3b 20 7d 0a 73 74 61 74 69  fy(P,I); }.stati
6170: 63 20 76 6f 69 64 20 68 61 72 64 52 65 61 6c 69  c void hardReali
6180: 66 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  fy(Vdbe *p, int 
6190: 69 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74  i){.  if( p->aSt
61a0: 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53  ack[i].flags & S
61b0: 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 70 2d  TK_Str ){.    p-
61c0: 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 20 3d 20 61  >aStack[i].r = a
61d0: 74 6f 66 28 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d  tof(p->zStack[i]
61e0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
61f0: 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ->aStack[i].flag
6200: 73 20 26 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20  s & STK_Int ){. 
6210: 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e     p->aStack[i].
6220: 72 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d  r = p->aStack[i]
6230: 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .i;.  }else{.   
6240: 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 20   p->aStack[i].r 
6250: 3d 20 30 2e 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  = 0.0;.  }.  p->
6260: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20  aStack[i].flags 
6270: 7c 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 7d 0a 0a  |= STK_Real;.}..
6280: 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 73 74  /*.** Pop the st
6290: 61 63 6b 20 4e 20 74 69 6d 65 73 2e 20 20 46 72  ack N times.  Fr
62a0: 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 73  ee any memory as
62b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
62c0: 65 0a 2a 2a 20 70 6f 70 70 65 64 20 73 74 61 63  e.** popped stac
62d0: 6b 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  k elements..*/.s
62e0: 74 61 74 69 63 20 76 6f 69 64 20 50 6f 70 53 74  tatic void PopSt
62f0: 61 63 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ack(Vdbe *p, int
6300: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 7a   N){.  char **pz
6310: 53 74 61 63 6b 3b 0a 20 20 53 74 61 63 6b 20 2a  Stack;.  Stack *
6320: 70 53 74 61 63 6b 3b 0a 20 20 69 66 28 20 70 2d  pStack;.  if( p-
6330: 3e 7a 53 74 61 63 6b 3d 3d 30 20 29 20 72 65 74  >zStack==0 ) ret
6340: 75 72 6e 3b 0a 20 20 70 53 74 61 63 6b 20 3d 20  urn;.  pStack = 
6350: 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 74 6f  &p->aStack[p->to
6360: 73 5d 3b 0a 20 20 70 7a 53 74 61 63 6b 20 3d 20  s];.  pzStack = 
6370: 26 70 2d 3e 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f  &p->zStack[p->to
6380: 73 5d 3b 0a 20 20 70 2d 3e 74 6f 73 20 2d 3d 20  s];.  p->tos -= 
6390: 4e 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  N;.  while( N-- 
63a0: 3e 20 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  > 0 ){.    if( p
63b0: 53 74 61 63 6b 2d 3e 66 6c 61 67 73 20 26 20 53  Stack->flags & S
63c0: 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  TK_Dyn ){.      
63d0: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 53 74  sqliteFree(*pzSt
63e0: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ack);.    }.    
63f0: 70 53 74 61 63 6b 2d 3e 66 6c 61 67 73 20 3d 20  pStack->flags = 
6400: 30 3b 0a 20 20 20 20 2a 70 7a 53 74 61 63 6b 20  0;.    *pzStack 
6410: 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 63 6b 2d  = 0;.    pStack-
6420: 2d 3b 0a 20 20 20 20 70 7a 53 74 61 63 6b 2d 2d  -;.    pzStack--
6430: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  ;.  }.}../*.** H
6440: 65 72 65 20 69 73 20 61 20 6d 61 63 72 6f 20 74  ere is a macro t
6450: 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 6f 6d  o handle the com
6460: 6d 6f 6e 20 63 61 73 65 20 6f 66 20 70 6f 70 70  mon case of popp
6470: 69 6e 67 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a  ing the stack.**
6480: 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 63   once.  This mac
6490: 72 6f 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 72  ro only works fr
64a0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 71  om within the sq
64b0: 6c 69 74 65 56 64 62 65 45 78 65 63 28 29 0a 2a  liteVdbeExec().*
64c0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23  * function..*/.#
64d0: 64 65 66 69 6e 65 20 50 4f 50 53 54 41 43 4b 20  define POPSTACK 
64e0: 5c 0a 20 69 66 28 20 61 53 74 61 63 6b 5b 70 2d  \. if( aStack[p-
64f0: 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  >tos].flags & ST
6500: 4b 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 46 72  K_Dyn ) sqliteFr
6510: 65 65 28 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  ee(zStack[p->tos
6520: 5d 29 3b 20 5c 0a 20 70 2d 3e 74 6f 73 2d 2d 3b  ]); \. p->tos--;
6530: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
6540: 65 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  e space has been
6550: 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
6560: 6c 64 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a  ld at least N.**
6570: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 2e   stack elements.
6580: 20 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74    Allocate addit
6590: 69 6f 6e 61 6c 20 73 74 61 63 6b 20 73 70 61 63  ional stack spac
65a0: 65 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72  e if.** necessar
65b0: 79 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  y..**.** Return 
65c0: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  0 on success and
65d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
65e0: 72 65 20 61 72 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re are memory.**
65f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6600: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rs..*/.#define N
6610: 65 65 64 53 74 61 63 6b 28 50 2c 4e 29 20 28 28  eedStack(P,N) ((
6620: 28 50 29 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63  (P)->nStackAlloc
6630: 3c 3d 28 4e 29 29 20 3f 20 68 61 72 64 4e 65 65  <=(N)) ? hardNee
6640: 64 53 74 61 63 6b 28 50 2c 4e 29 20 3a 20 30 29  dStack(P,N) : 0)
6650: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 72 64  .static int hard
6660: 4e 65 65 64 53 74 61 63 6b 28 56 64 62 65 20 2a  NeedStack(Vdbe *
6670: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  p, int N){.  int
6680: 20 6f 6c 64 41 6c 6c 6f 63 3b 0a 20 20 69 6e 74   oldAlloc;.  int
6690: 20 69 3b 0a 20 20 69 66 28 20 4e 3e 3d 70 2d 3e   i;.  if( N>=p->
66a0: 6e 53 74 61 63 6b 41 6c 6c 6f 63 20 29 7b 0a 20  nStackAlloc ){. 
66b0: 20 20 20 53 74 61 63 6b 20 2a 61 4e 65 77 3b 0a     Stack *aNew;.
66c0: 20 20 20 20 63 68 61 72 20 2a 2a 7a 4e 65 77 3b      char **zNew;
66d0: 0a 20 20 20 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20  .    oldAlloc = 
66e0: 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 3b 0a  p->nStackAlloc;.
66f0: 20 20 20 20 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c      p->nStackAll
6700: 6f 63 20 3d 20 4e 20 2b 20 32 30 3b 0a 20 20 20  oc = N + 20;.   
6710: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
6720: 61 6c 6c 6f 63 28 70 2d 3e 61 53 74 61 63 6b 2c  alloc(p->aStack,
6730: 20 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 2a   p->nStackAlloc*
6740: 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b  sizeof(p->aStack
6750: 5b 30 5d 29 29 3b 0a 20 20 20 20 7a 4e 65 77 20  [0]));.    zNew 
6760: 3d 20 61 4e 65 77 20 3f 20 73 71 6c 69 74 65 52  = aNew ? sqliteR
6770: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 53 74 61 63 6b  ealloc(p->zStack
6780: 2c 20 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63  , p->nStackAlloc
6790: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 29 20  *sizeof(char*)) 
67a0: 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  : 0;.    if( zNe
67b0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
67c0: 6c 69 74 65 46 72 65 65 28 61 4e 65 77 29 3b 0a  liteFree(aNew);.
67d0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
67e0: 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 20  (p->aStack);.   
67f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
6800: 3e 7a 53 74 61 63 6b 29 3b 0a 20 20 20 20 20 20  >zStack);.      
6810: 70 2d 3e 61 53 74 61 63 6b 20 3d 20 30 3b 0a 20  p->aStack = 0;. 
6820: 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 20 3d       p->zStack =
6830: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   0;.      p->nSt
6840: 61 63 6b 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ackAlloc = 0;.  
6850: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20      p->aStack = 
6860: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 53 74 61  0;.      p->zSta
6870: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ck = 0;.      re
6880: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
6890: 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 61 4e    p->aStack = aN
68a0: 65 77 3b 0a 20 20 20 20 70 2d 3e 7a 53 74 61 63  ew;.    p->zStac
68b0: 6b 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 66 6f  k = zNew;.    fo
68c0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
68d0: 70 2d 3e 6e 53 74 61 63 6b 41 6c 6c 6f 63 3b 20  p->nStackAlloc; 
68e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a  i++){.      p->z
68f0: 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20  Stack[i] = 0;.  
6900: 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d      p->aStack[i]
6910: 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  .flags = 0;.    
6920: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
6930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6940: 6e 20 54 52 55 45 20 69 66 20 7a 4e 75 6d 20 69  n TRUE if zNum i
6950: 73 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  s a floating-poi
6960: 6e 74 20 6f 72 20 69 6e 74 65 67 65 72 20 6e 75  nt or integer nu
6970: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
6980: 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e  int isNumber(con
6990: 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a  st char *zNum){.
69a0: 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27    if( *zNum=='-'
69b0: 20 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29   || *zNum=='+' )
69c0: 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 69 66 28 20 21   zNum++;.  if( !
69d0: 69 73 64 69 67 69 74 28 2a 7a 4e 75 6d 29 20 29  isdigit(*zNum) )
69e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
69f0: 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a 4e 75  le( isdigit(*zNu
6a00: 6d 29 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 69  m) ) zNum++;.  i
6a10: 66 28 20 2a 7a 4e 75 6d 3d 3d 30 20 29 20 72 65  f( *zNum==0 ) re
6a20: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 2a 7a  turn 1;.  if( *z
6a30: 4e 75 6d 21 3d 27 2e 27 20 29 20 72 65 74 75 72  Num!='.' ) retur
6a40: 6e 20 30 3b 0a 20 20 7a 4e 75 6d 2b 2b 3b 0a 20  n 0;.  zNum++;. 
6a50: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a   if( !isdigit(*z
6a60: 4e 75 6d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Num) ) return 0;
6a70: 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69  .  while( isdigi
6a80: 74 28 2a 7a 4e 75 6d 29 20 29 20 7a 4e 75 6d 2b  t(*zNum) ) zNum+
6a90: 2b 3b 0a 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d  +;.  if( *zNum==
6aa0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6ab0: 69 66 28 20 2a 7a 4e 75 6d 21 3d 27 65 27 20 26  if( *zNum!='e' &
6ac0: 26 20 2a 7a 4e 75 6d 21 3d 27 45 27 20 29 20 72  & *zNum!='E' ) r
6ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 75 6d 2b  eturn 0;.  zNum+
6ae0: 2b 3b 0a 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d  +;.  if( *zNum==
6af0: 27 2d 27 20 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b  '-' || *zNum=='+
6b00: 27 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 69 66  ' ) zNum++;.  if
6b10: 28 20 21 69 73 64 69 67 69 74 28 2a 7a 4e 75 6d  ( !isdigit(*zNum
6b20: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
6b30: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
6b40: 7a 4e 75 6d 29 20 29 20 7a 4e 75 6d 2b 2b 3b 0a  zNum) ) zNum++;.
6b50: 20 20 72 65 74 75 72 6e 20 2a 7a 4e 75 6d 3d 3d    return *zNum==
6b60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
6b70: 72 6e 20 54 52 55 45 20 69 66 20 7a 4e 75 6d 20  rn TRUE if zNum 
6b80: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  is an integer..*
6b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 49  /.static int isI
6ba0: 6e 74 65 67 65 72 28 63 6f 6e 73 74 20 63 68 61  nteger(const cha
6bb0: 72 20 2a 7a 4e 75 6d 29 7b 0a 20 20 69 66 28 20  r *zNum){.  if( 
6bc0: 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c 7c 20 2a 7a  *zNum=='-' || *z
6bd0: 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a 4e 75 6d 2b  Num=='+' ) zNum+
6be0: 2b 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69  +;.  while( isdi
6bf0: 67 69 74 28 2a 7a 4e 75 6d 29 20 29 20 7a 4e 75  git(*zNum) ) zNu
6c00: 6d 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 2a 7a  m++;.  return *z
6c10: 4e 75 6d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Num==0;.}../*.**
6c20: 20 44 65 6c 65 74 65 20 61 20 6b 65 79 6c 69 73   Delete a keylis
6c30: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
6c40: 20 4b 65 79 6c 69 73 74 46 72 65 65 28 4b 65 79   KeylistFree(Key
6c50: 6c 69 73 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  list *p){.  whil
6c60: 65 28 20 70 20 29 7b 0a 20 20 20 20 4b 65 79 6c  e( p ){.    Keyl
6c70: 69 73 74 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e  ist *pNext = p->
6c80: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6c90: 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 70 20  eFree(p);.    p 
6ca0: 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a  = pNext;.  }.}..
6cb0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
6cc0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
6cd0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
6ce0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68  es that cursor h
6cf0: 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c  appens.** to hol
6d00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6d10: 64 20 63 6c 65 61 6e 75 70 43 75 72 73 6f 72 28  d cleanupCursor(
6d20: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
6d30: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
6d40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 74   ){.    sqliteBt
6d50: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
6d60: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
6d70: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
6d80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 74   ){.    sqliteBt
6d90: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
6da0: 74 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  t);.  }.  memset
6db0: 28 70 43 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pCx, 0, sizeof(
6dc0: 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
6dd0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
6de0: 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sors.*/.static v
6df0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
6e00: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
6e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6e20: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
6e30: 69 2b 2b 29 7b 0a 20 20 20 20 63 6c 65 61 6e 75  i++){.    cleanu
6e40: 70 43 75 72 73 6f 72 28 26 70 2d 3e 61 43 73 72  pCursor(&p->aCsr
6e50: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
6e60: 74 65 46 72 65 65 28 70 2d 3e 61 43 73 72 29 3b  teFree(p->aCsr);
6e70: 0a 20 20 70 2d 3e 61 43 73 72 20 3d 20 30 3b 0a  .  p->aCsr = 0;.
6e80: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
6e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
6ea0: 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74  e any elements t
6eb0: 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68  hat remain on th
6ec0: 65 20 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65  e sorter for the
6ed0: 20 56 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a   VDBE given..*/.
6ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 6f 72 74  static void Sort
6ef0: 65 72 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  erReset(Vdbe *p)
6f00: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 53  {.  while( p->pS
6f10: 6f 72 74 20 29 7b 0a 20 20 20 20 53 6f 72 74 65  ort ){.    Sorte
6f20: 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e  r *pSorter = p->
6f30: 70 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e 70 53  pSort;.    p->pS
6f40: 6f 72 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70  ort = pSorter->p
6f50: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
6f60: 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a 4b  Free(pSorter->zK
6f70: 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ey);.    sqliteF
6f80: 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 70 44 61  ree(pSorter->pDa
6f90: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ta);.    sqliteF
6fa0: 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20  ree(pSorter);.  
6fb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
6fc0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
6fd0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
6fe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6ff0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
7000: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
7010: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
7020: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
7030: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
7040: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
7050: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
7060: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 50  p){.  int i;.  P
7070: 6f 70 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f  opStack(p, p->to
7080: 73 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  s+1);.  sqliteFr
7090: 65 65 28 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 29  ee(p->azColName)
70a0: 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65  ;.  p->azColName
70b0: 20 3d 20 30 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c   = 0;.  closeAll
70c0: 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
70d0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
70e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
70f0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Mem; i++){.     
7100: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e   if( p->aMem[i].
7110: 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 44 79  s.flags & STK_Dy
7120: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
7130: 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 5b  iteFree(p->aMem[
7140: 69 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i].z);.      }. 
7150: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7160: 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b 0a  eFree(p->aMem);.
7170: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a 20    p->aMem = 0;. 
7180: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
7190: 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a  if( p->pList ){.
71a0: 20 20 20 20 4b 65 79 6c 69 73 74 46 72 65 65 28      KeylistFree(
71b0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  p->pList);.    p
71c0: 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d  ->pList = 0;.  }
71d0: 0a 20 20 53 6f 72 74 65 72 52 65 73 65 74 28 70  .  SorterReset(p
71e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6c  );.  if( p->pFil
71f0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e ){.    if( p->
7200: 70 46 69 6c 65 21 3d 73 74 64 69 6e 20 29 20 66  pFile!=stdin ) f
7210: 63 6c 6f 73 65 28 70 2d 3e 70 46 69 6c 65 29 3b  close(p->pFile);
7220: 0a 20 20 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20  .    p->pFile = 
7230: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  0;.  }.  if( p->
7240: 61 7a 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 73  azField ){.    s
7250: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 7a 46  qliteFree(p->azF
7260: 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  ield);.    p->az
7270: 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Field = 0;.  }. 
7280: 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 30 3b 0a   p->nField = 0;.
7290: 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e 65 20 29    if( p->zLine )
72a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
72b0: 28 70 2d 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  (p->zLine);.    
72c0: 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20  p->zLine = 0;.  
72d0: 7d 0a 20 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f  }.  p->nLineAllo
72e0: 63 20 3d 20 30 3b 0a 20 20 41 67 67 52 65 73 65  c = 0;.  AggRese
72f0: 74 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20 69 66  t(&p->agg);.  if
7300: 28 20 70 2d 3e 61 53 65 74 20 29 7b 0a 20 20 20  ( p->aSet ){.   
7310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7320: 53 65 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Set; i++){.     
7330: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
7340: 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61 73  (&p->aSet[i].has
7350: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
7360: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53  sqliteFree(p->aS
7370: 65 74 29 3b 0a 20 20 70 2d 3e 61 53 65 74 20 3d  et);.  p->aSet =
7380: 20 30 3b 0a 20 20 70 2d 3e 6e 53 65 74 20 3d 20   0;.  p->nSet = 
7390: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6b 65 79 6c  0;.  if( p->keyl
73a0: 69 73 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  istStack ){.    
73b0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
73c0: 69 69 20 3d 20 30 3b 20 69 69 20 3c 20 70 2d 3e  ii = 0; ii < p->
73d0: 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74  keylistStackDept
73e0: 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  h; ii++){.      
73f0: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 6b  KeylistFree(p->k
7400: 65 79 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d 29  eylistStack[ii])
7410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7420: 74 65 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73  teFree(p->keylis
7430: 74 53 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d 3e  tStack);.    p->
7440: 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74  keylistStackDept
7450: 68 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b 65  h = 0;.    p->ke
7460: 79 6c 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ylistStack = 0;.
7470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
7480: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
7490: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
74a0: 74 65 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  teVdbeDelete(Vdb
74b0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
74c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
74d0: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
74e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41  );.  if( p->nOpA
74f0: 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  lloc==0 ){.    p
7500: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 70  ->aOp = 0;.    p
7510: 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  ->nOp = 0;.  }. 
7520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7530: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Op; i++){.    if
7540: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79  ( p->aOp[i].p3ty
7550: 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29  pe==P3_DYNAMIC )
7560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
7570: 65 65 28 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29  ee(p->aOp[i].p3)
7580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
7590: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29  liteFree(p->aOp)
75a0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
75b0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
75c0: 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63  iteFree(p->aStac
75d0: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  k);.  sqliteFree
75e0: 28 70 2d 3e 7a 53 74 61 63 6b 29 3b 0a 20 20 73  (p->zStack);.  s
75f0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
7600: 0a 2f 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 6c 61  ./*.** A transla
7610: 74 69 6f 6e 20 66 72 6f 6d 20 6f 70 63 6f 64 65  tion from opcode
7620: 20 6e 75 6d 62 65 72 73 20 74 6f 20 6f 70 63 6f   numbers to opco
7630: 64 65 20 6e 61 6d 65 73 2e 20 20 55 73 65 64 20  de names.  Used 
7640: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
7650: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
7660: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
7670: 6f 66 20 74 68 65 20 6e 75 6d 65 72 69 63 20 4f  of the numeric O
7680: 50 5f 20 76 61 6c 75 65 73 20 66 6f 72 20 6f 70  P_ values for op
7690: 63 6f 64 65 73 20 64 65 66 69 6e 65 64 20 69 6e  codes defined in
76a0: 20 73 71 6c 69 74 65 56 64 62 65 2e 68 0a 2a 2a   sqliteVdbe.h.**
76b0: 20 63 68 61 6e 67 65 2c 20 62 65 20 73 75 72 65   change, be sure
76c0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
76d0: 61 72 72 61 79 20 74 6f 20 6d 61 74 63 68 2e 20  array to match. 
76e0: 20 59 6f 75 20 63 61 6e 20 75 73 65 20 74 68 65   You can use the
76f0: 0a 2a 2a 20 22 6f 70 4e 61 6d 65 73 2e 61 77 6b  .** "opNames.awk
7700: 22 20 61 77 6b 20 73 63 72 69 70 74 20 77 68 69  " awk script whi
7710: 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ch is part of th
7720: 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 74 6f  e source tree to
7730: 20 72 65 67 65 6e 65 72 61 74 65 0a 2a 2a 20 74   regenerate.** t
7740: 68 69 73 20 61 72 72 61 79 2c 20 74 68 65 6e 20  his array, then 
7750: 63 6f 70 79 20 61 6e 64 20 70 61 73 74 65 20 69  copy and paste i
7760: 74 20 69 6e 74 6f 20 74 68 69 73 20 66 69 6c 65  t into this file
7770: 2c 20 69 66 20 79 6f 75 20 77 61 6e 74 2e 0a 2a  , if you want..*
7780: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
7790: 4f 70 4e 61 6d 65 5b 5d 20 3d 20 7b 20 30 2c 0a  OpName[] = { 0,.
77a0: 20 20 22 54 72 61 6e 73 61 63 74 69 6f 6e 22 2c    "Transaction",
77b0: 20 20 20 20 20 20 20 22 43 68 65 63 6b 70 6f 69         "Checkpoi
77c0: 6e 74 22 2c 20 20 20 20 20 20 20 20 22 43 6f 6d  nt",        "Com
77d0: 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
77e0: 20 22 52 6f 6c 6c 62 61 63 6b 22 2c 0a 20 20 22   "Rollback",.  "
77f0: 52 65 61 64 43 6f 6f 6b 69 65 22 2c 20 20 20 20  ReadCookie",    
7800: 20 20 20 20 22 53 65 74 43 6f 6f 6b 69 65 22 2c      "SetCookie",
7810: 20 20 20 20 20 20 20 20 20 22 56 65 72 69 66 79           "Verify
7820: 43 6f 6f 6b 69 65 22 2c 20 20 20 20 20 20 22 4f  Cookie",      "O
7830: 70 65 6e 22 2c 0a 20 20 22 4f 70 65 6e 54 65 6d  pen",.  "OpenTem
7840: 70 22 2c 20 20 20 20 20 20 20 20 20 20 22 4f 70  p",          "Op
7850: 65 6e 57 72 69 74 65 22 2c 20 20 20 20 20 20 20  enWrite",       
7860: 20 20 22 4f 70 65 6e 41 75 78 22 2c 20 20 20 20    "OpenAux",    
7870: 20 20 20 20 20 20 20 22 4f 70 65 6e 57 72 41 75         "OpenWrAu
7880: 78 22 2c 0a 20 20 22 43 6c 6f 73 65 22 2c 20 20  x",.  "Close",  
7890: 20 20 20 20 20 20 20 20 20 20 20 22 4d 6f 76 65             "Move
78a0: 54 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  To",            
78b0: 22 4e 65 77 52 65 63 6e 6f 22 2c 20 20 20 20 20  "NewRecno",     
78c0: 20 20 20 20 20 22 50 75 74 49 6e 74 4b 65 79 22       "PutIntKey"
78d0: 2c 0a 20 20 22 50 75 74 53 74 72 4b 65 79 22 2c  ,.  "PutStrKey",
78e0: 20 20 20 20 20 20 20 20 20 22 44 69 73 74 69 6e           "Distin
78f0: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 22 46  ct",          "F
7900: 6f 75 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20  ound",          
7910: 20 20 20 22 4e 6f 74 46 6f 75 6e 64 22 2c 0a 20     "NotFound",. 
7920: 20 22 49 73 55 6e 69 71 75 65 22 2c 20 20 20 20   "IsUnique",    
7930: 20 20 20 20 20 20 22 4e 6f 74 45 78 69 73 74 73        "NotExists
7940: 22 2c 20 20 20 20 20 20 20 20 20 22 44 65 6c 65  ",         "Dele
7950: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
7960: 22 43 6f 6c 75 6d 6e 22 2c 0a 20 20 22 4b 65 79  "Column",.  "Key
7970: 41 73 44 61 74 61 22 2c 20 20 20 20 20 20 20 20  AsData",        
7980: 20 22 52 65 63 6e 6f 22 2c 20 20 20 20 20 20 20   "Recno",       
7990: 20 20 20 20 20 20 22 46 75 6c 6c 4b 65 79 22 2c        "FullKey",
79a0: 20 20 20 20 20 20 20 20 20 20 20 22 4e 75 6c 6c             "Null
79b0: 52 6f 77 22 2c 0a 20 20 22 4c 61 73 74 22 2c 20  Row",.  "Last", 
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
79d0: 77 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20  wind",          
79e0: 20 20 22 4e 65 78 74 22 2c 20 20 20 20 20 20 20    "Next",       
79f0: 20 20 20 20 20 20 20 22 44 65 73 74 72 6f 79 22         "Destroy"
7a00: 2c 0a 20 20 22 43 6c 65 61 72 22 2c 20 20 20 20  ,.  "Clear",    
7a10: 20 20 20 20 20 20 20 20 20 22 43 72 65 61 74 65           "Create
7a20: 49 6e 64 65 78 22 2c 20 20 20 20 20 20 20 22 43  Index",       "C
7a30: 72 65 61 74 65 54 61 62 6c 65 22 2c 20 20 20 20  reateTable",    
7a40: 20 20 20 22 49 6e 74 65 67 72 69 74 79 43 6b 22     "IntegrityCk"
7a50: 2c 0a 20 20 22 49 64 78 50 75 74 22 2c 20 20 20  ,.  "IdxPut",   
7a60: 20 20 20 20 20 20 20 20 20 22 49 64 78 44 65 6c           "IdxDel
7a70: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 22 49  ete",         "I
7a80: 64 78 52 65 63 6e 6f 22 2c 20 20 20 20 20 20 20  dxRecno",       
7a90: 20 20 20 22 49 64 78 47 54 22 2c 0a 20 20 22 49     "IdxGT",.  "I
7aa0: 64 78 47 45 22 2c 20 20 20 20 20 20 20 20 20 20  dxGE",          
7ab0: 20 20 20 22 4d 65 6d 4c 6f 61 64 22 2c 20 20 20     "MemLoad",   
7ac0: 20 20 20 20 20 20 20 20 22 4d 65 6d 53 74 6f 72          "MemStor
7ad0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 4c 69  e",          "Li
7ae0: 73 74 57 72 69 74 65 22 2c 0a 20 20 22 4c 69 73  stWrite",.  "Lis
7af0: 74 52 65 77 69 6e 64 22 2c 20 20 20 20 20 20 20  tRewind",       
7b00: 20 22 4c 69 73 74 52 65 61 64 22 2c 20 20 20 20   "ListRead",    
7b10: 20 20 20 20 20 20 22 4c 69 73 74 52 65 73 65 74        "ListReset
7b20: 22 2c 20 20 20 20 20 20 20 20 20 22 4c 69 73 74  ",         "List
7b30: 50 75 73 68 22 2c 0a 20 20 22 4c 69 73 74 50 6f  Push",.  "ListPo
7b40: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 53  p",           "S
7b50: 6f 72 74 50 75 74 22 2c 20 20 20 20 20 20 20 20  ortPut",        
7b60: 20 20 20 22 53 6f 72 74 4d 61 6b 65 52 65 63 22     "SortMakeRec"
7b70: 2c 20 20 20 20 20 20 20 22 53 6f 72 74 4d 61 6b  ,       "SortMak
7b80: 65 4b 65 79 22 2c 0a 20 20 22 53 6f 72 74 22 2c  eKey",.  "Sort",
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
7ba0: 6f 72 74 4e 65 78 74 22 2c 20 20 20 20 20 20 20  ortNext",       
7bb0: 20 20 20 22 53 6f 72 74 43 61 6c 6c 62 61 63 6b     "SortCallback
7bc0: 22 2c 20 20 20 20 20 20 22 53 6f 72 74 52 65 73  ",      "SortRes
7bd0: 65 74 22 2c 0a 20 20 22 46 69 6c 65 4f 70 65 6e  et",.  "FileOpen
7be0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 46 69 6c  ",          "Fil
7bf0: 65 52 65 61 64 22 2c 20 20 20 20 20 20 20 20 20  eRead",         
7c00: 20 22 46 69 6c 65 43 6f 6c 75 6d 6e 22 2c 20 20   "FileColumn",  
7c10: 20 20 20 20 20 20 22 41 67 67 52 65 73 65 74 22        "AggReset"
7c20: 2c 0a 20 20 22 41 67 67 46 6f 63 75 73 22 2c 20  ,.  "AggFocus", 
7c30: 20 20 20 20 20 20 20 20 20 22 41 67 67 4e 65 78           "AggNex
7c40: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 41  t",           "A
7c50: 67 67 53 65 74 22 2c 20 20 20 20 20 20 20 20 20  ggSet",         
7c60: 20 20 20 22 41 67 67 47 65 74 22 2c 0a 20 20 22     "AggGet",.  "
7c70: 41 67 67 46 75 6e 63 22 2c 20 20 20 20 20 20 20  AggFunc",       
7c80: 20 20 20 20 22 41 67 67 49 6e 69 74 22 2c 20 20      "AggInit",  
7c90: 20 20 20 20 20 20 20 20 20 22 41 67 67 50 75 73           "AggPus
7ca0: 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 41  h",           "A
7cb0: 67 67 50 6f 70 22 2c 0a 20 20 22 53 65 74 49 6e  ggPop",.  "SetIn
7cc0: 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20 22  sert",         "
7cd0: 53 65 74 46 6f 75 6e 64 22 2c 20 20 20 20 20 20  SetFound",      
7ce0: 20 20 20 20 22 53 65 74 4e 6f 74 46 6f 75 6e 64      "SetNotFound
7cf0: 22 2c 20 20 20 20 20 20 20 22 53 65 74 46 69 72  ",       "SetFir
7d00: 73 74 22 2c 0a 20 20 22 53 65 74 4e 65 78 74 22  st",.  "SetNext"
7d10: 2c 20 20 20 20 20 20 20 20 20 20 20 22 4d 61 6b  ,           "Mak
7d20: 65 52 65 63 6f 72 64 22 2c 20 20 20 20 20 20 20  eRecord",       
7d30: 20 22 4d 61 6b 65 4b 65 79 22 2c 20 20 20 20 20   "MakeKey",     
7d40: 20 20 20 20 20 20 22 4d 61 6b 65 49 64 78 4b 65        "MakeIdxKe
7d50: 79 22 2c 0a 20 20 22 49 6e 63 72 4b 65 79 22 2c  y",.  "IncrKey",
7d60: 20 20 20 20 20 20 20 20 20 20 20 22 47 6f 74 6f             "Goto
7d70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7d80: 22 49 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  "If",           
7d90: 20 20 20 20 20 22 49 66 4e 6f 74 22 2c 0a 20 20       "IfNot",.  
7da0: 22 48 61 6c 74 22 2c 20 20 20 20 20 20 20 20 20  "Halt",         
7db0: 20 20 20 20 20 22 43 6f 6c 75 6d 6e 43 6f 75 6e       "ColumnCoun
7dc0: 74 22 2c 20 20 20 20 20 20 20 22 43 6f 6c 75 6d  t",       "Colum
7dd0: 6e 4e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 22  nName",        "
7de0: 43 61 6c 6c 62 61 63 6b 22 2c 0a 20 20 22 4e 75  Callback",.  "Nu
7df0: 6c 6c 43 61 6c 6c 62 61 63 6b 22 2c 20 20 20 20  llCallback",    
7e00: 20 20 22 49 6e 74 65 67 65 72 22 2c 20 20 20 20    "Integer",    
7e10: 20 20 20 20 20 20 20 22 53 74 72 69 6e 67 22 2c         "String",
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 6f 70              "Pop
7e30: 22 2c 0a 20 20 22 44 75 70 22 2c 20 20 20 20 20  ",.  "Dup",     
7e40: 20 20 20 20 20 20 20 20 20 20 22 50 75 6c 6c 22            "Pull"
7e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
7e60: 50 75 73 68 22 2c 20 20 20 20 20 20 20 20 20 20  Push",          
7e70: 20 20 20 20 22 4d 75 73 74 42 65 49 6e 74 22 2c      "MustBeInt",
7e80: 0a 20 20 22 41 64 64 22 2c 20 20 20 20 20 20 20  .  "Add",       
7e90: 20 20 20 20 20 20 20 20 22 41 64 64 49 6d 6d 22          "AddImm"
7ea0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 53 75  ,            "Su
7eb0: 62 74 72 61 63 74 22 2c 20 20 20 20 20 20 20 20  btract",        
7ec0: 20 20 22 4d 75 6c 74 69 70 6c 79 22 2c 0a 20 20    "Multiply",.  
7ed0: 22 44 69 76 69 64 65 22 2c 20 20 20 20 20 20 20  "Divide",       
7ee0: 20 20 20 20 20 22 52 65 6d 61 69 6e 64 65 72 22       "Remainder"
7ef0: 2c 20 20 20 20 20 20 20 20 20 22 42 69 74 41 6e  ,         "BitAn
7f00: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  d",            "
7f10: 42 69 74 4f 72 22 2c 0a 20 20 22 42 69 74 4e 6f  BitOr",.  "BitNo
7f20: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  t",            "
7f30: 53 68 69 66 74 4c 65 66 74 22 2c 20 20 20 20 20  ShiftLeft",     
7f40: 20 20 20 20 22 53 68 69 66 74 52 69 67 68 74 22      "ShiftRight"
7f50: 2c 20 20 20 20 20 20 20 20 22 41 62 73 56 61 6c  ,        "AbsVal
7f60: 75 65 22 2c 0a 20 20 22 45 71 22 2c 20 20 20 20  ue",.  "Eq",    
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65 22              "Ne"
7f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7f90: 20 22 4c 74 22 2c 20 20 20 20 20 20 20 20 20 20   "Lt",          
7fa0: 20 20 20 20 20 20 22 4c 65 22 2c 0a 20 20 22 47        "Le",.  "G
7fb0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
7fc0: 20 20 20 22 47 65 22 2c 20 20 20 20 20 20 20 20     "Ge",        
7fd0: 20 20 20 20 20 20 20 20 22 49 73 4e 75 6c 6c 22          "IsNull"
7fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f  ,            "No
7ff0: 74 4e 75 6c 6c 22 2c 0a 20 20 22 4e 65 67 61 74  tNull",.  "Negat
8000: 69 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 22  ive",          "
8010: 41 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  And",           
8020: 20 20 20 20 22 4f 72 22 2c 20 20 20 20 20 20 20      "Or",       
8030: 20 20 20 20 20 20 20 20 20 22 4e 6f 74 22 2c 0a           "Not",.
8040: 20 20 22 43 6f 6e 63 61 74 22 2c 20 20 20 20 20    "Concat",     
8050: 20 20 20 20 20 20 20 22 4e 6f 6f 70 22 2c 20 20         "Noop",  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 75 6e              "Fun
8070: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20  ction",         
8080: 20 22 4c 69 6d 69 74 22 2c 0a 20 20 22 4c 69 6d   "Limit",.  "Lim
8090: 69 74 43 6b 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  itCk",.};../*.**
80a0: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
80b0: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 2c 20 72 65  of an opcode, re
80c0: 74 75 72 6e 20 69 74 73 20 6e 75 6d 62 65 72 2e  turn its number.
80d0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a    Return 0 if.**
80e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
80f0: 63 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ch..**.** This r
8100: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
8110: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
8120: 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ebugging..*/.int
8130: 20 73 71 6c 69 74 65 56 64 62 65 4f 70 63 6f 64   sqliteVdbeOpcod
8140: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
8150: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
8160: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 4f 50 5f   for(i=1; i<=OP_
8170: 4d 41 58 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  MAX; i++){.    i
8180: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
8190: 28 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 5b  (zName, zOpName[
81a0: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
81b0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
81c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
81d0: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
81e0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
81f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
8210: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
8220: 65 20 61 73 20 73 71 6c 69 74 65 56 64 62 65 45  e as sqliteVdbeE
8230: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
8240: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
8250: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
8260: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
8270: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
8280: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
8290: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
82a0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
82b0: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
82c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65  /.int sqliteVdbe
82d0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  List(.  Vdbe *p,
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
8300: 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62  /.  sqlite_callb
8310: 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c 20 2f  ack xCallback, /
8320: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 2a  * The callback *
8330: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20  /.  void *pArg, 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8350: 2a 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74  * 1st argument t
8360: 6f 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  o callback */.  
8370: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
8380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
8390: 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20  ror msg written 
83a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
83b0: 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  ite *db = p->db;
83c0: 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20  .  int i, rc;.  
83d0: 63 68 61 72 20 2a 61 7a 56 61 6c 75 65 5b 36 5d  char *azValue[6]
83e0: 3b 0a 20 20 63 68 61 72 20 7a 41 64 64 72 5b 32  ;.  char zAddr[2
83f0: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 50 31 5b 32  0];.  char zP1[2
8400: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 50 32 5b 32  0];.  char zP2[2
8410: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 50 33 5b 34  0];.  char zP3[4
8420: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61  0];.  static cha
8430: 72 20 2a 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73  r *azColumnNames
8440: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 61 64 64  [] = {.     "add
8450: 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70  r", "opcode", "p
8460: 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20  1", "p2", "p3", 
8470: 30 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 78 43  0.  };..  if( xC
8480: 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 20 72 65 74  allback==0 ) ret
8490: 75 72 6e 20 30 3b 0a 20 20 61 7a 56 61 6c 75 65  urn 0;.  azValue
84a0: 5b 30 5d 20 3d 20 7a 41 64 64 72 3b 0a 20 20 61  [0] = zAddr;.  a
84b0: 7a 56 61 6c 75 65 5b 32 5d 20 3d 20 7a 50 31 3b  zValue[2] = zP1;
84c0: 0a 20 20 61 7a 56 61 6c 75 65 5b 33 5d 20 3d 20  .  azValue[3] = 
84d0: 7a 50 32 3b 0a 20 20 61 7a 56 61 6c 75 65 5b 35  zP2;.  azValue[5
84e0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 53 51  ] = 0;.  rc = SQ
84f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 69  LITE_OK;.  for(i
8500: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
8510: 4b 20 26 26 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  K && i<p->nOp; i
8520: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
8530: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8540: 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
8550: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
8560: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70  ~SQLITE_Interrup
8570: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  t;.      if( db-
8580: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
8590: 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20 20  AGIC_BUSY ){.   
85a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
85b0: 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d  _MISUSE;.      }
85c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
85d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
85e0: 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
85f0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8600: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c  ng(pzErrMsg, sql
8610: 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
8620: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
8630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8640: 20 73 70 72 69 6e 74 66 28 7a 41 64 64 72 2c 22   sprintf(zAddr,"
8650: 25 64 22 2c 69 29 3b 0a 20 20 20 20 73 70 72 69  %d",i);.    spri
8660: 6e 74 66 28 7a 50 31 2c 22 25 64 22 2c 20 70 2d  ntf(zP1,"%d", p-
8670: 3e 61 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20  >aOp[i].p1);.   
8680: 20 73 70 72 69 6e 74 66 28 7a 50 32 2c 22 25 64   sprintf(zP2,"%d
8690: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 29  ", p->aOp[i].p2)
86a0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70  ;.    if( p->aOp
86b0: 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33 5f 50  [i].p3type==P3_P
86c0: 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
86d0: 73 70 72 69 6e 74 66 28 7a 50 33 2c 20 22 70 74  sprintf(zP3, "pt
86e0: 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 70 2d  r(%#x)", (int)p-
86f0: 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20 20  >aOp[i].p3);.   
8700: 20 20 20 61 7a 56 61 6c 75 65 5b 34 5d 20 3d 20     azValue[4] = 
8710: 7a 50 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  zP3;.    }else{.
8720: 20 20 20 20 20 20 61 7a 56 61 6c 75 65 5b 34 5d        azValue[4]
8730: 20 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 3b   = p->aOp[i].p3;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 56 61 6c  .    }.    azVal
8750: 75 65 5b 31 5d 20 3d 20 7a 4f 70 4e 61 6d 65 5b  ue[1] = zOpName[
8760: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8770: 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ];.    if( sqlit
8780: 65 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29  eSafetyOff(db) )
8790: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
87a0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20  ITE_MISUSE;.    
87b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
87c0: 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b     if( xCallback
87d0: 28 70 41 72 67 2c 20 35 2c 20 61 7a 56 61 6c 75  (pArg, 5, azValu
87e0: 65 2c 20 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73  e, azColumnNames
87f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
8800: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
8810: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
8820: 74 65 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29  teSafetyOn(db) )
8830: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
8840: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20  ITE_MISUSE;.    
8850: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8860: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
8870: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 70  parameters are p
8880: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 68  ointers to the h
8890: 65 61 64 20 6f 66 20 74 77 6f 20 73 6f 72 74 65  ead of two sorte
88a0: 64 20 6c 69 73 74 73 0a 2a 2a 20 6f 66 20 53 6f  d lists.** of So
88b0: 72 74 65 72 20 73 74 72 75 63 74 75 72 65 73 2e  rter structures.
88c0: 20 20 4d 65 72 67 65 20 74 68 65 73 65 20 74 77    Merge these tw
88d0: 6f 20 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  o lists together
88e0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
88f0: 20 73 69 6e 67 6c 65 20 73 6f 72 74 65 64 20 6c   single sorted l
8900: 69 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ist.  This routi
8910: 6e 65 20 66 6f 72 6d 73 20 74 68 65 20 63 6f 72  ne forms the cor
8920: 65 20 6f 66 20 74 68 65 20 6d 65 72 67 65 2d 73  e of the merge-s
8930: 6f 72 74 0a 2a 2a 20 61 6c 67 6f 72 69 74 68 6d  ort.** algorithm
8940: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
8950: 61 73 65 20 6f 66 20 61 20 74 69 65 2c 20 6c 65  ase of a tie, le
8960: 66 74 20 73 6f 72 74 73 20 69 6e 20 66 72 6f 6e  ft sorts in fron
8970: 74 20 6f 66 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t of right..*/.s
8980: 74 61 74 69 63 20 53 6f 72 74 65 72 20 2a 4d 65  tatic Sorter *Me
8990: 72 67 65 28 53 6f 72 74 65 72 20 2a 70 4c 65 66  rge(Sorter *pLef
89a0: 74 2c 20 53 6f 72 74 65 72 20 2a 70 52 69 67 68  t, Sorter *pRigh
89b0: 74 29 7b 0a 20 20 53 6f 72 74 65 72 20 73 48 65  t){.  Sorter sHe
89c0: 61 64 3b 0a 20 20 53 6f 72 74 65 72 20 2a 70 54  ad;.  Sorter *pT
89d0: 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
89e0: 73 48 65 61 64 3b 0a 20 20 70 54 61 69 6c 2d 3e  sHead;.  pTail->
89f0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69  pNext = 0;.  whi
8a00: 6c 65 28 20 70 4c 65 66 74 20 26 26 20 70 52 69  le( pLeft && pRi
8a10: 67 68 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ght ){.    int c
8a20: 20 3d 20 73 71 6c 69 74 65 53 6f 72 74 43 6f 6d   = sqliteSortCom
8a30: 70 61 72 65 28 70 4c 65 66 74 2d 3e 7a 4b 65 79  pare(pLeft->zKey
8a40: 2c 20 70 52 69 67 68 74 2d 3e 7a 4b 65 79 29 3b  , pRight->zKey);
8a50: 0a 20 20 20 20 69 66 28 20 63 3c 3d 30 20 29 7b  .    if( c<=0 ){
8a60: 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e  .      pTail->pN
8a70: 65 78 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  ext = pLeft;.   
8a80: 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74     pLeft = pLeft
8a90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
8aa0: 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
8ab0: 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b  >pNext = pRight;
8ac0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
8ad0: 70 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20  pRight->pNext;. 
8ae0: 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d     }.    pTail =
8af0: 20 70 54 61 69 6c 2d 3e 70 4e 65 78 74 3b 0a 20   pTail->pNext;. 
8b00: 20 7d 0a 20 20 69 66 28 20 70 4c 65 66 74 20 29   }.  if( pLeft )
8b10: 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65  {.    pTail->pNe
8b20: 78 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 7d 65  xt = pLeft;.  }e
8b30: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 29  lse if( pRight )
8b40: 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65  {.    pTail->pNe
8b50: 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 7d  xt = pRight;.  }
8b60: 0a 20 20 72 65 74 75 72 6e 20 73 48 65 61 64 2e  .  return sHead.
8b70: 70 4e 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pNext;.}../*.** 
8b80: 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65 67  Convert an integ
8b90: 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  er in between th
8ba0: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  e native integer
8bb0: 20 66 6f 72 6d 61 74 20 61 6e 64 0a 2a 2a 20 74   format and.** t
8bc0: 68 65 20 62 69 67 45 6e 64 69 61 6e 20 66 6f 72  he bigEndian for
8bd0: 6d 61 74 20 75 73 65 64 20 61 73 20 74 68 65 20  mat used as the 
8be0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
8bf0: 72 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  r tables..**.** 
8c00: 54 68 65 20 62 69 67 45 6e 64 69 61 6e 20 66 6f  The bigEndian fo
8c10: 72 6d 61 74 20 28 6d 6f 73 74 20 73 69 67 6e 69  rmat (most signi
8c20: 66 69 63 61 6e 74 20 62 79 74 65 20 66 69 72 73  ficant byte firs
8c30: 74 29 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  t) is used for.*
8c40: 2a 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73  * record numbers
8c50: 20 73 6f 20 74 68 61 74 20 72 65 63 6f 72 64 73   so that records
8c60: 20 77 69 6c 6c 20 73 6f 72 74 20 69 6e 74 6f 20   will sort into 
8c70: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
8c80: 72 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  r.** even though
8c90: 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65   memcmp() is use
8ca0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65  d to compare the
8cb0: 20 6b 65 79 73 2e 20 20 4f 6e 20 6d 61 63 68 69   keys.  On machi
8cc0: 6e 65 73 0a 2a 2a 20 77 68 6f 73 65 20 6e 61 74  nes.** whose nat
8cd0: 69 76 65 20 69 6e 74 65 67 65 72 20 66 6f 72 6d  ive integer form
8ce0: 61 74 20 69 73 20 6c 69 74 74 6c 65 20 65 6e 64  at is little end
8cf0: 69 61 6e 20 28 65 78 3a 20 69 34 38 36 29 20 74  ian (ex: i486) t
8d00: 68 65 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 62  he.** order of b
8d10: 79 74 65 73 20 69 73 20 72 65 76 65 72 73 65 64  ytes is reversed
8d20: 2e 20 20 4f 6e 20 6e 61 74 69 76 65 20 62 69 67  .  On native big
8d30: 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73  -endian machines
8d40: 0a 2a 2a 20 28 65 78 3a 20 41 6c 70 68 61 2c 20  .** (ex: Alpha, 
8d50: 53 70 61 72 63 2c 20 4d 6f 74 6f 72 6f 6c 61 29  Sparc, Motorola)
8d60: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
8d70: 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 0a  is the same..**.
8d80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8d90: 20 69 73 20 69 74 73 20 6f 77 6e 20 69 6e 76 65   is its own inve
8da0: 72 73 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  rse.  In other w
8db0: 6f 72 64 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ords.**.**      
8dc0: 20 20 20 58 20 3d 3d 20 62 79 74 65 53 77 61 70     X == byteSwap
8dd0: 28 62 79 74 65 53 77 61 70 28 58 29 29 0a 2a 2f  (byteSwap(X)).*/
8de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 79 74 65  .static int byte
8df0: 53 77 61 70 28 69 6e 74 20 78 29 7b 0a 20 20 75  Swap(int x){.  u
8e00: 6e 69 6f 6e 20 7b 0a 20 20 20 20 20 63 68 61 72  nion {.     char
8e10: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 69 6e 74   zBuf[sizeof(int
8e20: 29 5d 3b 0a 20 20 20 20 20 69 6e 74 20 69 3b 0a  )];.     int i;.
8e30: 20 20 7d 20 75 78 3b 0a 20 20 75 78 2e 7a 42 75    } ux;.  ux.zBu
8e40: 66 5b 33 5d 20 3d 20 78 26 30 78 66 66 3b 0a 20  f[3] = x&0xff;. 
8e50: 20 75 78 2e 7a 42 75 66 5b 32 5d 20 3d 20 28 78   ux.zBuf[2] = (x
8e60: 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 75 78 2e  >>8)&0xff;.  ux.
8e70: 7a 42 75 66 5b 31 5d 20 3d 20 28 78 3e 3e 31 36  zBuf[1] = (x>>16
8e80: 29 26 30 78 66 66 3b 0a 20 20 75 78 2e 7a 42 75  )&0xff;.  ux.zBu
8e90: 66 5b 30 5d 20 3d 20 28 78 3e 3e 32 34 29 26 30  f[0] = (x>>24)&0
8ea0: 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 75 78  xff;.  return ux
8eb0: 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .i;.}../*.** Whe
8ec0: 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  n converting fro
8ed0: 6d 20 74 68 65 20 6e 61 74 69 76 65 20 66 6f 72  m the native for
8ee0: 6d 61 74 20 74 6f 20 74 68 65 20 6b 65 79 20 66  mat to the key f
8ef0: 6f 72 6d 61 74 20 61 6e 64 20 62 61 63 6b 0a 2a  ormat and back.*
8f00: 2a 20 61 67 61 69 6e 2c 20 69 6e 20 61 64 64 69  * again, in addi
8f10: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 69 6e 67  tion to changing
8f20: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
8f30: 77 65 20 69 6e 76 65 72 74 20 74 68 65 20 68 69  we invert the hi
8f40: 67 68 2d 6f 72 64 65 72 0a 2a 2a 20 62 69 74 20  gh-order.** bit 
8f50: 6f 66 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e  of the most sign
8f60: 69 66 69 63 61 6e 74 20 62 79 74 65 2e 20 20 54  ificant byte.  T
8f70: 68 69 73 20 63 61 75 73 65 73 20 6e 65 67 61 74  his causes negat
8f80: 69 76 65 20 6e 75 6d 62 65 72 73 20 74 6f 0a 2a  ive numbers to.*
8f90: 2a 20 73 6f 72 74 20 62 65 66 6f 72 65 20 70 6f  * sort before po
8fa0: 73 69 74 69 76 65 20 6e 75 6d 62 65 72 73 20 69  sitive numbers i
8fb0: 6e 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  n the memcmp() f
8fc0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66  unction..*/.#def
8fd0: 69 6e 65 20 6b 65 79 54 6f 49 6e 74 28 58 29 20  ine keyToInt(X) 
8fe0: 20 20 28 62 79 74 65 53 77 61 70 28 58 29 20 5e    (byteSwap(X) ^
8ff0: 20 30 78 38 30 30 30 30 30 30 30 29 0a 23 64 65   0x80000000).#de
9000: 66 69 6e 65 20 69 6e 74 54 6f 4b 65 79 28 58 29  fine intToKey(X)
9010: 20 20 20 28 62 79 74 65 53 77 61 70 28 28 58 29     (byteSwap((X)
9020: 20 5e 20 30 78 38 30 30 30 30 30 30 30 29 29 0a   ^ 0x80000000)).
9030: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 63 6f 6e 74  ./*.** Code cont
9040: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
9050: 20 56 45 52 49 46 59 28 29 20 6d 61 63 72 6f 20   VERIFY() macro 
9060: 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 66 6f  is not needed fo
9070: 72 20 63 6f 72 72 65 63 74 0a 2a 2a 20 65 78 65  r correct.** exe
9080: 63 75 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 74  cution.  It is t
9090: 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 63 61 74  here only to cat
90a0: 63 68 20 65 72 72 6f 72 73 2e 20 20 53 6f 20 77  ch errors.  So w
90b0: 68 65 6e 20 77 65 20 63 6f 6d 70 69 6c 65 0a 2a  hen we compile.*
90c0: 2a 20 77 69 74 68 20 4e 44 45 42 55 47 3d 31 2c  * with NDEBUG=1,
90d0: 20 74 68 65 20 56 45 52 49 46 59 28 29 20 63 6f   the VERIFY() co
90e0: 64 65 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a  de is omitted..*
90f0: 2f 0a 23 69 66 64 65 66 20 4e 44 45 42 55 47 0a  /.#ifdef NDEBUG.
9100: 23 20 64 65 66 69 6e 65 20 56 45 52 49 46 59 28  # define VERIFY(
9110: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
9120: 65 20 56 45 52 49 46 59 28 58 29 20 58 0a 23 65  e VERIFY(X) X.#e
9130: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ndif../*.** Exec
9140: 75 74 65 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ute the program 
9150: 69 6e 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a  in the VDBE..**.
9160: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9170: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
9180: 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
9190: 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  en to memory obt
91a0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
91b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
91c0: 20 2a 70 7a 45 72 72 4d 73 67 20 69 73 20 6d 61   *pzErrMsg is ma
91d0: 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
91e0: 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54  hat memory..** T
91f0: 68 65 20 72 65 74 75 72 6e 20 70 61 72 61 6d 65  he return parame
9200: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
9210: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
9220: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
9230: 63 6b 20 65 76 65 72 20 72 65 74 75 72 6e 73 20  ck ever returns 
9240: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
9250: 68 65 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73  he program exits
9260: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
9270: 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20    There will be 
9280: 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
9290: 20 62 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f   but the functio
92a0: 6e 0a 2a 2a 20 64 6f 65 73 20 72 65 74 75 72 6e  n.** does return
92b0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 2a   SQLITE_ABORT..*
92c0: 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c  *.** A memory al
92d0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 63  location error c
92e0: 61 75 73 65 73 20 74 68 69 73 20 72 6f 75 74 69  auses this routi
92f0: 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  ne to return SQL
9300: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 61 6e 64  ITE_NOMEM.** and
9310: 20 61 62 61 6e 64 6f 6e 20 66 75 72 74 75 72 65   abandon furture
9320: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
9330: 2a 2a 20 4f 74 68 65 72 20 66 61 74 61 6c 20 65  ** Other fatal e
9340: 72 72 6f 72 73 20 72 65 74 75 72 6e 20 53 51 4c  rrors return SQL
9350: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
9360: 20 49 66 20 61 20 64 61 74 61 62 61 73 65 20 66   If a database f
9370: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
9380: 20 6f 70 65 6e 65 64 20 62 65 63 61 75 73 65 20   opened because 
9390: 69 74 20 69 73 20 6c 6f 63 6b 65 64 20 62 79 0a  it is locked by.
93a0: 2a 2a 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  ** another datab
93b0: 61 73 65 20 69 6e 73 74 61 6e 63 65 2c 20 74 68  ase instance, th
93c0: 65 6e 20 74 68 65 20 78 42 75 73 79 28 29 20 63  en the xBusy() c
93d0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
93e0: 65 64 0a 2a 2a 20 77 69 74 68 20 70 42 75 73 79  ed.** with pBusy
93f0: 41 72 67 20 61 73 20 69 74 73 20 66 69 72 73 74  Arg as its first
9400: 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 20 6e   argument, the n
9410: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
9420: 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   as the.** secon
9430: 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 20  d argument, and 
9440: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
9450: 6d 65 73 20 74 68 65 20 6f 70 65 6e 20 68 61 73  mes the open has
9460: 20 62 65 65 6e 20 61 74 74 65 6d 70 74 65 64 0a   been attempted.
9470: 2a 2a 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ** as the third 
9480: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 78  argument.  The x
9490: 42 75 73 79 28 29 20 63 61 6c 6c 62 61 63 6b 20  Busy() callback 
94a0: 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 20 77  will typically w
94b0: 61 69 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  ait.** for the d
94c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
94d0: 62 65 20 6f 70 65 6e 61 62 6c 65 2c 20 74 68 65  be openable, the
94e0: 6e 20 72 65 74 75 72 6e 2e 20 20 49 66 20 78 42  n return.  If xB
94f0: 75 73 79 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  usy().** returns
9500: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 6f 74 68   non-zero, anoth
9510: 65 72 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  er attempt is ma
9520: 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  de to open the f
9530: 69 6c 65 2e 20 20 49 66 0a 2a 2a 20 78 42 75 73  ile.  If.** xBus
9540: 79 28 29 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  y() returns zero
9550: 2c 20 6f 72 20 69 66 20 78 42 75 73 79 20 69 73  , or if xBusy is
9560: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 65 78 65 63   NULL, then exec
9570: 75 74 69 6f 6e 20 68 61 6c 74 73 0a 2a 2a 20 61  ution halts.** a
9580: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
9590: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
95a0: 55 53 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  USY..*/.int sqli
95b0: 74 65 56 64 62 65 45 78 65 63 28 0a 20 20 56 64  teVdbeExec(.  Vd
95c0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
95d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
95e0: 56 44 42 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65  VDBE */.  sqlite
95f0: 5f 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62  _callback xCallb
9600: 61 63 6b 2c 20 2f 2a 20 54 68 65 20 63 61 6c 6c  ack, /* The call
9610: 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  back */.  void *
9620: 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
9630: 20 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75       /* 1st argu
9640: 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b  ment to callback
9650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
9660: 72 72 4d 73 67 2c 20 20 20 20 20 20 20 20 20 20  rrMsg,          
9670: 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
9680: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
9690: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20  void *pBusyArg, 
96a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73             /* 1s
96b0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
96c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
96d0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
96e0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
96f0: 61 72 2a 2c 69 6e 74 29 20 20 2f 2a 20 43 61 6c  ar*,int)  /* Cal
9700: 6c 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  led when a file 
9710: 69 73 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 20 20  is busy */.){.  
9720: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9740: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
9750: 72 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 3b 20  r */.  Op *pOp; 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65    /* Current ope
9780: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
9790: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
97a0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
97b0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 42  to return */.  B
97c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 2d 3e 70  tree *pBt = p->p
97d0: 42 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt;       /* The
97e0: 20 62 61 63 6b 65 6e 64 20 64 72 69 76 65 72 20   backend driver 
97f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
9800: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  = p->db;        
9810: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
9820: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 7a 53 74 61  */.  char **zSta
9830: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
9840: 2f 2a 20 54 65 78 74 20 73 74 61 63 6b 20 2a 2f  /* Text stack */
9850: 0a 20 20 53 74 61 63 6b 20 2a 61 53 74 61 63 6b  .  Stack *aStack
9860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9870: 20 41 64 64 69 74 69 6f 6e 61 6c 20 73 74 61 63   Additional stac
9880: 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  k information */
9890: 0a 20 20 75 6e 73 69 67 6e 65 64 20 75 6e 69 71  .  unsigned uniq
98a0: 75 65 43 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f  ueCnt = 0;     /
98b0: 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 4d 61 6b  * Used by OP_Mak
98c0: 65 52 65 63 6f 72 64 20 77 68 65 6e 20 50 32 21  eRecord when P2!
98d0: 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  =0 */.  int erro
98e0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
98f0: 72 74 3b 20 2f 2a 20 52 65 63 6f 76 65 72 79 20  rt; /* Recovery 
9900: 61 63 74 69 6f 6e 20 74 6f 20 64 6f 20 69 6e 20  action to do in 
9910: 63 61 73 65 20 6f 66 20 61 6e 20 65 72 72 6f 72  case of an error
9920: 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 64 6f 54 72   */.  int undoTr
9930: 61 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 30 3b 20  ansOnError = 0; 
9940: 20 20 2f 2a 20 49 66 20 65 72 72 6f 72 2c 20 65    /* If error, e
9950: 69 74 68 65 72 20 52 4f 4c 4c 42 41 43 4b 20 6f  ither ROLLBACK o
9960: 72 20 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 63 68  r COMMIT */.  ch
9970: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20  ar zBuf[100];   
9980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9990: 63 65 20 74 6f 20 73 70 72 69 6e 74 66 28 29 20  ce to sprintf() 
99a0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 0a 0a  an integer */...
99b0: 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74    /* No instruct
99c0: 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20  ion ever pushes 
99d0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67  more than a sing
99e0: 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20  le element onto 
99f0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20  the.  ** stack. 
9a00: 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e   And the stack n
9a10: 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75  ever grows on su
9a20: 63 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69  ccessive executi
9a30: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
9a40: 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74  same loop.  So t
9a50: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
9a60: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
9a70: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
9a80: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  d.  ** on the ma
9a90: 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74  ximum stack dept
9aa0: 68 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  h required..  **
9ab0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
9ac0: 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73   all the stack s
9ad0: 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65  pace we will eve
9ae0: 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 4e  r need..  */.  N
9af0: 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 6e  eedStack(p, p->n
9b00: 4f 70 29 3b 0a 20 20 7a 53 74 61 63 6b 20 3d 20  Op);.  zStack = 
9b10: 70 2d 3e 7a 53 74 61 63 6b 3b 0a 20 20 61 53 74  p->zStack;.  aSt
9b20: 61 63 6b 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b  ack = p->aStack;
9b30: 0a 20 20 70 2d 3e 74 6f 73 20 3d 20 2d 31 3b 0a  .  p->tos = -1;.
9b40: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
9b50: 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
9b60: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
9b70: 69 7a 65 20 74 68 65 20 61 67 67 72 65 67 72 61  ize the aggregra
9b80: 74 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  te hash table.. 
9b90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 48 61 73 68   */.  sqliteHash
9ba0: 49 6e 69 74 28 26 70 2d 3e 61 67 67 2e 68 61 73  Init(&p->agg.has
9bb0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  h, SQLITE_HASH_B
9bc0: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 70 2d 3e  INARY, 0);.  p->
9bd0: 61 67 67 2e 70 53 65 61 72 63 68 20 3d 20 30 3b  agg.pSearch = 0;
9be0: 0a 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ..  rc = SQLITE_
9bf0: 4f 4b 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52  OK;.#ifdef MEMOR
9c00: 59 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61 63  Y_DEBUG.  if( ac
9c10: 63 65 73 73 28 22 76 64 62 65 5f 74 72 61 63 65  cess("vdbe_trace
9c20: 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ",0)==0 ){.    p
9c30: 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  ->trace = stdout
9c40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
9c50: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
9c60: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e  _failed ) goto n
9c70: 6f 5f 6d 65 6d 3b 0a 20 20 66 6f 72 28 70 63 3d  o_mem;.  for(pc=
9c80: 30 3b 20 21 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  0; !sqlite_mallo
9c90: 63 5f 66 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  c_failed && rc==
9ca0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 63 3c  SQLITE_OK && pc<
9cb0: 70 2d 3e 6e 4f 70 0a 20 20 20 20 20 20 20 20 20  p->nOp.         
9cc0: 20 20 20 20 56 45 52 49 46 59 28 26 26 20 70 63      VERIFY(&& pc
9cd0: 3e 3d 30 29 3b 20 70 63 2b 2b 29 7b 0a 20 20 20  >=0); pc++){.   
9ce0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
9cf0: 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 74 65  c];..    /* Inte
9d00: 72 72 75 70 74 20 70 72 6f 63 65 73 73 69 6e 67  rrupt processing
9d10: 20 69 66 20 72 65 71 75 65 73 74 65 64 2e 0a 20   if requested.. 
9d20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
9d30: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9d40: 5f 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  _Interrupt ){.  
9d50: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
9d60: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75   ~SQLITE_Interru
9d70: 70 74 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  pt;.      if( db
9d80: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
9d90: 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20  MAGIC_BUSY ){.  
9da0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9db0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20  E_MISUSE;.      
9dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
9dd0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
9de0: 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
9df0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9e00: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71  ing(pzErrMsg, sq
9e10: 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e  lite_error_strin
9e20: 67 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  g(rc), 0);.     
9e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9e40: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77     /* Only allow
9e50: 20 74 72 61 63 69 6e 67 20 69 66 20 4e 44 45 42   tracing if NDEB
9e60: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
9e70: 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  d..    */.#ifnde
9e80: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28  f NDEBUG.    if(
9e90: 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20   p->trace ){.   
9ea0: 20 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20     char *zP3;.  
9eb0: 20 20 20 20 63 68 61 72 20 7a 50 74 72 5b 34 30      char zPtr[40
9ec0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ];.      if( pOp
9ed0: 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49  ->p3type==P3_POI
9ee0: 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  NTER ){.        
9ef0: 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20 22 70  sprintf(zPtr, "p
9f00: 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 70  tr(%#x)", (int)p
9f10: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 20  Op->p3);.       
9f20: 20 7a 50 33 20 3d 20 7a 50 74 72 3b 0a 20 20 20   zP3 = zPtr;.   
9f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f40: 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b    zP3 = pOp->p3;
9f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9f60: 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c  printf(p->trace,
9f70: 22 25 34 64 20 25 2d 31 32 73 20 25 34 64 20 25  "%4d %-12s %4d %
9f80: 34 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  4d %s\n",.      
9f90: 20 20 70 63 2c 20 7a 4f 70 4e 61 6d 65 5b 70 4f    pc, zOpName[pO
9fa0: 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d  p->opcode], pOp-
9fb0: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50  >p1, pOp->p2, zP
9fc0: 33 20 3f 20 7a 50 33 20 3a 20 22 22 29 3b 0a 20  3 ? zP3 : "");. 
9fd0: 20 20 20 20 20 66 66 6c 75 73 68 28 70 2d 3e 74       fflush(p->t
9fe0: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
9ff0: 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 28  dif..    switch(
a000: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
a010: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
a060: 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** What follows 
a070: 69 73 20 61 20 6d 61 73 73 69 76 65 20 73 77 69  is a massive swi
a080: 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77 68  tch statement wh
a090: 65 72 65 20 65 61 63 68 20 63 61 73 65 20 69 6d  ere each case im
a0a0: 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73 65  plements a.** se
a0b0: 70 61 72 61 74 65 20 69 6e 73 74 72 75 63 74 69  parate instructi
a0c0: 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  on in the virtua
a0d0: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 66 20 77  l machine.  If w
a0e0: 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73 75  e follow the usu
a0f0: 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69 6f  al.** indentatio
a100: 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20 65  n conventions, e
a110: 61 63 68 20 63 61 73 65 20 73 68 6f 75 6c 64 20  ach case should 
a120: 62 65 20 69 6e 64 65 6e 74 65 64 20 62 79 20 36  be indented by 6
a130: 20 73 70 61 63 65 73 2e 20 20 42 75 74 0a 2a 2a   spaces.  But.**
a140: 20 74 68 61 74 20 69 73 20 61 20 6c 6f 74 20 6f   that is a lot o
a150: 66 20 77 61 73 74 65 64 20 73 70 61 63 65 20 6f  f wasted space o
a160: 6e 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67 69  n the left margi
a170: 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f 64 65 20  n.  So the code 
a180: 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73 77  within.** the sw
a190: 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77  itch statement w
a1a0: 69 6c 6c 20 62 72 65 61 6b 20 77 69 74 68 20 63  ill break with c
a1b0: 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62 65  onvention and be
a1c0: 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e 6f   flush-left. Ano
a1d0: 74 68 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d  ther.** big comm
a1e0: 65 6e 74 20 28 73 69 6d 69 6c 61 72 20 74 6f 20  ent (similar to 
a1f0: 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20 6d  this one) will m
a200: 61 72 6b 20 74 68 65 20 70 6f 69 6e 74 20 69 6e  ark the point in
a210: 20 74 68 65 20 63 6f 64 65 20 77 68 65 72 65 0a   the code where.
a220: 2a 2a 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ** we transition
a230: 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20   back to normal 
a240: 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 2a  indentation..***
a250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
a2a0: 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20  Opcode:  Goto * 
a2b0: 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e  P2 *.**.** An un
a2c0: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
a2d0: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a   to address P2..
a2e0: 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74  ** The next inst
a2f0: 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64  ruction executed
a300: 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65   will be .** the
a310: 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32   one at index P2
a320: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
a330: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72  ing of.** the pr
a340: 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ogram..*/.case O
a350: 50 5f 47 6f 74 6f 3a 20 7b 0a 20 20 70 63 20 3d  P_Goto: {.  pc =
a360: 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
a370: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a380: 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32  ode:  Halt P1 P2
a390: 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d   *.**.** Exit im
a3a0: 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20  mediately.  All 
a3b0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 4c 69  open cursors, Li
a3c0: 73 74 73 2c 20 53 6f 72 74 73 2c 20 65 74 63 20  sts, Sorts, etc 
a3d0: 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75  are closed.** au
a3e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a  tomatically..**.
a3f0: 2a 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73  ** P1 is the res
a400: 75 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ult code returne
a410: 64 20 62 79 20 73 71 6c 69 74 65 5f 65 78 65 63  d by sqlite_exec
a420: 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61  ().  For a norma
a430: 6c 0a 2a 2a 20 68 61 6c 74 2c 20 74 68 69 73 20  l.** halt, this 
a440: 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45  should be SQLITE
a450: 5f 4f 4b 20 28 30 29 2e 20 20 46 6f 72 20 65 72  _OK (0).  For er
a460: 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20  rors, it can be 
a470: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 76 61  some.** other va
a480: 6c 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74  lue.  If P1!=0 t
a490: 68 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65  hen P2 will dete
a4a0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
a4b0: 20 6e 6f 74 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62   not to.** rollb
a4c0: 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  ack the current 
a4d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f  transaction.  Do
a4e0: 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 69 66   not rollback if
a4f0: 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 0a 2a 2a   P2==OE_Fail..**
a500: 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   Do the rollback
a510: 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62   if P2==OE_Rollb
a520: 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f  ack.  If P2==OE_
a530: 41 62 6f 72 74 2c 20 74 68 65 6e 20 62 61 63 6b  Abort, then back
a540: 0a 2a 2a 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e  .** out all chan
a550: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 6f 63  ges that have oc
a560: 63 75 72 72 65 64 20 64 75 72 69 6e 67 20 74 68  curred during th
a570: 69 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  is execution of 
a580: 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74  the.** VDBE, but
a590: 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b   do not rollback
a5a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a5b0: 2e 20 20 28 54 68 69 73 20 6c 61 73 74 20 63 61  .  (This last ca
a5c0: 73 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65  se has.** not ye
a5d0: 74 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  t been implement
a5e0: 65 64 2e 20 20 4f 45 5f 41 62 6f 72 74 20 77 6f  ed.  OE_Abort wo
a5f0: 72 6b 73 20 6c 69 6b 65 20 4f 45 5f 52 6f 6c 6c  rks like OE_Roll
a600: 62 61 63 6b 20 66 6f 72 0a 2a 2a 20 6e 6f 77 2e  back for.** now.
a610: 20 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 20    In the future 
a620: 74 68 61 74 20 6d 61 79 20 63 68 61 6e 67 65 2e  that may change.
a630: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ).**.** There is
a640: 20 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c   an implied "Hal
a650: 74 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63  t 0 0 0" instruc
a660: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74  tion inserted at
a670: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
a680: 0a 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61  .** every progra
a690: 6d 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61  m.  So a jump pa
a6a0: 73 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  st the last inst
a6b0: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ruction of the p
a6c0: 72 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65  rogram.** is the
a6d0: 20 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69   same as executi
a6e0: 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  ng Halt..*/.case
a6f0: 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 69 66   OP_Halt: {.  if
a700: 28 20 70 4f 70 2d 3e 70 31 21 3d 53 51 4c 49 54  ( pOp->p1!=SQLIT
a710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
a720: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 65 72   pOp->p1;.    er
a730: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 70 4f 70 2d  rorAction = pOp-
a740: 3e 70 32 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  >p2;.    if( pOp
a750: 2d 3e 70 33 20 29 7b 0a 09 73 71 6c 69 74 65 53  ->p3 ){..sqliteS
a760: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
a770: 67 2c 20 70 4f 70 2d 3e 70 33 2c 20 30 29 3b 0a  g, pOp->p3, 0);.
a780: 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 20  .goto cleanup;. 
a790: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62     }.    goto ab
a7a0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
a7b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
a7c0: 63 20 3d 20 70 2d 3e 6e 4f 70 2d 31 3b 0a 20 20  c = p->nOp-1;.  
a7d0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
a7e0: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72   Opcode: Integer
a7f0: 20 50 31 20 2a 20 50 33 0a 2a 2a 0a 2a 2a 20 54   P1 * P3.**.** T
a800: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
a810: 20 50 31 20 69 73 20 70 75 73 68 65 64 20 6f 6e   P1 is pushed on
a820: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  to the stack.  I
a830: 66 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P3 is not zero
a840: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 61  .** then it is a
a850: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 20 73  ssumed to be a s
a860: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
a870: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
a880: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73   integer..*/.cas
a890: 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 0a  e OP_Integer: {.
a8a0: 20 20 69 6e 74 20 69 20 3d 20 2b 2b 70 2d 3e 74    int i = ++p->t
a8b0: 6f 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66  os;.  VERIFY( if
a8c0: 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70  ( NeedStack(p, p
a8d0: 2d 3e 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f  ->tos) ) goto no
a8e0: 5f 6d 65 6d 3b 20 29 0a 20 20 61 53 74 61 63 6b  _mem; ).  aStack
a8f0: 5b 69 5d 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  [i].i = pOp->p1;
a900: 0a 20 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61  .  aStack[i].fla
a910: 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20  gs = STK_Int;.  
a920: 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20  if( pOp->p3 ){. 
a930: 20 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 70     zStack[i] = p
a940: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 53 74 61  Op->p3;.    aSta
a950: 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 7c 3d 20 53  ck[i].flags |= S
a960: 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 53 74 61  TK_Str | STK_Sta
a970: 74 69 63 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  tic;.    aStack[
a980: 69 5d 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4f  i].n = strlen(pO
a990: 70 2d 3e 70 33 29 2b 31 3b 0a 20 20 7d 0a 20 20  p->p3)+1;.  }.  
a9a0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a9b0: 6f 64 65 3a 20 53 74 72 69 6e 67 20 2a 20 2a 20  ode: String * * 
a9c0: 50 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72  P3.**.** The str
a9d0: 69 6e 67 20 76 61 6c 75 65 20 50 33 20 69 73 20  ing value P3 is 
a9e0: 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
a9f0: 73 74 61 63 6b 2e 20 20 49 66 20 50 33 3d 3d 30  stack.  If P3==0
aa00: 20 74 68 65 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20   then a.** NULL 
aa10: 69 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74  is pushed onto t
aa20: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73  he stack..*/.cas
aa30: 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 0a 20  e OP_String: {. 
aa40: 20 69 6e 74 20 69 20 3d 20 2b 2b 70 2d 3e 74 6f   int i = ++p->to
aa50: 73 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  s;.  char *z;.  
aa60: 56 45 52 49 46 59 28 20 69 66 28 20 4e 65 65 64  VERIFY( if( Need
aa70: 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 29  Stack(p, p->tos)
aa80: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   ) goto no_mem; 
aa90: 29 0a 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b  ).  z = pOp->p3;
aaa0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
aab0: 20 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30     zStack[i] = 0
aac0: 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e  ;.    aStack[i].
aad0: 6e 20 3d 20 30 3b 0a 20 20 20 20 61 53 74 61 63  n = 0;.    aStac
aae0: 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  k[i].flags = STK
aaf0: 5f 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _Null;.  }else{.
ab00: 20 20 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20      zStack[i] = 
ab10: 7a 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d  z;.    aStack[i]
ab20: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 20 2b  .n = strlen(z) +
ab30: 20 31 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69   1;.    aStack[i
ab40: 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74  ].flags = STK_St
ab50: 72 20 7c 20 53 54 4b 5f 53 74 61 74 69 63 3b 0a  r | STK_Static;.
ab60: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
ab70: 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 6f 70 20 50  /* Opcode: Pop P
ab80: 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 65  1 * *.**.** P1 e
ab90: 6c 65 6d 65 6e 74 73 20 61 72 65 20 70 6f 70 70  lements are popp
aba0: 65 64 20 6f 66 66 20 6f 66 20 74 68 65 20 74 6f  ed off of the to
abb0: 70 20 6f 66 20 73 74 61 63 6b 20 61 6e 64 20 64  p of stack and d
abc0: 69 73 63 61 72 64 65 64 2e 0a 2a 2f 0a 63 61 73  iscarded..*/.cas
abd0: 65 20 4f 50 5f 50 6f 70 3a 20 7b 0a 20 20 61 73  e OP_Pop: {.  as
abe0: 73 65 72 74 28 20 70 2d 3e 74 6f 73 2b 31 3e 3d  sert( p->tos+1>=
abf0: 70 4f 70 2d 3e 70 31 20 29 3b 0a 20 20 50 6f 70  pOp->p1 );.  Pop
ac00: 53 74 61 63 6b 28 70 2c 20 70 4f 70 2d 3e 70 31  Stack(p, pOp->p1
ac10: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
ac20: 2a 20 4f 70 63 6f 64 65 3a 20 44 75 70 20 50 31  * Opcode: Dup P1
ac30: 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 41 20 63 6f   P2 *.**.** A co
ac40: 70 79 20 6f 66 20 74 68 65 20 50 31 2d 74 68 20  py of the P1-th 
ac50: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
ac60: 74 61 63 6b 20 0a 2a 2a 20 69 73 20 6d 61 64 65  tack .** is made
ac70: 20 61 6e 64 20 70 75 73 68 65 64 20 6f 6e 74 6f   and pushed onto
ac80: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
ac90: 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 65 20 74 6f  stack..** The to
aca0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
acb0: 73 20 65 6c 65 6d 65 6e 74 20 30 2e 20 20 53 6f  s element 0.  So
acc0: 20 74 68 65 0a 2a 2a 20 69 6e 73 74 72 75 63 74   the.** instruct
acd0: 69 6f 6e 20 22 44 75 70 20 30 20 30 20 30 22 20  ion "Dup 0 0 0" 
ace0: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 63 6f 70 79  will make a copy
acf0: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 6f 70 20 6f   of the.** top o
ad00: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
ad10: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ** If the conten
ad20: 74 20 6f 66 20 74 68 65 20 50 31 2d 74 68 20 65  t of the P1-th e
ad30: 6c 65 6d 65 6e 74 20 69 73 20 61 20 64 79 6e 61  lement is a dyna
ad40: 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
ad50: 61 74 65 64 20 73 74 72 69 6e 67 2c 20 74 68 65  ated string, the
ad60: 6e 20 61 20 6e 65 77 20 63 6f 70 79 20 6f 66 20  n a new copy of 
ad70: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
ad80: 73 20 6d 61 64 65 20 69 66 20 50 32 3d 3d 30 2e  s made if P2==0.
ad90: 20 20 49 66 20 50 32 21 3d 30 2c 20 74 68 65 6e    If P2!=0, then
ada0: 20 6a 75 73 74 20 61 20 70 6f 69 6e 74 65 72 0a   just a pointer.
adb0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  ** to the string
adc0: 20 69 73 20 63 6f 70 69 65 64 2e 0a 2a 2a 0a 2a   is copied..**.*
add0: 2a 20 41 6c 73 6f 20 73 65 65 20 74 68 65 20 50  * Also see the P
ade0: 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ull instruction.
adf0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 75 70 3a  .*/.case OP_Dup:
ae00: 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e   {.  int i = p->
ae10: 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31 3b 0a 20  tos - pOp->p1;. 
ae20: 20 69 6e 74 20 6a 20 3d 20 2b 2b 70 2d 3e 74 6f   int j = ++p->to
ae30: 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  s;.  VERIFY( if(
ae40: 20 69 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f   i<0 ) goto not_
ae50: 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a  enough_stack; ).
ae60: 20 20 56 45 52 49 46 59 28 20 69 66 28 20 4e 65    VERIFY( if( Ne
ae70: 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f  edStack(p, p->to
ae80: 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  s) ) goto no_mem
ae90: 3b 20 29 0a 20 20 6d 65 6d 63 70 79 28 26 61 53  ; ).  memcpy(&aS
aea0: 74 61 63 6b 5b 6a 5d 2c 20 26 61 53 74 61 63 6b  tack[j], &aStack
aeb0: 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 61 53 74 61  [i], sizeof(aSta
aec0: 63 6b 5b 69 5d 29 2d 4e 42 46 53 29 3b 0a 20 20  ck[i])-NBFS);.  
aed0: 69 66 28 20 61 53 74 61 63 6b 5b 6a 5d 2e 66 6c  if( aStack[j].fl
aee0: 61 67 73 20 26 20 53 54 4b 5f 53 74 72 20 29 7b  ags & STK_Str ){
aef0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
af00: 20 7c 7c 20 28 61 53 74 61 63 6b 5b 6a 5d 2e 66   || (aStack[j].f
af10: 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 61 74 69  lags & STK_Stati
af20: 63 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  c)!=0 ){.      z
af30: 53 74 61 63 6b 5b 6a 5d 20 3d 20 7a 53 74 61 63  Stack[j] = zStac
af40: 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 61 53 74 61  k[i];.      aSta
af50: 63 6b 5b 6a 5d 2e 66 6c 61 67 73 20 26 3d 20 7e  ck[j].flags &= ~
af60: 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 7d 65 6c  STK_Dyn;.    }el
af70: 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d  se if( aStack[i]
af80: 2e 6e 3c 3d 4e 42 46 53 20 29 7b 0a 20 20 20 20  .n<=NBFS ){.    
af90: 20 20 6d 65 6d 63 70 79 28 61 53 74 61 63 6b 5b    memcpy(aStack[
afa0: 6a 5d 2e 7a 2c 20 7a 53 74 61 63 6b 5b 69 5d 2c  j].z, zStack[i],
afb0: 20 61 53 74 61 63 6b 5b 6a 5d 2e 6e 29 3b 0a 20   aStack[j].n);. 
afc0: 20 20 20 20 20 7a 53 74 61 63 6b 5b 6a 5d 20 3d       zStack[j] =
afd0: 20 61 53 74 61 63 6b 5b 6a 5d 2e 7a 3b 0a 20 20   aStack[j].z;.  
afe0: 20 20 20 20 61 53 74 61 63 6b 5b 6a 5d 2e 66 6c      aStack[j].fl
aff0: 61 67 73 20 26 3d 20 7e 28 53 54 4b 5f 53 74 61  ags &= ~(STK_Sta
b000: 74 69 63 7c 53 54 4b 5f 44 79 6e 29 3b 0a 20 20  tic|STK_Dyn);.  
b010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
b020: 53 74 61 63 6b 5b 6a 5d 20 3d 20 73 71 6c 69 74  Stack[j] = sqlit
b030: 65 4d 61 6c 6c 6f 63 28 20 61 53 74 61 63 6b 5b  eMalloc( aStack[
b040: 6a 5d 2e 6e 20 29 3b 0a 20 20 20 20 20 20 69 66  j].n );.      if
b050: 28 20 7a 53 74 61 63 6b 5b 6a 5d 3d 3d 30 20 29  ( zStack[j]==0 )
b060: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
b070: 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 74 61 63      memcpy(zStac
b080: 6b 5b 6a 5d 2c 20 7a 53 74 61 63 6b 5b 69 5d 2c  k[j], zStack[i],
b090: 20 61 53 74 61 63 6b 5b 6a 5d 2e 6e 29 3b 0a 20   aStack[j].n);. 
b0a0: 20 20 20 20 20 61 53 74 61 63 6b 5b 6a 5d 2e 66       aStack[j].f
b0b0: 6c 61 67 73 20 26 3d 20 7e 53 54 4b 5f 53 74 61  lags &= ~STK_Sta
b0c0: 74 69 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tic;.    }.  }. 
b0d0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b0e0: 63 6f 64 65 3a 20 50 75 6c 6c 20 50 31 20 2a 20  code: Pull P1 * 
b0f0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 2d 74  *.**.** The P1-t
b100: 68 20 65 6c 65 6d 65 6e 74 20 69 73 20 72 65 6d  h element is rem
b110: 6f 76 65 64 20 66 72 6f 6d 20 69 74 73 20 63 75  oved from its cu
b120: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 6f  rrent location o
b130: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  n .** the stack 
b140: 61 6e 64 20 70 75 73 68 65 64 20 62 61 63 6b 20  and pushed back 
b150: 6f 6e 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  on top of the st
b160: 61 63 6b 2e 20 20 54 68 65 0a 2a 2a 20 74 6f 70  ack.  The.** top
b170: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
b180: 20 65 6c 65 6d 65 6e 74 20 30 2c 20 73 6f 20 22   element 0, so "
b190: 50 75 6c 6c 20 30 20 30 20 30 22 20 69 73 0a 2a  Pull 0 0 0" is.*
b1a0: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 22 50 75 6c  * a no-op.  "Pul
b1b0: 6c 20 31 20 30 20 30 22 20 73 77 61 70 73 20 74  l 1 0 0" swaps t
b1c0: 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
b1d0: 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  nts of.** the st
b1e0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ack..**.** See a
b1f0: 6c 73 6f 20 74 68 65 20 44 75 70 20 69 6e 73 74  lso the Dup inst
b200: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
b210: 20 4f 50 5f 50 75 6c 6c 3a 20 7b 0a 20 20 69 6e   OP_Pull: {.  in
b220: 74 20 66 72 6f 6d 20 3d 20 70 2d 3e 74 6f 73 20  t from = p->tos 
b230: 2d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74  - pOp->p1;.  int
b240: 20 74 6f 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20   to = p->tos;.  
b250: 69 6e 74 20 69 3b 0a 20 20 53 74 61 63 6b 20 74  int i;.  Stack t
b260: 73 3b 0a 20 20 63 68 61 72 20 2a 74 7a 3b 0a 20  s;.  char *tz;. 
b270: 20 56 45 52 49 46 59 28 20 69 66 28 20 66 72 6f   VERIFY( if( fro
b280: 6d 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  m<0 ) goto not_e
b290: 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20  nough_stack; ). 
b2a0: 20 74 73 20 3d 20 61 53 74 61 63 6b 5b 66 72 6f   ts = aStack[fro
b2b0: 6d 5d 3b 0a 20 20 74 7a 20 3d 20 7a 53 74 61 63  m];.  tz = zStac
b2c0: 6b 5b 66 72 6f 6d 5d 3b 0a 20 20 66 6f 72 28 69  k[from];.  for(i
b2d0: 3d 66 72 6f 6d 3b 20 69 3c 74 6f 3b 20 69 2b 2b  =from; i<to; i++
b2e0: 29 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d  ){.    aStack[i]
b2f0: 20 3d 20 61 53 74 61 63 6b 5b 69 2b 31 5d 3b 0a   = aStack[i+1];.
b300: 20 20 20 20 69 66 28 20 61 53 74 61 63 6b 5b 69      if( aStack[i
b310: 5d 2e 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 44  ].flags & (STK_D
b320: 79 6e 7c 53 54 4b 5f 53 74 61 74 69 63 29 20 29  yn|STK_Static) )
b330: 7b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b 5b 69  {.      zStack[i
b340: 5d 20 3d 20 7a 53 74 61 63 6b 5b 69 2b 31 5d 3b  ] = zStack[i+1];
b350: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b360: 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 61 53    zStack[i] = aS
b370: 74 61 63 6b 5b 69 5d 2e 7a 3b 0a 20 20 20 20 7d  tack[i].z;.    }
b380: 0a 20 20 7d 0a 20 20 61 53 74 61 63 6b 5b 74 6f  .  }.  aStack[to
b390: 5d 20 3d 20 74 73 3b 0a 20 20 69 66 28 20 61 53  ] = ts;.  if( aS
b3a0: 74 61 63 6b 5b 74 6f 5d 2e 66 6c 61 67 73 20 26  tack[to].flags &
b3b0: 20 28 53 54 4b 5f 44 79 6e 7c 53 54 4b 5f 53 74   (STK_Dyn|STK_St
b3c0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 7a 53 74  atic) ){.    zSt
b3d0: 61 63 6b 5b 74 6f 5d 20 3d 20 74 7a 3b 0a 20 20  ack[to] = tz;.  
b3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 74 61 63  }else{.    zStac
b3f0: 6b 5b 74 6f 5d 20 3d 20 61 53 74 61 63 6b 5b 74  k[to] = aStack[t
b400: 6f 5d 2e 7a 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o].z;.  }.  brea
b410: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
b420: 20 50 75 73 68 20 50 31 20 2a 20 2a 0a 2a 2a 0a   Push P1 * *.**.
b430: 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 74 68 65  ** Overwrite the
b440: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
b450: 2d 74 68 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e  -th element down
b460: 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   on the.** stack
b470: 20 28 50 31 3d 3d 30 20 69 73 20 74 68 65 20 74   (P1==0 is the t
b480: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 29  op of the stack)
b490: 20 77 69 74 68 20 74 68 65 20 76 61 6c 75 65 0a   with the value.
b4a0: 2a 2a 20 6f 66 20 74 68 65 20 74 6f 70 20 6f 66  ** of the top of
b4b0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
b4c0: 20 70 6f 70 20 74 68 65 20 74 6f 70 20 6f 66 20   pop the top of 
b4d0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61  the stack..*/.ca
b4e0: 73 65 20 4f 50 5f 50 75 73 68 3a 20 7b 0a 20 20  se OP_Push: {.  
b4f0: 69 6e 74 20 66 72 6f 6d 20 3d 20 70 2d 3e 74 6f  int from = p->to
b500: 73 3b 0a 20 20 69 6e 74 20 74 6f 20 3d 20 70 2d  s;.  int to = p-
b510: 3e 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31 3b 0a  >tos - pOp->p1;.
b520: 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 74  .  VERIFY( if( t
b530: 6f 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  o<0 ) goto not_e
b540: 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20  nough_stack; ). 
b550: 20 69 66 28 20 61 53 74 61 63 6b 5b 74 6f 5d 2e   if( aStack[to].
b560: 66 6c 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20  flags & STK_Dyn 
b570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
b580: 65 28 7a 53 74 61 63 6b 5b 74 6f 5d 29 3b 0a 20  e(zStack[to]);. 
b590: 20 7d 0a 20 20 61 53 74 61 63 6b 5b 74 6f 5d 20   }.  aStack[to] 
b5a0: 3d 20 61 53 74 61 63 6b 5b 66 72 6f 6d 5d 3b 0a  = aStack[from];.
b5b0: 20 20 69 66 28 20 61 53 74 61 63 6b 5b 74 6f 5d    if( aStack[to]
b5c0: 2e 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 44 79  .flags & (STK_Dy
b5d0: 6e 7c 53 54 4b 5f 53 74 61 74 69 63 29 20 29 7b  n|STK_Static) ){
b5e0: 0a 20 20 20 20 7a 53 74 61 63 6b 5b 74 6f 5d 20  .    zStack[to] 
b5f0: 3d 20 7a 53 74 61 63 6b 5b 66 72 6f 6d 5d 3b 0a  = zStack[from];.
b600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 74    }else{.    zSt
b610: 61 63 6b 5b 74 6f 5d 20 3d 20 61 53 74 61 63 6b  ack[to] = aStack
b620: 5b 74 6f 5d 2e 7a 3b 0a 20 20 7d 0a 20 20 61 53  [to].z;.  }.  aS
b630: 74 61 63 6b 5b 66 72 6f 6d 5d 2e 66 6c 61 67 73  tack[from].flags
b640: 20 26 3d 20 7e 53 54 4b 5f 44 79 6e 3b 0a 20 20   &= ~STK_Dyn;.  
b650: 70 2d 3e 74 6f 73 2d 2d 3b 0a 20 20 62 72 65 61  p->tos--;.  brea
b660: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
b670: 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74 20 50 31 20   ColumnCount P1 
b680: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  * *.**.** Specif
b690: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
b6a0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74 68  column values th
b6b0: 61 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69  at will appear i
b6c0: 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 70  n the.** array p
b6d0: 61 73 73 65 64 20 61 73 20 74 68 65 20 34 74 68  assed as the 4th
b6e0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
b6f0: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 4e 6f 20  e callback.  No 
b700: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 69 73 20 64  checking.** is d
b710: 6f 6e 65 2e 20 20 49 66 20 74 68 69 73 20 76 61  one.  If this va
b720: 6c 75 65 20 69 73 20 77 72 6f 6e 67 2c 20 61 20  lue is wrong, a 
b730: 63 6f 72 65 64 75 6d 70 20 63 61 6e 20 72 65 73  coredump can res
b740: 75 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ult..*/.case OP_
b750: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 3a 20 7b 0a 20  ColumnCount: {. 
b760: 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 73 71 6c   char **az = sql
b770: 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a  iteRealloc(p->az
b780: 43 6f 6c 4e 61 6d 65 2c 20 28 70 4f 70 2d 3e 70  ColName, (pOp->p
b790: 31 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  1+1)*sizeof(char
b7a0: 2a 29 29 3b 0a 20 20 69 66 28 20 61 7a 3d 3d 30  *));.  if( az==0
b7b0: 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b   ){ goto no_mem;
b7c0: 20 7d 0a 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d   }.  p->azColNam
b7d0: 65 20 3d 20 61 7a 3b 0a 20 20 70 2d 3e 61 7a 43  e = az;.  p->azC
b7e0: 6f 6c 4e 61 6d 65 5b 70 4f 70 2d 3e 70 31 5d 20  olName[pOp->p1] 
b7f0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 61 6c 6c 62  = 0;.  p->nCallb
b800: 61 63 6b 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  ack = 0;.  break
b810: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
b820: 43 6f 6c 75 6d 6e 4e 61 6d 65 20 50 31 20 2a 20  ColumnName P1 * 
b830: 50 33 0a 2a 2a 0a 2a 2a 20 50 33 20 62 65 63 6f  P3.**.** P3 beco
b840: 6d 65 73 20 74 68 65 20 50 31 2d 74 68 20 63 6f  mes the P1-th co
b850: 6c 75 6d 6e 20 6e 61 6d 65 20 28 66 69 72 73 74  lumn name (first
b860: 20 69 73 20 30 29 2e 20 20 41 6e 20 61 72 72 61   is 0).  An arra
b870: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  y of pointers.**
b880: 20 74 6f 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e   to all column n
b890: 61 6d 65 73 20 69 73 20 70 61 73 73 65 64 20 61  ames is passed a
b8a0: 73 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65  s the 4th parame
b8b0: 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ter to the callb
b8c0: 61 63 6b 2e 0a 2a 2a 20 54 68 65 20 43 6f 6c 75  ack..** The Colu
b8d0: 6d 6e 43 6f 75 6e 74 20 6f 70 63 6f 64 65 20 6d  mnCount opcode m
b8e0: 75 73 74 20 62 65 20 65 78 65 63 75 74 65 64 20  ust be executed 
b8f0: 66 69 72 73 74 20 74 6f 20 61 6c 6c 6f 63 61 74  first to allocat
b900: 65 20 73 70 61 63 65 20 74 6f 0a 2a 2a 20 68 6f  e space to.** ho
b910: 6c 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ld the column na
b920: 6d 65 73 2e 20 20 46 61 69 6c 75 72 65 20 74 6f  mes.  Failure to
b930: 20 64 6f 20 74 68 69 73 20 77 69 6c 6c 20 6c 69   do this will li
b940: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 0a 2a  kely result in.*
b950: 2a 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  * a coredump..*/
b960: 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  .case OP_ColumnN
b970: 61 6d 65 3a 20 7b 0a 20 20 70 2d 3e 61 7a 43 6f  ame: {.  p->azCo
b980: 6c 4e 61 6d 65 5b 70 4f 70 2d 3e 70 31 5d 20 3d  lName[pOp->p1] =
b990: 20 70 4f 70 2d 3e 70 33 20 3f 20 70 4f 70 2d 3e   pOp->p3 ? pOp->
b9a0: 70 33 20 3a 20 22 22 3b 0a 20 20 70 2d 3e 6e 43  p3 : "";.  p->nC
b9b0: 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 62  allback = 0;.  b
b9c0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
b9d0: 64 65 3a 20 43 61 6c 6c 62 61 63 6b 20 50 31 20  de: Callback P1 
b9e0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 50 31  * *.**.** Pop P1
b9f0: 20 76 61 6c 75 65 73 20 6f 66 66 20 74 68 65 20   values off the 
ba00: 73 74 61 63 6b 20 61 6e 64 20 66 6f 72 6d 20 74  stack and form t
ba10: 68 65 6d 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  hem into an arra
ba20: 79 2e 20 20 54 68 65 6e 0a 2a 2a 20 69 6e 76 6f  y.  Then.** invo
ba30: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
ba40: 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74  function using t
ba50: 68 65 20 6e 65 77 6c 79 20 66 6f 72 6d 65 64 20  he newly formed 
ba60: 61 72 72 61 79 20 61 73 20 74 68 65 0a 2a 2a 20  array as the.** 
ba70: 33 72 64 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  3rd parameter..*
ba80: 2f 0a 63 61 73 65 20 4f 50 5f 43 61 6c 6c 62 61  /.case OP_Callba
ba90: 63 6b 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ck: {.  int i = 
baa0: 70 2d 3e 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31  p->tos - pOp->p1
bab0: 20 2b 20 31 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   + 1;.  int j;. 
bac0: 20 56 45 52 49 46 59 28 20 69 66 28 20 69 3c 30   VERIFY( if( i<0
bad0: 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
bae0: 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 56 45  gh_stack; ).  VE
baf0: 52 49 46 59 28 20 69 66 28 20 4e 65 65 64 53 74  RIFY( if( NeedSt
bb00: 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 32 29  ack(p, p->tos+2)
bb10: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   ) goto no_mem; 
bb20: 29 0a 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 3d  ).  for(j=i; j<=
bb30: 70 2d 3e 74 6f 73 3b 20 6a 2b 2b 29 7b 0a 20 20  p->tos; j++){.  
bb40: 20 20 69 66 28 20 61 53 74 61 63 6b 5b 6a 5d 2e    if( aStack[j].
bb50: 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c  flags & STK_Null
bb60: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b   ){.      zStack
bb70: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [j] = 0;.    }el
bb80: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 53 74  se{.      if( St
bb90: 72 69 6e 67 69 66 79 28 70 2c 20 6a 29 20 29 20  ringify(p, j) ) 
bba0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
bbb0: 20 7d 0a 20 20 7d 0a 20 20 7a 53 74 61 63 6b 5b   }.  }.  zStack[
bbc0: 70 2d 3e 74 6f 73 2b 31 5d 20 3d 20 30 3b 0a 20  p->tos+1] = 0;. 
bbd0: 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 21 3d   if( xCallback!=
bbe0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
bbf0: 69 74 65 53 61 66 65 74 79 4f 66 66 28 64 62 29  iteSafetyOff(db)
bc00: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
bc10: 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 20 0a 20 20  e_to_misuse; .  
bc20: 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28    if( xCallback(
bc30: 70 41 72 67 2c 20 70 4f 70 2d 3e 70 31 2c 20 26  pArg, pOp->p1, &
bc40: 7a 53 74 61 63 6b 5b 69 5d 2c 20 70 2d 3e 61 7a  zStack[i], p->az
bc50: 43 6f 6c 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ColName)!=0 ){. 
bc60: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bc70: 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20  _ABORT;.    }.  
bc80: 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65    if( sqliteSafe
bc90: 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20  tyOn(db) ) goto 
bca0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
bcb0: 75 73 65 3b 0a 20 20 20 20 70 2d 3e 6e 43 61 6c  use;.    p->nCal
bcc0: 6c 62 61 63 6b 2b 2b 3b 0a 20 20 7d 0a 20 20 50  lback++;.  }.  P
bcd0: 6f 70 53 74 61 63 6b 28 70 2c 20 70 4f 70 2d 3e  opStack(p, pOp->
bce0: 70 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  p1);.  if( sqlit
bcf0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
bd00: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
bd10: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
bd20: 63 6f 64 65 3a 20 4e 75 6c 6c 43 61 6c 6c 62 61  code: NullCallba
bd30: 63 6b 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  ck P1 * *.**.** 
bd40: 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
bd50: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 63  ack function onc
bd60: 65 20 77 69 74 68 20 74 68 65 20 32 6e 64 20 61  e with the 2nd a
bd70: 72 67 75 6d 65 6e 74 20 28 74 68 65 0a 2a 2a 20  rgument (the.** 
bd80: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
bd90: 73 29 20 65 71 75 61 6c 20 74 6f 20 50 31 20 61  s) equal to P1 a
bda0: 6e 64 20 77 69 74 68 20 74 68 65 20 34 74 68 20  nd with the 4th 
bdb0: 61 72 67 75 6d 65 6e 74 20 28 74 68 65 0a 2a 2a  argument (the.**
bdc0: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
bdd0: 6c 75 6d 6e 73 29 20 73 65 74 20 61 63 63 6f 72  lumns) set accor
bde0: 64 69 6e 67 20 74 6f 20 70 72 69 6f 72 20 4f 50  ding to prior OP
bdf0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 20 61 6e 64 0a  _ColumnName and.
be00: 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  ** OP_ColumnCoun
be10: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  t instructions. 
be20: 20 54 68 69 73 20 69 73 20 61 6c 6c 20 6c 69 6b   This is all lik
be30: 65 20 74 68 65 20 72 65 67 75 6c 61 72 0a 2a 2a  e the regular.**
be40: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 20 6f 72 20   OP_Callback or 
be50: 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 20  OP_SortCallback 
be60: 6f 70 63 6f 64 65 73 2e 20 20 42 75 74 20 74 68  opcodes.  But th
be70: 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  e 3rd argument.*
be80: 2a 20 77 68 69 63 68 20 6e 6f 72 6d 61 6c 6c 79  * which normally
be90: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
bea0: 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
beb0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  of pointers to.*
bec0: 2a 20 64 61 74 61 20 69 73 20 4e 55 4c 4c 2e 0a  * data is NULL..
bed0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
bee0: 63 6b 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ck is only invok
bef0: 65 64 20 69 66 20 74 68 65 72 65 20 68 61 76 65  ed if there have
bf00: 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 20 63   been no prior c
bf10: 61 6c 6c 73 0a 2a 2a 20 74 6f 20 4f 50 5f 43 61  alls.** to OP_Ca
bf20: 6c 6c 62 61 63 6b 20 6f 72 20 4f 50 5f 53 6f 72  llback or OP_Sor
bf30: 74 43 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  tCallback..**.**
bf40: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
bf50: 75 73 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  used to report t
bf60: 68 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 6e 61  he number and na
bf70: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
bf80: 2a 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  * in cases where
bf90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
bfa0: 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73  is empty..*/.cas
bfb0: 65 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  e OP_NullCallbac
bfc0: 6b 3a 20 7b 0a 20 20 69 66 28 20 78 43 61 6c 6c  k: {.  if( xCall
bfd0: 62 61 63 6b 21 3d 30 20 26 26 20 70 2d 3e 6e 43  back!=0 && p->nC
bfe0: 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
bff0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65    if( sqliteSafe
c000: 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f  tyOff(db) ) goto
c010: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69   abort_due_to_mi
c020: 73 75 73 65 3b 20 0a 20 20 20 20 69 66 28 20 78  suse; .    if( x
c030: 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 70  Callback(pArg, p
c040: 4f 70 2d 3e 70 31 2c 20 30 2c 20 70 2d 3e 61 7a  Op->p1, 0, p->az
c050: 43 6f 6c 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ColName)!=0 ){. 
c060: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c070: 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20  _ABORT;.    }.  
c080: 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65    if( sqliteSafe
c090: 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20  tyOn(db) ) goto 
c0a0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
c0b0: 75 73 65 3b 0a 20 20 20 20 70 2d 3e 6e 43 61 6c  use;.    p->nCal
c0c0: 6c 62 61 63 6b 2b 2b 3b 0a 20 20 7d 0a 20 20 69  lback++;.  }.  i
c0d0: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
c0e0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e  _failed ) goto n
c0f0: 6f 5f 6d 65 6d 3b 0a 20 20 62 72 65 61 6b 3b 0a  o_mem;.  break;.
c100: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
c110: 6e 63 61 74 20 50 31 20 50 32 20 50 33 0a 2a 2a  ncat P1 P2 P3.**
c120: 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20  .** Look at the 
c130: 66 69 72 73 74 20 50 31 20 65 6c 65 6d 65 6e 74  first P1 element
c140: 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  s of the stack. 
c150: 20 41 70 70 65 6e 64 20 74 68 65 6d 20 61 6c 6c   Append them all
c160: 20 0a 2a 2a 20 74 6f 67 65 74 68 65 72 20 77 69   .** together wi
c170: 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 65 6c  th the lowest el
c180: 65 6d 65 6e 74 20 66 69 72 73 74 2e 20 20 55 73  ement first.  Us
c190: 65 20 50 33 20 61 73 20 61 20 73 65 70 61 72 61  e P3 as a separa
c1a0: 74 6f 72 2e 20 20 0a 2a 2a 20 50 75 74 20 74 68  tor.  .** Put th
c1b0: 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20  e result on the 
c1c0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
c1d0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
c1e0: 50 31 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 61  P1 elements.** a
c1f0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
c200: 68 65 20 73 74 61 63 6b 20 69 66 20 50 32 3d 3d  he stack if P2==
c210: 30 20 61 6e 64 20 72 65 74 61 69 6e 65 64 20 69  0 and retained i
c220: 66 20 50 32 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 49  f P2==1..**.** I
c230: 66 20 50 33 20 69 73 20 4e 55 4c 4c 2c 20 74 68  f P3 is NULL, th
c240: 65 6e 20 75 73 65 20 6e 6f 20 73 65 70 61 72 61  en use no separa
c250: 74 6f 72 2e 20 20 57 68 65 6e 20 50 31 3d 3d 31  tor.  When P1==1
c260: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
c270: 2a 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f  * makes a copy o
c280: 66 20 74 68 65 20 74 6f 70 20 73 74 61 63 6b 20  f the top stack 
c290: 65 6c 65 6d 65 6e 74 20 69 6e 74 6f 20 6d 65 6d  element into mem
c2a0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
c2b0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
c2c0: 63 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  c()..*/.case OP_
c2d0: 43 6f 6e 63 61 74 3a 20 7b 0a 20 20 63 68 61 72  Concat: {.  char
c2e0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 42   *zNew;.  int nB
c2f0: 79 74 65 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  yte;.  int nFiel
c300: 64 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  d;.  int i, j;. 
c310: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69   char *zSep;.  i
c320: 6e 74 20 6e 53 65 70 3b 0a 0a 20 20 6e 46 69 65  nt nSep;..  nFie
c330: 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  ld = pOp->p1;.  
c340: 7a 53 65 70 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  zSep = pOp->p3;.
c350: 20 20 69 66 28 20 7a 53 65 70 3d 3d 30 20 29 20    if( zSep==0 ) 
c360: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 6e 53 65  zSep = "";.  nSe
c370: 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70 29  p = strlen(zSep)
c380: 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ;.  VERIFY( if( 
c390: 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69 65 6c 64 20  p->tos+1<nField 
c3a0: 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
c3b0: 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 6e 42 79  h_stack; ).  nBy
c3c0: 74 65 20 3d 20 31 20 2d 20 6e 53 65 70 3b 0a 20  te = 1 - nSep;. 
c3d0: 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46   for(i=p->tos-nF
c3e0: 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f  ield+1; i<=p->to
c3f0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
c400: 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73   aStack[i].flags
c410: 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20   & STK_Null ){. 
c420: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 53       nByte += nS
c430: 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ep;.    }else{. 
c440: 20 20 20 20 20 69 66 28 20 53 74 72 69 6e 67 69       if( Stringi
c450: 66 79 28 70 2c 20 69 29 20 29 20 67 6f 74 6f 20  fy(p, i) ) goto 
c460: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 6e 42  no_mem;.      nB
c470: 79 74 65 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d  yte += aStack[i]
c480: 2e 6e 20 2d 20 31 20 2b 20 6e 53 65 70 3b 0a 20  .n - 1 + nSep;. 
c490: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4e 65 77 20     }.  }.  zNew 
c4a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c4b0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
c4c0: 4e 65 77 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  New==0 ) goto no
c4d0: 5f 6d 65 6d 3b 0a 20 20 6a 20 3d 20 30 3b 0a 20  _mem;.  j = 0;. 
c4e0: 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46   for(i=p->tos-nF
c4f0: 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f  ield+1; i<=p->to
c500: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
c510: 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67   (aStack[i].flag
c520: 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30  s & STK_Null)==0
c530: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
c540: 28 26 7a 4e 65 77 5b 6a 5d 2c 20 7a 53 74 61 63  (&zNew[j], zStac
c550: 6b 5b 69 5d 2c 20 61 53 74 61 63 6b 5b 69 5d 2e  k[i], aStack[i].
c560: 6e 2d 31 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d  n-1);.      j +=
c570: 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d 31 3b 0a   aStack[i].n-1;.
c580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
c590: 65 70 3e 30 20 26 26 20 69 3c 70 2d 3e 74 6f 73  ep>0 && i<p->tos
c5a0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
c5b0: 28 26 7a 4e 65 77 5b 6a 5d 2c 20 7a 53 65 70 2c  (&zNew[j], zSep,
c5c0: 20 6e 53 65 70 29 3b 0a 20 20 20 20 20 20 6a 20   nSep);.      j 
c5d0: 2b 3d 20 6e 53 65 70 3b 0a 20 20 20 20 7d 0a 20  += nSep;.    }. 
c5e0: 20 7d 0a 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 30   }.  zNew[j] = 0
c5f0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  ;.  if( pOp->p2=
c600: 3d 30 20 29 20 50 6f 70 53 74 61 63 6b 28 70 2c  =0 ) PopStack(p,
c610: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 56 45 52 49   nField);.  VERI
c620: 46 59 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c  FY( NeedStack(p,
c630: 20 70 2d 3e 74 6f 73 2b 31 29 3b 20 29 0a 20 20   p->tos+1); ).  
c640: 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 61 53 74 61  p->tos++;.  aSta
c650: 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e  ck[p->tos].n = n
c660: 42 79 74 65 3b 0a 20 20 61 53 74 61 63 6b 5b 70  Byte;.  aStack[p
c670: 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  ->tos].flags = S
c680: 54 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e 3b 0a  TK_Str|STK_Dyn;.
c690: 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    zStack[p->tos]
c6a0: 20 3d 20 7a 4e 65 77 3b 0a 20 20 62 72 65 61 6b   = zNew;.  break
c6b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c6c0: 41 64 64 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  Add * * *.**.** 
c6d0: 50 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20  Pop the top two 
c6e0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
c6f0: 65 20 73 74 61 63 6b 2c 20 61 64 64 20 74 68 65  e stack, add the
c700: 6d 20 74 6f 67 65 74 68 65 72 2c 0a 2a 2a 20 61  m together,.** a
c710: 6e 64 20 70 75 73 68 20 74 68 65 20 72 65 73 75  nd push the resu
c720: 6c 74 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65  lt back onto the
c730: 20 73 74 61 63 6b 2e 20 20 49 66 20 65 69 74 68   stack.  If eith
c740: 65 72 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 73  er element.** is
c750: 20 61 20 73 74 72 69 6e 67 20 74 68 65 6e 20 69   a string then i
c760: 74 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  t is converted t
c770: 6f 20 61 20 64 6f 75 62 6c 65 20 75 73 69 6e 67  o a double using
c780: 20 74 68 65 20 61 74 6f 66 28 29 0a 2a 2a 20 66   the atof().** f
c790: 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74  unction before t
c7a0: 68 65 20 61 64 64 69 74 69 6f 6e 2e 0a 2a 2a 20  he addition..** 
c7b0: 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
c7c0: 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d is NULL, the r
c7d0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
c7e0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c  /./* Opcode: Mul
c7f0: 74 69 70 6c 79 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  tiply * * *.**.*
c800: 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74 77  * Pop the top tw
c810: 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  o elements from 
c820: 74 68 65 20 73 74 61 63 6b 2c 20 6d 75 6c 74 69  the stack, multi
c830: 70 6c 79 20 74 68 65 6d 20 74 6f 67 65 74 68 65  ply them togethe
c840: 72 2c 0a 2a 2a 20 61 6e 64 20 70 75 73 68 20 74  r,.** and push t
c850: 68 65 20 72 65 73 75 6c 74 20 62 61 63 6b 20 6f  he result back o
c860: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
c870: 49 66 20 65 69 74 68 65 72 20 65 6c 65 6d 65 6e  If either elemen
c880: 74 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  t.** is a string
c890: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 76   then it is conv
c8a0: 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62 6c  erted to a doubl
c8b0: 65 20 75 73 69 6e 67 20 74 68 65 20 61 74 6f 66  e using the atof
c8c0: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 62  ().** function b
c8d0: 65 66 6f 72 65 20 74 68 65 20 6d 75 6c 74 69 70  efore the multip
c8e0: 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  lication..** If 
c8f0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
c900: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
c910: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
c920: 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62 74 72 61  * Opcode: Subtra
c930: 63 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  ct * * *.**.** P
c940: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
c950: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
c960: 20 73 74 61 63 6b 2c 20 73 75 62 74 72 61 63 74   stack, subtract
c970: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 28 77   the.** first (w
c980: 68 61 74 20 77 61 73 20 6f 6e 20 74 6f 70 20 6f  hat was on top o
c990: 66 20 74 68 65 20 73 74 61 63 6b 29 20 66 72 6f  f the stack) fro
c9a0: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 28 74 68  m the second (th
c9b0: 65 0a 2a 2a 20 6e 65 78 74 20 6f 6e 20 73 74 61  e.** next on sta
c9c0: 63 6b 29 0a 2a 2a 20 61 6e 64 20 70 75 73 68 20  ck).** and push 
c9d0: 74 68 65 20 72 65 73 75 6c 74 20 62 61 63 6b 20  the result back 
c9e0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20  onto the stack. 
c9f0: 20 49 66 20 65 69 74 68 65 72 20 65 6c 65 6d 65   If either eleme
ca00: 6e 74 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  nt.** is a strin
ca10: 67 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e  g then it is con
ca20: 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62  verted to a doub
ca30: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 61 74 6f  le using the ato
ca40: 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  f().** function 
ca50: 62 65 66 6f 72 65 20 74 68 65 20 73 75 62 74 72  before the subtr
ca60: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 65 69  action..** If ei
ca70: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
ca80: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
ca90: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
caa0: 4f 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20 2a  Opcode: Divide *
cab0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74   * *.**.** Pop t
cac0: 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
cad0: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
cae0: 63 6b 2c 20 64 69 76 69 64 65 20 74 68 65 0a 2a  ck, divide the.*
caf0: 2a 20 66 69 72 73 74 20 28 77 68 61 74 20 77 61  * first (what wa
cb00: 73 20 6f 6e 20 74 6f 70 20 6f 66 20 74 68 65 20  s on top of the 
cb10: 73 74 61 63 6b 29 20 66 72 6f 6d 20 74 68 65 20  stack) from the 
cb20: 73 65 63 6f 6e 64 20 28 74 68 65 0a 2a 2a 20 6e  second (the.** n
cb30: 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 0a 2a 2a  ext on stack).**
cb40: 20 61 6e 64 20 70 75 73 68 20 74 68 65 20 72 65   and push the re
cb50: 73 75 6c 74 20 62 61 63 6b 20 6f 6e 74 6f 20 74  sult back onto t
cb60: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 65 69  he stack.  If ei
cb70: 74 68 65 72 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  ther element.** 
cb80: 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 65 6e  is a string then
cb90: 20 69 74 20 69 73 20 63 6f 6e 76 65 72 74 65 64   it is converted
cba0: 20 74 6f 20 61 20 64 6f 75 62 6c 65 20 75 73 69   to a double usi
cbb0: 6e 67 20 74 68 65 20 61 74 6f 66 28 29 0a 2a 2a  ng the atof().**
cbc0: 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65   function before
cbd0: 20 74 68 65 20 64 69 76 69 73 69 6f 6e 2e 20 20   the division.  
cbe0: 44 69 76 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f  Division by zero
cbf0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
cc00: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72  * If either oper
cc10: 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  and is NULL, the
cc20: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
cc30: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .*/./* Opcode: R
cc40: 65 6d 61 69 6e 64 65 72 20 2a 20 2a 20 2a 0a 2a  emainder * * *.*
cc50: 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70  *.** Pop the top
cc60: 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72   two elements fr
cc70: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2c 20 64 69  om the stack, di
cc80: 76 69 64 65 20 74 68 65 0a 2a 2a 20 66 69 72 73  vide the.** firs
cc90: 74 20 28 77 68 61 74 20 77 61 73 20 6f 6e 20 74  t (what was on t
cca0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 29  op of the stack)
ccb0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
ccc0: 20 28 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 6e   (the.** next on
ccd0: 20 73 74 61 63 6b 29 0a 2a 2a 20 61 6e 64 20 70   stack).** and p
cce0: 75 73 68 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ush the remainde
ccf0: 72 20 61 66 74 65 72 20 64 69 76 69 73 69 6f 6e  r after division
cd00: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
cd10: 20 20 49 66 20 65 69 74 68 65 72 20 65 6c 65 6d    If either elem
cd20: 65 6e 74 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ent.** is a stri
cd30: 6e 67 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ng then it is co
cd40: 6e 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75  nverted to a dou
cd50: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 61 74  ble using the at
cd60: 6f 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  of().** function
cd70: 20 62 65 66 6f 72 65 20 74 68 65 20 64 69 76 69   before the divi
cd80: 73 69 6f 6e 2e 20 20 44 69 76 69 73 69 6f 6e 20  sion.  Division 
cd90: 62 79 20 7a 65 72 6f 20 72 65 74 75 72 6e 73 20  by zero returns 
cda0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68  NULL..** If eith
cdb0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
cdc0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
cdd0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
cde0: 4f 50 5f 41 64 64 3a 0a 63 61 73 65 20 4f 50 5f  OP_Add:.case OP_
cdf0: 53 75 62 74 72 61 63 74 3a 0a 63 61 73 65 20 4f  Subtract:.case O
ce00: 50 5f 4d 75 6c 74 69 70 6c 79 3a 0a 63 61 73 65  P_Multiply:.case
ce10: 20 4f 50 5f 44 69 76 69 64 65 3a 0a 63 61 73 65   OP_Divide:.case
ce20: 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b   OP_Remainder: {
ce30: 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e  .  int tos = p->
ce40: 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20 3d  tos;.  int nos =
ce50: 20 74 6f 73 20 2d 20 31 3b 0a 20 20 56 45 52 49   tos - 1;.  VERI
ce60: 46 59 28 20 69 66 28 20 6e 6f 73 3c 30 20 29 20  FY( if( nos<0 ) 
ce70: 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
ce80: 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 28  stack; ).  if( (
ce90: 28 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  (aStack[tos].fla
cea0: 67 73 20 7c 20 61 53 74 61 63 6b 5b 6e 6f 73 5d  gs | aStack[nos]
ceb0: 2e 66 6c 61 67 73 29 20 26 20 53 54 4b 5f 4e 75  .flags) & STK_Nu
cec0: 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 50 4f  ll)!=0 ){.    PO
ced0: 50 53 54 41 43 4b 3b 0a 20 20 20 20 52 65 6c 65  PSTACK;.    Rele
cee0: 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20  ase(p, nos);.   
cef0: 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61   aStack[nos].fla
cf00: 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20  gs = STK_Null;. 
cf10: 20 7d 65 6c 73 65 20 69 66 28 20 28 61 53 74 61   }else if( (aSta
cf20: 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
cf30: 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67  aStack[nos].flag
cf40: 73 20 26 20 53 54 4b 5f 49 6e 74 29 3d 3d 53 54  s & STK_Int)==ST
cf50: 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  K_Int ){.    int
cf60: 20 61 2c 20 62 3b 0a 20 20 20 20 61 20 3d 20 61   a, b;.    a = a
cf70: 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20  Stack[tos].i;.  
cf80: 20 20 62 20 3d 20 61 53 74 61 63 6b 5b 6e 6f 73    b = aStack[nos
cf90: 5d 2e 69 3b 0a 20 20 20 20 73 77 69 74 63 68 28  ].i;.    switch(
cfa0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
cfb0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64        case OP_Ad
cfc0: 64 3a 20 20 20 20 20 20 20 20 20 62 20 2b 3d 20  d:         b += 
cfd0: 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  a;       break;.
cfe0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75        case OP_Su
cff0: 62 74 72 61 63 74 3a 20 20 20 20 62 20 2d 3d 20  btract:    b -= 
d000: 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  a;       break;.
d010: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
d020: 6c 74 69 70 6c 79 3a 20 20 20 20 62 20 2a 3d 20  ltiply:    b *= 
d030: 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  a;       break;.
d040: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69        case OP_Di
d050: 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  vide: {.        
d060: 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
d070: 64 69 76 69 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a  divide_by_zero;.
d080: 20 20 20 20 20 20 20 20 62 20 2f 3d 20 61 3b 0a          b /= a;.
d090: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
d0b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
d0c0: 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
d0d0: 64 69 76 69 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a  divide_by_zero;.
d0e0: 20 20 20 20 20 20 20 20 62 20 25 3d 20 61 3b 0a          b %= a;.
d0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d110: 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 20 20 52   POPSTACK;.    R
d120: 65 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a  elease(p, nos);.
d130: 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e      aStack[nos].
d140: 69 20 3d 20 62 3b 0a 20 20 20 20 61 53 74 61 63  i = b;.    aStac
d150: 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[nos].flags = S
d160: 54 4b 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b  TK_Int;.  }else{
d170: 0a 20 20 20 20 64 6f 75 62 6c 65 20 61 2c 20 62  .    double a, b
d180: 3b 0a 20 20 20 20 52 65 61 6c 69 66 79 28 70 2c  ;.    Realify(p,
d190: 20 74 6f 73 29 3b 0a 20 20 20 20 52 65 61 6c 69   tos);.    Reali
d1a0: 66 79 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20  fy(p, nos);.    
d1b0: 61 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  a = aStack[tos].
d1c0: 72 3b 0a 20 20 20 20 62 20 3d 20 61 53 74 61 63  r;.    b = aStac
d1d0: 6b 5b 6e 6f 73 5d 2e 72 3b 0a 20 20 20 20 73 77  k[nos].r;.    sw
d1e0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
d1f0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
d200: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
d210: 62 20 2b 3d 20 61 3b 20 20 20 20 20 20 20 62 72  b += a;       br
d220: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d230: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
d240: 62 20 2d 3d 20 61 3b 20 20 20 20 20 20 20 62 72  b -= a;       br
d250: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d260: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
d270: 62 20 2a 3d 20 61 3b 20 20 20 20 20 20 20 62 72  b *= a;       br
d280: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d290: 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20  OP_Divide: {.   
d2a0: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 2e 30 20       if( a==0.0 
d2b0: 29 20 67 6f 74 6f 20 64 69 76 69 64 65 5f 62 79  ) goto divide_by
d2c0: 5f 7a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 62  _zero;.        b
d2d0: 20 2f 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62   /= a;.        b
d2e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d2f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
d300: 20 20 20 20 20 20 20 69 6e 74 20 69 61 20 3d 20         int ia = 
d310: 28 69 6e 74 29 61 3b 0a 20 20 20 20 20 20 20 20  (int)a;.        
d320: 69 6e 74 20 69 62 20 3d 20 28 69 6e 74 29 62 3b  int ib = (int)b;
d330: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 61 3d  .        if( ia=
d340: 3d 30 2e 30 20 29 20 67 6f 74 6f 20 64 69 76 69  =0.0 ) goto divi
d350: 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a 20 20 20 20  de_by_zero;.    
d360: 20 20 20 20 62 20 3d 20 69 62 20 25 20 69 61 3b      b = ib % ia;
d370: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d390: 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 20 20    POPSTACK;.    
d3a0: 52 65 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b  Release(p, nos);
d3b0: 0a 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d  .    aStack[nos]
d3c0: 2e 72 20 3d 20 62 3b 0a 20 20 20 20 61 53 74 61  .r = b;.    aSta
d3d0: 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[nos].flags = 
d3e0: 53 54 4b 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  STK_Real;.  }.  
d3f0: 62 72 65 61 6b 3b 0a 0a 64 69 76 69 64 65 5f 62  break;..divide_b
d400: 79 5f 7a 65 72 6f 3a 0a 20 20 50 6f 70 53 74 61  y_zero:.  PopSta
d410: 63 6b 28 70 2c 20 32 29 3b 0a 20 20 70 2d 3e 74  ck(p, 2);.  p->t
d420: 6f 73 20 3d 20 6e 6f 73 3b 0a 20 20 61 53 74 61  os = nos;.  aSta
d430: 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[nos].flags = 
d440: 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61  STK_Null;.  brea
d450: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
d460: 20 46 75 6e 63 74 69 6f 6e 20 50 31 20 2a 20 50   Function P1 * P
d470: 33 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61  3.**.** Invoke a
d480: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28   user function (
d490: 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P3 is a pointer 
d4a0: 74 6f 20 61 20 46 75 6e 63 74 69 6f 6e 20 73 74  to a Function st
d4b0: 72 75 63 74 75 72 65 20 74 68 61 74 0a 2a 2a 20  ructure that.** 
d4c0: 64 65 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63  defines the func
d4d0: 74 69 6f 6e 29 20 77 69 74 68 20 50 31 20 73 74  tion) with P1 st
d4e0: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 74  ring arguments t
d4f0: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 73 74  aken from the st
d500: 61 63 6b 2e 0a 2a 2a 20 50 6f 70 20 61 6c 6c 20  ack..** Pop all 
d510: 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74  arguments from t
d520: 68 65 20 73 74 61 63 6b 20 61 6e 64 20 70 75 73  he stack and pus
d530: 68 20 62 61 63 6b 20 74 68 65 20 72 65 73 75 6c  h back the resul
d540: 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  t..**.** See als
d550: 6f 3a 20 41 67 67 46 75 6e 63 0a 2a 2f 0a 63 61  o: AggFunc.*/.ca
d560: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20  se OP_Function: 
d570: 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20  {.  int n, i;.  
d580: 73 71 6c 69 74 65 5f 66 75 6e 63 20 63 74 78 3b  sqlite_func ctx;
d590: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b  ..  n = pOp->p1;
d5a0: 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 6e  .  VERIFY( if( n
d5b0: 3c 30 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e  <0 ) goto bad_in
d5c0: 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20 20 56  struction; ).  V
d5d0: 45 52 49 46 59 28 20 69 66 28 20 70 2d 3e 74 6f  ERIFY( if( p->to
d5e0: 73 2b 31 3c 6e 20 29 20 67 6f 74 6f 20 6e 6f 74  s+1<n ) goto not
d5f0: 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29  _enough_stack; )
d600: 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d  .  for(i=p->tos-
d610: 6e 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20  n+1; i<=p->tos; 
d620: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
d630: 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20  tack[i].flags & 
d640: 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  STK_Null ){.    
d650: 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b    zStack[i] = 0;
d660: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d670: 20 20 69 66 28 20 53 74 72 69 6e 67 69 66 79 28    if( Stringify(
d680: 70 2c 20 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  p, i) ) goto no_
d690: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mem;.    }.  }. 
d6a0: 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 28 46 75   ctx.pFunc = (Fu
d6b0: 6e 63 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a  ncDef*)pOp->p3;.
d6c0: 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20    ctx.s.flags = 
d6d0: 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e  STK_Null;.  ctx.
d6e0: 7a 20 3d 20 30 3b 0a 20 20 63 74 78 2e 69 73 45  z = 0;.  ctx.isE
d6f0: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78 2e  rror = 0;.  ctx.
d700: 69 73 53 74 65 70 20 3d 20 30 3b 0a 20 20 28 2a  isStep = 0;.  (*
d710: 63 74 78 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63  ctx.pFunc->xFunc
d720: 29 28 26 63 74 78 2c 20 6e 2c 20 28 63 6f 6e 73  )(&ctx, n, (cons
d730: 74 20 63 68 61 72 2a 2a 29 26 7a 53 74 61 63 6b  t char**)&zStack
d740: 5b 70 2d 3e 74 6f 73 2d 6e 2b 31 5d 29 3b 0a 20  [p->tos-n+1]);. 
d750: 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 6e 29 3b   PopStack(p, n);
d760: 0a 20 20 56 45 52 49 46 59 28 20 4e 65 65 64 53  .  VERIFY( NeedS
d770: 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31  tack(p, p->tos+1
d780: 29 3b 20 29 0a 20 20 70 2d 3e 74 6f 73 2b 2b 3b  ); ).  p->tos++;
d790: 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  .  aStack[p->tos
d7a0: 5d 20 3d 20 63 74 78 2e 73 3b 0a 20 20 69 66 28  ] = ctx.s;.  if(
d7b0: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 26 20 53   ctx.s.flags & S
d7c0: 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 7a 53  TK_Dyn ){.    zS
d7d0: 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 63  tack[p->tos] = c
d7e0: 74 78 2e 7a 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tx.z;.  }else if
d7f0: 28 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 26 20  ( ctx.s.flags & 
d800: 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 7a  STK_Str ){.    z
d810: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20  Stack[p->tos] = 
d820: 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 7a  aStack[p->tos].z
d830: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
d840: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20  Stack[p->tos] = 
d850: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 74 78  0;.  }.  if( ctx
d860: 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
d870: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
d880: 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  pzErrMsg, .     
d890: 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    zStack[p->tos]
d8a0: 20 3f 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73   ? zStack[p->tos
d8b0: 5d 20 3a 20 22 75 73 65 72 20 66 75 6e 63 74 69  ] : "user functi
d8c0: 6f 6e 20 65 72 72 6f 72 22 2c 20 30 29 3b 0a 20  on error", 0);. 
d8d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
d8e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61  RROR;.  }.  brea
d8f0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
d900: 20 42 69 74 41 6e 64 20 2a 20 2a 20 2a 0a 2a 2a   BitAnd * * *.**
d910: 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20  .** Pop the top 
d920: 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  two elements fro
d930: 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 43 6f  m the stack.  Co
d940: 6e 76 65 72 74 20 62 6f 74 68 20 65 6c 65 6d 65  nvert both eleme
d950: 6e 74 73 0a 2a 2a 20 74 6f 20 69 6e 74 65 67 65  nts.** to intege
d960: 72 73 2e 20 20 50 75 73 68 20 62 61 63 6b 20 6f  rs.  Push back o
d970: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68  nto the stack th
d980: 65 20 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f  e bit-wise AND o
d990: 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 65 6c 65  f the.** two ele
d9a0: 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 65 69 74  ments..** If eit
d9b0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
d9c0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
d9d0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
d9e0: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 2a 20 2a  pcode: BitOr * *
d9f0: 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65   *.**.** Pop the
da00: 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
da10: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
da20: 2e 20 20 43 6f 6e 76 65 72 74 20 62 6f 74 68 20  .  Convert both 
da30: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 6f 20 69  elements.** to i
da40: 6e 74 65 67 65 72 73 2e 20 20 50 75 73 68 20 62  ntegers.  Push b
da50: 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ack onto the sta
da60: 63 6b 20 74 68 65 20 62 69 74 2d 77 69 73 65 20  ck the bit-wise 
da70: 4f 52 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  OR of the.** two
da80: 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66   elements..** If
da90: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
daa0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
dab0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
dac0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74  /* Opcode: Shift
dad0: 4c 65 66 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  Left * * *.**.**
dae0: 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f   Pop the top two
daf0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74   elements from t
db00: 68 65 20 73 74 61 63 6b 2e 20 20 43 6f 6e 76 65  he stack.  Conve
db10: 72 74 20 62 6f 74 68 20 65 6c 65 6d 65 6e 74 73  rt both elements
db20: 0a 2a 2a 20 74 6f 20 69 6e 74 65 67 65 72 73 2e  .** to integers.
db30: 20 20 50 75 73 68 20 62 61 63 6b 20 6f 6e 74 6f    Push back onto
db40: 20 74 68 65 20 73 74 61 63 6b 20 74 68 65 20 74   the stack the t
db50: 6f 70 20 65 6c 65 6d 65 6e 74 20 73 68 69 66 74  op element shift
db60: 65 64 0a 2a 2a 20 6c 65 66 74 20 62 79 20 4e 20  ed.** left by N 
db70: 62 69 74 73 20 77 68 65 72 65 20 4e 20 69 73 20  bits where N is 
db80: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
db90: 6e 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  nt on the stack.
dba0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70  .** If either op
dbb0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74  erand is NULL, t
dbc0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
dbd0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
dbe0: 20 53 68 69 66 74 52 69 67 68 74 20 2a 20 2a 20   ShiftRight * * 
dbf0: 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  *.**.** Pop the 
dc00: 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  top two elements
dc10: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
dc20: 20 20 43 6f 6e 76 65 72 74 20 62 6f 74 68 20 65    Convert both e
dc30: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 6f 20 69 6e  lements.** to in
dc40: 74 65 67 65 72 73 2e 20 20 50 75 73 68 20 62 61  tegers.  Push ba
dc50: 63 6b 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ck onto the stac
dc60: 6b 20 74 68 65 20 74 6f 70 20 65 6c 65 6d 65 6e  k the top elemen
dc70: 74 20 73 68 69 66 74 65 64 0a 2a 2a 20 72 69 67  t shifted.** rig
dc80: 68 74 20 62 79 20 4e 20 62 69 74 73 20 77 68 65  ht by N bits whe
dc90: 72 65 20 4e 20 69 73 20 74 68 65 20 73 65 63 6f  re N is the seco
dca0: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  nd element on th
dcb0: 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 49 66 20 65  e stack..** If e
dcc0: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
dcd0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
dce0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  t is NULL..*/.ca
dcf0: 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 0a 63 61  se OP_BitAnd:.ca
dd00: 73 65 20 4f 50 5f 42 69 74 4f 72 3a 0a 63 61 73  se OP_BitOr:.cas
dd10: 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 0a  e OP_ShiftLeft:.
dd20: 63 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67  case OP_ShiftRig
dd30: 68 74 3a 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20  ht: {.  int tos 
dd40: 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20  = p->tos;.  int 
dd50: 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31 3b 0a 20  nos = tos - 1;. 
dd60: 20 69 6e 74 20 61 2c 20 62 3b 0a 20 20 56 45 52   int a, b;.  VER
dd70: 49 46 59 28 20 69 66 28 20 6e 6f 73 3c 30 20 29  IFY( if( nos<0 )
dd80: 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
dd90: 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20  _stack; ).  if( 
dda0: 28 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61  (aStack[tos].fla
ddb0: 67 73 20 7c 20 61 53 74 61 63 6b 5b 6e 6f 73 5d  gs | aStack[nos]
ddc0: 2e 66 6c 61 67 73 29 20 26 20 53 54 4b 5f 4e 75  .flags) & STK_Nu
ddd0: 6c 6c 20 29 7b 0a 20 20 20 20 50 4f 50 53 54 41  ll ){.    POPSTA
dde0: 43 4b 3b 0a 20 20 20 20 52 65 6c 65 61 73 65 28  CK;.    Release(
ddf0: 70 2c 6e 6f 73 29 3b 0a 20 20 20 20 61 53 74 61  p,nos);.    aSta
de00: 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[nos].flags = 
de10: 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72  STK_Null;.    br
de20: 65 61 6b 3b 0a 20 20 7d 0a 20 20 49 6e 74 65 67  eak;.  }.  Integ
de30: 65 72 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20  erify(p, tos);. 
de40: 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20 6e   Integerify(p, n
de50: 6f 73 29 3b 0a 20 20 61 20 3d 20 61 53 74 61 63  os);.  a = aStac
de60: 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20 62 20 3d 20  k[tos].i;.  b = 
de70: 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a 20  aStack[nos].i;. 
de80: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
de90: 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  code ){.    case
dea0: 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20   OP_BitAnd:     
deb0: 20 61 20 26 3d 20 62 3b 20 20 20 20 20 62 72 65   a &= b;     bre
dec0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
ded0: 42 69 74 4f 72 3a 20 20 20 20 20 20 20 61 20 7c  BitOr:       a |
dee0: 3d 20 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  = b;     break;.
def0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 68 69 66      case OP_Shif
df00: 74 4c 65 66 74 3a 20 20 20 61 20 3c 3c 3d 20 62  tLeft:   a <<= b
df10: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
df20: 63 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67  case OP_ShiftRig
df30: 68 74 3a 20 20 61 20 3e 3e 3d 20 62 3b 20 20 20  ht:  a >>= b;   
df40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
df50: 75 6c 74 3a 20 20 20 2f 2a 20 43 41 4e 54 20 48  ult:   /* CANT H
df60: 41 50 50 45 4e 20 2a 2f 20 20 20 20 20 62 72 65  APPEN */     bre
df70: 61 6b 3b 0a 20 20 7d 0a 20 20 50 4f 50 53 54 41  ak;.  }.  POPSTA
df80: 43 4b 3b 0a 20 20 52 65 6c 65 61 73 65 28 70 2c  CK;.  Release(p,
df90: 20 6e 6f 73 29 3b 0a 20 20 61 53 74 61 63 6b 5b   nos);.  aStack[
dfa0: 6e 6f 73 5d 2e 69 20 3d 20 61 3b 0a 20 20 61 53  nos].i = a;.  aS
dfb0: 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20  tack[nos].flags 
dfc0: 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 62 72 65  = STK_Int;.  bre
dfd0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
dfe0: 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 2a 20 2a  : AddImm  P1 * *
dff0: 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20  .** .** Add the 
e000: 76 61 6c 75 65 20 50 31 20 74 6f 20 77 68 61 74  value P1 to what
e010: 65 76 65 72 20 69 73 20 6f 6e 20 74 6f 70 20 6f  ever is on top o
e020: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  f the stack.  Th
e030: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 61  e result.** is a
e040: 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72  lways an integer
e050: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65  ..**.** To force
e060: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
e070: 73 74 61 63 6b 20 74 6f 20 62 65 20 61 6e 20 69  stack to be an i
e080: 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 61 64 64  nteger, just add
e090: 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41   0..*/.case OP_A
e0a0: 64 64 49 6d 6d 3a 20 7b 0a 20 20 69 6e 74 20 74  ddImm: {.  int t
e0b0: 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56  os = p->tos;.  V
e0c0: 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30  ERIFY( if( tos<0
e0d0: 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
e0e0: 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 49 6e  gh_stack; ).  In
e0f0: 74 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73 29  tegerify(p, tos)
e100: 3b 0a 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  ;.  aStack[tos].
e110: 69 20 2b 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  i += pOp->p1;.  
e120: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
e130: 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 20  ode: MustBeInt  
e140: 2a 20 50 32 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f  * P2 *.** .** Fo
e150: 72 63 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74  rce the top of t
e160: 68 65 20 73 74 61 63 6b 20 74 6f 20 62 65 20 61  he stack to be a
e170: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  n integer.  If t
e180: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
e190: 20 73 74 61 63 6b 20 69 73 20 6e 6f 74 20 61 6e   stack is not an
e1a0: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e   integer and can
e1b0: 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64  not be converted
e1c0: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
e1d0: 0a 2a 2a 20 77 69 74 68 20 6f 75 74 20 64 61 74  .** with out dat
e1e0: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d  a loss, then jum
e1f0: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
e200: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30   P2, or if P2==0
e210: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c  .** raise an SQL
e220: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63  ITE_MISMATCH exc
e230: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  eption..*/.case 
e240: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 0a  OP_MustBeInt: {.
e250: 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
e260: 6f 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66  os;.  VERIFY( if
e270: 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e  ( tos<0 ) goto n
e280: 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b  ot_enough_stack;
e290: 20 29 0a 20 20 69 66 28 20 61 53 74 61 63 6b 5b   ).  if( aStack[
e2a0: 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  tos].flags & STK
e2b0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 44  _Int ){.    /* D
e2c0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
e2d0: 65 6c 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b  else if( aStack[
e2e0: 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  tos].flags & STK
e2f0: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  _Real ){.    int
e300: 20 69 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d   i = aStack[tos]
e310: 2e 72 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  .r;.    double r
e320: 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 72 21   = i;.    if( r!
e330: 3d 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 20 29  =aStack[tos].r )
e340: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 69 73  {.      goto mis
e350: 6d 61 74 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  match;.    }.   
e360: 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d   aStack[tos].i =
e370: 20 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   i;.  }else if( 
e380: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
e390: 73 20 26 20 53 54 4b 5f 53 74 72 20 29 7b 0a 20  s & STK_Str ){. 
e3a0: 20 20 20 69 66 28 20 21 69 73 49 6e 74 65 67 65     if( !isIntege
e3b0: 72 28 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 20 29  r(zStack[tos]) )
e3c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 69 73  {.      goto mis
e3d0: 6d 61 74 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  match;.    }.   
e3e0: 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e   p->aStack[tos].
e3f0: 69 20 3d 20 61 74 6f 69 28 70 2d 3e 7a 53 74 61  i = atoi(p->zSta
e400: 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 7d 65 6c 73  ck[tos]);.  }els
e410: 65 7b 0a 20 20 20 20 67 6f 74 6f 20 6d 69 73 6d  e{.    goto mism
e420: 61 74 63 68 3b 0a 20 20 7d 0a 20 20 52 65 6c 65  atch;.  }.  Rele
e430: 61 73 65 28 70 2c 20 74 6f 73 29 3b 0a 20 20 70  ase(p, tos);.  p
e440: 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c  ->aStack[tos].fl
e450: 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20  ags = STK_Int;. 
e460: 20 62 72 65 61 6b 3b 0a 0a 6d 69 73 6d 61 74 63   break;..mismatc
e470: 68 3a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  h:.  if( pOp->p2
e480: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
e490: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b  SQLITE_MISMATCH;
e4a0: 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
e4b0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
e4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63 20 3d 20  }else{.    pc = 
e4d0: 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
e4e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e4f0: 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32  Opcode: Eq P1 P2
e500: 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65   *.**.** Pop the
e510: 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
e520: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
e530: 2e 20 20 49 66 20 74 68 65 79 20 61 72 65 20 65  .  If they are e
e540: 71 75 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 6a 75  qual, then.** ju
e550: 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
e560: 6e 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  n P2.  Otherwise
e570: 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68  , continue to th
e580: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
e590: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  on..**.** If eit
e5a0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
e5b0: 55 4c 4c 20 28 61 6e 64 20 74 68 75 73 20 69 66  ULL (and thus if
e5c0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 75   the result is u
e5d0: 6e 6b 6e 6f 77 6e 29 20 74 68 65 6e 0a 2a 2a 20  nknown) then.** 
e5e0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
e5f0: 20 50 31 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a   P1 is true..**.
e600: 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f  ** If P2 is zero
e610: 2c 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20  , do not jump.  
e620: 49 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e  Instead, push an
e630: 20 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20   integer 1 onto 
e640: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
e650: 74 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68  the jump would h
e660: 61 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20  ave been taken, 
e670: 6f 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20  or a 0 if not.  
e680: 50 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69  Push a.** NULL i
e690: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
e6a0: 20 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a   was NULL..*/./*
e6b0: 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20 50   Opcode: Ne P1 P
e6c0: 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68  2 *.**.** Pop th
e6d0: 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e  e top two elemen
e6e0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ts from the stac
e6f0: 6b 2e 20 20 49 66 20 74 68 65 79 20 61 72 65 20  k.  If they are 
e700: 6e 6f 74 20 65 71 75 61 6c 2c 20 74 68 65 6e 0a  not equal, then.
e710: 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  ** jump to instr
e720: 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65  uction P2.  Othe
e730: 72 77 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20  rwise, continue 
e740: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
e750: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ruction..**.** I
e760: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
e770: 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68   is NULL (and th
e780: 75 73 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  us if the result
e790: 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68 65   is unknown) the
e7a0: 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
e7b0: 6d 70 20 69 66 20 50 31 20 69 73 20 74 72 75 65  mp if P1 is true
e7c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73  ..**.** If P2 is
e7d0: 20 7a 65 72 6f 2c 20 64 6f 20 6e 6f 74 20 6a 75   zero, do not ju
e7e0: 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c 20 70 75  mp.  Instead, pu
e7f0: 73 68 20 61 6e 20 69 6e 74 65 67 65 72 20 31 20  sh an integer 1 
e800: 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63  onto the.** stac
e810: 6b 20 69 66 20 74 68 65 20 6a 75 6d 70 20 77 6f  k if the jump wo
e820: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 74 61  uld have been ta
e830: 6b 65 6e 2c 20 6f 72 20 61 20 30 20 69 66 20 6e  ken, or a 0 if n
e840: 6f 74 2e 20 20 50 75 73 68 20 61 0a 2a 2a 20 4e  ot.  Push a.** N
e850: 55 4c 4c 20 69 66 20 65 69 74 68 65 72 20 6f 70  ULL if either op
e860: 65 72 61 6e 64 20 77 61 73 20 4e 55 4c 4c 2e 0a  erand was NULL..
e870: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74  */./* Opcode: Lt
e880: 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50   P1 P2 *.**.** P
e890: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
e8a0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
e8b0: 20 73 74 61 63 6b 2e 20 20 49 66 20 73 65 63 6f   stack.  If seco
e8c0: 6e 64 20 65 6c 65 6d 65 6e 74 20 28 74 68 65 0a  nd element (the.
e8d0: 2a 2a 20 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b  ** next on stack
e8e0: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ) is less than t
e8f0: 68 65 20 66 69 72 73 74 20 28 74 68 65 20 74 6f  he first (the to
e900: 70 20 6f 66 20 73 74 61 63 6b 29 2c 20 74 68 65  p of stack), the
e910: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73  n.** jump to ins
e920: 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 74  truction P2.  Ot
e930: 68 65 72 77 69 73 65 2c 20 63 6f 6e 74 69 6e 75  herwise, continu
e940: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  e to the next in
e950: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  struction..** In
e960: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6a 75   other words, ju
e970: 6d 70 20 69 66 20 4e 4f 53 3c 54 4f 53 2e 0a 2a  mp if NOS<TOS..*
e980: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
e990: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 28  perand is NULL (
e9a0: 61 6e 64 20 74 68 75 73 20 69 66 20 74 68 65 20  and thus if the 
e9b0: 72 65 73 75 6c 74 20 69 73 20 75 6e 6b 6e 6f 77  result is unknow
e9c0: 6e 29 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  n) then.** take 
e9d0: 74 68 65 20 6a 75 6d 70 20 69 66 20 50 31 20 69  the jump if P1 i
e9e0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
e9f0: 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f 20   P2 is zero, do 
ea00: 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65  not jump.  Inste
ea10: 61 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74 65  ad, push an inte
ea20: 67 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a 2a  ger 1 onto the.*
ea30: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 6a  * stack if the j
ea40: 75 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20 62  ump would have b
ea50: 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61 20  een taken, or a 
ea60: 30 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68 20  0 if not.  Push 
ea70: 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69 74  a.** NULL if eit
ea80: 68 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73 20  her operand was 
ea90: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
eaa0: 64 65 3a 20 4c 65 20 50 31 20 50 32 20 2a 0a 2a  de: Le P1 P2 *.*
eab0: 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70  *.** Pop the top
eac0: 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72   two elements fr
ead0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  om the stack.  I
eae0: 66 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  f second element
eaf0: 20 28 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 6e   (the.** next on
eb00: 20 73 74 61 63 6b 29 20 69 73 20 6c 65 73 73 20   stack) is less 
eb10: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
eb20: 20 74 68 65 20 66 69 72 73 74 20 28 74 68 65 20   the first (the 
eb30: 74 6f 70 20 6f 66 20 73 74 61 63 6b 29 2c 0a 2a  top of stack),.*
eb40: 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 69  * then jump to i
eb50: 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 49  nstruction P2. I
eb60: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6a  n other words, j
eb70: 75 6d 70 20 69 66 20 4e 4f 53 3c 3d 54 4f 53 2e  ump if NOS<=TOS.
eb80: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
eb90: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
eba0: 20 28 61 6e 64 20 74 68 75 73 20 69 66 20 74 68   (and thus if th
ebb0: 65 20 72 65 73 75 6c 74 20 69 73 20 75 6e 6b 6e  e result is unkn
ebc0: 6f 77 6e 29 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  own) then.** tak
ebd0: 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50 31  e the jump if P1
ebe0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
ebf0: 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 64  If P2 is zero, d
ec00: 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73  o not jump.  Ins
ec10: 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20 69 6e  tead, push an in
ec20: 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74 68 65  teger 1 onto the
ec30: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
ec40: 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61 76 65   jump would have
ec50: 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20   been taken, or 
ec60: 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50 75 73  a 0 if not.  Pus
ec70: 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65  h a.** NULL if e
ec80: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 77 61  ither operand wa
ec90: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
eca0: 63 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 2a  code: Gt P1 P2 *
ecb0: 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74  .**.** Pop the t
ecc0: 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  op two elements 
ecd0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
ece0: 20 49 66 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65   If second eleme
ecf0: 6e 74 20 28 74 68 65 0a 2a 2a 20 6e 65 78 74 20  nt (the.** next 
ed00: 6f 6e 20 73 74 61 63 6b 29 20 69 73 20 67 72 65  on stack) is gre
ed10: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 66 69  ater than the fi
ed20: 72 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66 20  rst (the top of 
ed30: 73 74 61 63 6b 29 2c 0a 2a 2a 20 74 68 65 6e 20  stack),.** then 
ed40: 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
ed50: 69 6f 6e 20 50 32 2e 20 49 6e 20 6f 74 68 65 72  ion P2. In other
ed60: 20 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69 66 20   words, jump if 
ed70: 4e 4f 53 3e 54 4f 53 2e 0a 2a 2a 0a 2a 2a 20 49  NOS>TOS..**.** I
ed80: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
ed90: 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68   is NULL (and th
eda0: 75 73 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  us if the result
edb0: 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68 65   is unknown) the
edc0: 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
edd0: 6d 70 20 69 66 20 50 31 20 69 73 20 74 72 75 65  mp if P1 is true
ede0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73  ..**.** If P2 is
edf0: 20 7a 65 72 6f 2c 20 64 6f 20 6e 6f 74 20 6a 75   zero, do not ju
ee00: 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c 20 70 75  mp.  Instead, pu
ee10: 73 68 20 61 6e 20 69 6e 74 65 67 65 72 20 31 20  sh an integer 1 
ee20: 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63  onto the.** stac
ee30: 6b 20 69 66 20 74 68 65 20 6a 75 6d 70 20 77 6f  k if the jump wo
ee40: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 74 61  uld have been ta
ee50: 6b 65 6e 2c 20 6f 72 20 61 20 30 20 69 66 20 6e  ken, or a 0 if n
ee60: 6f 74 2e 20 20 50 75 73 68 20 61 0a 2a 2a 20 4e  ot.  Push a.** N
ee70: 55 4c 4c 20 69 66 20 65 69 74 68 65 72 20 6f 70  ULL if either op
ee80: 65 72 61 6e 64 20 77 61 73 20 4e 55 4c 4c 2e 0a  erand was NULL..
ee90: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65  */./* Opcode: Ge
eea0: 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50   P1 P2 *.**.** P
eeb0: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
eec0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
eed0: 20 73 74 61 63 6b 2e 20 20 49 66 20 73 65 63 6f   stack.  If seco
eee0: 6e 64 20 65 6c 65 6d 65 6e 74 20 28 74 68 65 20  nd element (the 
eef0: 6e 65 78 74 0a 2a 2a 20 6f 6e 20 73 74 61 63 6b  next.** on stack
ef00: 29 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  ) is greater tha
ef10: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
ef20: 65 20 66 69 72 73 74 20 28 74 68 65 20 74 6f 70  e first (the top
ef30: 20 6f 66 20 73 74 61 63 6b 29 2c 0a 2a 2a 20 74   of stack),.** t
ef40: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  hen jump to inst
ef50: 72 75 63 74 69 6f 6e 20 50 32 2e 20 49 6e 20 6f  ruction P2. In o
ef60: 74 68 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70  ther words, jump
ef70: 20 69 66 20 4e 4f 53 3e 3d 54 4f 53 2e 0a 2a 2a   if NOS>=TOS..**
ef80: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70  .** If either op
ef90: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 28 61  erand is NULL (a
efa0: 6e 64 20 74 68 75 73 20 69 66 20 74 68 65 20 72  nd thus if the r
efb0: 65 73 75 6c 74 20 69 73 20 75 6e 6b 6e 6f 77 6e  esult is unknown
efc0: 29 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  ) then.** take t
efd0: 68 65 20 6a 75 6d 70 20 69 66 20 50 31 20 69 73  he jump if P1 is
efe0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
eff0: 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f 20 6e  P2 is zero, do n
f000: 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61  ot jump.  Instea
f010: 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74 65 67  d, push an integ
f020: 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a  er 1 onto the.**
f030: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 6a 75   stack if the ju
f040: 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  mp would have be
f050: 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61 20 30  en taken, or a 0
f060: 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68 20 61   if not.  Push a
f070: 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69 74 68  .** NULL if eith
f080: 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73 20 4e  er operand was N
f090: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
f0a0: 45 71 3a 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 0a  Eq:.case OP_Ne:.
f0b0: 63 61 73 65 20 4f 50 5f 4c 74 3a 0a 63 61 73 65  case OP_Lt:.case
f0c0: 20 4f 50 5f 4c 65 3a 0a 63 61 73 65 20 4f 50 5f   OP_Le:.case OP_
f0d0: 47 74 3a 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20  Gt:.case OP_Ge: 
f0e0: 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  {.  int tos = p-
f0f0: 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20  >tos;.  int nos 
f100: 3d 20 74 6f 73 20 2d 20 31 3b 0a 20 20 69 6e 74  = tos - 1;.  int
f110: 20 63 3b 0a 20 20 69 6e 74 20 66 74 2c 20 66 6e   c;.  int ft, fn
f120: 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ;.  VERIFY( if( 
f130: 6e 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74  nos<0 ) goto not
f140: 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29  _enough_stack; )
f150: 0a 20 20 66 74 20 3d 20 61 53 74 61 63 6b 5b 74  .  ft = aStack[t
f160: 6f 73 5d 2e 66 6c 61 67 73 3b 0a 20 20 66 6e 20  os].flags;.  fn 
f170: 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c  = aStack[nos].fl
f180: 61 67 73 3b 0a 20 20 69 66 28 20 28 66 74 20 7c  ags;.  if( (ft |
f190: 20 66 6e 29 20 26 20 53 54 4b 5f 4e 75 6c 6c 20   fn) & STK_Null 
f1a0: 29 7b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b 3b  ){.    POPSTACK;
f1b0: 0a 20 20 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20  .    POPSTACK;. 
f1c0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29     if( pOp->p2 )
f1d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
f1e0: 3e 70 31 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  >p1 ) pc = pOp->
f1f0: 70 32 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p2-1;.    }else{
f200: 0a 20 20 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b  .      p->tos++;
f210: 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f  .      aStack[no
f220: 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e  s].flags = STK_N
f230: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ull;.    }.    b
f240: 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  reak;.  }else if
f250: 28 20 28 66 74 20 26 20 66 6e 20 26 20 53 54 4b  ( (ft & fn & STK
f260: 5f 49 6e 74 29 3d 3d 53 54 4b 5f 49 6e 74 20 29  _Int)==STK_Int )
f270: 7b 0a 20 20 20 20 63 20 3d 20 61 53 74 61 63 6b  {.    c = aStack
f280: 5b 6e 6f 73 5d 2e 69 20 2d 20 61 53 74 61 63 6b  [nos].i - aStack
f290: 5b 74 6f 73 5d 2e 69 3b 0a 20 20 7d 65 6c 73 65  [tos].i;.  }else
f2a0: 20 69 66 28 20 28 66 74 20 26 20 53 54 4b 5f 49   if( (ft & STK_I
f2b0: 6e 74 29 21 3d 30 20 26 26 20 28 66 6e 20 26 20  nt)!=0 && (fn & 
f2c0: 53 54 4b 5f 53 74 72 29 21 3d 30 20 26 26 20 69  STK_Str)!=0 && i
f2d0: 73 49 6e 74 65 67 65 72 28 7a 53 74 61 63 6b 5b  sInteger(zStack[
f2e0: 6e 6f 73 5d 29 20 29 7b 0a 20 20 20 20 49 6e 74  nos]) ){.    Int
f2f0: 65 67 65 72 69 66 79 28 70 2c 20 6e 6f 73 29 3b  egerify(p, nos);
f300: 0a 20 20 20 20 63 20 3d 20 61 53 74 61 63 6b 5b  .    c = aStack[
f310: 6e 6f 73 5d 2e 69 20 2d 20 61 53 74 61 63 6b 5b  nos].i - aStack[
f320: 74 6f 73 5d 2e 69 3b 0a 20 20 7d 65 6c 73 65 20  tos].i;.  }else 
f330: 69 66 28 20 28 66 6e 20 26 20 53 54 4b 5f 49 6e  if( (fn & STK_In
f340: 74 29 21 3d 30 20 26 26 20 28 66 74 20 26 20 53  t)!=0 && (ft & S
f350: 54 4b 5f 53 74 72 29 21 3d 30 20 26 26 20 69 73  TK_Str)!=0 && is
f360: 49 6e 74 65 67 65 72 28 7a 53 74 61 63 6b 5b 74  Integer(zStack[t
f370: 6f 73 5d 29 20 29 7b 0a 20 20 20 20 49 6e 74 65  os]) ){.    Inte
f380: 67 65 72 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a  gerify(p, tos);.
f390: 20 20 20 20 63 20 3d 20 61 53 74 61 63 6b 5b 6e      c = aStack[n
f3a0: 6f 73 5d 2e 69 20 2d 20 61 53 74 61 63 6b 5b 74  os].i - aStack[t
f3b0: 6f 73 5d 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  os].i;.  }else{.
f3c0: 20 20 20 20 69 66 28 20 53 74 72 69 6e 67 69 66      if( Stringif
f3d0: 79 28 70 2c 20 74 6f 73 29 20 7c 7c 20 53 74 72  y(p, tos) || Str
f3e0: 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29 20 29  ingify(p, nos) )
f3f0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
f400: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 6f 6d 70    c = sqliteComp
f410: 61 72 65 28 7a 53 74 61 63 6b 5b 6e 6f 73 5d 2c  are(zStack[nos],
f420: 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 3b 0a 20   zStack[tos]);. 
f430: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70   }.  switch( pOp
f440: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
f450: 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 63  case OP_Eq:    c
f460: 20 3d 20 63 3d 3d 30 3b 20 20 20 20 20 62 72 65   = c==0;     bre
f470: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
f480: 4e 65 3a 20 20 20 20 63 20 3d 20 63 21 3d 30 3b  Ne:    c = c!=0;
f490: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f4a0: 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 63  case OP_Lt:    c
f4b0: 20 3d 20 63 3c 30 3b 20 20 20 20 20 20 62 72 65   = c<0;      bre
f4c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
f4d0: 4c 65 3a 20 20 20 20 63 20 3d 20 63 3c 3d 30 3b  Le:    c = c<=0;
f4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f4f0: 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 63  case OP_Gt:    c
f500: 20 3d 20 63 3e 30 3b 20 20 20 20 20 20 62 72 65   = c>0;      bre
f510: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
f520: 20 20 20 20 20 20 20 63 20 3d 20 63 3e 3d 30 3b         c = c>=0;
f530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
f540: 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 50 4f    POPSTACK;.  PO
f550: 50 53 54 41 43 4b 3b 0a 20 20 69 66 28 20 70 4f  PSTACK;.  if( pO
f560: 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20 69 66 28  p->p2 ){.    if(
f570: 20 63 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70   c ) pc = pOp->p
f580: 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2-1;.  }else{.  
f590: 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20 20    p->tos++;.    
f5a0: 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67  aStack[nos].flag
f5b0: 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20  s = STK_Int;.   
f5c0: 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 20 3d   aStack[nos].i =
f5d0: 20 63 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   c;.  }.  break;
f5e0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
f5f0: 6e 64 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  nd * * *.**.** P
f600: 6f 70 20 74 77 6f 20 76 61 6c 75 65 73 20 6f 66  op two values of
f610: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 61  f the stack.  Ta
f620: 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 41  ke the logical A
f630: 4e 44 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ND of the.** two
f640: 20 76 61 6c 75 65 73 20 61 6e 64 20 70 75 73 68   values and push
f650: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 62   the resulting b
f660: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 62 61 63  oolean value bac
f670: 6b 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74  k onto the.** st
f680: 61 63 6b 2e 20 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  ack. .*/./* Opco
f690: 64 65 3a 20 4f 72 20 2a 20 2a 20 2a 0a 2a 2a 0a  de: Or * * *.**.
f6a0: 2a 2a 20 50 6f 70 20 74 77 6f 20 76 61 6c 75 65  ** Pop two value
f6b0: 73 20 6f 66 66 20 74 68 65 20 73 74 61 63 6b 2e  s off the stack.
f6c0: 20 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63    Take the logic
f6d0: 61 6c 20 4f 52 20 6f 66 20 74 68 65 0a 2a 2a 20  al OR of the.** 
f6e0: 74 77 6f 20 76 61 6c 75 65 73 20 61 6e 64 20 70  two values and p
f6f0: 75 73 68 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ush the resultin
f700: 67 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  g boolean value 
f710: 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a  back onto the.**
f720: 20 73 74 61 63 6b 2e 20 0a 2a 2f 0a 63 61 73 65   stack. .*/.case
f730: 20 4f 50 5f 41 6e 64 3a 0a 63 61 73 65 20 4f 50   OP_And:.case OP
f740: 5f 4f 72 3a 20 7b 0a 20 20 69 6e 74 20 74 6f 73  _Or: {.  int tos
f750: 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74   = p->tos;.  int
f760: 20 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31 3b 0a   nos = tos - 1;.
f770: 20 20 69 6e 74 20 76 31 2c 20 76 32 3b 20 20 20    int v1, v2;   
f780: 20 2f 2a 20 30 3d 3d 54 52 55 45 2c 20 31 3d 3d   /* 0==TRUE, 1==
f790: 46 41 4c 53 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57  FALSE, 2==UNKNOW
f7a0: 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20  N or NULL */..  
f7b0: 56 45 52 49 46 59 28 20 69 66 28 20 6e 6f 73 3c  VERIFY( if( nos<
f7c0: 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  0 ) goto not_eno
f7d0: 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69  ugh_stack; ).  i
f7e0: 66 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66  f( aStack[tos].f
f7f0: 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20  lags & STK_Null 
f800: 29 7b 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20  ){.    v1 = 2;. 
f810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 74 65   }else{.    Inte
f820: 67 65 72 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a  gerify(p, tos);.
f830: 20 20 20 20 76 31 20 3d 20 61 53 74 61 63 6b 5b      v1 = aStack[
f840: 74 6f 73 5d 2e 69 3d 3d 30 3b 0a 20 20 7d 0a 20  tos].i==0;.  }. 
f850: 20 69 66 28 20 61 53 74 61 63 6b 5b 6e 6f 73 5d   if( aStack[nos]
f860: 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c  .flags & STK_Nul
f870: 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b  l ){.    v2 = 2;
f880: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
f890: 74 65 67 65 72 69 66 79 28 70 2c 20 6e 6f 73 29  tegerify(p, nos)
f8a0: 3b 0a 20 20 20 20 76 32 20 3d 20 61 53 74 61 63  ;.    v2 = aStac
f8b0: 6b 5b 6e 6f 73 5d 2e 69 3d 3d 30 3b 0a 20 20 7d  k[nos].i==0;.  }
f8c0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
f8d0: 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20  de==OP_And ){.  
f8e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f8f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 6e 64  nsigned char and
f900: 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20  _logic[] = { 0, 
f910: 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32  1, 2, 1, 1, 1, 2
f920: 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31  , 1, 2 };.    v1
f930: 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a   = and_logic[v1*
f940: 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  3+v2];.  }else{.
f950: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
f970: 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c  r_logic[] = { 0,
f980: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20   0, 0, 0, 1, 2, 
f990: 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76  0, 2, 2 };.    v
f9a0: 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a  1 = or_logic[v1*
f9b0: 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 50 4f 50  3+v2];.  }.  POP
f9c0: 53 54 41 43 4b 3b 0a 20 20 52 65 6c 65 61 73 65  STACK;.  Release
f9d0: 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 69 66 28 20  (p, nos);.  if( 
f9e0: 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 61 53 74  v1==2 ){.    aSt
f9f0: 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[nos].flags =
fa00: 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 7d 65 6c   STK_Null;.  }el
fa10: 73 65 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 6e  se{.    aStack[n
fa20: 6f 73 5d 2e 69 20 3d 20 76 31 3d 3d 30 3b 0a 20  os].i = v1==0;. 
fa30: 20 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66     aStack[nos].f
fa40: 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a  lags = STK_Int;.
fa50: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
fa60: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 67 61 74  /* Opcode: Negat
fa70: 69 76 65 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  ive * * *.**.** 
fa80: 54 72 65 61 74 20 74 68 65 20 74 6f 70 20 6f 66  Treat the top of
fa90: 20 74 68 65 20 73 74 61 63 6b 20 61 73 20 61 20   the stack as a 
faa0: 6e 75 6d 65 72 69 63 20 71 75 61 6e 74 69 74 79  numeric quantity
fab0: 2e 20 20 52 65 70 6c 61 63 65 20 69 74 0a 2a 2a  .  Replace it.**
fac0: 20 77 69 74 68 20 69 74 73 20 61 64 64 69 74 69   with its additi
fad0: 76 65 20 69 6e 76 65 72 73 65 2e 20 20 49 66 20  ve inverse.  If 
fae0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
faf0: 74 61 63 6b 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  tack is NULL.** 
fb00: 69 74 73 20 76 61 6c 75 65 20 69 73 20 75 6e 63  its value is unc
fb10: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f 70  hanged..*/./* Op
fb20: 63 6f 64 65 3a 20 41 62 73 56 61 6c 75 65 20 2a  code: AbsValue *
fb30: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 65 61 74   * *.**.** Treat
fb40: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
fb50: 73 74 61 63 6b 20 61 73 20 61 20 6e 75 6d 65 72  stack as a numer
fb60: 69 63 20 71 75 61 6e 74 69 74 79 2e 20 20 52 65  ic quantity.  Re
fb70: 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74 68  place it.** with
fb80: 20 69 74 73 20 61 62 73 6f 6c 75 74 65 20 76 61   its absolute va
fb90: 6c 75 65 2e 20 49 66 20 74 68 65 20 74 6f 70 20  lue. If the top 
fba0: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  of the stack is 
fbb0: 4e 55 4c 4c 0a 2a 2a 20 69 74 73 20 76 61 6c 75  NULL.** its valu
fbc0: 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
fbd0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 67 61 74  */.case OP_Negat
fbe0: 69 76 65 3a 0a 63 61 73 65 20 4f 50 5f 41 62 73  ive:.case OP_Abs
fbf0: 56 61 6c 75 65 3a 20 7b 0a 20 20 69 6e 74 20 74  Value: {.  int t
fc00: 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56  os = p->tos;.  V
fc10: 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30  ERIFY( if( tos<0
fc20: 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
fc30: 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66  gh_stack; ).  if
fc40: 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c  ( aStack[tos].fl
fc50: 61 67 73 20 26 20 53 54 4b 5f 52 65 61 6c 20 29  ags & STK_Real )
fc60: 7b 0a 20 20 20 20 52 65 6c 65 61 73 65 28 70 2c  {.    Release(p,
fc70: 20 74 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 70   tos);.    if( p
fc80: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
fc90: 65 67 61 74 69 76 65 20 7c 7c 20 61 53 74 61 63  egative || aStac
fca0: 6b 5b 74 6f 73 5d 2e 72 3c 30 2e 30 20 29 7b 0a  k[tos].r<0.0 ){.
fcb0: 20 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73        aStack[tos
fcc0: 5d 2e 72 20 3d 20 2d 61 53 74 61 63 6b 5b 74 6f  ].r = -aStack[to
fcd0: 73 5d 2e 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s].r;.    }.    
fce0: 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
fcf0: 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 20 20  s = STK_Real;.  
fd00: 7d 65 6c 73 65 20 69 66 28 20 61 53 74 61 63 6b  }else if( aStack
fd10: 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  [tos].flags & ST
fd20: 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 52 65 6c  K_Int ){.    Rel
fd30: 65 61 73 65 28 70 2c 20 74 6f 73 29 3b 0a 20 20  ease(p, tos);.  
fd40: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
fd50: 65 3d 3d 4f 50 5f 4e 65 67 61 74 69 76 65 20 7c  e==OP_Negative |
fd60: 7c 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69  |  aStack[tos].i
fd70: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 53 74 61  <0 ){.      aSta
fd80: 63 6b 5b 74 6f 73 5d 2e 69 20 3d 20 2d 61 53 74  ck[tos].i = -aSt
fd90: 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20 20 20  ack[tos].i;.    
fda0: 7d 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73  }.    aStack[tos
fdb0: 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e  ].flags = STK_In
fdc0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  t;.  }else if( a
fdd0: 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
fde0: 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20   & STK_Null ){. 
fdf0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
fe00: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
fe10: 20 52 65 61 6c 69 66 79 28 70 2c 20 74 6f 73 29   Realify(p, tos)
fe20: 3b 0a 20 20 20 20 52 65 6c 65 61 73 65 28 70 2c  ;.    Release(p,
fe30: 20 74 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 70   tos);.    if( p
fe40: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
fe50: 65 67 61 74 69 76 65 20 7c 7c 20 20 61 53 74 61  egative ||  aSta
fe60: 63 6b 5b 74 6f 73 5d 2e 72 3c 30 2e 30 20 29 7b  ck[tos].r<0.0 ){
fe70: 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f  .      aStack[to
fe80: 73 5d 2e 72 20 3d 20 2d 61 53 74 61 63 6b 5b 74  s].r = -aStack[t
fe90: 6f 73 5d 2e 72 3b 0a 20 20 20 20 7d 0a 20 20 20  os].r;.    }.   
fea0: 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61   aStack[tos].fla
feb0: 67 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 20  gs = STK_Real;. 
fec0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
fed0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 2a 20  * Opcode: Not * 
fee0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  * *.**.** Interp
fef0: 72 65 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ret the top of t
ff00: 68 65 20 73 74 61 63 6b 20 61 73 20 61 20 62 6f  he stack as a bo
ff10: 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65  olean value.  Re
ff20: 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74 68  place it.** with
ff30: 20 69 74 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 2e   its complement.
ff40: 20 20 49 66 20 74 68 65 20 74 6f 70 20 6f 66 20    If the top of 
ff50: 74 68 65 20 73 74 61 63 6b 20 69 73 20 4e 55 4c  the stack is NUL
ff60: 4c 20 69 74 73 20 76 61 6c 75 65 0a 2a 2a 20 69  L its value.** i
ff70: 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
ff80: 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 0a 20  case OP_Not: {. 
ff90: 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f   int tos = p->to
ffa0: 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  s;.  VERIFY( if(
ffb0: 20 70 2d 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f   p->tos<0 ) goto
ffc0: 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63   not_enough_stac
ffd0: 6b 3b 20 29 0a 20 20 69 66 28 20 61 53 74 61 63  k; ).  if( aStac
ffe0: 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53  k[tos].flags & S
fff0: 54 4b 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b  TK_Null ) break;
10000 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
10010 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 49 6e  to NULLs */.  In
10020 74 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73 29  tegerify(p, tos)
10030 3b 0a 20 20 52 65 6c 65 61 73 65 28 70 2c 20 74  ;.  Release(p, t
10040 6f 73 29 3b 0a 20 20 61 53 74 61 63 6b 5b 74 6f  os);.  aStack[to
10050 73 5d 2e 69 20 3d 20 21 61 53 74 61 63 6b 5b 74  s].i = !aStack[t
10060 6f 73 5d 2e 69 3b 0a 20 20 61 53 74 61 63 6b 5b  os].i;.  aStack[
10070 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  tos].flags = STK
10080 5f 49 6e 74 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  _Int;.  break;.}
10090 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74  ../* Opcode: Bit
100a0 4e 6f 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  Not * * *.**.** 
100b0 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 74 6f  Interpret the to
100c0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61  p of the stack a
100d0 73 20 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 70  s an value.  Rep
100e0 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  lace it.** with 
100f0 69 74 73 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d  its ones-complem
10100 65 6e 74 2e 20 20 49 66 20 74 68 65 20 74 6f 70  ent.  If the top
10110 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
10120 20 4e 55 4c 4c 20 69 74 73 0a 2a 2a 20 76 61 6c   NULL its.** val
10130 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  ue is unchanged.
10140 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e  .*/.case OP_BitN
10150 6f 74 3a 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20  ot: {.  int tos 
10160 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49  = p->tos;.  VERI
10170 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 3c 30  FY( if( p->tos<0
10180 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
10190 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66  gh_stack; ).  if
101a0 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c  ( aStack[tos].fl
101b0 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29  ags & STK_Null )
101c0 20 62 72 65 61 6b 3b 20 20 2f 2a 20 44 6f 20 6e   break;  /* Do n
101d0 6f 74 68 69 6e 67 20 74 6f 20 4e 55 4c 4c 73 20  othing to NULLs 
101e0 2a 2f 0a 20 20 49 6e 74 65 67 65 72 69 66 79 28  */.  Integerify(
101f0 70 2c 20 74 6f 73 29 3b 0a 20 20 52 65 6c 65 61  p, tos);.  Relea
10200 73 65 28 70 2c 20 74 6f 73 29 3b 0a 20 20 61 53  se(p, tos);.  aS
10210 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d 20 7e 61  tack[tos].i = ~a
10220 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20  Stack[tos].i;.  
10230 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
10240 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 62  s = STK_Int;.  b
10250 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
10260 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 0a 2a  de: Noop * * *.*
10270 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  *.** Do nothing.
10280 20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69    This instructi
10290 6f 6e 20 69 73 20 6f 66 74 65 6e 20 75 73 65 66  on is often usef
102a0 75 6c 20 61 73 20 61 20 6a 75 6d 70 0a 2a 2a 20  ul as a jump.** 
102b0 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
102c0 63 61 73 65 20 4f 50 5f 4e 6f 6f 70 3a 20 7b 0a  case OP_Noop: {.
102d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
102e0 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20  pcode: If P1 P2 
102f0 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 61 20 73 69  *.**.** Pop a si
10300 6e 67 6c 65 20 62 6f 6f 6c 65 61 6e 20 66 72 6f  ngle boolean fro
10310 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  m the stack.  If
10320 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 70 6f 70   the boolean pop
10330 70 65 64 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  ped is.** true, 
10340 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 70 32 2e  then jump to p2.
10350 20 20 4f 74 68 65 72 77 69 73 65 20 63 6f 6e 74    Otherwise cont
10360 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
10370 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
10380 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 66   An integer is f
10390 61 6c 73 65 20 69 66 20 7a 65 72 6f 20 61 6e 64  alse if zero and
103a0 20 74 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   true otherwise.
103b0 20 20 41 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a    A string is.**
103c0 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
103d0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 61 6e 64   zero length and
103e0 20 74 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   true otherwise.
103f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
10400 6c 75 65 20 70 6f 70 70 65 64 20 6f 66 20 74 68  lue popped of th
10410 65 20 73 74 61 63 6b 20 69 73 20 4e 55 4c 4c 2c  e stack is NULL,
10420 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
10430 75 6d 70 20 69 66 20 50 31 0a 2a 2a 20 69 73 20  ump if P1.** is 
10440 74 72 75 65 20 61 6e 64 20 66 61 6c 6c 20 74 68  true and fall th
10450 72 6f 75 67 68 20 69 66 20 50 31 20 69 73 20 66  rough if P1 is f
10460 61 6c 73 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  alse..*/./* Opco
10470 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20  de: IfNot P1 P2 
10480 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 61 20 73 69  *.**.** Pop a si
10490 6e 67 6c 65 20 62 6f 6f 6c 65 61 6e 20 66 72 6f  ngle boolean fro
104a0 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  m the stack.  If
104b0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 70 6f 70   the boolean pop
104c0 70 65 64 20 69 73 0a 2a 2a 20 66 61 6c 73 65 2c  ped is.** false,
104d0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 70 32   then jump to p2
104e0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 63 6f 6e  .  Otherwise con
104f0 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
10500 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
10510 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
10520 66 61 6c 73 65 20 69 66 20 7a 65 72 6f 20 61 6e  false if zero an
10530 64 20 74 72 75 65 20 6f 74 68 65 72 77 69 73 65  d true otherwise
10540 2e 20 20 41 20 73 74 72 69 6e 67 20 69 73 0a 2a  .  A string is.*
10550 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61  * false if it ha
10560 73 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 61 6e  s zero length an
10570 64 20 74 72 75 65 20 6f 74 68 65 72 77 69 73 65  d true otherwise
10580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  ..**.** If the v
10590 61 6c 75 65 20 70 6f 70 70 65 64 20 6f 66 20 74  alue popped of t
105a0 68 65 20 73 74 61 63 6b 20 69 73 20 4e 55 4c 4c  he stack is NULL
105b0 2c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  , then take the 
105c0 6a 75 6d 70 20 69 66 20 50 31 0a 2a 2a 20 69 73  jump if P1.** is
105d0 20 74 72 75 65 20 61 6e 64 20 66 61 6c 6c 20 74   true and fall t
105e0 68 72 6f 75 67 68 20 69 66 20 50 31 20 69 73 20  hrough if P1 is 
105f0 66 61 6c 73 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  false..*/.case O
10600 50 5f 49 66 3a 0a 63 61 73 65 20 4f 50 5f 49 66  P_If:.case OP_If
10610 4e 6f 74 3a 20 7b 0a 20 20 69 6e 74 20 63 3b 0a  Not: {.  int c;.
10620 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70 2d    VERIFY( if( p-
10630 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  >tos<0 ) goto no
10640 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20  t_enough_stack; 
10650 29 0a 20 20 69 66 28 20 61 53 74 61 63 6b 5b 70  ).  if( aStack[p
10660 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53  ->tos].flags & S
10670 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63  TK_Null ){.    c
10680 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7d 65   = pOp->p1;.  }e
10690 6c 73 65 7b 0a 20 20 20 20 49 6e 74 65 67 65 72  lse{.    Integer
106a0 69 66 79 28 70 2c 20 70 2d 3e 74 6f 73 29 3b 0a  ify(p, p->tos);.
106b0 20 20 20 20 63 20 3d 20 61 53 74 61 63 6b 5b 70      c = aStack[p
106c0 2d 3e 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 69 66  ->tos].i;.    if
106d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
106e0 50 5f 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63  P_IfNot ) c = !c
106f0 3b 0a 20 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b  ;.  }.  POPSTACK
10700 3b 0a 20 20 69 66 28 20 63 20 29 20 70 63 20 3d  ;.  if( c ) pc =
10710 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 62 72   pOp->p2-1;.  br
10720 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
10730 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20  e: IsNull P1 P2 
10740 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  *.**.** If any o
10750 66 20 74 68 65 20 74 6f 70 20 61 62 73 28 50 31  f the top abs(P1
10760 29 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  ) values on the 
10770 73 74 61 63 6b 20 61 72 65 20 4e 55 4c 4c 2c 20  stack are NULL, 
10780 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  then jump.** to 
10790 50 32 2e 20 20 54 68 65 20 73 74 61 63 6b 20 69  P2.  The stack i
107a0 73 20 70 6f 70 70 65 64 20 50 31 20 74 69 6d 65  s popped P1 time
107b0 73 20 69 66 20 50 31 3e 30 2e 20 20 49 66 20 50  s if P1>0.  If P
107c0 31 3c 30 20 74 68 65 6e 20 61 6c 6c 20 76 61 6c  1<0 then all val
107d0 75 65 73 0a 2a 2a 20 61 72 65 20 6c 65 66 74 20  ues.** are left 
107e0 75 6e 63 68 61 6e 67 65 64 20 6f 6e 20 74 68 65  unchanged on the
107f0 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20   stack..*/.case 
10800 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 0a 20 20 69  OP_IsNull: {.  i
10810 6e 74 20 69 2c 20 63 6e 74 3b 0a 20 20 63 6e 74  nt i, cnt;.  cnt
10820 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66   = pOp->p1;.  if
10830 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
10840 2d 63 6e 74 3b 0a 20 20 56 45 52 49 46 59 28 20  -cnt;.  VERIFY( 
10850 69 66 28 20 70 2d 3e 74 6f 73 2b 31 2d 63 6e 74  if( p->tos+1-cnt
10860 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <0 ) goto not_en
10870 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20  ough_stack; ).  
10880 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6e 74 3b 20  for(i=0; i<cnt; 
10890 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
108a0 74 61 63 6b 5b 70 2d 3e 74 6f 73 2d 69 5d 2e 66  tack[p->tos-i].f
108b0 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20  lags & STK_Null 
108c0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
108d0 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 20 20 62  p->p2-1;.      b
108e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
108f0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 30 20    if( pOp->p1>0 
10900 29 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 63 6e  ) PopStack(p, cn
10910 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
10920 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75  /* Opcode: NotNu
10930 6c 6c 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a  ll P1 P2 *.**.**
10940 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
10950 68 65 20 74 6f 70 20 76 61 6c 75 65 20 6f 6e 20  he top value on 
10960 74 68 65 20 73 74 61 63 6b 20 69 73 20 6e 6f 74  the stack is not
10970 20 4e 55 4c 4c 2e 20 20 50 6f 70 20 74 68 65 0a   NULL.  Pop the.
10980 2a 2a 20 73 74 61 63 6b 20 69 66 20 50 31 20 69  ** stack if P1 i
10990 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
109a0 65 72 6f 2e 20 20 49 66 20 50 31 20 69 73 20 6c  ero.  If P1 is l
109b0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
109c0 6c 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  l to.** zero the
109d0 6e 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75  n leave the valu
109e0 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
109f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75  */.case OP_NotNu
10a00 6c 6c 3a 20 7b 0a 20 20 56 45 52 49 46 59 28 20  ll: {.  VERIFY( 
10a10 69 66 28 20 70 2d 3e 74 6f 73 3c 30 20 29 20 67  if( p->tos<0 ) g
10a20 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
10a30 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 28 61  tack; ).  if( (a
10a40 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
10a50 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d  ags & STK_Null)=
10a60 3d 30 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70  =0 ) pc = pOp->p
10a70 32 2d 31 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  2-1;.  if( pOp->
10a80 70 31 3e 30 20 29 7b 20 50 4f 50 53 54 41 43 4b  p1>0 ){ POPSTACK
10a90 3b 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ; }.  break;.}..
10aa0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52  /* Opcode: MakeR
10ab0 65 63 6f 72 64 20 50 31 20 50 32 20 2a 0a 2a 2a  ecord P1 P2 *.**
10ac0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
10ad0 74 6f 70 20 50 31 20 65 6e 74 72 69 65 73 20 6f  top P1 entries o
10ae0 66 20 74 68 65 20 73 74 61 63 6b 20 69 6e 74 6f  f the stack into
10af0 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 0a   a single entry.
10b00 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
10b10 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65  use as a data re
10b20 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61  cord in a databa
10b30 73 65 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a  se table.  The.*
10b40 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65  * details of the
10b50 20 66 6f 72 6d 61 74 20 61 72 65 20 69 72 72 65   format are irre
10b60 6c 61 76 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  lavant as long a
10b70 73 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 0a  s the OP_Column.
10b80 2a 2a 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65  ** opcode can de
10b90 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64 20  code the record 
10ba0 6c 61 74 65 72 2e 20 20 52 65 66 65 72 20 74 6f  later.  Refer to
10bb0 20 73 6f 75 72 63 65 20 63 6f 64 65 0a 2a 2a 20   source code.** 
10bc0 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  comments for the
10bd0 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20   details of the 
10be0 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 2e 0a 2a  record format..*
10bf0 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 74 72  *.** If P2 is tr
10c00 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 61 6e  ue (non-zero) an
10c10 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
10c20 20 74 68 65 20 50 31 20 65 6e 74 72 69 65 73 0a   the P1 entries.
10c30 2a 2a 20 74 68 61 74 20 67 6f 20 69 6e 74 6f 20  ** that go into 
10c40 62 75 69 6c 64 69 6e 67 20 74 68 65 20 72 65 63  building the rec
10c50 6f 72 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ord is NULL, the
10c60 6e 20 61 64 64 20 73 6f 6d 65 20 65 78 74 72 61  n add some extra
10c70 0a 2a 2a 20 62 79 74 65 73 20 74 6f 20 74 68 65  .** bytes to the
10c80 20 72 65 63 6f 72 64 20 74 6f 20 6d 61 6b 65 20   record to make 
10c90 69 74 20 64 69 73 74 69 6e 63 74 20 66 6f 72 20  it distinct for 
10ca0 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 63 72  other entries cr
10cb0 65 61 74 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20  eated.** during 
10cc0 74 68 65 20 73 61 6d 65 20 72 75 6e 20 6f 66 20  the same run of 
10cd0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 65  the VDBE.  The e
10ce0 78 74 72 61 20 62 79 74 65 73 20 61 64 64 65 64  xtra bytes added
10cf0 20 61 72 65 20 61 0a 2a 2a 20 63 6f 75 6e 74 65   are a.** counte
10d00 72 20 74 68 61 74 20 69 73 20 72 65 73 65 74 20  r that is reset 
10d10 77 69 74 68 20 65 61 63 68 20 72 75 6e 20 6f 66  with each run of
10d20 20 74 68 65 20 56 44 42 45 2c 20 73 6f 20 72 65   the VDBE, so re
10d30 63 6f 72 64 73 0a 2a 2a 20 63 72 65 61 74 65 64  cords.** created
10d40 20 74 68 69 73 20 77 61 79 20 77 69 6c 6c 20 6e   this way will n
10d50 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ot necessarily b
10d60 65 20 64 69 73 74 69 6e 63 74 20 61 63 72 6f 73  e distinct acros
10d70 73 20 72 75 6e 73 2e 0a 2a 2a 20 42 75 74 20 74  s runs..** But t
10d80 68 65 79 20 73 68 6f 75 6c 64 20 62 65 20 64 69  hey should be di
10d90 73 74 69 6e 63 74 20 66 6f 72 20 74 72 61 6e 73  stinct for trans
10da0 69 65 6e 74 20 74 61 62 6c 65 73 20 28 63 72 65  ient tables (cre
10db0 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 4f 50  ated using.** OP
10dc0 5f 4f 70 65 6e 54 65 6d 70 29 20 77 68 69 63 68  _OpenTemp) which
10dd0 20 69 73 20 77 68 61 74 20 74 68 65 79 20 61 72   is what they ar
10de0 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 2e 0a  e intended for..
10df0 2a 2a 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20 54  **.** (Later:) T
10e00 68 65 20 50 32 3d 3d 31 20 6f 70 74 69 6f 6e 20  he P2==1 option 
10e10 77 61 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  was intended to 
10e20 6d 61 6b 65 20 4e 55 4c 4c 73 20 64 69 73 74 69  make NULLs disti
10e30 6e 63 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 55  nct.** for the U
10e40 4e 49 4f 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  NION operator.  
10e50 42 75 74 20 49 20 68 61 76 65 20 73 69 6e 63 65  But I have since
10e60 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
10e70 20 4e 55 4c 4c 73 0a 2a 2a 20 61 72 65 20 69 6e   NULLs.** are in
10e80 64 69 73 74 69 6e 63 74 20 66 6f 72 20 55 4e 49  distinct for UNI
10e90 4f 4e 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 74  ON.  So this opt
10ea0 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
10eb0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61  d..*/.case OP_Ma
10ec0 6b 65 52 65 63 6f 72 64 3a 20 7b 0a 20 20 63 68  keRecord: {.  ch
10ed0 61 72 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 0a  ar *zNewRecord;.
10ee0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
10ef0 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
10f00 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 64 78   i, j;.  int idx
10f10 57 69 64 74 68 3b 0a 20 20 75 33 32 20 61 64 64  Width;.  u32 add
10f20 72 3b 0a 20 20 69 6e 74 20 61 64 64 55 6e 69 71  r;.  int addUniq
10f30 75 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75  ue = 0;   /* Tru
10f40 65 20 74 6f 20 63 61 75 73 65 20 62 79 74 65 73  e to cause bytes
10f50 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
10f60 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 20  make the.       
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65 63  ** generated rec
10f90 6f 72 64 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  ord distinct */.
10fa0 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74  .  /* Assuming t
10fb0 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69  he record contai
10fc0 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65  ns N fields, the
10fd0 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c   record format l
10fe0 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74  ooks.  ** like t
10ff0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
11000 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11040 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 7c 20 69 64  ----.  **   | id
11050 78 30 20 7c 20 69 64 78 31 20 7c 20 2e 2e 2e 20  x0 | idx1 | ... 
11060 7c 20 69 64 78 28 4e 2d 31 29 20 7c 20 69 64 78  | idx(N-1) | idx
11070 28 4e 29 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e  (N) | data0 | ..
11080 2e 20 7c 20 64 61 74 61 28 4e 2d 31 29 20 7c 0a  . | data(N-1) |.
11090 20 20 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d    **   ---------
110a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
110b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
110c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
110d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a  ----------.  **.
110e0 20 20 2a 2a 20 41 6c 6c 20 64 61 74 61 20 66 69    ** All data fi
110f0 65 6c 64 73 20 61 72 65 20 63 6f 6e 76 65 72 74  elds are convert
11100 65 64 20 74 6f 20 73 74 72 69 6e 67 73 20 62 65  ed to strings be
11110 66 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65  fore being store
11120 64 20 61 6e 64 0a 20 20 2a 2a 20 61 72 65 20 73  d and.  ** are s
11130 74 6f 72 65 64 20 77 69 74 68 20 74 68 65 69 72  tored with their
11140 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
11150 73 2e 20 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  s.  NULL entries
11160 20 6f 6d 69 74 20 74 68 65 0a 20 20 2a 2a 20 6e   omit the.  ** n
11170 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 20  ull terminator. 
11180 20 54 68 75 73 20 61 6e 20 65 6d 70 74 79 20 73   Thus an empty s
11190 74 72 69 6e 67 20 75 73 65 73 20 31 20 62 79 74  tring uses 1 byt
111a0 65 20 61 6e 64 20 61 20 4e 55 4c 4c 20 75 73 65  e and a NULL use
111b0 73 0a 20 20 2a 2a 20 7a 65 72 6f 20 62 79 74 65  s.  ** zero byte
111c0 73 2e 20 20 44 61 74 61 28 30 29 20 69 73 20 74  s.  Data(0) is t
111d0 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 6c 6f  aken from the lo
111e0 77 65 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  west element of 
111f0 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2a 20 61  the stack.  ** a
11200 6e 64 20 64 61 74 61 28 4e 2d 31 29 20 69 73 20  nd data(N-1) is 
11210 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
11220 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
11230 45 61 63 68 20 6f 66 20 74 68 65 20 69 64 78 28  Each of the idx(
11240 29 20 65 6e 74 72 69 65 73 20 69 73 20 65 69 74  ) entries is eit
11250 68 65 72 20 31 2c 20 32 2c 20 6f 72 20 33 20 62  her 1, 2, or 3 b
11260 79 74 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ytes depending o
11270 6e 0a 20 20 2a 2a 20 68 6f 77 20 62 69 67 20 74  n.  ** how big t
11280 68 65 20 74 6f 74 61 6c 20 72 65 63 6f 72 64 20  he total record 
11290 69 73 2e 20 20 49 64 78 28 30 29 20 63 6f 6e 74  is.  Idx(0) cont
112a0 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
112b0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
112c0 2a 20 6f 66 20 64 61 74 61 28 30 29 2e 20 20 49  * of data(0).  I
112d0 64 78 28 6b 29 20 63 6f 6e 74 61 69 6e 73 20 74  dx(k) contains t
112e0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
112f0 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 28 6b   start of data(k
11300 29 2e 0a 20 20 2a 2a 20 49 64 78 28 4e 29 20 63  )..  ** Idx(N) c
11310 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 74 61  ontains the tota
11320 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
11330 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e  s in the record.
11340 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
11350 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 45 52 49   pOp->p1;.  VERI
11360 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b 31  FY( if( p->tos+1
11370 3c 6e 46 69 65 6c 64 20 29 20 67 6f 74 6f 20 6e  <nField ) goto n
11380 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b  ot_enough_stack;
11390 20 29 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a   ).  nByte = 0;.
113a0 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e    for(i=p->tos-n
113b0 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74  Field+1; i<=p->t
113c0 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  os; i++){.    if
113d0 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61  ( (aStack[i].fla
113e0 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 20 29  gs & STK_Null) )
113f0 7b 0a 20 20 20 20 20 20 61 64 64 55 6e 69 71 75  {.      addUniqu
11400 65 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  e = pOp->p2;.   
11410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
11420 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69  ( Stringify(p, i
11430 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
11440 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
11450 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20  aStack[i].n;.   
11460 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64   }.  }.  if( add
11470 55 6e 69 71 75 65 20 29 20 6e 42 79 74 65 20 2b  Unique ) nByte +
11480 3d 20 73 69 7a 65 6f 66 28 75 6e 69 71 75 65 43  = sizeof(uniqueC
11490 6e 74 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  nt);.  if( nByte
114a0 20 2b 20 6e 46 69 65 6c 64 20 2b 20 31 20 3c 20   + nField + 1 < 
114b0 32 35 36 20 29 7b 0a 20 20 20 20 69 64 78 57 69  256 ){.    idxWi
114c0 64 74 68 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dth = 1;.  }else
114d0 20 69 66 28 20 6e 42 79 74 65 20 2b 20 32 2a 6e   if( nByte + 2*n
114e0 46 69 65 6c 64 20 2b 20 32 20 3c 20 36 35 35 33  Field + 2 < 6553
114f0 36 20 29 7b 0a 20 20 20 20 69 64 78 57 69 64 74  6 ){.    idxWidt
11500 68 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  h = 2;.  }else{.
11510 20 20 20 20 69 64 78 57 69 64 74 68 20 3d 20 33      idxWidth = 3
11520 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 2b 3d  ;.  }.  nByte +=
11530 20 69 64 78 57 69 64 74 68 2a 28 6e 46 69 65 6c   idxWidth*(nFiel
11540 64 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 6e 42  d + 1);.  if( nB
11550 79 74 65 3e 4d 41 58 5f 42 59 54 45 53 5f 50 45  yte>MAX_BYTES_PE
11560 52 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20  R_ROW ){.    rc 
11570 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b  = SQLITE_TOOBIG;
11580 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
11590 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
115a0 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d  }.  zNewRecord =
115b0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
115c0 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 4e  Byte );.  if( zN
115d0 65 77 52 65 63 6f 72 64 3d 3d 30 20 29 20 67 6f  ewRecord==0 ) go
115e0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 6a 20 3d  to no_mem;.  j =
115f0 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 69 64 78   0;.  addr = idx
11600 57 69 64 74 68 2a 28 6e 46 69 65 6c 64 2b 31 29  Width*(nField+1)
11610 20 2b 20 61 64 64 55 6e 69 71 75 65 2a 73 69 7a   + addUnique*siz
11620 65 6f 66 28 75 6e 69 71 75 65 43 6e 74 29 3b 0a  eof(uniqueCnt);.
11630 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e    for(i=p->tos-n
11640 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74  Field+1; i<=p->t
11650 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4e  os; i++){.    zN
11660 65 77 52 65 63 6f 72 64 5b 6a 2b 2b 5d 20 3d 20  ewRecord[j++] = 
11670 61 64 64 72 20 26 20 30 78 66 66 3b 0a 20 20 20  addr & 0xff;.   
11680 20 69 66 28 20 69 64 78 57 69 64 74 68 3e 31 20   if( idxWidth>1 
11690 29 7b 0a 20 20 20 20 20 20 7a 4e 65 77 52 65 63  ){.      zNewRec
116a0 6f 72 64 5b 6a 2b 2b 5d 20 3d 20 28 61 64 64 72  ord[j++] = (addr
116b0 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 20 20 20  >>8)&0xff;.     
116c0 20 69 66 28 20 69 64 78 57 69 64 74 68 3e 32 20   if( idxWidth>2 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 52  ){.        zNewR
116e0 65 63 6f 72 64 5b 6a 2b 2b 5d 20 3d 20 28 61 64  ecord[j++] = (ad
116f0 64 72 3e 3e 31 36 29 26 30 78 66 66 3b 0a 20 20  dr>>16)&0xff;.  
11700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11710 69 66 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66  if( (aStack[i].f
11720 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29  lags & STK_Null)
11730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  ==0 ){.      add
11740 72 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e  r += aStack[i].n
11750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4e  ;.    }.  }.  zN
11760 65 77 52 65 63 6f 72 64 5b 6a 2b 2b 5d 20 3d 20  ewRecord[j++] = 
11770 61 64 64 72 20 26 20 30 78 66 66 3b 0a 20 20 69  addr & 0xff;.  i
11780 66 28 20 69 64 78 57 69 64 74 68 3e 31 20 29 7b  f( idxWidth>1 ){
11790 0a 20 20 20 20 7a 4e 65 77 52 65 63 6f 72 64 5b  .    zNewRecord[
117a0 6a 2b 2b 5d 20 3d 20 28 61 64 64 72 3e 3e 38 29  j++] = (addr>>8)
117b0 26 30 78 66 66 3b 0a 20 20 20 20 69 66 28 20 69  &0xff;.    if( i
117c0 64 78 57 69 64 74 68 3e 32 20 29 7b 0a 20 20 20  dxWidth>2 ){.   
117d0 20 20 20 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 2b     zNewRecord[j+
117e0 2b 5d 20 3d 20 28 61 64 64 72 3e 3e 31 36 29 26  +] = (addr>>16)&
117f0 30 78 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  0xff;.    }.  }.
11800 20 20 69 66 28 20 61 64 64 55 6e 69 71 75 65 20    if( addUnique 
11810 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  ){.    memcpy(&z
11820 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 26 75  NewRecord[j], &u
11830 6e 69 71 75 65 43 6e 74 2c 20 73 69 7a 65 6f 66  niqueCnt, sizeof
11840 28 75 6e 69 71 75 65 43 6e 74 29 29 3b 0a 20 20  (uniqueCnt));.  
11850 20 20 75 6e 69 71 75 65 43 6e 74 2b 2b 3b 0a 20    uniqueCnt++;. 
11860 20 20 20 6a 20 2b 3d 20 73 69 7a 65 6f 66 28 75     j += sizeof(u
11870 6e 69 71 75 65 43 6e 74 29 3b 0a 20 20 7d 0a 20  niqueCnt);.  }. 
11880 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46   for(i=p->tos-nF
11890 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f  ield+1; i<=p->to
118a0 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
118b0 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67   (aStack[i].flag
118c0 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30  s & STK_Null)==0
118d0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
118e0 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c  (&zNewRecord[j],
118f0 20 7a 53 74 61 63 6b 5b 69 5d 2c 20 61 53 74 61   zStack[i], aSta
11900 63 6b 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20 20 20  ck[i].n);.      
11910 6a 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e  j += aStack[i].n
11920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 50 6f  ;.    }.  }.  Po
11930 70 53 74 61 63 6b 28 70 2c 20 6e 46 69 65 6c 64  pStack(p, nField
11940 29 3b 0a 20 20 56 45 52 49 46 59 28 20 4e 65 65  );.  VERIFY( Nee
11950 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73  dStack(p, p->tos
11960 2b 31 29 3b 20 29 0a 20 20 70 2d 3e 74 6f 73 2b  +1); ).  p->tos+
11970 2b 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74  +;.  aStack[p->t
11980 6f 73 5d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  os].n = nByte;. 
11990 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e   aStack[p->tos].
119a0 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 20  flags = STK_Str 
119b0 7c 20 53 54 4b 5f 44 79 6e 3b 0a 20 20 7a 53 74  | STK_Dyn;.  zSt
119c0 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 7a 4e  ack[p->tos] = zN
119d0 65 77 52 65 63 6f 72 64 3b 0a 20 20 62 72 65 61  ewRecord;.  brea
119e0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
119f0 20 4d 61 6b 65 4b 65 79 20 50 31 20 50 32 20 2a   MakeKey P1 P2 *
11a00 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  .**.** Convert t
11a10 68 65 20 74 6f 70 20 50 31 20 65 6e 74 72 69 65  he top P1 entrie
11a20 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  s of the stack i
11a30 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74  nto a single ent
11a40 72 79 20 73 75 69 74 61 62 6c 65 0a 2a 2a 20 66  ry suitable.** f
11a50 6f 72 20 75 73 65 20 61 73 20 74 68 65 20 6b 65  or use as the ke
11a60 79 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20  y in an index.  
11a70 54 68 65 20 74 6f 70 20 50 31 20 72 65 63 6f 72  The top P1 recor
11a80 64 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 76 65 72  ds are.** conver
11a90 74 65 64 20 74 6f 20 73 74 72 69 6e 67 73 20 61  ted to strings a
11aa0 6e 64 20 6d 65 72 67 65 64 2e 20 20 54 68 65 20  nd merged.  The 
11ab0 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 73  null-terminators
11ac0 20 0a 2a 2a 20 61 72 65 20 72 65 74 61 69 6e 65   .** are retaine
11ad0 64 20 61 6e 64 20 75 73 65 64 20 61 73 20 73 65  d and used as se
11ae0 70 61 72 61 74 6f 72 73 2e 0a 2a 2a 20 54 68 65  parators..** The
11af0 20 6c 6f 77 65 73 74 20 65 6e 74 72 79 20 69 6e   lowest entry in
11b00 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
11b10 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 61 6e  e first field an
11b20 64 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  d the top of the
11b30 0a 2a 2a 20 73 74 61 63 6b 20 62 65 63 6f 6d 65  .** stack become
11b40 73 20 74 68 65 20 6c 61 73 74 2e 0a 2a 2a 0a 2a  s the last..**.*
11b50 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20 7a  * If P2 is not z
11b60 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  ero, then the or
11b70 69 67 69 6e 61 6c 20 65 6e 74 72 69 65 73 20 72  iginal entries r
11b80 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73 74 61  emain on the sta
11b90 63 6b 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65  ck.** and the ne
11ba0 77 20 6b 65 79 20 69 73 20 70 75 73 68 65 64 20  w key is pushed 
11bb0 6f 6e 20 74 6f 70 2e 20 20 49 66 20 50 32 20 69  on top.  If P2 i
11bc0 73 20 7a 65 72 6f 2c 20 74 68 65 20 6f 72 69 67  s zero, the orig
11bd0 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 69 73 20  inal.** data is 
11be0 70 6f 70 70 65 64 20 6f 66 66 20 74 68 65 20 73  popped off the s
11bf0 74 61 63 6b 20 66 69 72 73 74 20 74 68 65 6e 20  tack first then 
11c00 74 68 65 20 6e 65 77 20 6b 65 79 20 69 73 20 70  the new key is p
11c10 75 73 68 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  ushed.** back in
11c20 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a   its place..**.*
11c30 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4d 61 6b 65  * See also: Make
11c40 49 64 78 4b 65 79 2c 20 53 6f 72 74 4d 61 6b 65  IdxKey, SortMake
11c50 4b 65 79 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  Key.*/./* Opcode
11c60 3a 20 4d 61 6b 65 49 64 78 4b 65 79 20 50 31 20  : MakeIdxKey P1 
11c70 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65  P2 *.**.** Conve
11c80 72 74 20 74 68 65 20 74 6f 70 20 50 31 20 65 6e  rt the top P1 en
11c90 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 74 61  tries of the sta
11ca0 63 6b 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ck into a single
11cb0 20 65 6e 74 72 79 20 73 75 69 74 61 62 6c 65 0a   entry suitable.
11cc0 2a 2a 20 66 6f 72 20 75 73 65 20 61 73 20 74 68  ** for use as th
11cd0 65 20 6b 65 79 20 69 6e 20 61 6e 20 69 6e 64 65  e key in an inde
11ce0 78 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c  x.  In addition,
11cf0 20 74 61 6b 65 20 6f 6e 65 20 61 64 64 69 74 69   take one additi
11d00 6f 6e 61 6c 20 69 6e 74 65 67 65 72 0a 2a 2a 20  onal integer.** 
11d10 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b  off of the stack
11d20 2c 20 74 72 65 61 74 20 74 68 61 74 20 69 6e 74  , treat that int
11d30 65 67 65 72 20 61 73 20 61 20 66 6f 75 72 2d 62  eger as a four-b
11d40 79 74 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  yte record numbe
11d50 72 2c 20 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64  r, and.** append
11d60 20 74 68 65 20 66 6f 75 72 20 62 79 74 65 73 20   the four bytes 
11d70 74 6f 20 74 68 65 20 6b 65 79 2e 20 20 54 68 75  to the key.  Thu
11d80 73 20 61 20 74 6f 74 61 6c 20 6f 66 20 50 31 2b  s a total of P1+
11d90 31 20 65 6e 74 72 69 65 73 20 61 72 65 0a 2a 2a  1 entries are.**
11da0 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
11db0 20 73 74 61 63 6b 20 66 6f 72 20 74 68 69 73 20   stack for this 
11dc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
11dd0 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 69  a single entry i
11de0 73 20 70 75 73 68 65 64 0a 2a 2a 20 62 61 63 6b  s pushed.** back
11df0 2e 20 20 54 68 65 20 66 69 72 73 74 20 50 31 20  .  The first P1 
11e00 65 6e 74 72 69 65 73 20 74 68 61 74 20 61 72 65  entries that are
11e10 20 70 6f 70 70 65 64 20 61 72 65 20 73 74 72 69   popped are stri
11e20 6e 67 73 20 61 6e 64 20 74 68 65 20 6c 61 73 74  ngs and the last
11e30 0a 2a 2a 20 65 6e 74 72 79 20 28 74 68 65 20 6c  .** entry (the l
11e40 6f 77 65 73 74 20 6f 6e 20 74 68 65 20 73 74 61  owest on the sta
11e50 63 6b 29 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ck) is an intege
11e60 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  r record number.
11e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 76 65  .**.** The conve
11e80 72 73 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  rstion of the fi
11e90 72 73 74 20 50 31 20 73 74 72 69 6e 67 20 65 6e  rst P1 string en
11ea0 74 72 69 65 73 20 6f 63 63 75 72 73 20 6a 75 73  tries occurs jus
11eb0 74 20 6c 69 6b 65 20 69 6e 0a 2a 2a 20 4d 61 6b  t like in.** Mak
11ec0 65 4b 65 79 2e 20 20 45 61 63 68 20 65 6e 74 72  eKey.  Each entr
11ed0 79 20 69 73 20 73 65 70 61 72 61 74 65 64 20 66  y is separated f
11ee0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62  rom the others b
11ef0 79 20 61 20 6e 75 6c 6c 2e 0a 2a 2a 20 54 68 65  y a null..** The
11f00 20 65 6e 74 69 72 65 20 63 6f 6e 63 61 74 65 6e   entire concaten
11f10 61 74 69 6f 6e 20 69 73 20 6e 75 6c 6c 2d 74 65  ation is null-te
11f20 72 6d 69 6e 61 74 65 64 2e 20 20 54 68 65 20 6c  rminated.  The l
11f30 6f 77 65 73 74 20 65 6e 74 72 79 0a 2a 2a 20 69  owest entry.** i
11f40 6e 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  n the stack is t
11f50 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 61  he first field a
11f60 6e 64 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  nd the top of th
11f70 65 20 73 74 61 63 6b 20 62 65 63 6f 6d 65 73 20  e stack becomes 
11f80 74 68 65 0a 2a 2a 20 6c 61 73 74 2e 0a 2a 2a 0a  the.** last..**.
11f90 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20  ** If P2 is not 
11fa0 7a 65 72 6f 20 61 6e 64 20 6f 6e 65 20 6f 72 20  zero and one or 
11fb0 6d 6f 72 65 20 6f 66 20 74 68 65 20 50 31 20 65  more of the P1 e
11fc0 6e 74 72 69 65 73 20 74 68 61 74 20 67 6f 20 69  ntries that go i
11fd0 6e 74 6f 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  nto the.** gener
11fe0 61 74 65 64 20 6b 65 79 20 69 73 20 4e 55 4c 4c  ated key is NULL
11ff0 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
12000 32 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 20  2 after the new 
12010 6b 65 79 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  key has been.** 
12020 70 75 73 68 65 64 20 6f 6e 20 74 68 65 20 73 74  pushed on the st
12030 61 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ack.  In other w
12040 6f 72 64 73 2c 20 6a 75 6d 70 20 74 6f 20 50 32  ords, jump to P2
12050 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 0a 2a   if the key is.*
12060 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
12070 62 65 20 75 6e 69 71 75 65 2e 20 20 54 68 69 73  be unique.  This
12080 20 6a 75 6d 70 20 63 61 6e 20 62 65 20 75 73 65   jump can be use
12090 64 20 74 6f 20 73 6b 69 70 20 61 20 73 75 62 73  d to skip a subs
120a0 65 71 75 65 6e 74 0a 2a 2a 20 75 6e 69 71 75 65  equent.** unique
120b0 6e 65 73 73 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  ness test..**.**
120c0 20 53 65 65 20 61 6c 73 6f 3a 20 20 4d 61 6b 65   See also:  Make
120d0 4b 65 79 2c 20 53 6f 72 74 4d 61 6b 65 4b 65 79  Key, SortMakeKey
120e0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65  .*/.case OP_Make
120f0 49 64 78 4b 65 79 3a 0a 63 61 73 65 20 4f 50 5f  IdxKey:.case OP_
12100 4d 61 6b 65 4b 65 79 3a 20 7b 0a 20 20 63 68 61  MakeKey: {.  cha
12110 72 20 2a 7a 4e 65 77 4b 65 79 3b 0a 20 20 69 6e  r *zNewKey;.  in
12120 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e  t nByte;.  int n
12130 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 61 64 64  Field;.  int add
12140 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 2c 20  Rowid;.  int i, 
12150 6a 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 61 69 6e  j;.  int contain
12160 73 4e 75 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 64  sNull = 0;..  ad
12170 64 52 6f 77 69 64 20 3d 20 70 4f 70 2d 3e 6f 70  dRowid = pOp->op
12180 63 6f 64 65 3d 3d 4f 50 5f 4d 61 6b 65 49 64 78  code==OP_MakeIdx
12190 4b 65 79 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20  Key;.  nField = 
121a0 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 45 52 49 46  pOp->p1;.  VERIF
121b0 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b 31 2b  Y( if( p->tos+1+
121c0 61 64 64 52 6f 77 69 64 3c 6e 46 69 65 6c 64 20  addRowid<nField 
121d0 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
121e0 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 6e 42 79  h_stack; ).  nBy
121f0 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  te = 0;.  for(i=
12200 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b  p->tos-nField+1;
12210 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29   i<=p->tos; i++)
12220 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
12230 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  = aStack[i].flag
12240 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  s;.    int len;.
12250 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
12260 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 54 4b   if( flags & STK
12270 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 6e  _Null ){.      n
12280 42 79 74 65 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Byte += 2;.     
12290 20 63 6f 6e 74 61 69 6e 73 4e 75 6c 6c 20 3d 20   containsNull = 
122a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
122b0 20 66 6c 61 67 73 20 26 20 53 54 4b 5f 52 65 61   flags & STK_Rea
122c0 6c 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 61  l ){.      z = a
122d0 53 74 61 63 6b 5b 69 5d 2e 7a 3b 0a 20 20 20 20  Stack[i].z;.    
122e0 20 20 73 71 6c 69 74 65 52 65 61 6c 54 6f 53 6f    sqliteRealToSo
122f0 72 74 61 62 6c 65 28 61 53 74 61 63 6b 5b 69 5d  rtable(aStack[i]
12300 2e 72 2c 20 26 7a 5b 31 5d 29 3b 0a 20 20 20 20  .r, &z[1]);.    
12310 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20    z[0] = 0;.    
12320 20 20 52 65 6c 65 61 73 65 28 70 2c 20 69 29 3b    Release(p, i);
12330 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  .      len = str
12340 6c 65 6e 28 26 7a 5b 31 5d 29 3b 0a 20 20 20 20  len(&z[1]);.    
12350 20 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b    zStack[i] = 0;
12360 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 69 5d  .      aStack[i]
12370 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 52 65 61  .flags = STK_Rea
12380 6c 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b  l;.      aStack[
12390 69 5d 2e 6e 20 3d 20 6c 65 6e 2b 32 3b 0a 20 20  i].n = len+2;.  
123a0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 61 53 74      nByte += aSt
123b0 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7d 65  ack[i].n;.    }e
123c0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
123d0 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  STK_Int ){.     
123e0 20 7a 20 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 7a   z = aStack[i].z
123f0 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 69  ;.      aStack[i
12400 5d 2e 72 20 3d 20 61 53 74 61 63 6b 5b 69 5d 2e  ].r = aStack[i].
12410 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  i;.      sqliteR
12420 65 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 61 53  ealToSortable(aS
12430 74 61 63 6b 5b 69 5d 2e 72 2c 20 26 7a 5b 31 5d  tack[i].r, &z[1]
12440 29 3b 0a 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  );.      z[0] = 
12450 30 3b 0a 20 20 20 20 20 20 52 65 6c 65 61 73 65  0;.      Release
12460 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 6c 65  (p, i);.      le
12470 6e 20 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 31 5d  n = strlen(&z[1]
12480 29 3b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b 5b  );.      zStack[
12490 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 53  i] = 0;.      aS
124a0 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20  tack[i].flags = 
124b0 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 20 20 61  STK_Int;.      a
124c0 53 74 61 63 6b 5b 69 5d 2e 6e 20 3d 20 6c 65 6e  Stack[i].n = len
124d0 2b 32 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +2;.      nByte 
124e0 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 0a  += aStack[i].n;.
124f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12500 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
12510 20 53 54 4b 5f 53 74 72 20 29 3b 0a 20 20 20 20   STK_Str );.    
12520 20 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 7a    if( isNumber(z
12530 53 74 61 63 6b 5b 69 5d 29 20 29 7b 0a 20 20 20  Stack[i]) ){.   
12540 20 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e 72       aStack[i].r
12550 20 3d 20 61 74 6f 66 28 7a 53 74 61 63 6b 5b 69   = atof(zStack[i
12560 5d 29 3b 0a 20 20 20 20 20 20 20 20 52 65 6c 65  ]);.        Rele
12570 61 73 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  ase(p, i);.     
12580 20 20 20 7a 20 3d 20 61 53 74 61 63 6b 5b 69 5d     z = aStack[i]
12590 2e 7a 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .z;.        sqli
125a0 74 65 52 65 61 6c 54 6f 53 6f 72 74 61 62 6c 65  teRealToSortable
125b0 28 61 53 74 61 63 6b 5b 69 5d 2e 72 2c 20 26 7a  (aStack[i].r, &z
125c0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b  [1]);.        z[
125d0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
125e0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 26 7a 5b  len = strlen(&z[
125f0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 74  1]);.        zSt
12600 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  ack[i] = 0;.    
12610 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c      aStack[i].fl
12620 61 67 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a  ags = STK_Real;.
12630 20 20 20 20 20 20 20 20 61 53 74 61 63 6b 5b 69          aStack[i
12640 5d 2e 6e 20 3d 20 6c 65 6e 2b 32 3b 0a 20 20 20  ].n = len+2;.   
12650 20 20 20 7d 0a 20 20 20 20 20 20 6e 42 79 74 65     }.      nByte
12660 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b   += aStack[i].n;
12670 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12680 20 6e 42 79 74 65 2b 73 69 7a 65 6f 66 28 75 33   nByte+sizeof(u3
12690 32 29 3e 4d 41 58 5f 42 59 54 45 53 5f 50 45 52  2)>MAX_BYTES_PER
126a0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 3d  _ROW ){.    rc =
126b0 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
126c0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
126d0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
126e0 0a 20 20 69 66 28 20 61 64 64 52 6f 77 69 64 20  .  if( addRowid 
126f0 29 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f  ) nByte += sizeo
12700 66 28 75 33 32 29 3b 0a 20 20 7a 4e 65 77 4b 65  f(u32);.  zNewKe
12710 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
12720 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
12730 20 7a 4e 65 77 4b 65 79 3d 3d 30 20 29 20 67 6f   zNewKey==0 ) go
12740 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 6a 20 3d  to no_mem;.  j =
12750 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74   0;.  for(i=p->t
12760 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
12770 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20  p->tos; i++){.  
12780 20 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e    if( aStack[i].
12790 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c  flags & STK_Null
127a0 20 29 7b 0a 20 20 20 20 20 20 7a 4e 65 77 4b 65   ){.      zNewKe
127b0 79 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  y[j++] = 0;.    
127c0 20 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20 3d    zNewKey[j++] =
127d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
127e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4e 65       memcpy(&zNe
127f0 77 4b 65 79 5b 6a 5d 2c 20 7a 53 74 61 63 6b 5b  wKey[j], zStack[
12800 69 5d 20 3f 20 7a 53 74 61 63 6b 5b 69 5d 20 3a  i] ? zStack[i] :
12810 20 61 53 74 61 63 6b 5b 69 5d 2e 7a 2c 20 61 53   aStack[i].z, aS
12820 74 61 63 6b 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20  tack[i].n);.    
12830 20 20 6a 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d    j += aStack[i]
12840 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  .n;.    }.  }.  
12850 69 66 28 20 61 64 64 52 6f 77 69 64 20 29 7b 0a  if( addRowid ){.
12860 20 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20      u32 iKey;.  
12870 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20    Integerify(p, 
12880 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 29 3b 0a  p->tos-nField);.
12890 20 20 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f      iKey = intTo
128a0 4b 65 79 28 61 53 74 61 63 6b 5b 70 2d 3e 74 6f  Key(aStack[p->to
128b0 73 2d 6e 46 69 65 6c 64 5d 2e 69 29 3b 0a 20 20  s-nField].i);.  
128c0 20 20 6d 65 6d 63 70 79 28 26 7a 4e 65 77 4b 65    memcpy(&zNewKe
128d0 79 5b 6a 5d 2c 20 26 69 4b 65 79 2c 20 73 69 7a  y[j], &iKey, siz
128e0 65 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 50  eof(u32));.    P
128f0 6f 70 53 74 61 63 6b 28 70 2c 20 6e 46 69 65 6c  opStack(p, nFiel
12900 64 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  d+1);.    if( pO
12910 70 2d 3e 70 32 20 26 26 20 63 6f 6e 74 61 69 6e  p->p2 && contain
12920 73 4e 75 6c 6c 20 29 20 70 63 20 3d 20 70 4f 70  sNull ) pc = pOp
12930 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  ->p2 - 1;.  }els
12940 65 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e{.    if( pOp->
12950 70 32 3d 3d 30 20 29 20 50 6f 70 53 74 61 63 6b  p2==0 ) PopStack
12960 28 70 2c 20 6e 46 69 65 6c 64 2b 61 64 64 52 6f  (p, nField+addRo
12970 77 69 64 29 3b 0a 20 20 7d 0a 20 20 56 45 52 49  wid);.  }.  VERI
12980 46 59 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c  FY( NeedStack(p,
12990 20 70 2d 3e 74 6f 73 2b 31 29 3b 20 29 0a 20 20   p->tos+1); ).  
129a0 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 61 53 74 61  p->tos++;.  aSta
129b0 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e  ck[p->tos].n = n
129c0 42 79 74 65 3b 0a 20 20 61 53 74 61 63 6b 5b 70  Byte;.  aStack[p
129d0 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  ->tos].flags = S
129e0 54 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e 3b 0a  TK_Str|STK_Dyn;.
129f0 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    zStack[p->tos]
12a00 20 3d 20 7a 4e 65 77 4b 65 79 3b 0a 20 20 62 72   = zNewKey;.  br
12a10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12a20 65 3a 20 49 6e 63 72 4b 65 79 20 2a 20 2a 20 2a  e: IncrKey * * *
12a30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 70 20 6f  .**.** The top o
12a40 66 20 74 68 65 20 73 74 61 63 6b 20 73 68 6f 75  f the stack shou
12a50 6c 64 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ld contain an in
12a60 64 65 78 20 6b 65 79 20 67 65 6e 65 72 61 74 65  dex key generate
12a70 64 20 62 79 0a 2a 2a 20 54 68 65 20 4d 61 6b 65  d by.** The Make
12a80 4b 65 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  Key opcode.  Thi
12a90 73 20 72 6f 75 74 69 6e 65 20 69 6e 63 72 65 61  s routine increa
12aa0 73 65 73 20 74 68 65 20 6c 65 61 73 74 20 73 69  ses the least si
12ab0 67 6e 69 66 69 63 61 6e 74 0a 2a 2a 20 62 79 74  gnificant.** byt
12ac0 65 20 6f 66 20 74 68 61 74 20 6b 65 79 20 62 79  e of that key by
12ad0 20 6f 6e 65 2e 20 20 54 68 69 73 20 69 73 20 75   one.  This is u
12ae0 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
12af0 4d 6f 76 65 54 6f 20 6f 70 63 6f 64 65 0a 2a 2a  MoveTo opcode.**
12b00 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 74 68   will move to th
12b10 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 67 72  e first entry gr
12b20 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b  eater than the k
12b30 65 79 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ey rather than t
12b40 6f 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 74 73  o.** the key its
12b50 65 6c 66 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  elf..*/.case OP_
12b60 49 6e 63 72 4b 65 79 3a 20 7b 0a 20 20 69 6e 74  IncrKey: {.  int
12b70 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 0a   tos = p->tos;..
12b80 20 20 56 45 52 49 46 59 28 20 69 66 28 20 74 6f    VERIFY( if( to
12b90 73 3c 30 20 29 20 67 6f 74 6f 20 62 61 64 5f 69  s<0 ) goto bad_i
12ba0 6e 73 74 72 75 63 74 69 6f 6e 20 29 3b 0a 20 20  nstruction );.  
12bb0 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
12bc0 20 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f   tos) ) goto no_
12bd0 6d 65 6d 3b 0a 20 20 69 66 28 20 61 53 74 61 63  mem;.  if( aStac
12be0 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53  k[tos].flags & S
12bf0 54 4b 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20  TK_Static ){.   
12c00 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
12c10 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 61 53 74 61  liteMalloc( aSta
12c20 63 6b 5b 74 6f 73 5d 2e 6e 20 29 3b 0a 20 20 20  ck[tos].n );.   
12c30 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 53   memcpy(zNew, zS
12c40 74 61 63 6b 5b 74 6f 73 5d 2c 20 61 53 74 61 63  tack[tos], aStac
12c50 6b 5b 74 6f 73 5d 2e 6e 29 3b 0a 20 20 20 20 7a  k[tos].n);.    z
12c60 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 7a 4e 65  Stack[tos] = zNe
12c70 77 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f  w;.    aStack[to
12c80 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53  s].flags = STK_S
12c90 74 72 20 7c 20 53 54 4b 5f 44 79 6e 3b 0a 20 20  tr | STK_Dyn;.  
12ca0 7d 0a 20 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 5b  }.  zStack[tos][
12cb0 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2d 31 5d  aStack[tos].n-1]
12cc0 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ++;.  break;.}..
12cd0 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b  /* Opcode: Check
12ce0 70 6f 69 6e 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  point * * *.**.*
12cf0 2a 20 42 65 67 69 6e 20 61 20 63 68 65 63 6b 70  * Begin a checkp
12d00 6f 69 6e 74 2e 20 20 41 20 63 68 65 63 6b 70 6f  oint.  A checkpo
12d10 69 6e 74 20 69 73 20 74 68 65 20 62 65 67 69 6e  int is the begin
12d20 6e 69 6e 67 20 6f 66 20 61 20 6f 70 65 72 61 74  ning of a operat
12d30 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 70  ion that.** is p
12d40 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
12d50 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
12d60 77 68 69 63 68 20 6d 69 67 68 74 20 6e 65 65 64  which might need
12d70 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
12d80 63 6b 0a 2a 2a 20 69 74 73 65 6c 66 20 77 69 74  ck.** itself wit
12d90 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
12da0 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 72  he containing tr
12db0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 63 68  ansaction.  A ch
12dc0 65 63 6b 70 6f 69 6e 74 20 77 69 6c 6c 0a 2a 2a  eckpoint will.**
12dd0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
12de0 79 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  y committed or r
12df0 6f 6c 6c 62 61 63 6b 20 77 68 65 6e 20 74 68 65  ollback when the
12e00 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2f 0a   VDBE halts..*/.
12e10 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69  case OP_Checkpoi
12e20 6e 74 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c  nt: {.  rc = sql
12e30 69 74 65 42 74 72 65 65 42 65 67 69 6e 43 6b 70  iteBtreeBeginCkp
12e40 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  t(pBt);.  if( rc
12e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
12e60 62 2d 3e 70 42 65 54 65 6d 70 20 29 7b 0a 20 20  b->pBeTemp ){.  
12e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74     rc = sqliteBt
12e80 72 65 65 42 65 67 69 6e 43 6b 70 74 28 64 62 2d  reeBeginCkpt(db-
12e90 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 7d 0a 20  >pBeTemp);.  }. 
12ea0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
12eb0 63 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69 6f  code: Transactio
12ec0 6e 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65  n * * *.**.** Be
12ed0 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
12ee0 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74  n.  The transact
12ef0 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20  ion ends when a 
12f00 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61  Commit or Rollba
12f10 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20  ck.** opcode is 
12f20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65  encountered.  De
12f30 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f  pending on the O
12f40 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69  N CONFLICT setti
12f50 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ng, the.** trans
12f60 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73  action might als
12f70 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
12f80 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
12f90 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
12fa0 2a 2a 20 41 20 77 72 69 74 65 20 6c 6f 63 6b 20  ** A write lock 
12fb0 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
12fc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12fd0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
12fe0 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65  ion is.** starte
12ff0 64 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f  d.  No other pro
13000 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
13010 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
13020 77 68 69 6c 65 20 74 68 65 0a 2a 2a 20 74 72 61  while the.** tra
13030 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 6e 64 65  nsaction is unde
13040 72 77 61 79 2e 20 20 53 74 61 72 74 69 6e 67 20  rway.  Starting 
13050 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  a transaction al
13060 73 6f 20 63 72 65 61 74 65 73 20 61 0a 2a 2a 20  so creates a.** 
13070 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
13080 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
13090 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
130a0 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
130b0 67 65 73 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 61  ges.** can be ma
130c0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
130d0 73 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  se..*/.case OP_T
130e0 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20  ransaction: {.  
130f0 69 6e 74 20 62 75 73 79 20 3d 20 30 3b 0a 20 20  int busy = 0;.  
13100 69 66 28 20 64 62 2d 3e 70 42 65 54 65 6d 70 20  if( db->pBeTemp 
13110 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13120 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
13130 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a  s(db->pBeTemp);.
13140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13160 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
13170 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
13180 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  }.  do{.    rc =
13190 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
131a0 6e 54 72 61 6e 73 28 70 42 74 29 3b 0a 20 20 20  nTrans(pBt);.   
131b0 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
131c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
131d0 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 20 20 20  _BUSY: {.       
131e0 20 69 66 28 20 78 42 75 73 79 3d 3d 30 20 7c 7c   if( xBusy==0 ||
131f0 20 28 2a 78 42 75 73 79 29 28 70 42 75 73 79 41   (*xBusy)(pBusyA
13200 72 67 2c 20 22 22 2c 20 2b 2b 62 75 73 79 29 3d  rg, "", ++busy)=
13210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13220 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
13230 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  pzErrMsg, sqlite
13240 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 63  _error_string(rc
13250 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ), 0);.         
13260 20 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20   busy = 0;.     
13270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
13280 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13290 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
132a0 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 75 73 79  : {.        busy
132b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
132c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
132d0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
132e0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
132f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
13300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13310 77 68 69 6c 65 28 20 62 75 73 79 20 29 3b 0a 20  while( busy );. 
13320 20 75 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f   undoTransOnErro
13330 72 20 3d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a  r = 1;.  break;.
13340 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
13350 6d 6d 69 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  mmit * * *.**.**
13360 20 43 61 75 73 65 20 61 6c 6c 20 6d 6f 64 69 66   Cause all modif
13370 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  ications to the 
13380 64 61 74 61 62 61 73 65 20 74 68 61 74 20 68 61  database that ha
13390 76 65 20 62 65 65 6e 20 6d 61 64 65 20 73 69 6e  ve been made sin
133a0 63 65 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 54  ce the.** last T
133b0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 61 63  ransaction to ac
133c0 74 75 61 6c 6c 79 20 74 61 6b 65 20 65 66 66 65  tually take effe
133d0 63 74 2e 20 20 4e 6f 20 61 64 64 69 74 69 6f 6e  ct.  No addition
133e0 61 6c 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  al modifications
133f0 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  .** are allowed 
13400 75 6e 74 69 6c 20 61 6e 6f 74 68 65 72 20 74 72  until another tr
13410 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
13420 72 74 65 64 2e 20 20 54 68 65 20 43 6f 6d 6d 69  rted.  The Commi
13430 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  t instruction.**
13440 20 64 65 6c 65 74 65 73 20 74 68 65 20 6a 6f 75   deletes the jou
13450 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 72 65  rnal file and re
13460 6c 65 61 73 65 73 20 74 68 65 20 77 72 69 74 65  leases the write
13470 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13480 61 62 61 73 65 2e 0a 2a 2a 20 41 20 72 65 61 64  abase..** A read
13490 20 6c 6f 63 6b 20 63 6f 6e 74 69 6e 75 65 73 20   lock continues 
134a0 74 6f 20 62 65 20 68 65 6c 64 20 69 66 20 74 68  to be held if th
134b0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 63 75  ere are still cu
134c0 72 73 6f 72 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 63  rsors open..*/.c
134d0 61 73 65 20 4f 50 5f 43 6f 6d 6d 69 74 3a 20 7b  ase OP_Commit: {
134e0 0a 20 20 69 66 28 20 64 62 2d 3e 70 42 65 54 65  .  if( db->pBeTe
134f0 6d 70 3d 3d 30 20 7c 7c 20 28 72 63 20 3d 20 73  mp==0 || (rc = s
13500 71 6c 69 74 65 42 74 72 65 65 43 6f 6d 6d 69 74  qliteBtreeCommit
13510 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 29 3d 3d  (db->pBeTemp))==
13520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13530 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
13540 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
13550 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
13560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13570 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
13580 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
13590 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
135a0 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
135b0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
135c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
135d0 20 4f 70 63 6f 64 65 3a 20 52 6f 6c 6c 62 61 63   Opcode: Rollbac
135e0 6b 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61  k * * *.**.** Ca
135f0 75 73 65 20 61 6c 6c 20 6d 6f 64 69 66 69 63 61  use all modifica
13600 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 64 61 74  tions to the dat
13610 61 62 61 73 65 20 74 68 61 74 20 68 61 76 65 20  abase that have 
13620 62 65 65 6e 20 6d 61 64 65 20 73 69 6e 63 65 20  been made since 
13630 74 68 65 0a 2a 2a 20 6c 61 73 74 20 54 72 61 6e  the.** last Tran
13640 73 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e  saction to be un
13650 64 6f 6e 65 2e 20 54 68 65 20 64 61 74 61 62 61  done. The databa
13660 73 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  se is restored t
13670 6f 20 69 74 73 20 73 74 61 74 65 0a 2a 2a 20 62  o its state.** b
13680 65 66 6f 72 65 20 74 68 65 20 54 72 61 6e 73 61  efore the Transa
13690 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 77 61 73  ction opcode was
136a0 20 65 78 65 63 75 74 65 64 2e 20 20 4e 6f 20 61   executed.  No a
136b0 64 64 69 74 69 6f 6e 61 6c 20 6d 6f 64 69 66 69  dditional modifi
136c0 63 61 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 61  cations.** are a
136d0 6c 6c 6f 77 65 64 20 75 6e 74 69 6c 20 61 6e 6f  llowed until ano
136e0 74 68 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  ther transaction
136f0 20 69 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a   is started..**.
13700 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
13710 69 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ion automaticall
13720 79 20 63 6c 6f 73 65 73 20 61 6c 6c 20 63 75 72  y closes all cur
13730 73 6f 72 73 20 61 6e 64 20 72 65 6c 65 61 73 65  sors and release
13740 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 72 65  s both.** the re
13750 61 64 20 61 6e 64 20 77 72 69 74 65 20 6c 6f 63  ad and write loc
13760 6b 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ks on the databa
13770 73 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  se..*/.case OP_R
13780 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 69 66 28  ollback: {.  if(
13790 20 64 62 2d 3e 70 42 65 54 65 6d 70 20 29 7b 0a   db->pBeTemp ){.
137a0 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 52      sqliteBtreeR
137b0 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 42 65 54  ollback(db->pBeT
137c0 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  emp);.  }.  rc =
137d0 20 73 71 6c 69 74 65 42 74 72 65 65 52 6f 6c 6c   sqliteBtreeRoll
137e0 62 61 63 6b 28 70 42 74 29 3b 0a 20 20 73 71 6c  back(pBt);.  sql
137f0 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72  iteRollbackInter
13800 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
13810 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
13820 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69  pcode: ReadCooki
13830 65 20 2a 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 57  e * P2 *.**.** W
13840 68 65 6e 20 50 32 3d 3d 30 2c 20 0a 2a 2a 20 72  hen P2==0, .** r
13850 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 63  ead the schema c
13860 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64  ookie from the d
13870 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
13880 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
13890 65 0a 2a 2a 20 73 74 61 63 6b 2e 20 20 54 68 65  e.** stack.  The
138a0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
138b0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
138c0 74 20 69 73 20 75 73 65 64 20 6c 69 6b 65 20 61  t is used like a
138d0 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6e 75 6d 62   version.** numb
138e0 65 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  er for the datab
138f0 61 73 65 20 73 63 68 65 6d 61 2e 20 20 45 76 65  ase schema.  Eve
13900 72 79 74 69 6d 65 20 74 68 65 20 73 63 68 65 6d  rytime the schem
13910 61 20 63 68 61 6e 67 65 73 2c 20 74 68 65 0a 2a  a changes, the.*
13920 2a 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  * cookie changes
13930 20 74 6f 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d   to a new random
13940 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 6f 70   value.  This op
13950 63 6f 64 65 20 69 73 20 75 73 65 64 20 64 75 72  code is used dur
13960 69 6e 67 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  ing.** initializ
13970 61 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  ation to read th
13980 65 20 69 6e 69 74 69 61 6c 20 63 6f 6f 6b 69 65  e initial cookie
13990 20 76 61 6c 75 65 20 73 6f 20 74 68 61 74 20 73   value so that s
139a0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 64 61 74  ubsequent.** dat
139b0 61 62 61 73 65 20 61 63 63 65 73 73 65 73 20 63  abase accesses c
139c0 61 6e 20 76 65 72 69 66 79 20 74 68 61 74 20 74  an verify that t
139d0 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 6e 6f  he cookie has no
139e0 74 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  t changed..**.**
139f0 20 49 66 20 50 32 3e 30 2c 20 74 68 65 6e 20 72   If P2>0, then r
13a00 65 61 64 20 67 6c 6f 62 61 6c 20 64 61 74 61 62  ead global datab
13a10 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75  ase parameter nu
13a20 6d 62 65 72 20 50 32 2e 20 20 54 68 65 72 65 20  mber P2.  There 
13a30 69 73 0a 2a 2a 20 61 20 73 6d 61 6c 6c 20 66 69  is.** a small fi
13a40 78 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 67 6c  xed number of gl
13a50 6f 62 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  obal database pa
13a60 72 61 6d 65 74 65 72 73 2e 20 20 50 32 3d 3d 31  rameters.  P2==1
13a70 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   is the.** datab
13a80 61 73 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ase version numb
13a90 65 72 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68  er.  P2==2 is th
13aa0 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61  e recommended pa
13ab0 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger cache size..
13ac0 2a 2a 20 4f 74 68 65 72 20 70 61 72 61 6d 65 74  ** Other paramet
13ad0 65 72 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ers are currentl
13ae0 79 20 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  y unused..**.** 
13af0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  There must be a 
13b00 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
13b10 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
13b20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  r a transaction.
13b30 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  ** must be start
13b40 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75 73 74  ed or there must
13b50 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
13b60 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65 78  or) before.** ex
13b70 65 63 75 74 69 6e 67 20 74 68 69 73 20 69 6e 73  ecuting this ins
13b80 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
13b90 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 3a  e OP_ReadCookie:
13ba0 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2b 2b 70   {.  int i = ++p
13bb0 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 61 4d 65  ->tos;.  int aMe
13bc0 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  ta[SQLITE_N_BTRE
13bd0 45 5f 4d 45 54 41 5d 3b 0a 20 20 61 73 73 65 72  E_META];.  asser
13be0 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54  t( pOp->p2<SQLIT
13bf0 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29  E_N_BTREE_META )
13c00 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ;.  VERIFY( if( 
13c10 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e  NeedStack(p, p->
13c20 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  tos) ) goto no_m
13c30 65 6d 3b 20 29 0a 20 20 72 63 20 3d 20 73 71 6c  em; ).  rc = sql
13c40 69 74 65 42 74 72 65 65 47 65 74 4d 65 74 61 28  iteBtreeGetMeta(
13c50 70 42 74 2c 20 61 4d 65 74 61 29 3b 0a 20 20 61  pBt, aMeta);.  a
13c60 53 74 61 63 6b 5b 69 5d 2e 69 20 3d 20 61 4d 65  Stack[i].i = aMe
13c70 74 61 5b 31 2b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  ta[1+pOp->p2];. 
13c80 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73   aStack[i].flags
13c90 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 62 72   = STK_Int;.  br
13ca0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13cb0 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 2a 20 50  e: SetCookie * P
13cc0 32 20 2a 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 50  2 *.**.** When P
13cd0 32 3d 3d 30 2c 0a 2a 2a 20 74 68 69 73 20 6f 70  2==0,.** this op
13ce0 65 72 61 74 69 6f 6e 20 63 68 61 6e 67 65 73 20  eration changes 
13cf0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13d00 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f   schema cookie o
13d10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
13d20 2a 2a 20 54 68 65 20 6e 65 77 20 76 61 6c 75 65  ** The new value
13d30 20 69 73 20 74 6f 70 20 6f 66 20 74 68 65 20 73   is top of the s
13d40 74 61 63 6b 2e 0a 2a 2a 20 57 68 65 6e 20 50 32  tack..** When P2
13d50 3e 30 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  >0, the value of
13d60 20 67 6c 6f 62 61 6c 20 64 61 74 61 62 61 73 65   global database
13d70 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6e 75   parameter.** nu
13d80 6d 62 65 72 20 50 32 20 69 73 20 63 68 61 6e 67  mber P2 is chang
13d90 65 64 2e 20 20 53 65 65 20 52 65 61 64 43 6f 6f  ed.  See ReadCoo
13da0 6b 69 65 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  kie for more inf
13db0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a  ormation about.*
13dc0 2a 20 67 6c 6f 62 61 6c 20 64 61 74 61 62 61 73  * global databas
13dd0 65 20 70 61 72 61 6d 65 74 65 73 2e 0a 2a 2a 0a  e parametes..**.
13de0 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
13df0 6f 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74 73  okie changes its
13e00 20 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20   value whenever 
13e10 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
13e20 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20  ema changes..** 
13e30 54 68 61 74 20 77 61 79 2c 20 6f 74 68 65 72 20  That way, other 
13e40 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 72 65  processes can re
13e50 63 6f 67 6e 69 7a 65 20 77 68 65 6e 20 74 68 65  cognize when the
13e60 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
13e70 67 65 64 0a 2a 2a 20 61 6e 64 20 72 65 72 65 61  ged.** and rerea
13e80 64 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  d it..**.** A tr
13e90 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
13ea0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13eb0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
13ec0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20  opcode..*/.case 
13ed0 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a  OP_SetCookie: {.
13ee0 20 20 69 6e 74 20 61 4d 65 74 61 5b 53 51 4c 49    int aMeta[SQLI
13ef0 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 5d  TE_N_BTREE_META]
13f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
13f10 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p2<SQLITE_N_BTR
13f20 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 56 45 52  EE_META );.  VER
13f30 49 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 3c  IFY( if( p->tos<
13f40 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  0 ) goto not_eno
13f50 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 49  ugh_stack; ).  I
13f60 6e 74 65 67 65 72 69 66 79 28 70 2c 20 70 2d 3e  ntegerify(p, p->
13f70 74 6f 73 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  tos).  rc = sqli
13f80 74 65 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  teBtreeGetMeta(p
13f90 42 74 2c 20 61 4d 65 74 61 29 3b 0a 20 20 69 66  Bt, aMeta);.  if
13fa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13fb0 29 7b 0a 20 20 20 20 61 4d 65 74 61 5b 31 2b 70  ){.    aMeta[1+p
13fc0 4f 70 2d 3e 70 32 5d 20 3d 20 61 53 74 61 63 6b  Op->p2] = aStack
13fd0 5b 70 2d 3e 74 6f 73 5d 2e 69 3b 0a 20 20 20 20  [p->tos].i;.    
13fe0 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
13ff0 55 70 64 61 74 65 4d 65 74 61 28 70 42 74 2c 20  UpdateMeta(pBt, 
14000 61 4d 65 74 61 29 3b 0a 20 20 7d 0a 20 20 50 4f  aMeta);.  }.  PO
14010 50 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b 3b  PSTACK;.  break;
14020 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  .}../* Opcode: V
14030 65 72 69 66 79 43 6f 6f 6b 69 65 20 50 31 20 50  erifyCookie P1 P
14040 32 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  2 *.**.** Check 
14050 74 68 65 20 76 61 6c 75 65 20 6f 66 20 67 6c 6f  the value of glo
14060 62 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 72  bal database par
14070 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 50 32  ameter number P2
14080 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 73 75 72   and make.** sur
14090 65 20 69 74 20 69 73 20 65 71 75 61 6c 20 74 6f  e it is equal to
140a0 20 50 31 2e 20 20 50 32 3d 3d 30 20 69 73 20 74   P1.  P2==0 is t
140b0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
140c0 2e 20 20 50 31 3d 3d 31 20 69 73 0a 2a 2a 20 74  .  P1==1 is.** t
140d0 68 65 20 64 61 74 61 62 61 73 65 20 76 65 72 73  he database vers
140e0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 76 61 6c  ion.  If the val
140f0 75 65 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  ues do not match
14100 2c 20 61 62 6f 72 74 20 77 69 74 68 0a 2a 2a 20  , abort with.** 
14110 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
14120 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
14130 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
14140 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
14150 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
14160 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
14170 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
14180 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
14190 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
141a0 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
141b0 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
141c0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
141d0 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
141e0 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
141f0 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61  ..**.** Either a
14200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
14210 64 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  ds to have been 
14220 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f 50  started or an OP
14230 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74  _Open needs.** t
14240 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 28 74  o be executed (t
14250 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
14260 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20  ad lock) before 
14270 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a  this opcode is.*
14280 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61  * invoked..*/.ca
14290 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  se OP_VerifyCook
142a0 69 65 3a 20 7b 0a 20 20 69 6e 74 20 61 4d 65 74  ie: {.  int aMet
142b0 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  a[SQLITE_N_BTREE
142c0 5f 4d 45 54 41 5d 3b 0a 20 20 61 73 73 65 72 74  _META];.  assert
142d0 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45  ( pOp->p2<SQLITE
142e0 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
142f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74  .  rc = sqliteBt
14300 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
14310 61 4d 65 74 61 29 3b 0a 20 20 69 66 28 20 72 63  aMeta);.  if( rc
14320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
14330 4d 65 74 61 5b 31 2b 70 4f 70 2d 3e 70 32 5d 21  Meta[1+pOp->p2]!
14340 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20  =pOp->p1 ){.    
14350 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
14360 70 7a 45 72 72 4d 73 67 2c 20 22 64 61 74 61 62  pzErrMsg, "datab
14370 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
14380 68 61 6e 67 65 64 22 2c 20 30 29 3b 0a 20 20 20  hanged", 0);.   
14390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48   rc = SQLITE_SCH
143a0 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  EMA;.  }.  break
143b0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
143c0 4f 70 65 6e 20 50 31 20 50 32 20 50 33 0a 2a 2a  Open P1 P2 P3.**
143d0 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
143e0 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20  only cursor for 
143f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
14400 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
14410 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 74  ge is.** P2 in t
14420 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
14430 20 66 69 6c 65 2e 20 20 47 69 76 65 20 74 68 65   file.  Give the
14440 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69   new cursor an i
14450 64 65 6e 74 69 66 69 65 72 0a 2a 2a 20 6f 66 20  dentifier.** of 
14460 50 31 2e 20 20 54 68 65 20 50 31 20 76 61 6c 75  P1.  The P1 valu
14470 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63  es need not be c
14480 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c  ontiguous but al
14490 6c 20 50 31 20 76 61 6c 75 65 73 0a 2a 2a 20 73  l P1 values.** s
144a0 68 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69  hould be small i
144b0 6e 74 65 67 65 72 73 2e 20 20 49 74 20 69 73 20  ntegers.  It is 
144c0 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20  an error for P1 
144d0 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a  to be negative..
144e0 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 30 20 74  **.** If P2==0 t
144f0 68 65 6e 20 74 61 6b 65 20 74 68 65 20 72 6f 6f  hen take the roo
14500 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 72  t page number fr
14510 6f 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  om the top of th
14520 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
14530 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20 72  here will be a r
14540 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
14550 64 61 74 61 62 61 73 65 20 77 68 65 6e 65 76 65  database wheneve
14560 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  r there is an.**
14570 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20 49   open cursor.  I
14580 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
14590 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69 6f  as unlocked prio
145a0 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72 75  r to this instru
145b0 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61 20  ction.** then a 
145c0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63 71  read lock is acq
145d0 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  uired as part of
145e0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
145f0 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c 6f  n.  A read.** lo
14600 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20  ck allows other 
14610 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65 61  processes to rea
14620 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  d the database b
14630 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a 20  ut prohibits.** 
14640 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
14650 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e 67  s from modifying
14660 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14670 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  The read lock is
14680 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65  .** released whe
14690 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
146a0 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74 68  e closed.  If th
146b0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  is instruction a
146c0 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67 65  ttempts.** to ge
146d0 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62 75  t a read lock bu
146e0 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63 72  t fails, the scr
146f0 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20 77  ipt terminates w
14700 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
14710 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64 65  _BUSY error code
14720 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76  ..**.** The P3 v
14730 61 6c 75 65 20 69 73 20 74 68 65 20 6e 61 6d 65  alue is the name
14740 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
14750 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
14760 6e 65 64 2e 0a 2a 2a 20 54 68 65 20 50 33 20 76  ned..** The P3 v
14770 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 63 74 75  alue is not actu
14780 61 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68 69  ally used by thi
14790 73 20 6f 70 63 6f 64 65 20 61 6e 64 20 6d 61 79  s opcode and may
147a0 20 62 65 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 20   be.** omitted. 
147b0 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
147c0 6e 65 72 61 74 6f 72 20 75 73 75 61 6c 6c 79 20  nerator usually 
147d0 69 6e 73 65 72 74 73 20 74 68 65 20 69 6e 64 65  inserts the inde
147e0 78 20 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 6e 61  x or.** table na
147f0 6d 65 20 69 6e 74 6f 20 50 33 20 74 6f 20 6d 61  me into P3 to ma
14800 6b 65 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  ke the code easi
14810 65 72 20 74 6f 20 72 65 61 64 2e 0a 2a 2a 0a 2a  er to read..**.*
14820 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 41  * See also OpenA
14830 75 78 20 61 6e 64 20 4f 70 65 6e 57 72 69 74 65  ux and OpenWrite
14840 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
14850 4f 70 65 6e 41 75 78 20 50 31 20 50 32 20 50 33  OpenAux P1 P2 P3
14860 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65  .**.** Open a re
14870 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
14880 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
14890 74 61 62 6c 65 20 73 65 74 2e 20 20 54 68 69 73  table set.  This
148a0 20 6f 70 63 6f 64 65 0a 2a 2a 20 77 6f 72 6b 73   opcode.** works
148b0 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f 50   exactly like OP
148c0 5f 4f 70 65 6e 20 65 78 63 65 70 74 20 74 68 61  _Open except tha
148d0 74 20 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63  t it opens the c
148e0 75 72 73 6f 72 20 6f 6e 20 74 68 65 0a 2a 2a 20  ursor on the.** 
148f0 61 75 78 69 6c 69 61 72 79 20 74 61 62 6c 65 20  auxiliary table 
14900 73 65 74 20 28 74 68 65 20 66 69 6c 65 20 75 73  set (the file us
14910 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c  ed to store tabl
14920 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
14930 0a 2a 2a 20 43 52 45 41 54 45 20 54 45 4d 50 4f  .** CREATE TEMPO
14940 52 41 52 59 20 54 41 42 4c 45 29 20 69 6e 73 74  RARY TABLE) inst
14950 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
14960 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
14970 2e 0a 2a 2a 20 53 65 65 20 4f 50 5f 4f 70 65 6e  ..** See OP_Open
14980 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
14990 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
149a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57  /* Opcode: OpenW
149b0 72 69 74 65 20 50 31 20 50 32 20 50 33 0a 2a 2a  rite P1 P2 P3.**
149c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f  .** Open a read/
149d0 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d  write cursor nam
149e0 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62  ed P1 on the tab
149f0 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
14a00 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
14a10 73 20 50 32 2e 20 20 49 66 20 50 32 3d 3d 30 20  s P2.  If P2==0 
14a20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 72 6f  then take the ro
14a30 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot page number f
14a40 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  rom the stack..*
14a50 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
14a60 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74  ction works just
14a70 20 6c 69 6b 65 20 4f 70 65 6e 20 65 78 63 65 70   like Open excep
14a80 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20  t that it opens 
14a90 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e  the cursor.** in
14aa0 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65   read/write mode
14ab0 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e 20 74  .  For a given t
14ac0 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61 6e 20  able, there can 
14ad0 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  be one or more r
14ae0 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
14af0 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c 65 20  ors or a single 
14b00 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
14b10 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a  r but not both..
14b20 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f  **.** See also O
14b30 70 57 72 41 75 78 2e 0a 2a 2f 0a 2f 2a 20 4f 70  pWrAux..*/./* Op
14b40 63 6f 64 65 3a 20 4f 70 65 6e 57 72 41 75 78 20  code: OpenWrAux 
14b50 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 4f  P1 P2 P3.**.** O
14b60 70 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65  pen a read/write
14b70 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 61   cursor in the a
14b80 75 78 69 6c 69 61 72 79 20 74 61 62 6c 65 20 73  uxiliary table s
14b90 65 74 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  et.  This opcode
14ba0 20 77 6f 72 6b 73 0a 2a 2a 20 6a 75 73 74 20 6c   works.** just l
14bb0 69 6b 65 20 4f 70 65 6e 57 72 69 74 65 20 65 78  ike OpenWrite ex
14bc0 63 65 70 74 20 74 68 61 74 20 74 68 65 20 61 75  cept that the au
14bd0 78 69 6c 69 61 72 79 20 74 61 62 6c 65 20 73 65  xiliary table se
14be0 74 20 28 74 68 65 20 66 69 6c 65 20 75 73 65 64  t (the file used
14bf0 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 61 62  .** to store tab
14c00 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
14c10 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
14c20 52 59 20 54 41 42 4c 45 29 20 69 73 20 75 73 65  RY TABLE) is use
14c30 64 20 69 6e 20 70 6c 61 63 65 0a 2a 2a 20 6f 66  d in place.** of
14c40 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
14c50 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 61 73 65  se file..*/.case
14c60 20 4f 50 5f 4f 70 65 6e 41 75 78 3a 0a 63 61 73   OP_OpenAux:.cas
14c70 65 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 3a 0a  e OP_OpenWrAux:.
14c80 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74  case OP_OpenWrit
14c90 65 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 3a  e:.case OP_Open:
14ca0 20 7b 0a 20 20 69 6e 74 20 62 75 73 79 20 3d 20   {.  int busy = 
14cb0 30 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70  0;.  int i = pOp
14cc0 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20  ->p1;.  int tos 
14cd0 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20  = p->tos;.  int 
14ce0 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
14cf0 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20 42 74  int wrFlag;.  Bt
14d00 72 65 65 20 2a 70 58 3b 0a 20 20 73 77 69 74 63  ree *pX;.  switc
14d10 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
14d20 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4f 70  {.    case OP_Op
14d30 65 6e 3a 20 20 20 20 20 20 20 20 77 72 46 6c 61  en:        wrFla
14d40 67 20 3d 20 30 3b 20 20 70 58 20 3d 20 70 42 74  g = 0;  pX = pBt
14d50 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
14d60 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4f 70  ;.    case OP_Op
14d70 65 6e 57 72 69 74 65 3a 20 20 20 77 72 46 6c 61  enWrite:   wrFla
14d80 67 20 3d 20 31 3b 20 20 70 58 20 3d 20 70 42 74  g = 1;  pX = pBt
14d90 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
14da0 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4f 70  ;.    case OP_Op
14db0 65 6e 41 75 78 3a 20 20 20 20 20 77 72 46 6c 61  enAux:     wrFla
14dc0 67 20 3d 20 30 3b 20 20 70 58 20 3d 20 64 62 2d  g = 0;  pX = db-
14dd0 3e 70 42 65 54 65 6d 70 3b 20 20 62 72 65 61 6b  >pBeTemp;  break
14de0 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4f 70  ;.    case OP_Op
14df0 65 6e 57 72 41 75 78 3a 20 20 20 77 72 46 6c 61  enWrAux:   wrFla
14e00 67 20 3d 20 31 3b 20 20 70 58 20 3d 20 64 62 2d  g = 1;  pX = db-
14e10 3e 70 42 65 54 65 6d 70 3b 20 20 62 72 65 61 6b  >pBeTemp;  break
14e20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14e30 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pX!=0 );.  if( p
14e40 32 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  2<=0 ){.    if( 
14e50 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74  tos<0 ) goto not
14e60 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20  _enough_stack;. 
14e70 20 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c     Integerify(p,
14e80 20 74 6f 73 29 3b 0a 20 20 20 20 70 32 20 3d 20   tos);.    p2 = 
14e90 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69  p->aStack[tos].i
14ea0 3b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b 3b 0a  ;.    POPSTACK;.
14eb0 20 20 20 20 69 66 28 20 70 32 3c 32 20 29 7b 0a      if( p2<2 ){.
14ec0 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
14ed0 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
14ee0 22 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65  "root page numbe
14ef0 72 20 6c 65 73 73 20 74 68 61 6e 20 32 22 2c 20  r less than 2", 
14f00 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  0);.      rc = S
14f10 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
14f20 20 20 20 20 20 20 67 6f 74 6f 20 63 6c 65 61 6e        goto clean
14f30 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  up;.    }.  }.  
14f40 56 45 52 49 46 59 28 20 69 66 28 20 69 3c 30 20  VERIFY( if( i<0 
14f50 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72  ) goto bad_instr
14f60 75 63 74 69 6f 6e 3b 20 29 0a 20 20 69 66 28 20  uction; ).  if( 
14f70 69 3e 3d 70 2d 3e 6e 43 75 72 73 6f 72 20 29 7b  i>=p->nCursor ){
14f80 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
14f90 43 75 72 73 6f 72 20 2a 61 43 73 72 20 3d 20 73  Cursor *aCsr = s
14fa0 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
14fb0 3e 61 43 73 72 2c 20 28 69 2b 31 29 2a 73 69 7a  >aCsr, (i+1)*siz
14fc0 65 6f 66 28 43 75 72 73 6f 72 29 20 29 3b 0a 20  eof(Cursor) );. 
14fd0 20 20 20 69 66 28 20 61 43 73 72 3d 3d 30 20 29     if( aCsr==0 )
14fe0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
14ff0 20 20 70 2d 3e 61 43 73 72 20 3d 20 61 43 73 72    p->aCsr = aCsr
15000 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e  ;.    for(j=p->n
15010 43 75 72 73 6f 72 3b 20 6a 3c 3d 69 3b 20 6a 2b  Cursor; j<=i; j+
15020 2b 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  +){.      memset
15030 28 26 70 2d 3e 61 43 73 72 5b 6a 5d 2c 20 30 2c  (&p->aCsr[j], 0,
15040 20 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29   sizeof(Cursor))
15050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
15060 43 75 72 73 6f 72 20 3d 20 69 2b 31 3b 0a 20 20  Cursor = i+1;.  
15070 7d 0a 20 20 63 6c 65 61 6e 75 70 43 75 72 73 6f  }.  cleanupCurso
15080 72 28 26 70 2d 3e 61 43 73 72 5b 69 5d 29 3b 0a  r(&p->aCsr[i]);.
15090 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 73    memset(&p->aCs
150a0 72 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  r[i], 0, sizeof(
150b0 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 2d 3e 61  Cursor));.  p->a
150c0 43 73 72 5b 69 5d 2e 6e 75 6c 6c 52 6f 77 20 3d  Csr[i].nullRow =
150d0 20 31 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63   1;.  do{.    rc
150e0 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 43 75   = sqliteBtreeCu
150f0 72 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46  rsor(pX, p2, wrF
15100 6c 61 67 2c 20 26 70 2d 3e 61 43 73 72 5b 69 5d  lag, &p->aCsr[i]
15110 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  .pCursor);.    s
15120 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
15130 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
15140 55 53 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  USY: {.        i
15150 66 28 20 78 42 75 73 79 3d 3d 30 20 7c 7c 20 28  f( xBusy==0 || (
15160 2a 78 42 75 73 79 29 28 70 42 75 73 79 41 72 67  *xBusy)(pBusyArg
15170 2c 20 70 4f 70 2d 3e 70 33 2c 20 2b 2b 62 75 73  , pOp->p3, ++bus
15180 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
15190 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
151a0 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c  ng(pzErrMsg, sql
151b0 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
151c0 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
151d0 20 20 20 20 62 75 73 79 20 3d 20 30 3b 0a 20 20      busy = 0;.  
151e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
151f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15200 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
15210 5f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 62  _OK: {.        b
15220 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  usy = 0;.       
15230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15240 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
15250 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
15260 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
15270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15280 20 20 7d 77 68 69 6c 65 28 20 62 75 73 79 20 29    }while( busy )
15290 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
152a0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 54 65 6d   Opcode: OpenTem
152b0 70 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  p P1 P2 *.**.** 
152c0 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f  Open a new curso
152d0 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
152e0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
152f0 78 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  x in a temporary
15300 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
15310 65 2e 20 20 54 68 65 20 74 65 6d 70 6f 72 61 72  e.  The temporar
15320 79 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  y file is opened
15330 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e   read/write even
15340 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e   if .** the main
15350 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
15360 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 74 65 6d  d-only.  The tem
15370 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 64  porary file is d
15380 65 6c 65 74 65 64 0a 2a 2a 20 77 68 65 6e 20 74  eleted.** when t
15390 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
153a0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sed..**.** The c
153b0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
153c0 61 20 42 54 72 65 65 20 74 61 62 6c 65 20 69 66  a BTree table if
153d0 20 50 32 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20   P2==0 and to a 
153e0 42 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69  BTree index.** i
153f0 66 20 50 32 3d 3d 31 2e 20 20 41 20 42 54 72 65  f P2==1.  A BTre
15400 65 20 74 61 62 6c 65 20 6d 75 73 74 20 68 61 76  e table must hav
15410 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79  e an integer key
15420 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20 61 72   and can have ar
15430 62 69 74 72 61 72 79 0a 2a 2a 20 64 61 74 61 2e  bitrary.** data.
15440 20 20 41 20 42 54 72 65 65 20 69 6e 64 65 78 20    A BTree index 
15450 68 61 73 20 6e 6f 20 64 61 74 61 20 62 75 74 20  has no data but 
15460 63 61 6e 20 68 61 76 65 20 61 6e 20 61 72 62 69  can have an arbi
15470 74 72 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  trary key..**.**
15480 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
15490 75 73 65 64 20 66 6f 72 20 74 61 62 6c 65 73 20  used for tables 
154a0 74 68 61 74 20 65 78 69 73 74 20 66 6f 72 20 74  that exist for t
154b0 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 61  he duration of a
154c0 20 73 69 6e 67 6c 65 0a 2a 2a 20 53 51 4c 20 73   single.** SQL s
154d0 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 20 20  tatement only.  
154e0 54 61 62 6c 65 73 20 63 72 65 61 74 65 64 20 75  Tables created u
154f0 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50  sing CREATE TEMP
15500 4f 52 41 52 59 20 54 41 42 4c 45 0a 2a 2a 20 61  ORARY TABLE.** a
15510 72 65 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  re opened using 
15520 4f 50 5f 4f 70 65 6e 41 75 78 20 6f 72 20 4f 50  OP_OpenAux or OP
15530 5f 4f 70 65 6e 57 72 41 75 78 2e 20 20 22 54 65  _OpenWrAux.  "Te
15540 6d 70 6f 72 61 72 79 22 20 69 6e 20 74 68 65 0a  mporary" in the.
15550 2a 2a 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  ** context of th
15560 69 73 20 6f 70 63 6f 64 65 20 6d 65 61 6e 73 20  is opcode means 
15570 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e  for the duration
15580 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
15590 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 77 68   statement.** wh
155a0 65 72 65 61 73 20 22 54 65 6d 70 6f 72 61 72 79  ereas "Temporary
155b0 22 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  " in the context
155c0 20 6f 66 20 43 52 45 41 54 45 20 54 41 42 4c 45   of CREATE TABLE
155d0 20 6d 65 61 6e 73 20 66 6f 72 20 74 68 65 20 64   means for the d
155e0 75 72 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  uration.** of th
155f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
15600 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  the database.  S
15610 61 6d 65 20 77 6f 72 64 3b 20 64 69 66 66 65 72  ame word; differ
15620 65 6e 74 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2f  ent meanings..*/
15630 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 54 65 6d  .case OP_OpenTem
15640 70 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  p: {.  int i = p
15650 4f 70 2d 3e 70 31 3b 0a 20 20 43 75 72 73 6f 72  Op->p1;.  Cursor
15660 20 2a 70 43 78 3b 0a 20 20 56 45 52 49 46 59 28   *pCx;.  VERIFY(
15670 20 69 66 28 20 69 3c 30 20 29 20 67 6f 74 6f 20   if( i<0 ) goto 
15680 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b  bad_instruction;
15690 20 29 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e   ).  if( i>=p->n
156a0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e  Cursor ){.    in
156b0 74 20 6a 3b 0a 20 20 20 20 43 75 72 73 6f 72 20  t j;.    Cursor 
156c0 2a 61 43 73 72 20 3d 20 73 71 6c 69 74 65 52 65  *aCsr = sqliteRe
156d0 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 73 72 2c 20  alloc( p->aCsr, 
156e0 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 43 75 72  (i+1)*sizeof(Cur
156f0 73 6f 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  sor) );.    if( 
15700 61 43 73 72 3d 3d 30 20 29 7b 20 67 6f 74 6f 20  aCsr==0 ){ goto 
15710 6e 6f 5f 6d 65 6d 3b 20 7d 0a 20 20 20 20 70 2d  no_mem; }.    p-
15720 3e 61 43 73 72 20 3d 20 61 43 73 72 3b 0a 20 20  >aCsr = aCsr;.  
15730 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 43 75 72 73    for(j=p->nCurs
15740 6f 72 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b 29 7b 0a  or; j<=i; j++){.
15750 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
15760 3e 61 43 73 72 5b 6a 5d 2c 20 30 2c 20 73 69 7a  >aCsr[j], 0, siz
15770 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 0a 20 20  eof(Cursor));.  
15780 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73    }.    p->nCurs
15790 6f 72 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20  or = i+1;.  }.  
157a0 70 43 78 20 3d 20 26 70 2d 3e 61 43 73 72 5b 69  pCx = &p->aCsr[i
157b0 5d 3b 0a 20 20 63 6c 65 61 6e 75 70 43 75 72 73  ];.  cleanupCurs
157c0 6f 72 28 70 43 78 29 3b 0a 20 20 6d 65 6d 73 65  or(pCx);.  memse
157d0 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pCx, 0, sizeof
157e0 28 2a 70 43 78 29 29 3b 0a 20 20 70 43 78 2d 3e  (*pCx));.  pCx->
157f0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
15800 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4f  c = sqliteBtreeO
15810 70 65 6e 28 30 2c 20 30 2c 20 54 45 4d 50 5f 50  pen(0, 0, TEMP_P
15820 41 47 45 53 2c 20 26 70 43 78 2d 3e 70 42 74 29  AGES, &pCx->pBt)
15830 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15850 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67  = sqliteBtreeBeg
15860 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74  inTrans(pCx->pBt
15870 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15890 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b    if( pOp->p2 ){
158a0 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
158b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
158c0 74 65 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  teBtreeCreateInd
158d0 65 78 28 70 43 78 2d 3e 70 42 74 2c 20 26 70 67  ex(pCx->pBt, &pg
158e0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
158f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15910 69 74 65 42 74 72 65 65 43 75 72 73 6f 72 28 70  iteBtreeCursor(p
15920 43 78 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 31  Cx->pBt, pgno, 1
15930 2c 20 26 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  , &pCx->pCursor)
15940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15950 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
15960 73 71 6c 69 74 65 42 74 72 65 65 43 75 72 73 6f  sqliteBtreeCurso
15970 72 28 70 43 78 2d 3e 70 42 74 2c 20 32 2c 20 31  r(pCx->pBt, 2, 1
15980 2c 20 26 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  , &pCx->pCursor)
15990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
159a0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
159b0 65 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 0a  e: Close P1 * *.
159c0 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  **.** Close a cu
159d0 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20  rsor previously 
159e0 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49  opened as P1.  I
159f0 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  f P1 is not.** c
15a00 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74  urrently open, t
15a10 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
15a20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63  is a no-op..*/.c
15a30 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a  ase OP_Close: {.
15a40 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
15a50 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 26 26  1;.  if( i>=0 &&
15a60 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26   i<p->nCursor &&
15a70 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72   p->aCsr[i].pCur
15a80 73 6f 72 20 29 7b 0a 20 20 20 20 63 6c 65 61 6e  sor ){.    clean
15a90 75 70 43 75 72 73 6f 72 28 26 70 2d 3e 61 43 73  upCursor(&p->aCs
15aa0 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65  r[i]);.  }.  bre
15ab0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
15ac0 3a 20 4d 6f 76 65 54 6f 20 50 31 20 50 32 20 2a  : MoveTo P1 P2 *
15ad0 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74  .**.** Pop the t
15ae0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
15af0 61 6e 64 20 75 73 65 20 69 74 73 20 76 61 6c 75  and use its valu
15b00 65 20 61 73 20 61 20 6b 65 79 2e 20 20 52 65 70  e as a key.  Rep
15b10 6f 73 69 74 69 6f 6e 0a 2a 2a 20 63 75 72 73 6f  osition.** curso
15b20 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20  r P1 so that it 
15b30 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
15b40 72 79 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  ry with a matchi
15b50 6e 67 20 6b 65 79 2e 20 20 49 66 0a 2a 2a 20 74  ng key.  If.** t
15b60 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
15b70 73 20 6e 6f 20 72 65 63 6f 72 64 20 77 69 74 68  s no record with
15b80 20 61 20 6d 61 74 63 68 69 6e 67 20 6b 65 79 2c   a matching key,
15b90 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
15ba0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
15bb0 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
15bc0 74 20 72 65 63 6f 72 64 20 74 68 61 74 20 69 73  t record that is
15bd0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15be0 65 20 6b 65 79 2e 0a 2a 2a 20 49 66 20 74 68 65  e key..** If the
15bf0 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
15c00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15c10 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
15c20 20 6e 6f 74 20 7a 65 72 6f 2c 0a 2a 2a 20 74 68   not zero,.** th
15c30 65 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  en an immediate 
15c40 6a 75 6d 70 20 74 6f 20 50 32 20 69 73 20 6d 61  jump to P2 is ma
15c50 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
15c60 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
15c70 75 6e 64 2c 20 44 69 73 74 69 6e 63 74 0a 2a 2f  und, Distinct.*/
15c80 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 54 6f 3a  .case OP_MoveTo:
15c90 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
15ca0 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20  ->p1;.  int tos 
15cb0 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 43 75 72 73  = p->tos;.  Curs
15cc0 6f 72 20 2a 70 43 3b 0a 0a 20 20 56 45 52 49 46  or *pC;..  VERIF
15cd0 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67  Y( if( tos<0 ) g
15ce0 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
15cf0 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 69 3e  tack; ).  if( i>
15d00 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73  =0 && i<p->nCurs
15d10 6f 72 20 26 26 20 28 70 43 20 3d 20 26 70 2d 3e  or && (pC = &p->
15d20 61 43 73 72 5b 69 5d 29 2d 3e 70 43 75 72 73 6f  aCsr[i])->pCurso
15d30 72 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r!=0 ){.    int 
15d40 72 65 73 3b 0a 20 20 20 20 69 66 28 20 61 53 74  res;.    if( aSt
15d50 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26  ack[tos].flags &
15d60 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20   STK_Int ){.    
15d70 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 6e 74    int iKey = int
15d80 54 6f 4b 65 79 28 61 53 74 61 63 6b 5b 74 6f 73  ToKey(aStack[tos
15d90 5d 2e 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ].i);.      sqli
15da0 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  teBtreeMoveto(pC
15db0 2d 3e 70 43 75 72 73 6f 72 2c 20 28 63 68 61 72  ->pCursor, (char
15dc0 2a 29 26 69 4b 65 79 2c 20 73 69 7a 65 6f 66 28  *)&iKey, sizeof(
15dd0 69 6e 74 29 2c 20 26 72 65 73 29 3b 0a 20 20 20  int), &res);.   
15de0 20 20 20 70 43 2d 3e 6c 61 73 74 52 65 63 6e 6f     pC->lastRecno
15df0 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69   = aStack[tos].i
15e00 3b 0a 20 20 20 20 20 20 70 43 2d 3e 72 65 63 6e  ;.      pC->recn
15e10 6f 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  oIsValid = res==
15e20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
15e30 20 20 20 20 69 66 28 20 53 74 72 69 6e 67 69 66      if( Stringif
15e40 79 28 70 2c 20 74 6f 73 29 20 29 20 67 6f 74 6f  y(p, tos) ) goto
15e50 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 73   no_mem;.      s
15e60 71 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74 6f  qliteBtreeMoveto
15e70 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 7a 53  (pC->pCursor, zS
15e80 74 61 63 6b 5b 74 6f 73 5d 2c 20 61 53 74 61 63  tack[tos], aStac
15e90 6b 5b 74 6f 73 5d 2e 6e 2c 20 26 72 65 73 29 3b  k[tos].n, &res);
15ea0 0a 20 20 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f  .      pC->recno
15eb0 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  IsValid = 0;.   
15ec0 20 7d 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52   }.    pC->nullR
15ed0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ow = 0;.    sqli
15ee0 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  te_search_count+
15ef0 2b 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  +;.    if( res<0
15f00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15f10 42 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 70 43  BtreeNext(pC->pC
15f20 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
15f30 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f 49 73 56      pC->recnoIsV
15f40 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
15f50 69 66 28 20 72 65 73 20 26 26 20 70 4f 70 2d 3e  if( res && pOp->
15f60 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2>0 ){.        
15f70 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
15f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15f90 20 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a    }.  POPSTACK;.
15fa0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15fb0 70 63 6f 64 65 3a 20 44 69 73 74 69 6e 63 74 20  pcode: Distinct 
15fc0 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 55 73  P1 P2 *.**.** Us
15fd0 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  e the top of the
15fe0 20 73 74 61 63 6b 20 61 73 20 61 20 73 74 72 69   stack as a stri
15ff0 6e 67 20 6b 65 79 2e 20 20 49 66 20 61 20 72 65  ng key.  If a re
16000 63 6f 72 64 20 77 69 74 68 20 74 68 61 74 20 6b  cord with that k
16010 65 79 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  ey does.** not e
16020 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 62 6c  xist in the tabl
16030 65 20 6f 66 20 63 75 72 73 6f 72 20 50 31 2c 20  e of cursor P1, 
16040 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
16050 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 0a    If the record.
16060 2a 2a 20 64 6f 65 73 20 61 6c 72 65 61 64 79 20  ** does already 
16070 65 78 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c  exist, then fall
16080 20 74 68 72 75 2e 20 20 54 68 65 20 63 75 72 73   thru.  The curs
16090 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
160a0 69 6e 67 0a 2a 2a 20 61 74 20 74 68 65 20 72 65  ing.** at the re
160b0 63 6f 72 64 20 69 66 20 69 74 20 65 78 69 73 74  cord if it exist
160c0 73 2e 20 54 68 65 20 6b 65 79 20 69 73 20 6e 6f  s. The key is no
160d0 74 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  t popped from th
160e0 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
160f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
16100 20 73 69 6d 69 6c 61 72 20 74 6f 20 4e 6f 74 46   similar to NotF
16110 6f 75 6e 64 20 65 78 63 65 70 74 20 74 68 61 74  ound except that
16120 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a   this operation.
16130 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 70 6f 70 20  ** does not pop 
16140 74 68 65 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  the key from the
16150 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65   stack..**.** Se
16160 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
16170 6f 74 46 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f 2c  otFound, MoveTo,
16180 20 49 73 55 6e 69 71 75 65 2c 20 4e 6f 74 45 78   IsUnique, NotEx
16190 69 73 74 73 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ists.*/./* Opcod
161a0 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20 2a  e: Found P1 P2 *
161b0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 74  .**.** Use the t
161c0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
161d0 61 73 20 61 20 73 74 72 69 6e 67 20 6b 65 79 2e  as a string key.
161e0 20 20 49 66 20 61 20 72 65 63 6f 72 64 20 77 69    If a record wi
161f0 74 68 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 64  th that key.** d
16200 6f 65 73 20 65 78 69 73 74 20 69 6e 20 74 61 62  oes exist in tab
16210 6c 65 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a  le of P1, then j
16220 75 6d 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74  ump to P2.  If t
16230 68 65 20 72 65 63 6f 72 64 0a 2a 2a 20 64 6f 65  he record.** doe
16240 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
16250 6e 20 66 61 6c 6c 20 74 68 72 75 2e 20 20 54 68  n fall thru.  Th
16260 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
16270 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
16280 74 68 65 20 72 65 63 6f 72 64 20 69 66 20 69 74  the record if it
16290 20 65 78 69 73 74 73 2e 20 20 54 68 65 20 6b 65   exists.  The ke
162a0 79 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  y is popped from
162b0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
162c0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44 69 73 74  * See also: Dist
162d0 69 6e 63 74 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  inct, NotFound, 
162e0 4d 6f 76 65 54 6f 2c 20 49 73 55 6e 69 71 75 65  MoveTo, IsUnique
162f0 2c 20 4e 6f 74 45 78 69 73 74 73 0a 2a 2f 0a 2f  , NotExists.*/./
16300 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75  * Opcode: NotFou
16310 6e 64 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a  nd P1 P2 *.**.**
16320 20 55 73 65 20 74 68 65 20 74 6f 70 20 6f 66 20   Use the top of 
16330 74 68 65 20 73 74 61 63 6b 20 61 73 20 61 20 73  the stack as a s
16340 74 72 69 6e 67 20 6b 65 79 2e 20 20 49 66 20 61  tring key.  If a
16350 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 61   record with tha
16360 74 20 6b 65 79 0a 2a 2a 20 64 6f 65 73 20 6e 6f  t key.** does no
16370 74 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65  t exist in table
16380 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d   of P1, then jum
16390 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  p to P2.  If the
163a0 20 72 65 63 6f 72 64 0a 2a 2a 20 64 6f 65 73 20   record.** does 
163b0 65 78 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c  exist, then fall
163c0 20 74 68 72 75 2e 20 20 54 68 65 20 63 75 72 73   thru.  The curs
163d0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
163e0 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 72 65  ing to the.** re
163f0 63 6f 72 64 20 69 66 20 69 74 20 65 78 69 73 74  cord if it exist
16400 73 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 70  s.  The key is p
16410 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
16420 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tack..**.** The 
16430 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
16440 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
16450 6e 20 61 6e 64 20 44 69 73 74 69 6e 63 74 20 69  n and Distinct i
16460 73 20 74 68 61 74 0a 2a 2a 20 44 69 73 74 69 6e  s that.** Distin
16470 63 74 20 64 6f 65 73 20 6e 6f 74 20 70 6f 70 20  ct does not pop 
16480 74 68 65 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  the key from the
16490 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65   stack..**.** Se
164a0 65 20 61 6c 73 6f 3a 20 44 69 73 74 69 6e 63 74  e also: Distinct
164b0 2c 20 46 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f 2c  , Found, MoveTo,
164c0 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e   NotExists, IsUn
164d0 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
164e0 44 69 73 74 69 6e 63 74 3a 0a 63 61 73 65 20 4f  Distinct:.case O
164f0 50 5f 4e 6f 74 46 6f 75 6e 64 3a 0a 63 61 73 65  P_NotFound:.case
16500 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 0a 20 20 69   OP_Found: {.  i
16510 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
16520 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
16530 6f 73 3b 0a 20 20 69 6e 74 20 61 6c 72 65 61 64  os;.  int alread
16540 79 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 43  yExists = 0;.  C
16550 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 56 45 52  ursor *pC;.  VER
16560 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29  IFY( if( tos<0 )
16570 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
16580 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20  _stack; ).  if( 
16590 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20  VERIFY( i>=0 && 
165a0 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20  i<p->nCursor && 
165b0 29 20 28 70 43 20 3d 20 26 70 2d 3e 61 43 73 72  ) (pC = &p->aCsr
165c0 5b 69 5d 29 2d 3e 70 43 75 72 73 6f 72 21 3d 30  [i])->pCursor!=0
165d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
165e0 20 72 78 3b 0a 20 20 20 20 69 66 28 20 53 74 72   rx;.    if( Str
165f0 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 20 29  ingify(p, tos) )
16600 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
16610 20 20 72 78 20 3d 20 73 71 6c 69 74 65 42 74 72    rx = sqliteBtr
16620 65 65 4d 6f 76 65 74 6f 28 70 43 2d 3e 70 43 75  eeMoveto(pC->pCu
16630 72 73 6f 72 2c 20 7a 53 74 61 63 6b 5b 74 6f 73  rsor, zStack[tos
16640 5d 2c 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e  ], aStack[tos].n
16650 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 61 6c 72  , &res);.    alr
16660 65 61 64 79 45 78 69 73 74 73 20 3d 20 72 78 3d  eadyExists = rx=
16670 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
16680 73 3d 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  s==0;.  }.  if( 
16690 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
166a0 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 69 66 28  Found ){.    if(
166b0 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29   alreadyExists )
166c0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
166d0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
166e0 69 66 28 20 21 61 6c 72 65 61 64 79 45 78 69 73  if( !alreadyExis
166f0 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70  ts ) pc = pOp->p
16700 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  2 - 1;.  }.  if(
16710 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
16720 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
16730 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 7d 0a 20   POPSTACK;.  }. 
16740 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
16750 63 6f 64 65 3a 20 49 73 55 6e 69 71 75 65 20 50  code: IsUnique P
16760 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  1 P2 *.**.** The
16770 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
16780 6b 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  k is an integer 
16790 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 20  record number.  
167a0 43 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 65 63  Call this.** rec
167b0 6f 72 64 20 6e 75 6d 62 65 72 20 52 2e 20 20 54  ord number R.  T
167c0 68 65 20 6e 65 78 74 20 6f 6e 20 74 68 65 20 73  he next on the s
167d0 74 61 63 6b 20 69 73 20 61 6e 20 69 6e 64 65 78  tack is an index
167e0 20 6b 65 79 20 63 72 65 61 74 65 64 0a 2a 2a 20   key created.** 
167f0 75 73 69 6e 67 20 4d 61 6b 65 49 64 78 4b 65 79  using MakeIdxKey
16800 2e 20 20 43 61 6c 6c 20 69 74 20 4b 2e 20 20 54  .  Call it K.  T
16810 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
16820 70 6f 70 73 20 52 20 66 72 6f 6d 20 74 68 65 0a  pops R from the.
16830 2a 2a 20 73 74 61 63 6b 20 62 75 74 20 69 74 20  ** stack but it 
16840 6c 65 61 76 65 73 20 4b 20 75 6e 63 68 61 6e 67  leaves K unchang
16850 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ed..**.** P1 is 
16860 61 6e 20 69 6e 64 65 78 2e 20 20 53 6f 20 61 6c  an index.  So al
16870 6c 20 62 75 74 20 74 68 65 20 6c 61 73 74 20 66  l but the last f
16880 6f 75 72 20 62 79 74 65 73 20 6f 66 20 4b 20 61  our bytes of K a
16890 72 65 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73  re an.** index s
168a0 74 72 69 6e 67 2e 20 20 54 68 65 20 6c 61 73 74  tring.  The last
168b0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 4b   four bytes of K
168c0 20 61 72 65 20 61 20 72 65 63 6f 72 64 20 6e 75   are a record nu
168d0 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  mber..**.** This
168e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 73 6b   instruction ask
168f0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
16900 20 65 6e 74 72 79 20 69 6e 20 50 31 20 77 68 65   entry in P1 whe
16910 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  re the.** index 
16920 73 74 72 69 6e 67 20 6d 61 74 63 68 65 73 20 4b  string matches K
16930 20 62 75 74 20 74 68 65 20 72 65 63 6f 72 64 20   but the record 
16940 6e 75 6d 62 65 72 20 69 73 20 64 69 66 66 65 72  number is differ
16950 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 52 2e 20 20  ent.** from R.  
16960 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
16970 75 63 68 20 65 6e 74 72 79 2c 20 74 68 65 6e 20  uch entry, then 
16980 74 68 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65  there is an imme
16990 64 69 61 74 65 0a 2a 2a 20 6a 75 6d 70 20 74 6f  diate.** jump to
169a0 20 50 32 2e 20 20 49 66 20 61 6e 79 20 65 6e 74   P2.  If any ent
169b0 72 79 20 64 6f 65 73 20 65 78 69 73 74 20 77 68  ry does exist wh
169c0 65 72 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ere the index st
169d0 72 69 6e 67 0a 2a 2a 20 6d 61 74 63 68 65 73 20  ring.** matches 
169e0 4b 20 62 75 74 20 74 68 65 20 72 65 63 6f 72 64  K but the record
169f0 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 52   number is not R
16a00 2c 20 74 68 65 6e 20 74 68 65 20 72 65 63 6f 72  , then the recor
16a10 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  d.** number for 
16a20 74 68 61 74 20 65 6e 74 72 79 20 69 73 20 70 75  that entry is pu
16a30 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74  shed onto the st
16a40 61 63 6b 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 0a  ack and control.
16a50 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68  ** falls through
16a60 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
16a70 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
16a80 53 65 65 20 61 6c 73 6f 3a 20 44 69 73 74 69 6e  See also: Distin
16a90 63 74 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  ct, NotFound, No
16aa0 74 45 78 69 73 74 73 2c 20 46 6f 75 6e 64 0a 2a  tExists, Found.*
16ab0 2f 0a 63 61 73 65 20 4f 50 5f 49 73 55 6e 69 71  /.case OP_IsUniq
16ac0 75 65 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ue: {.  int i = 
16ad0 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74  pOp->p1;.  int t
16ae0 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69  os = p->tos;.  i
16af0 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 2d 31 3b 0a  nt nos = tos-1;.
16b00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
16b10 72 3b 0a 20 20 69 6e 74 20 52 3b 0a 0a 20 20 2f  r;.  int R;..  /
16b20 2a 20 50 6f 70 20 74 68 65 20 76 61 6c 75 65 20  * Pop the value 
16b30 52 20 6f 66 66 20 74 68 65 20 74 6f 70 20 6f 66  R off the top of
16b40 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a   the stack.  */.
16b50 20 20 56 45 52 49 46 59 28 20 69 66 28 20 6e 6f    VERIFY( if( no
16b60 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  s<0 ) goto not_e
16b70 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20  nough_stack; ). 
16b80 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20 74   Integerify(p, t
16b90 6f 73 29 3b 0a 20 20 52 20 3d 20 61 53 74 61 63  os);.  R = aStac
16ba0 6b 5b 74 6f 73 5d 2e 69 3b 20 20 20 0a 20 20 50  k[tos].i;   .  P
16bb0 4f 50 53 54 41 43 4b 3b 0a 20 20 69 66 28 20 56  OPSTACK;.  if( V
16bc0 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69  ERIFY( i>=0 && i
16bd0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29  <p->nCursor && )
16be0 20 28 70 43 72 73 72 20 3d 20 70 2d 3e 61 43 73   (pCrsr = p->aCs
16bf0 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30  r[i].pCursor)!=0
16c00 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
16c10 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 76 3b 20   rc;.    int v; 
16c20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
16c30 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 6f 6e 20  ecord number on 
16c40 74 68 65 20 50 31 20 65 6e 74 72 79 20 74 68 61  the P1 entry tha
16c50 74 20 6d 61 74 63 68 65 73 20 4b 20 2a 2f 0a 20  t matches K */. 
16c60 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20 20     char *zKey;  
16c70 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
16c80 66 20 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  f K */.    int n
16c90 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  Key;      /* Num
16ca0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
16cb0 4b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  K */..    /* Mak
16cc0 65 20 73 75 72 65 20 4b 20 69 73 20 61 20 73 74  e sure K is a st
16cd0 72 69 6e 67 20 61 6e 64 20 6d 61 6b 65 20 7a 4b  ring and make zK
16ce0 65 79 20 70 6f 69 6e 74 20 74 6f 20 4b 0a 20 20  ey point to K.  
16cf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 74 72    */.    if( Str
16d00 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29 20 29  ingify(p, nos) )
16d10 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
16d20 20 20 7a 4b 65 79 20 3d 20 7a 53 74 61 63 6b 5b    zKey = zStack[
16d30 6e 6f 73 5d 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  nos];.    nKey =
16d40 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b 0a   aStack[nos].n;.
16d50 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
16d60 20 3e 3d 20 34 20 29 3b 0a 0a 20 20 20 20 2f 2a   >= 4 );..    /*
16d70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
16d80 6e 74 72 79 20 69 6e 20 50 31 20 77 68 65 72 65  ntry in P1 where
16d90 20 61 6c 6c 20 62 75 74 20 74 68 65 20 6c 61 73   all but the las
16da0 74 20 66 6f 75 72 20 62 79 74 65 73 20 6d 61 74  t four bytes mat
16db0 63 68 20 4b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ch K..    ** If 
16dc0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
16dd0 20 65 6e 74 72 79 2c 20 6a 75 6d 70 20 69 6d 6d   entry, jump imm
16de0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
16df0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
16e00 73 71 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74  sqliteBtreeMovet
16e10 6f 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e  o(pCrsr, zKey, n
16e20 4b 65 79 2d 34 2c 20 26 72 65 73 29 3b 0a 20 20  Key-4, &res);.  
16e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e40 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
16e50 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
16e60 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
16e70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16e80 65 42 74 72 65 65 4e 65 78 74 28 70 43 72 73 72  eBtreeNext(pCrsr
16e90 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
16ea0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
16eb0 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
16ec0 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
16ed0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16ee0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16ef0 42 74 72 65 65 4b 65 79 43 6f 6d 70 61 72 65 28  BtreeKeyCompare(
16f00 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65  pCrsr, zKey, nKe
16f10 79 2d 34 2c 20 34 2c 20 26 72 65 73 29 3b 0a 20  y-4, 4, &res);. 
16f20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16f30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
16f40 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
16f50 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 29 7b      if( res>0 ){
16f60 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
16f70 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
16f80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16f90 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16fa0 74 2c 20 70 43 72 73 72 20 69 73 20 70 6f 69 6e  t, pCrsr is poin
16fb0 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
16fc0 20 69 6e 20 50 31 20 77 68 65 72 65 20 61 6c 6c   in P1 where all
16fd0 20 62 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20   but.    ** the 
16fe0 6c 61 73 74 20 66 6f 72 20 62 79 74 65 73 20 6f  last for bytes o
16ff0 66 20 74 68 65 20 6b 65 79 20 6d 61 74 63 68 20  f the key match 
17000 4b 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  K.  Check to see
17010 20 69 66 20 74 68 65 20 6c 61 73 74 0a 20 20 20   if the last.   
17020 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
17030 66 20 74 68 65 20 6b 65 79 20 61 72 65 20 64 69  f the key are di
17040 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 52 2e 20  fferent from R. 
17050 20 49 66 20 74 68 65 20 6c 61 73 74 20 66 6f 75   If the last fou
17060 72 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 65  r.    ** bytes e
17070 71 75 61 6c 20 52 20 74 68 65 6e 20 6a 75 6d 70  qual R then jump
17080 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
17090 50 32 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  P2..    */.    s
170a0 71 6c 69 74 65 42 74 72 65 65 4b 65 79 28 70 43  qliteBtreeKey(pC
170b0 72 73 72 2c 20 6e 4b 65 79 20 2d 20 34 2c 20 34  rsr, nKey - 4, 4
170c0 2c 20 28 63 68 61 72 2a 29 26 76 29 3b 0a 20 20  , (char*)&v);.  
170d0 20 20 76 20 3d 20 6b 65 79 54 6f 49 6e 74 28 76    v = keyToInt(v
170e0 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 52 20  );.    if( v==R 
170f0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
17100 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
17110 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17120 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66     /* The last f
17130 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
17140 20 6b 65 79 20 61 72 65 20 64 69 66 66 65 72 65   key are differe
17150 6e 74 20 66 72 6f 6d 20 52 2e 20 20 43 6f 6e 76  nt from R.  Conv
17160 65 72 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  ert the.    ** l
17170 61 73 74 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ast four bytes o
17180 66 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 61  f the key into a
17190 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 70 75  n integer and pu
171a0 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 0a 20  sh it onto the. 
171b0 20 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 28 54     ** stack.  (T
171c0 68 65 73 65 20 62 79 74 65 73 20 61 72 65 20 74  hese bytes are t
171d0 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
171e0 20 6f 66 20 61 6e 20 65 6e 74 72 79 20 74 68 61   of an entry tha
171f0 74 0a 20 20 20 20 2a 2a 20 76 69 6f 6c 61 74 65  t.    ** violate
17200 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  s a UNIQUE const
17210 72 61 69 6e 74 2e 29 0a 20 20 20 20 2a 2f 0a 20  raint.).    */. 
17220 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20     p->tos++;.   
17230 20 56 45 52 49 46 59 28 20 69 66 28 20 4e 65 65   VERIFY( if( Nee
17240 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73  dStack(p, p->tos
17250 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
17260 20 29 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f   ).    aStack[to
17270 73 5d 2e 69 20 3d 20 76 3b 0a 20 20 20 20 61 53  s].i = v;.    aS
17280 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
17290 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 7d 0a 20  = STK_Int;.  }. 
172a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
172b0 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20  code: NotExists 
172c0 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 55 73  P1 P2 *.**.** Us
172d0 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  e the top of the
172e0 20 73 74 61 63 6b 20 61 73 20 61 20 69 6e 74 65   stack as a inte
172f0 67 65 72 20 6b 65 79 2e 20 20 49 66 20 61 20 72  ger key.  If a r
17300 65 63 6f 72 64 20 77 69 74 68 20 74 68 61 74 20  ecord with that 
17310 6b 65 79 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  key.** does not 
17320 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65 20 6f  exist in table o
17330 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20  f P1, then jump 
17340 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20 72  to P2.  If the r
17350 65 63 6f 72 64 0a 2a 2a 20 64 6f 65 73 20 65 78  ecord.** does ex
17360 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  ist, then fall t
17370 68 72 75 2e 20 20 54 68 65 20 63 75 72 73 6f 72  hru.  The cursor
17380 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
17390 67 20 74 6f 20 74 68 65 0a 2a 2a 20 72 65 63 6f  g to the.** reco
173a0 72 64 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  rd if it exists.
173b0 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 6b 65    The integer ke
173c0 79 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  y is popped from
173d0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
173e0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
173f0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 6f 70   between this op
17400 65 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46  eration and NotF
17410 6f 75 6e 64 20 69 73 20 74 68 61 74 20 74 68 69  ound is that thi
17420 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61  s.** operation a
17430 73 73 75 6d 65 73 20 74 68 65 20 6b 65 79 20 69  ssumes the key i
17440 73 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  s an integer and
17450 20 4e 6f 74 46 6f 75 6e 64 20 61 73 73 75 6d 65   NotFound assume
17460 73 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 74 72  s it.** is a str
17470 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ing..**.** See a
17480 6c 73 6f 3a 20 44 69 73 74 69 6e 63 74 2c 20 46  lso: Distinct, F
17490 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f 2c 20 4e 6f  ound, MoveTo, No
174a0 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69 71 75 65  tFound, IsUnique
174b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45  .*/.case OP_NotE
174c0 78 69 73 74 73 3a 20 7b 0a 20 20 69 6e 74 20 69  xists: {.  int i
174d0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e   = pOp->p1;.  in
174e0 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a  t tos = p->tos;.
174f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
17500 72 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  r;.  VERIFY( if(
17510 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f   tos<0 ) goto no
17520 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20  t_enough_stack; 
17530 29 0a 20 20 69 66 28 20 56 45 52 49 46 59 28 20  ).  if( VERIFY( 
17540 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
17550 72 73 6f 72 20 26 26 20 29 20 28 70 43 72 73 72  rsor && ) (pCrsr
17560 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43   = p->aCsr[i].pC
17570 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20  ursor)!=0 ){.   
17580 20 69 6e 74 20 72 65 73 2c 20 72 78 2c 20 69 4b   int res, rx, iK
17590 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ey;.    assert( 
175a0 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
175b0 73 20 26 20 53 54 4b 5f 49 6e 74 20 29 3b 0a 20  s & STK_Int );. 
175c0 20 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f 4b     iKey = intToK
175d0 65 79 28 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69  ey(aStack[tos].i
175e0 29 3b 0a 20 20 20 20 72 78 20 3d 20 73 71 6c 69  );.    rx = sqli
175f0 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  teBtreeMoveto(pC
17600 72 73 72 2c 20 28 63 68 61 72 2a 29 26 69 4b 65  rsr, (char*)&iKe
17610 79 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  y, sizeof(int), 
17620 26 72 65 73 29 3b 0a 20 20 20 20 70 2d 3e 61 43  &res);.    p->aC
17630 73 72 5b 69 5d 2e 6c 61 73 74 52 65 63 6e 6f 20  sr[i].lastRecno 
17640 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b  = aStack[tos].i;
17650 0a 20 20 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e  .    p->aCsr[i].
17660 72 65 63 6e 6f 49 73 56 61 6c 69 64 20 3d 20 72  recnoIsValid = r
17670 65 73 3d 3d 30 3b 0a 20 20 20 20 70 2d 3e 61 43  es==0;.    p->aC
17680 73 72 5b 69 5d 2e 6e 75 6c 6c 52 6f 77 20 3d 20  sr[i].nullRow = 
17690 30 3b 0a 20 20 20 20 69 66 28 20 72 78 21 3d 53  0;.    if( rx!=S
176a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 21  QLITE_OK || res!
176b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  =0 ){.      pc =
176c0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
176d0 20 20 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 72      p->aCsr[i].r
176e0 65 63 6e 6f 49 73 56 61 6c 69 64 20 3d 20 30 3b  ecnoIsValid = 0;
176f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 50 4f 50  .    }.  }.  POP
17700 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b 3b 0a  STACK;.  break;.
17710 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65  }../* Opcode: Ne
17720 77 52 65 63 6e 6f 20 50 31 20 2a 20 2a 0a 2a 2a  wRecno P1 * *.**
17730 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69 6e  .** Get a new in
17740 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d  teger record num
17750 62 65 72 20 75 73 65 64 20 61 73 20 74 68 65 20  ber used as the 
17760 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e 0a  key to a table..
17770 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  ** The record nu
17780 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65 76  mber is not prev
17790 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20 61  iously used as a
177a0 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
177b0 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68  base.** table th
177c0 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69  at cursor P1 poi
177d0 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65 77  nts to.  The new
177e0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
177f0 73 20 70 75 73 68 65 64 20 0a 2a 2a 20 6f 6e 74  s pushed .** ont
17800 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  o the stack..*/.
17810 63 61 73 65 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  case OP_NewRecno
17820 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f  : {.  int i = pO
17830 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 76 20 3d  p->p1;.  int v =
17840 20 30 3b 0a 20 20 43 75 72 73 6f 72 20 2a 70 43   0;.  Cursor *pC
17850 3b 0a 20 20 69 66 28 20 56 45 52 49 46 59 28 20  ;.  if( VERIFY( 
17860 69 3c 30 20 7c 7c 20 69 3e 3d 70 2d 3e 6e 43 75  i<0 || i>=p->nCu
17870 72 73 6f 72 20 7c 7c 20 29 20 28 70 43 20 3d 20  rsor || ) (pC = 
17880 26 70 2d 3e 61 43 73 72 5b 69 5d 29 2d 3e 70 43  &p->aCsr[i])->pC
17890 75 72 73 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ursor==0 ){.    
178a0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
178b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
178c0 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64 20  rowid or record 
178d0 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65 6e  number (differen
178e0 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
178f0 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e  same.    ** thin
17900 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  g) is obtained i
17910 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c 67  n a two-step alg
17920 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20  orithm..    **. 
17930 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20 61     ** First we a
17940 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74  ttempt to find t
17950 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
17960 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61 64  ing rowid and ad
17970 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20  d one.    ** to 
17980 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74 68  that.  But if th
17990 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
179a0 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72 65  ng rowid is alre
179b0 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  ady the maximum.
179c0 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65 20      ** positive 
179d0 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76 65  integer, we have
179e0 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   to fall through
179f0 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20   to the second. 
17a00 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73     ** probabilis
17a10 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  tic algorithm.  
17a20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17a30 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d  second algorithm
17a40 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61 20   is to select a 
17a50 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d 20  rowid at random 
17a60 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20 2a  and see if.    *
17a70 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  * it already exi
17a80 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  sts in the table
17a90 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
17aa0 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76 65  t exist, we have
17ab0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 65  .    ** succeede
17ac0 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64 6f  d.  If the rando
17ad0 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78 69  m rowid does exi
17ae0 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61 20  st, we select a 
17af0 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  new one.    ** a
17b00 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75 70  nd try again, up
17b10 20 74 6f 20 31 30 30 30 20 74 69 6d 65 73 2e 0a   to 1000 times..
17b20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
17b30 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 6c  r a table with l
17b40 65 73 73 20 74 68 61 6e 20 32 20 62 69 6c 6c 69  ess than 2 billi
17b50 6f 6e 20 65 6e 74 72 69 65 73 2c 20 74 68 65 20  on entries, the 
17b60 70 72 6f 62 61 62 69 6c 69 74 79 0a 20 20 20 20  probability.    
17b70 2a 2a 20 6f 66 20 6e 6f 74 20 66 69 6e 64 69 6e  ** of not findin
17b80 67 20 61 20 75 6e 75 73 65 64 20 72 6f 77 69 64  g a unused rowid
17b90 20 69 73 20 61 62 6f 75 74 20 31 2e 30 65 2d 33   is about 1.0e-3
17ba0 30 30 2e 20 20 54 68 69 73 20 69 73 20 61 20 0a  00.  This is a .
17bb0 20 20 20 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20      ** non-zero 
17bc0 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 62 75 74  probability, but
17bd0 20 69 74 20 69 73 20 73 74 69 6c 6c 20 76 61 6e   it is still van
17be0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 61  ishingly small a
17bf0 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a  nd should.    **
17c00 20 6e 65 76 65 72 20 63 61 75 73 65 20 61 20 70   never cause a p
17c10 72 6f 62 6c 65 6d 2e 20 20 59 6f 75 20 61 72 65  roblem.  You are
17c20 20 6d 75 63 68 2c 20 6d 75 63 68 20 6d 6f 72 65   much, much more
17c30 20 6c 69 6b 65 6c 79 20 74 6f 20 68 61 76 65 20   likely to have 
17c40 61 0a 20 20 20 20 2a 2a 20 68 61 72 64 77 61 72  a.    ** hardwar
17c50 65 20 66 61 69 6c 75 72 65 20 74 68 61 6e 20 66  e failure than f
17c60 6f 72 20 74 68 69 73 20 61 6c 67 6f 72 69 74 68  or this algorith
17c70 6d 20 74 6f 20 66 61 69 6c 2e 0a 20 20 20 20 2a  m to fail..    *
17c80 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 6e 61  *.    ** The ana
17c90 6c 79 73 69 73 20 69 6e 20 74 68 65 20 70 72 65  lysis in the pre
17ca0 76 69 6f 75 73 20 70 61 72 61 67 72 61 70 68 20  vious paragraph 
17cb0 61 73 73 75 6d 65 73 20 74 68 61 74 20 79 6f 75  assumes that you
17cc0 20 68 61 76 65 20 61 20 67 6f 6f 64 0a 20 20 20   have a good.   
17cd0 20 2a 2a 20 73 6f 75 72 63 65 20 6f 66 20 72 61   ** source of ra
17ce0 6e 64 6f 6d 20 6e 75 6d 62 65 72 73 2e 20 20 49  ndom numbers.  I
17cf0 73 20 61 20 6c 69 62 72 61 72 79 20 66 75 6e 63  s a library func
17d00 74 69 6f 6e 20 6c 69 6b 65 20 6c 72 61 6e 64 34  tion like lrand4
17d10 38 28 29 0a 20 20 20 20 2a 2a 20 67 6f 6f 64 20  8().    ** good 
17d20 65 6e 6f 75 67 68 3f 20 20 4d 61 79 62 65 2e 20  enough?  Maybe. 
17d30 4d 61 79 62 65 20 6e 6f 74 2e 20 49 74 27 73 20  Maybe not. It's 
17d40 68 61 72 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  hard to know whe
17d50 74 68 65 72 20 74 68 65 72 65 0a 20 20 20 20 2a  ther there.    *
17d60 2a 20 6d 69 67 68 74 20 62 65 20 73 75 62 74 6c  * might be subtl
17d70 65 20 62 75 67 73 20 69 73 20 73 6f 6d 65 20 69  e bugs is some i
17d80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
17d90 66 20 6c 72 61 6e 64 34 38 28 29 20 74 68 61 74  f lrand48() that
17da0 0a 20 20 20 20 2a 2a 20 63 6f 75 6c 64 20 63 61  .    ** could ca
17db0 75 73 65 20 70 72 6f 62 6c 65 6d 73 2e 20 54 6f  use problems. To
17dc0 20 61 76 6f 69 64 20 75 6e 63 65 72 74 61 69 6e   avoid uncertain
17dd0 74 79 2c 20 53 51 4c 69 74 65 20 75 73 65 73 20  ty, SQLite uses 
17de0 69 74 73 20 6f 77 6e 20 0a 20 20 20 20 2a 2a 20  its own .    ** 
17df0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
17e00 6e 65 72 61 74 6f 72 20 62 61 73 65 64 20 6f 6e  nerator based on
17e10 20 74 68 65 20 52 43 34 20 61 6c 67 6f 72 69 74   the RC4 algorit
17e20 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  hm..    **.    *
17e30 2a 20 54 6f 20 70 72 6f 6d 6f 74 65 20 6c 6f 63  * To promote loc
17e40 61 6c 69 74 79 20 6f 66 20 72 65 66 65 72 65 6e  ality of referen
17e50 63 65 20 66 6f 72 20 72 65 70 65 74 69 74 69 76  ce for repetitiv
17e60 65 20 69 6e 73 65 72 74 73 2c 20 74 68 65 0a 20  e inserts, the. 
17e70 20 20 20 2a 2a 20 66 69 72 73 74 20 66 65 77 20     ** first few 
17e80 61 74 74 65 6d 70 74 73 20 61 74 20 63 68 6f 73  attempts at chos
17e90 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 72 6f 77  ing a random row
17ea0 69 64 20 70 69 63 6b 20 76 61 6c 75 65 73 20 6a  id pick values j
17eb0 75 73 74 20 61 20 6c 69 74 74 6c 65 0a 20 20 20  ust a little.   
17ec0 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   ** larger than 
17ed0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
17ee0 69 64 2e 20 20 54 68 69 73 20 68 61 73 20 62 65  id.  This has be
17ef0 65 6e 20 73 68 6f 77 6e 20 65 78 70 65 72 69 6d  en shown experim
17f00 65 6e 74 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 74  entally.    ** t
17f10 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  o double the spe
17f20 65 64 20 6f 66 20 74 68 65 20 43 4f 50 59 20 6f  ed of the COPY o
17f30 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
17f40 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 78  .    int res, rx
17f50 2c 20 63 6e 74 2c 20 78 3b 0a 20 20 20 20 63 6e  , cnt, x;.    cn
17f60 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
17f70 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
17f80 69 64 20 29 7b 0a 20 20 20 20 20 20 72 78 20 3d  id ){.      rx =
17f90 20 73 71 6c 69 74 65 42 74 72 65 65 4c 61 73 74   sqliteBtreeLast
17fa0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
17fb0 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
17fc0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  es ){.        v 
17fd0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
17fe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17ff0 42 74 72 65 65 4b 65 79 28 70 43 2d 3e 70 43 75  BtreeKey(pC->pCu
18000 72 73 6f 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rsor, 0, sizeof(
18010 76 29 2c 20 28 76 6f 69 64 2a 29 26 76 29 3b 0a  v), (void*)&v);.
18020 20 20 20 20 20 20 20 20 76 20 3d 20 6b 65 79 54          v = keyT
18030 6f 49 6e 74 28 76 29 3b 0a 20 20 20 20 20 20 20  oInt(v);.       
18040 20 69 66 28 20 76 3d 3d 30 78 37 66 66 66 66 66   if( v==0x7fffff
18050 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
18060 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
18070 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
18080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18090 20 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   v++;.        }.
180a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
180b0 20 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e    if( pC->useRan
180c0 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
180d0 20 20 76 20 3d 20 64 62 2d 3e 70 72 69 6f 72 4e    v = db->priorN
180e0 65 77 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  ewRowid;.      c
180f0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  nt = 0;.      do
18100 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3d  {.        if( v=
18110 3d 30 20 7c 7c 20 63 6e 74 3e 32 20 29 7b 0a 20  =0 || cnt>2 ){. 
18120 20 20 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c           v = sql
18130 69 74 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65 72  iteRandomInteger
18140 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
18150 28 20 63 6e 74 3c 35 20 29 20 76 20 26 3d 20 30  ( cnt<5 ) v &= 0
18160 78 66 66 66 66 66 66 3b 0a 20 20 20 20 20 20 20  xffffff;.       
18170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18180 20 20 76 20 2b 3d 20 73 71 6c 69 74 65 52 61 6e    v += sqliteRan
18190 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20  domByte() + 1;. 
181a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
181b0 20 69 66 28 20 76 3d 3d 30 20 29 20 63 6f 6e 74   if( v==0 ) cont
181c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 78 20  inue;.        x 
181d0 3d 20 69 6e 74 54 6f 4b 65 79 28 76 29 3b 0a 20  = intToKey(v);. 
181e0 20 20 20 20 20 20 20 72 78 20 3d 20 73 71 6c 69         rx = sqli
181f0 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  teBtreeMoveto(pC
18200 2d 3e 70 43 75 72 73 6f 72 2c 20 26 78 2c 20 73  ->pCursor, &x, s
18210 69 7a 65 6f 66 28 69 6e 74 29 2c 20 26 72 65 73  izeof(int), &res
18220 29 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  );.        cnt++
18230 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
18240 63 6e 74 3c 31 30 30 30 20 26 26 20 72 78 3d 3d  cnt<1000 && rx==
18250 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
18260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  ==0 );.      db-
18270 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d  >priorNewRowid =
18280 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 72 78   v;.      if( rx
18290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
182a0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
182b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
182c0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
182d0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
182e0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
182f0 7d 0a 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f 49  }.    pC->recnoI
18300 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  sValid = 0;.  }.
18310 20 20 56 45 52 49 46 59 28 20 4e 65 65 64 53 74    VERIFY( NeedSt
18320 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73 2b 31 29  ack(p, p->tos+1)
18330 3b 20 29 0a 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a  ; ).  p->tos++;.
18340 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    aStack[p->tos]
18350 2e 69 20 3d 20 76 3b 0a 20 20 61 53 74 61 63 6b  .i = v;.  aStack
18360 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  [p->tos].flags =
18370 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 62 72 65 61   STK_Int;.  brea
18380 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
18390 20 50 75 74 49 6e 74 4b 65 79 20 50 31 20 50 32   PutIntKey P1 P2
183a0 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61   *.**.** Write a
183b0 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
183c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 50   database file P
183d0 31 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  1.  A new entry 
183e0 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 66  is.** created if
183f0 20 69 74 20 64 6f 65 73 6e 27 74 20 61 6c 72 65   it doesn't alre
18400 61 64 79 20 65 78 69 73 74 20 6f 72 20 74 68 65  ady exist or the
18410 20 64 61 74 61 20 66 6f 72 20 61 6e 20 65 78 69   data for an exi
18420 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69  sting.** entry i
18430 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  s overwritten.  
18440 54 68 65 20 64 61 74 61 20 69 73 20 74 68 65 20  The data is the 
18450 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 74 6f 70  value on the top
18460 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
18470 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 74 68  .  The key is th
18480 65 20 6e 65 78 74 20 76 61 6c 75 65 20 64 6f 77  e next value dow
18490 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  n on the stack. 
184a0 20 54 68 65 20 6b 65 79 20 6d 75 73 74 0a 2a 2a   The key must.**
184b0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   be an integer. 
184c0 20 54 68 65 20 73 74 61 63 6b 20 69 73 20 70 6f   The stack is po
184d0 70 70 65 64 20 74 77 69 63 65 20 62 79 20 74 68  pped twice by th
184e0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  is instruction..
184f0 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74  **.** If P2==1 t
18500 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61 6e  hen the row chan
18510 67 65 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ge count is incr
18520 65 6d 65 6e 74 65 64 2e 20 20 49 66 20 50 32 3d  emented.  If P2=
18530 3d 30 20 74 68 65 0a 2a 2a 20 72 6f 77 20 63 68  =0 the.** row ch
18540 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 20 75 6e  ange count is un
18550 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 2f 2a 20  modified..*/./* 
18560 4f 70 63 6f 64 65 3a 20 50 75 74 53 74 72 4b 65  Opcode: PutStrKe
18570 79 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  y P1 * *.**.** W
18580 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
18590 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
185a0 66 69 6c 65 20 50 31 2e 20 20 41 20 6e 65 77 20  file P1.  A new 
185b0 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61  entry is.** crea
185c0 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ted if it doesn'
185d0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
185e0 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  or the data for 
185f0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65  an existing.** e
18600 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74  ntry is overwrit
18610 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69  ten.  The data i
18620 73 20 74 68 65 20 76 61 6c 75 65 20 6f 6e 20 74  s the value on t
18630 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
18640 20 73 74 61 63 6b 2e 20 20 54 68 65 20 6b 65 79   stack.  The key
18650 20 69 73 20 74 68 65 20 6e 65 78 74 20 76 61 6c   is the next val
18660 75 65 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73  ue down on the s
18670 74 61 63 6b 2e 20 20 54 68 65 20 6b 65 79 20 6d  tack.  The key m
18680 75 73 74 0a 2a 2a 20 62 65 20 61 20 73 74 72 69  ust.** be a stri
18690 6e 67 2e 20 20 54 68 65 20 73 74 61 63 6b 20 69  ng.  The stack i
186a0 73 20 70 6f 70 70 65 64 20 74 77 69 63 65 20 62  s popped twice b
186b0 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  y this instructi
186c0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
186d0 75 74 49 6e 74 4b 65 79 3a 0a 63 61 73 65 20 4f  utIntKey:.case O
186e0 50 5f 50 75 74 53 74 72 4b 65 79 3a 20 7b 0a 20  P_PutStrKey: {. 
186f0 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f   int tos = p->to
18700 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20 3d 20 70  s;.  int nos = p
18710 2d 3e 74 6f 73 2d 31 3b 0a 20 20 69 6e 74 20 69  ->tos-1;.  int i
18720 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 45   = pOp->p1;.  VE
18730 52 49 46 59 28 20 69 66 28 20 6e 6f 73 3c 30 20  RIFY( if( nos<0 
18740 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
18750 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28  h_stack; ).  if(
18760 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26   VERIFY( i>=0 &&
18770 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26   i<p->nCursor &&
18780 20 29 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43   ) p->aCsr[i].pC
18790 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20  ursor!=0 ){.    
187a0 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20  char *zKey;.    
187b0 69 6e 74 20 6e 4b 65 79 2c 20 69 4b 65 79 3b 0a  int nKey, iKey;.
187c0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
187d0 6f 64 65 3d 3d 4f 50 5f 50 75 74 53 74 72 4b 65  ode==OP_PutStrKe
187e0 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  y ){.      if( S
187f0 74 72 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29  tringify(p, nos)
18800 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
18810 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 61 53 74        nKey = aSt
18820 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b 0a 20 20 20 20  ack[nos].n;.    
18830 20 20 7a 4b 65 79 20 3d 20 7a 53 74 61 63 6b 5b    zKey = zStack[
18840 6e 6f 73 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nos];.    }else{
18850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
18860 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73  Stack[nos].flags
18870 20 26 20 53 54 4b 5f 49 6e 74 20 29 3b 0a 20 20   & STK_Int );.  
18880 20 20 20 20 6e 4b 65 79 20 3d 20 73 69 7a 65 6f      nKey = sizeo
18890 66 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 4b  f(int);.      iK
188a0 65 79 20 3d 20 69 6e 74 54 6f 4b 65 79 28 61 53  ey = intToKey(aS
188b0 74 61 63 6b 5b 6e 6f 73 5d 2e 69 29 3b 0a 20 20  tack[nos].i);.  
188c0 20 20 20 20 7a 4b 65 79 20 3d 20 28 63 68 61 72      zKey = (char
188d0 2a 29 26 69 4b 65 79 3b 0a 20 20 20 20 20 20 64  *)&iKey;.      d
188e0 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 61  b->lastRowid = a
188f0 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a 20 20  Stack[nos].i;.  
18900 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20      if( pOp->p2 
18910 29 20 64 62 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b  ) db->nChange++;
18920 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
18930 73 71 6c 69 74 65 42 74 72 65 65 49 6e 73 65 72  sqliteBtreeInser
18940 74 28 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75  t(p->aCsr[i].pCu
18950 72 73 6f 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  rsor, zKey, nKey
18960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18970 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 63 6b            zStack
18980 5b 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f  [tos], aStack[to
18990 73 5d 2e 6e 29 3b 0a 20 20 20 20 70 2d 3e 61 43  s].n);.    p->aC
189a0 73 72 5b 69 5d 2e 72 65 63 6e 6f 49 73 56 61 6c  sr[i].recnoIsVal
189b0 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 50 4f  id = 0;.  }.  PO
189c0 50 53 54 41 43 4b 3b 0a 20 20 50 4f 50 53 54 41  PSTACK;.  POPSTA
189d0 43 4b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  CK;.  break;.}..
189e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74  /* Opcode: Delet
189f0 65 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  e P1 P2 *.**.** 
18a00 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72  Delete the recor
18a10 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20 50  d at which the P
18a20 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72  1 cursor is curr
18a30 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
18a40 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  **.** The cursor
18a50 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
18a60 69 6e 74 69 6e 67 20 61 74 20 65 69 74 68 65 72  inting at either
18a70 20 74 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65   the next or the
18a80 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63   previous.** rec
18a90 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ord in the table
18aa0 2e 20 49 66 20 69 74 20 69 73 20 6c 65 66 74 20  . If it is left 
18ab0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
18ac0 6e 65 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65  next record, the
18ad0 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65  n.** the next Ne
18ae0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  xt instruction w
18af0 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  ill be a no-op. 
18b00 20 48 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   Hence it is OK 
18b10 74 6f 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 72  to delete.** a r
18b20 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69  ecord from withi
18b30 6e 20 61 6e 20 4e 65 78 74 20 6c 6f 6f 70 2e 0a  n an Next loop..
18b40 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 20 63 68  **.** The row ch
18b50 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20  ange counter is 
18b60 69 6e 63 72 65 6d 65 6e 74 65 64 20 69 66 20 50  incremented if P
18b70 32 3d 3d 31 20 61 6e 64 20 69 73 20 75 6e 6d 6f  2==1 and is unmo
18b80 64 69 66 69 65 64 0a 2a 2a 20 69 66 20 50 32 3d  dified.** if P2=
18b90 3d 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  =0..*/.case OP_D
18ba0 65 6c 65 74 65 3a 20 7b 0a 20 20 69 6e 74 20 69  elete: {.  int i
18bb0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66   = pOp->p1;.  if
18bc0 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26  ( VERIFY( i>=0 &
18bd0 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26  & i<p->nCursor &
18be0 26 20 29 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70  & ) p->aCsr[i].p
18bf0 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20  Cursor!=0 ){.   
18c00 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
18c10 65 44 65 6c 65 74 65 28 70 2d 3e 61 43 73 72 5b  eDelete(p->aCsr[
18c20 69 5d 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].pCursor);.  }
18c30 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29  .  if( pOp->p2 )
18c40 20 64 62 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a   db->nChange++;.
18c50 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
18c60 70 63 6f 64 65 3a 20 4b 65 79 41 73 44 61 74 61  pcode: KeyAsData
18c70 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 54   P1 P2 *.**.** T
18c80 75 72 6e 20 74 68 65 20 6b 65 79 2d 61 73 2d 64  urn the key-as-d
18c90 61 74 61 20 6d 6f 64 65 20 66 6f 72 20 63 75 72  ata mode for cur
18ca0 73 6f 72 20 50 31 20 65 69 74 68 65 72 20 6f 6e  sor P1 either on
18cb0 20 28 69 66 20 50 32 3d 3d 31 29 20 6f 72 0a 2a   (if P2==1) or.*
18cc0 2a 20 6f 66 66 20 28 69 66 20 50 32 3d 3d 30 29  * off (if P2==0)
18cd0 2e 20 20 49 6e 20 6b 65 79 2d 61 73 2d 64 61 74  .  In key-as-dat
18ce0 61 20 6d 6f 64 65 2c 20 74 68 65 20 46 69 65 6c  a mode, the Fiel
18cf0 64 20 6f 70 63 6f 64 65 20 70 75 6c 6c 73 0a 2a  d opcode pulls.*
18d00 2a 20 64 61 74 61 20 6f 66 66 20 6f 66 20 74 68  * data off of th
18d10 65 20 6b 65 79 20 72 61 74 68 65 72 20 74 68 61  e key rather tha
18d20 6e 20 74 68 65 20 64 61 74 61 2e 20 20 54 68 69  n the data.  Thi
18d30 73 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 0a  s is useful for.
18d40 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  ** processing co
18d50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 73 2e 0a  mpound selects..
18d60 2a 2f 0a 63 61 73 65 20 4f 50 5f 4b 65 79 41 73  */.case OP_KeyAs
18d70 44 61 74 61 3a 20 7b 0a 20 20 69 6e 74 20 69 20  Data: {.  int i 
18d80 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  = pOp->p1;.  if(
18d90 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26   VERIFY( i>=0 &&
18da0 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26   i<p->nCursor &&
18db0 20 29 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43   ) p->aCsr[i].pC
18dc0 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20  ursor!=0 ){.    
18dd0 70 2d 3e 61 43 73 72 5b 69 5d 2e 6b 65 79 41 73  p->aCsr[i].keyAs
18de0 44 61 74 61 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Data = pOp->p2;.
18df0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
18e00 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d  /* Opcode: Colum
18e10 6e 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  n P1 P2 *.**.** 
18e20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64 61  Interpret the da
18e30 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  ta that cursor P
18e40 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 0a 2a  1 points to as.*
18e50 2a 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75  * a structure bu
18e60 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20 4d 61  ilt using the Ma
18e70 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
18e80 74 69 6f 6e 2e 0a 2a 2a 20 28 53 65 65 20 74 68  tion..** (See th
18e90 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  e MakeRecord opc
18ea0 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
18eb0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
18ec0 62 6f 75 74 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  bout.** the form
18ed0 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29  at of the data.)
18ee0 0a 2a 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74 68  .** Push onto th
18ef0 65 20 73 74 61 63 6b 20 74 68 65 20 76 61 6c 75  e stack the valu
18f00 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63  e of the P2-th c
18f10 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 65 64 0a  olumn contained.
18f20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 2e 0a  ** in the data..
18f30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4b 65 79  **.** If the Key
18f40 41 73 44 61 74 61 20 6f 70 63 6f 64 65 20 68 61  AsData opcode ha
18f50 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 65  s previously exe
18f60 63 75 74 65 64 20 6f 6e 20 74 68 69 73 20 63 75  cuted on this cu
18f70 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  rsor,.** then th
18f80 65 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65  e field might be
18f90 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18fa0 74 68 65 20 6b 65 79 20 72 61 74 68 65 72 20 74  the key rather t
18fb0 68 61 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 2e  han the.** data.
18fc0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75  .*/.case OP_Colu
18fd0 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 61 6d 74 2c  mn: {.  int amt,
18fe0 20 6f 66 66 73 65 74 2c 20 65 6e 64 2c 20 70 61   offset, end, pa
18ff0 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 69 6e 74  yloadSize;.  int
19000 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
19010 69 6e 74 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  int p2 = pOp->p2
19020 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  ;.  int tos = p-
19030 3e 74 6f 73 2b 31 3b 0a 20 20 43 75 72 73 6f 72  >tos+1;.  Cursor
19040 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
19050 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 69   *pCrsr;.  int i
19060 64 78 57 69 64 74 68 3b 0a 20 20 75 6e 73 69 67  dxWidth;.  unsig
19070 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
19080 5d 3b 0a 20 20 69 6e 74 20 28 2a 78 52 65 61 64  ];.  int (*xRead
19090 29 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74  )(BtCursor*, int
190a0 2c 20 69 6e 74 2c 20 63 68 61 72 2a 29 3b 0a 0a  , int, char*);..
190b0 20 20 56 45 52 49 46 59 28 20 69 66 28 20 4e 65    VERIFY( if( Ne
190c0 65 64 53 74 61 63 6b 28 70 2c 20 74 6f 73 2b 31  edStack(p, tos+1
190d0 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
190e0 20 29 0a 20 20 69 66 28 20 56 45 52 49 46 59 28   ).  if( VERIFY(
190f0 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43   i>=0 && i<p->nC
19100 75 72 73 6f 72 20 26 26 20 29 20 28 70 43 20 3d  ursor && ) (pC =
19110 20 26 70 2d 3e 61 43 73 72 5b 69 5d 29 2d 3e 70   &p->aCsr[i])->p
19120 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 0a 20 20  Cursor!=0 ){..  
19130 20 20 2f 2a 20 55 73 65 20 64 69 66 66 65 72 65    /* Use differe
19140 6e 74 20 61 63 63 65 73 73 20 66 75 6e 63 74 69  nt access functi
19150 6f 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ons depending on
19160 20 77 68 65 74 68 65 72 20 74 68 65 20 69 6e 66   whether the inf
19170 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  ormation.    ** 
19180 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  is coming from t
19190 68 65 20 6b 65 79 20 6f 72 20 74 68 65 20 64 61  he key or the da
191a0 74 61 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ta of the record
191b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 72  ..    */.    pCr
191c0 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
191d0 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75  ;.    if( pC->nu
191e0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  llRow ){.      p
191f0 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a  ayloadSize = 0;.
19200 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
19210 2d 3e 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20  ->keyAsData ){. 
19220 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
19230 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26  KeySize(pCrsr, &
19240 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20  payloadSize);.  
19250 20 20 20 20 78 52 65 61 64 20 3d 20 73 71 6c 69      xRead = sqli
19260 74 65 42 74 72 65 65 4b 65 79 3b 0a 20 20 20 20  teBtreeKey;.    
19270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
19280 69 74 65 42 74 72 65 65 44 61 74 61 53 69 7a 65  iteBtreeDataSize
19290 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64  (pCrsr, &payload
192a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 78 52 65  Size);.      xRe
192b0 61 64 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  ad = sqliteBtree
192c0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Data;.    }..   
192d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
192e0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  ow many bytes in
192f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 61 74 61   the column data
19300 20 61 6e 64 20 77 68 65 72 65 20 74 68 65 20 63   and where the c
19310 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 64 61 74  olumn.    ** dat
19320 61 20 62 65 67 69 6e 73 2e 0a 20 20 20 20 2a 2f  a begins..    */
19330 0a 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64  .    if( payload
19340 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
19350 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61   aStack[tos].fla
19360 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20  gs = STK_Null;. 
19370 20 20 20 20 20 70 2d 3e 74 6f 73 20 3d 20 74 6f       p->tos = to
19380 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  s;.      break;.
19390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61      }else if( pa
193a0 79 6c 6f 61 64 53 69 7a 65 3c 32 35 36 20 29 7b  yloadSize<256 ){
193b0 0a 20 20 20 20 20 20 69 64 78 57 69 64 74 68 20  .      idxWidth 
193c0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
193d0 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3c 36  f( payloadSize<6
193e0 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 69 64  5536 ){.      id
193f0 78 57 69 64 74 68 20 3d 20 32 3b 0a 20 20 20 20  xWidth = 2;.    
19400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 64 78  }else{.      idx
19410 57 69 64 74 68 20 3d 20 33 3b 0a 20 20 20 20 7d  Width = 3;.    }
19420 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
19430 6f 75 74 20 77 68 65 72 65 20 74 68 65 20 72 65  out where the re
19440 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 20 69  quested column i
19450 73 20 73 74 6f 72 65 64 20 61 6e 64 20 68 6f 77  s stored and how
19460 20 62 69 67 20 69 74 20 69 73 2e 0a 20 20 20 20   big it is..    
19470 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 79 6c 6f  */.    if( paylo
19480 61 64 53 69 7a 65 20 3c 20 69 64 78 57 69 64 74  adSize < idxWidt
19490 68 2a 28 70 32 2b 31 29 20 29 7b 0a 20 20 20 20  h*(p2+1) ){.    
194a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
194b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  RRUPT;.      got
194c0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
194d0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
194e0 28 2a 78 52 65 61 64 29 28 70 43 72 73 72 2c 20  (*xRead)(pCrsr, 
194f0 69 64 78 57 69 64 74 68 2a 70 32 2c 20 69 64 78  idxWidth*p2, idx
19500 57 69 64 74 68 2a 32 2c 20 28 63 68 61 72 2a 29  Width*2, (char*)
19510 61 48 64 72 29 3b 0a 20 20 20 20 6f 66 66 73 65  aHdr);.    offse
19520 74 20 3d 20 61 48 64 72 5b 30 5d 3b 0a 20 20 20  t = aHdr[0];.   
19530 20 65 6e 64 20 3d 20 61 48 64 72 5b 69 64 78 57   end = aHdr[idxW
19540 69 64 74 68 5d 3b 0a 20 20 20 20 69 66 28 20 69  idth];.    if( i
19550 64 78 57 69 64 74 68 3e 31 20 29 7b 0a 20 20 20  dxWidth>1 ){.   
19560 20 20 20 6f 66 66 73 65 74 20 7c 3d 20 61 48 64     offset |= aHd
19570 72 5b 31 5d 3c 3c 38 3b 0a 20 20 20 20 20 20 65  r[1]<<8;.      e
19580 6e 64 20 7c 3d 20 61 48 64 72 5b 69 64 78 57 69  nd |= aHdr[idxWi
19590 64 74 68 2b 31 5d 3c 3c 38 3b 0a 20 20 20 20 20  dth+1]<<8;.     
195a0 20 69 66 28 20 69 64 78 57 69 64 74 68 3e 32 20   if( idxWidth>2 
195b0 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ){.        offse
195c0 74 20 7c 3d 20 61 48 64 72 5b 32 5d 3c 3c 31 36  t |= aHdr[2]<<16
195d0 3b 0a 20 20 20 20 20 20 20 20 65 6e 64 20 7c 3d  ;.        end |=
195e0 20 61 48 64 72 5b 69 64 78 57 69 64 74 68 2b 32   aHdr[idxWidth+2
195f0 5d 3c 3c 31 36 3b 0a 20 20 20 20 20 20 7d 0a 20  ]<<16;.      }. 
19600 20 20 20 7d 0a 20 20 20 20 61 6d 74 20 3d 20 65     }.    amt = e
19610 6e 64 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  nd - offset;.   
19620 20 69 66 28 20 61 6d 74 3c 30 20 7c 7c 20 6f 66   if( amt<0 || of
19630 66 73 65 74 3c 30 20 7c 7c 20 65 6e 64 3e 70 61  fset<0 || end>pa
19640 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20  yloadSize ){.   
19650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
19660 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f  ORRUPT;.      go
19670 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
19680 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  error;.    }..  
19690 20 20 2f 2a 20 61 6d 74 20 61 6e 64 20 6f 66 66    /* amt and off
196a0 73 65 74 20 6e 6f 77 20 68 6f 6c 64 20 74 68 65  set now hold the
196b0 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
196c0 74 61 72 74 20 6f 66 20 64 61 74 61 20 61 6e 64  tart of data and
196d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 6d 6f 75   the.    ** amou
196e0 6e 74 20 6f 66 20 64 61 74 61 2e 20 20 47 6f 20  nt of data.  Go 
196f0 67 65 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  get the data and
19700 20 70 75 74 20 69 74 20 6f 6e 20 74 68 65 20 73   put it on the s
19710 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
19720 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 7b 0a 20   if( amt==0 ){. 
19730 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d       aStack[tos]
19740 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c  .flags = STK_Nul
19750 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
19760 20 61 6d 74 3c 3d 4e 42 46 53 20 29 7b 0a 20 20   amt<=NBFS ){.  
19770 20 20 20 20 28 2a 78 52 65 61 64 29 28 70 43 72      (*xRead)(pCr
19780 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  sr, offset, amt,
19790 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 7a 29 3b   aStack[tos].z);
197a0 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f  .      aStack[to
197b0 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53  s].flags = STK_S
197c0 74 72 3b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b  tr;.      zStack
197d0 5b 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b 5b 74  [tos] = aStack[t
197e0 6f 73 5d 2e 7a 3b 0a 20 20 20 20 20 20 61 53 74  os].z;.      aSt
197f0 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 61 6d 74  ack[tos].n = amt
19800 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19810 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
19820 69 74 65 4d 61 6c 6c 6f 63 28 20 61 6d 74 20 29  iteMalloc( amt )
19830 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
19840 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
19850 20 20 20 20 20 20 28 2a 78 52 65 61 64 29 28 70        (*xRead)(p
19860 43 72 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  Crsr, offset, am
19870 74 2c 20 7a 29 3b 0a 20 20 20 20 20 20 61 53 74  t, z);.      aSt
19880 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
19890 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 44   STK_Str | STK_D
198a0 79 6e 3b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b  yn;.      zStack
198b0 5b 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20 20  [tos] = z;.     
198c0 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d   aStack[tos].n =
198d0 20 61 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20   amt;.    }.    
198e0 70 2d 3e 74 6f 73 20 3d 20 74 6f 73 3b 0a 20 20  p->tos = tos;.  
198f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
19900 20 4f 70 63 6f 64 65 3a 20 52 65 63 6e 6f 20 50   Opcode: Recno P
19910 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68  1 * *.**.** Push
19920 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
19930 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19940 20 69 73 20 74 68 65 20 66 69 72 73 74 20 34 20   is the first 4 
19950 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
19960 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 63  the key to the c
19970 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
19980 61 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63 61  a sequential sca
19990 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
199a0 65 0a 2a 2a 20 66 69 6c 65 20 50 31 2e 20 20 54  e.** file P1.  T
199b0 68 65 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63  he sequential sc
199c0 61 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  an should have b
199d0 65 65 6e 20 73 74 61 72 74 65 64 20 75 73 69 6e  een started usin
199e0 67 20 74 68 65 20 0a 2a 2a 20 4e 65 78 74 20 6f  g the .** Next o
199f0 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
19a00 50 5f 52 65 63 6e 6f 3a 20 7b 0a 20 20 69 6e 74  P_Recno: {.  int
19a10 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
19a20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b 70 2d 3e 74  int tos = ++p->t
19a30 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  os;.  BtCursor *
19a40 70 43 72 73 72 3b 0a 0a 20 20 56 45 52 49 46 59  pCrsr;..  VERIFY
19a50 28 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b 28  ( if( NeedStack(
19a60 70 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67 6f 74  p, p->tos) ) got
19a70 6f 20 6e 6f 5f 6d 65 6d 3b 20 29 0a 20 20 69 66  o no_mem; ).  if
19a80 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26  ( VERIFY( i>=0 &
19a90 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26  & i<p->nCursor &
19aa0 26 20 29 20 28 70 43 72 73 72 20 3d 20 70 2d 3e  & ) (pCrsr = p->
19ab0 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29  aCsr[i].pCursor)
19ac0 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  !=0 ){.    int v
19ad0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 43 73  ;.    if( p->aCs
19ae0 72 5b 69 5d 2e 72 65 63 6e 6f 49 73 56 61 6c 69  r[i].recnoIsVali
19af0 64 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  d ){.      v = p
19b00 2d 3e 61 43 73 72 5b 69 5d 2e 6c 61 73 74 52 65  ->aCsr[i].lastRe
19b10 63 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  cno;.    }else i
19b20 66 28 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75  f( p->aCsr[i].nu
19b30 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  llRow ){.      a
19b40 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
19b50 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20   = STK_Null;.   
19b60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
19b70 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
19b80 65 42 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c  eBtreeKey(pCrsr,
19b90 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2c   0, sizeof(u32),
19ba0 20 28 63 68 61 72 2a 29 26 76 29 3b 0a 20 20 20   (char*)&v);.   
19bb0 20 20 20 76 20 3d 20 6b 65 79 54 6f 49 6e 74 28     v = keyToInt(
19bc0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  v);.    }.    aS
19bd0 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d 20 76 3b  tack[tos].i = v;
19be0 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d  .    aStack[tos]
19bf0 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74  .flags = STK_Int
19c00 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
19c10 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6c  ../* Opcode: Ful
19c20 6c 4b 65 79 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a  lKey P1 * *.**.*
19c30 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f  * Extract the co
19c40 6d 70 6c 65 74 65 20 6b 65 79 20 66 72 6f 6d 20  mplete key from 
19c50 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20  the record that 
19c60 63 75 72 73 6f 72 20 50 31 20 69 73 20 63 75 72  cursor P1 is cur
19c70 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
19c80 6e 67 20 74 6f 20 61 6e 64 20 70 75 73 68 20 74  ng to and push t
19c90 68 65 20 6b 65 79 20 6f 6e 74 6f 20 74 68 65 20  he key onto the 
19ca0 73 74 61 63 6b 20 61 73 20 61 20 73 74 72 69 6e  stack as a strin
19cb0 67 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  g..**.** Compare
19cc0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
19cd0 52 65 63 6e 6f 2e 20 20 54 68 65 20 52 65 63 6e  Recno.  The Recn
19ce0 6f 20 6f 70 63 6f 64 65 20 65 78 74 72 61 63 74  o opcode extract
19cf0 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 34  s the first.** 4
19d00 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
19d10 79 20 61 6e 64 20 70 75 73 68 65 73 20 74 68 6f  y and pushes tho
19d20 73 65 20 62 79 74 65 73 20 6f 6e 74 6f 20 74 68  se bytes onto th
19d30 65 20 73 74 61 63 6b 20 61 73 20 61 6e 0a 2a 2a  e stack as an.**
19d40 20 69 6e 74 65 67 65 72 2e 20 20 54 68 69 73 20   integer.  This 
19d50 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 75 73 68  instruction push
19d60 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  es the entire ke
19d70 79 20 61 73 20 61 20 73 74 72 69 6e 67 2e 0a 2a  y as a string..*
19d80 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6c 6c 4b 65  /.case OP_FullKe
19d90 79 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  y: {.  int i = p
19da0 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f  Op->p1;.  int to
19db0 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20  s = ++p->tos;.  
19dc0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
19dd0 0a 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ..  VERIFY( if( 
19de0 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e  NeedStack(p, p->
19df0 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  tos) ) goto no_m
19e00 65 6d 3b 20 29 0a 20 20 56 45 52 49 46 59 28 20  em; ).  VERIFY( 
19e10 69 66 28 20 21 70 2d 3e 61 43 73 72 5b 69 5d 2e  if( !p->aCsr[i].
19e20 6b 65 79 41 73 44 61 74 61 20 29 20 67 6f 74 6f  keyAsData ) goto
19e30 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e   bad_instruction
19e40 3b 20 29 0a 20 20 69 66 28 20 56 45 52 49 46 59  ; ).  if( VERIFY
19e50 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
19e60 43 75 72 73 6f 72 20 26 26 20 29 20 28 70 43 72  Cursor && ) (pCr
19e70 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e  sr = p->aCsr[i].
19e80 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20  pCursor)!=0 ){. 
19e90 20 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 20 20     int amt;.    
19ea0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 73 71  char *z;..    sq
19eb0 6c 69 74 65 42 74 72 65 65 4b 65 79 53 69 7a 65  liteBtreeKeySize
19ec0 28 70 43 72 73 72 2c 20 26 61 6d 74 29 3b 0a 20  (pCrsr, &amt);. 
19ed0 20 20 20 69 66 28 20 61 6d 74 3c 3d 30 20 29 7b     if( amt<=0 ){
19ee0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19ef0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
19f00 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
19f10 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
19f20 0a 20 20 20 20 69 66 28 20 61 6d 74 3e 4e 42 46  .    if( amt>NBF
19f30 53 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  S ){.      z = s
19f40 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 61 6d 74  qliteMalloc( amt
19f50 20 29 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b   );.      aStack
19f60 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [tos].flags = ST
19f70 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 44 79 6e 3b  K_Str | STK_Dyn;
19f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19f90 20 20 7a 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73    z = aStack[tos
19fa0 5d 2e 7a 3b 0a 20 20 20 20 20 20 61 53 74 61 63  ].z;.      aStac
19fb0 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[tos].flags = S
19fc0 54 4b 5f 53 74 72 3b 0a 20 20 20 20 7d 0a 20 20  TK_Str;.    }.  
19fd0 20 20 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79    sqliteBtreeKey
19fe0 28 70 43 72 73 72 2c 20 30 2c 20 61 6d 74 2c 20  (pCrsr, 0, amt, 
19ff0 7a 29 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 74  z);.    zStack[t
1a000 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20 61 53 74  os] = z;.    aSt
1a010 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 61 6d 74  ack[tos].n = amt
1a020 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1a030 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
1a040 6c 52 6f 77 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a  lRow P1 * *.**.*
1a050 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a060 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72  r P1 to a null r
1a070 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75  ow.  Any OP_Colu
1a080 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a  mn operations.**
1a090 20 74 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c   that occur whil
1a0a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  e the cursor is 
1a0b0 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20  on the null row 
1a0c0 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 75 73 68  will always push
1a0d0 20 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 6e 74 6f   .** a NULL onto
1a0e0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63   the stack..*/.c
1a0f0 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20  ase OP_NullRow: 
1a100 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  {.  int i = pOp-
1a110 3e 70 31 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  >p1;.  BtCursor 
1a120 2a 70 43 72 73 72 3b 0a 0a 20 20 69 66 28 20 56  *pCrsr;..  if( V
1a130 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69  ERIFY( i>=0 && i
1a140 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29  <p->nCursor && )
1a150 20 28 70 43 72 73 72 20 3d 20 70 2d 3e 61 43 73   (pCrsr = p->aCs
1a160 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30  r[i].pCursor)!=0
1a170 20 29 7b 0a 20 20 20 20 70 2d 3e 61 43 73 72 5b   ){.    p->aCsr[
1a180 69 5d 2e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  i].nullRow = 1;.
1a190 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1a1a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74 20  /* Opcode: Last 
1a1b0 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  P1 P2 *.**.** Th
1a1c0 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68  e next use of th
1a1d0 65 20 52 65 63 6e 6f 20 6f 72 20 43 6f 6c 75 6d  e Recno or Colum
1a1e0 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75  n or Next instru
1a1f0 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a  ction for P1 .**
1a200 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74   will refer to t
1a210 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1a220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
1a230 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
1a240 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
1a250 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
1a260 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a  and P2>0, then j
1a270 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
1a280 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20  to P2..** If P2 
1a290 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74  is 0 or if the t
1a2a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
1a2b0 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
1a2c0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
1a2d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
1a2e0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
1a2f0 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 0a 20 20 69  e OP_Last: {.  i
1a300 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
1a310 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1a320 72 3b 0a 0a 20 20 69 66 28 20 56 45 52 49 46 59  r;..  if( VERIFY
1a330 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
1a340 43 75 72 73 6f 72 20 26 26 20 29 20 28 70 43 72  Cursor && ) (pCr
1a350 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e  sr = p->aCsr[i].
1a360 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20  pCursor)!=0 ){. 
1a370 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
1a380 73 71 6c 69 74 65 42 74 72 65 65 4c 61 73 74 28  sqliteBtreeLast(
1a390 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
1a3a0 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c    p->aCsr[i].nul
1a3b0 6c 52 6f 77 20 3d 20 72 65 73 3b 0a 20 20 20 20  lRow = res;.    
1a3c0 69 66 28 20 72 65 73 20 26 26 20 70 4f 70 2d 3e  if( res && pOp->
1a3d0 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 63  p2>0 ){.      pc
1a3e0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1a3f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
1a400 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1a410 20 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 0a   Rewind P1 P2 *.
1a420 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75  **.** The next u
1a430 73 65 20 6f 66 20 74 68 65 20 52 65 63 6e 6f 20  se of the Recno 
1a440 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78  or Column or Nex
1a450 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  t instruction fo
1a460 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65  r P1 .** will re
1a470 66 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  fer to the first
1a480 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1a490 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
1a4a0 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65  index..** If the
1a4b0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1a4c0 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e  is empty and P2>
1a4d0 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  0, then jump imm
1a4e0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
1a4f0 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72  ** If P2 is 0 or
1a500 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   if the table or
1a510 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
1a520 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
1a530 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
1a540 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
1a550 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  n..*/.case OP_Re
1a560 77 69 6e 64 3a 20 7b 0a 20 20 69 6e 74 20 69 20  wind: {.  int i 
1a570 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 42 74 43  = pOp->p1;.  BtC
1a580 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
1a590 20 69 66 28 20 56 45 52 49 46 59 28 20 69 3e 3d   if( VERIFY( i>=
1a5a0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
1a5b0 72 20 26 26 20 29 20 28 70 43 72 73 72 20 3d 20  r && ) (pCrsr = 
1a5c0 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73  p->aCsr[i].pCurs
1a5d0 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  or)!=0 ){.    in
1a5e0 74 20 72 65 73 3b 0a 20 20 20 20 73 71 6c 69 74  t res;.    sqlit
1a5f0 65 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73  eBtreeFirst(pCrs
1a600 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 2d  r, &res);.    p-
1a610 3e 61 43 73 72 5b 69 5d 2e 61 74 46 69 72 73 74  >aCsr[i].atFirst
1a620 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 70   = res==0;.    p
1a630 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c 6c 52 6f  ->aCsr[i].nullRo
1a640 77 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  w = res;.    if(
1a650 20 72 65 73 20 26 26 20 70 4f 70 2d 3e 70 32 3e   res && pOp->p2>
1a660 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
1a670 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1a680 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
1a690 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65  }../* Opcode: Ne
1a6a0 78 74 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a  xt P1 P2 *.**.**
1a6b0 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20   Advance cursor 
1a6c0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
1a6d0 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74  ints to the next
1a6e0 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69   key/data pair i
1a6f0 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f  n its.** table o
1a700 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  r index.  If the
1a710 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b  re are no more k
1a720 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74  ey/value pairs t
1a730 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1a740 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
1a750 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
1a760 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75  .  But if the cu
1a770 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73  rsor advance was
1a780 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
1a790 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
1a7a0 20 74 6f 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20   to P2..*/.case 
1a7b0 4f 50 5f 4e 65 78 74 3a 20 7b 0a 20 20 69 6e 74  OP_Next: {.  int
1a7c0 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
1a7d0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1a7e0 0a 0a 20 20 69 66 28 20 56 45 52 49 46 59 28 20  ..  if( VERIFY( 
1a7f0 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
1a800 72 73 6f 72 20 26 26 20 29 20 28 70 43 72 73 72  rsor && ) (pCrsr
1a810 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43   = p->aCsr[i].pC
1a820 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20  ursor)!=0 ){.   
1a830 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 66   int res;.    if
1a840 28 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c  ( p->aCsr[i].nul
1a850 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 72 65  lRow ){.      re
1a860 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1a870 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1a880 69 74 65 42 74 72 65 65 4e 65 78 74 28 70 43 72  iteBtreeNext(pCr
1a890 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  sr, &res);.     
1a8a0 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c 6c   p->aCsr[i].null
1a8b0 52 6f 77 20 3d 20 72 65 73 3b 0a 20 20 20 20 7d  Row = res;.    }
1a8c0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
1a8d0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1a8e0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1a8f0 20 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63   sqlite_search_c
1a900 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ount++;.    }.  
1a910 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 72 65 63    p->aCsr[i].rec
1a920 6e 6f 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  noIsValid = 0;. 
1a930 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1a940 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 50 75 74  * Opcode: IdxPut
1a950 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20   P1 P2 P3.**.** 
1a960 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  The top of the s
1a970 74 61 63 6b 20 68 6f 6c 64 20 61 6e 20 53 51 4c  tack hold an SQL
1a980 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20   index key made 
1a990 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b  using the.** Mak
1a9a0 65 49 64 78 4b 65 79 20 69 6e 73 74 72 75 63 74  eIdxKey instruct
1a9b0 69 6f 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ion.  This opcod
1a9c0 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65  e writes that ke
1a9d0 79 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  y into the.** in
1a9e0 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f  dex P1.  Data fo
1a9f0 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e  r the entry is n
1aa00 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d  il..**.** If P2=
1aa10 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79  =1, then the key
1aa20 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 2e   must be unique.
1aa30 20 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20    If the key is 
1aa40 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 2a 2a 20 74  not unique,.** t
1aa50 68 65 20 70 72 6f 67 72 61 6d 20 61 62 6f 72 74  he program abort
1aa60 73 20 77 69 74 68 20 61 20 53 51 4c 49 54 45 5f  s with a SQLITE_
1aa70 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
1aa80 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1aa90 65 0a 2a 2a 20 69 73 20 72 6f 6c 6c 65 64 20 62  e.** is rolled b
1aaa0 61 63 6b 2e 20 20 49 66 20 50 33 20 69 73 20 6e  ack.  If P3 is n
1aab0 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e 20 69 74  ot null, then it
1aac0 20 62 65 63 61 75 73 65 20 70 61 72 74 20 6f 66   because part of
1aad0 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 6d 65   the.** error me
1aae0 73 73 61 67 65 20 72 65 74 75 72 6e 65 64 20 77  ssage returned w
1aaf0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 43  ith the SQLITE_C
1ab00 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2f 0a 63 61  ONSTRAINT..*/.ca
1ab10 73 65 20 4f 50 5f 49 64 78 50 75 74 3a 20 7b 0a  se OP_IdxPut: {.
1ab20 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
1ab30 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70  1;.  int tos = p
1ab40 2d 3e 74 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f  ->tos;.  BtCurso
1ab50 72 20 2a 70 43 72 73 72 3b 0a 20 20 56 45 52 49  r *pCrsr;.  VERI
1ab60 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20  FY( if( tos<0 ) 
1ab70 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
1ab80 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 56  stack; ).  if( V
1ab90 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69  ERIFY( i>=0 && i
1aba0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29  <p->nCursor && )
1abb0 20 28 70 43 72 73 72 20 3d 20 70 2d 3e 61 43 73   (pCrsr = p->aCs
1abc0 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30  r[i].pCursor)!=0
1abd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   ){.    int nKey
1abe0 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e   = aStack[tos].n
1abf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1ac00 20 2a 7a 4b 65 79 20 3d 20 7a 53 74 61 63 6b 5b   *zKey = zStack[
1ac10 74 6f 73 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  tos];.    if( pO
1ac20 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20 20 20 69  p->p2 ){.      i
1ac30 6e 74 20 72 65 73 2c 20 6e 3b 0a 20 20 20 20 20  nt res, n;.     
1ac40 20 61 73 73 65 72 74 28 20 61 53 74 61 63 6b 5b   assert( aStack[
1ac50 74 6f 73 5d 2e 6e 20 3e 3d 20 34 20 29 3b 0a 20  tos].n >= 4 );. 
1ac60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ac70 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 72 73  BtreeMoveto(pCrs
1ac80 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2d 34 2c  r, zKey, nKey-4,
1ac90 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
1aca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1acb0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1acc0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1acd0 20 77 68 69 6c 65 28 20 72 65 73 21 3d 30 20 29   while( res!=0 )
1ace0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
1acf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 42  .        sqliteB
1ad00 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73  treeKeySize(pCrs
1ad10 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
1ad20 69 66 28 20 6e 3d 3d 6e 4b 65 79 0a 20 20 20 20  if( n==nKey.    
1ad30 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ad40 42 74 72 65 65 4b 65 79 43 6f 6d 70 61 72 65 28  BtreeKeyCompare(
1ad50 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65  pCrsr, zKey, nKe
1ad60 79 2d 34 2c 20 34 2c 20 26 63 29 3d 3d 53 51 4c  y-4, 4, &c)==SQL
1ad70 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
1ad80 20 20 26 26 20 63 3d 3d 30 0a 20 20 20 20 20 20    && c==0.      
1ad90 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
1ada0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
1adb0 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
1adc0 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 26 26 20   if( pOp->p3 && 
1add0 70 4f 70 2d 3e 70 33 5b 30 5d 20 29 7b 0a 20 20  pOp->p3[0] ){.  
1ade0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1adf0 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
1ae00 73 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20 69  sg, "duplicate i
1ae10 6e 64 65 78 20 65 6e 74 72 79 3a 20 22 2c 20 70  ndex entry: ", p
1ae20 4f 70 2d 3e 70 33 2c 30 29 3b 0a 20 20 20 20 20  Op->p3,0);.     
1ae30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ae40 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1ae50 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1ae60 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ae70 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
1ae80 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 4e 65     sqliteBtreeNe
1ae90 78 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  xt(pCrsr, &res);
1aea0 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
1aeb0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   +1;.        }el
1aec0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se{.          br
1aed0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1aee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aef0 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
1af00 65 49 6e 73 65 72 74 28 70 43 72 73 72 2c 20 7a  eInsert(pCrsr, z
1af10 4b 65 79 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30  Key, nKey, "", 0
1af20 29 3b 0a 20 20 7d 0a 20 20 50 4f 50 53 54 41 43  );.  }.  POPSTAC
1af30 4b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  K;.  break;.}../
1af40 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65 6c  * Opcode: IdxDel
1af50 65 74 65 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a  ete P1 * *.**.**
1af60 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
1af70 73 74 61 63 6b 20 69 73 20 61 6e 20 69 6e 64 65  stack is an inde
1af80 78 20 6b 65 79 20 62 75 69 6c 74 20 75 73 69 6e  x key built usin
1af90 67 20 74 68 65 20 4d 61 6b 65 49 64 78 4b 65 79  g the MakeIdxKey
1afa0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73   opcode..** This
1afb0 20 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65 73 20   opcode removes 
1afc0 74 68 61 74 20 65 6e 74 72 79 20 66 72 6f 6d 20  that entry from 
1afd0 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 61  the index..*/.ca
1afe0 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a  se OP_IdxDelete:
1aff0 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
1b000 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20  ->p1;.  int tos 
1b010 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 42 74 43 75  = p->tos;.  BtCu
1b020 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 56  rsor *pCrsr;.  V
1b030 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30  ERIFY( if( tos<0
1b040 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
1b050 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66  gh_stack; ).  if
1b060 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26  ( VERIFY( i>=0 &
1b070 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26  & i<p->nCursor &
1b080 26 20 29 20 28 70 43 72 73 72 20 3d 20 70 2d 3e  & ) (pCrsr = p->
1b090 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29  aCsr[i].pCursor)
1b0a0 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  !=0 ){.    int r
1b0b0 78 2c 20 72 65 73 3b 0a 20 20 20 20 72 78 20 3d  x, res;.    rx =
1b0c0 20 73 71 6c 69 74 65 42 74 72 65 65 4d 6f 76 65   sqliteBtreeMove
1b0d0 74 6f 28 70 43 72 73 72 2c 20 7a 53 74 61 63 6b  to(pCrsr, zStack
1b0e0 5b 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f  [tos], aStack[to
1b0f0 73 5d 2e 6e 2c 20 26 72 65 73 29 3b 0a 20 20 20  s].n, &res);.   
1b100 20 69 66 28 20 72 78 3d 3d 53 51 4c 49 54 45 5f   if( rx==SQLITE_
1b110 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a  OK && res==0 ){.
1b120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b130 65 42 74 72 65 65 44 65 6c 65 74 65 28 70 43 72  eBtreeDelete(pCr
1b140 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sr);.    }.  }. 
1b150 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72 65   POPSTACK;.  bre
1b160 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1b170 3a 20 49 64 78 52 65 63 6e 6f 20 50 31 20 2a 20  : IdxRecno P1 * 
1b180 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 6f 6e 74  *.**.** Push ont
1b190 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e 20 69  o the stack an i
1b1a0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b1b0 74 68 65 20 6c 61 73 74 20 34 20 62 79 74 65 73  the last 4 bytes
1b1c0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 68 65 20 6b   of the.** the k
1b1d0 65 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ey to the curren
1b1e0 74 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78  t entry in index
1b1f0 20 50 31 2e 20 20 54 68 65 73 65 20 34 20 62 79   P1.  These 4 by
1b200 74 65 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  tes should.** be
1b210 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
1b220 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  er of the table 
1b230 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1b240 68 69 73 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  his index entry.
1b250 2a 2a 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  ** points..**.**
1b260 20 53 65 65 20 61 6c 73 6f 3a 20 52 65 63 6e 6f   See also: Recno
1b270 2c 20 4d 61 6b 65 49 64 78 4b 65 79 2e 0a 2a 2f  , MakeIdxKey..*/
1b280 0a 63 61 73 65 20 4f 50 5f 49 64 78 52 65 63 6e  .case OP_IdxRecn
1b290 6f 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  o: {.  int i = p
1b2a0 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f  Op->p1;.  int to
1b2b0 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20  s = ++p->tos;.  
1b2c0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1b2d0 0a 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ..  VERIFY( if( 
1b2e0 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e  NeedStack(p, p->
1b2f0 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  tos) ) goto no_m
1b300 65 6d 3b 20 29 0a 20 20 69 66 28 20 56 45 52 49  em; ).  if( VERI
1b310 46 59 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  FY( i>=0 && i<p-
1b320 3e 6e 43 75 72 73 6f 72 20 26 26 20 29 20 28 70  >nCursor && ) (p
1b330 43 72 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69  Crsr = p->aCsr[i
1b340 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b  ].pCursor)!=0 ){
1b350 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20  .    int v;.    
1b360 69 6e 74 20 73 7a 3b 0a 20 20 20 20 73 71 6c 69  int sz;.    sqli
1b370 74 65 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  teBtreeKeySize(p
1b380 43 72 73 72 2c 20 26 73 7a 29 3b 0a 20 20 20 20  Crsr, &sz);.    
1b390 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79 28 70  sqliteBtreeKey(p
1b3a0 43 72 73 72 2c 20 73 7a 20 2d 20 73 69 7a 65 6f  Crsr, sz - sizeo
1b3b0 66 28 75 33 32 29 2c 20 73 69 7a 65 6f 66 28 75  f(u32), sizeof(u
1b3c0 33 32 29 2c 20 28 63 68 61 72 2a 29 26 76 29 3b  32), (char*)&v);
1b3d0 0a 20 20 20 20 76 20 3d 20 6b 65 79 54 6f 49 6e  .    v = keyToIn
1b3e0 74 28 76 29 3b 0a 20 20 20 20 61 53 74 61 63 6b  t(v);.    aStack
1b3f0 5b 74 6f 73 5d 2e 69 20 3d 20 76 3b 0a 20 20 20  [tos].i = v;.   
1b400 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61   aStack[tos].fla
1b410 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20  gs = STK_Int;.  
1b420 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
1b430 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50   Opcode: IdxGT P
1b440 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d  1 P2 *.**.** Com
1b450 70 61 72 65 20 74 68 65 20 74 6f 70 20 6f 66 20  pare the top of 
1b460 74 68 65 20 73 74 61 63 6b 20 61 67 61 69 6e 73  the stack agains
1b470 74 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65  t the key on the
1b480 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1b490 74 0a 2a 2a 20 63 75 72 73 6f 72 20 50 31 20 69  t.** cursor P1 i
1b4a0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1b4b0 74 69 6e 67 20 74 6f 2e 20 20 49 67 6e 6f 72 65  ting to.  Ignore
1b4c0 20 74 68 65 20 6c 61 73 74 20 34 20 62 79 74 65   the last 4 byte
1b4d0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 64 65  s of the.** inde
1b4e0 78 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  x entry.  If the
1b4f0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20   index entry is 
1b500 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1b510 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
1b520 6b 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74  k.** then jump t
1b530 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
1b540 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
1b550 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1b560 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 65 69 74  ction..** In eit
1b570 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 73 74  her case, the st
1b580 61 63 6b 20 69 73 20 70 6f 70 70 65 64 20 6f 6e  ack is popped on
1b590 63 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ce..*/./* Opcode
1b5a0 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 2a 0a  : IdxGE P1 P2 *.
1b5b0 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  **.** Compare th
1b5c0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
1b5d0 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 6b  ck against the k
1b5e0 65 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  ey on the index 
1b5f0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 63 75  entry that.** cu
1b600 72 73 6f 72 20 50 31 20 69 73 20 63 75 72 72 65  rsor P1 is curre
1b610 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
1b620 2e 20 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 61  .  Ignore the la
1b630 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1b640 65 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72 79  e.** index entry
1b650 2e 20 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  .  If the index 
1b660 65 6e 74 72 79 20 69 73 20 67 72 65 61 74 65 72  entry is greater
1b670 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1b680 6f 20 0a 2a 2a 20 74 68 65 20 74 6f 70 20 6f 66  o .** the top of
1b690 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 74 68   the stack.** th
1b6a0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
1b6b0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
1b6c0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
1b6d0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
1b6e0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
1b6f0 65 2c 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  e, the stack is 
1b700 70 6f 70 70 65 64 20 6f 6e 63 65 2e 0a 2a 2f 0a  popped once..*/.
1b710 63 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 0a 63  case OP_IdxGT:.c
1b720 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 7b 0a  ase OP_IdxGE: {.
1b730 20 20 69 6e 74 20 69 3d 20 70 4f 70 2d 3e 70 31    int i= pOp->p1
1b740 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  ;.  int tos = p-
1b750 3e 74 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f 72  >tos;.  BtCursor
1b760 20 2a 70 43 72 73 72 3b 0a 0a 20 20 69 66 28 20   *pCrsr;..  if( 
1b770 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20  VERIFY( i>=0 && 
1b780 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20  i<p->nCursor && 
1b790 29 20 28 70 43 72 73 72 20 3d 20 70 2d 3e 61 43  ) (pCrsr = p->aC
1b7a0 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d  sr[i].pCursor)!=
1b7b0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  0 ){.    int res
1b7c0 2c 20 72 63 3b 0a 20 0a 20 20 20 20 69 66 28 20  , rc;. .    if( 
1b7d0 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73  Stringify(p, tos
1b7e0 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
1b7f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b800 42 74 72 65 65 4b 65 79 43 6f 6d 70 61 72 65 28  BtreeKeyCompare(
1b810 70 43 72 73 72 2c 20 7a 53 74 61 63 6b 5b 74 6f  pCrsr, zStack[to
1b820 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  s], aStack[tos].
1b830 6e 2c 20 34 2c 20 26 72 65 73 29 3b 0a 20 20 20  n, 4, &res);.   
1b840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  OK ){.      brea
1b860 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1b870 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1b880 5f 49 64 78 47 45 20 29 7b 0a 20 20 20 20 20 20  _IdxGE ){.      
1b890 72 65 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  res++;.    }.   
1b8a0 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
1b8b0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1b8c0 20 2d 20 31 20 3b 0a 20 20 20 20 7d 0a 20 20 7d   - 1 ;.    }.  }
1b8d0 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62  .  POPSTACK;.  b
1b8e0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1b8f0 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50  de: Destroy P1 P
1b900 32 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  2 *.**.** Delete
1b910 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
1b920 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
1b930 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
1b940 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1b950 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69  se.** file is gi
1b960 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a  ven by P1..**.**
1b970 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
1b980 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e   destroyed is in
1b990 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1b9a0 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30  se file if P2==0
1b9b0 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74  .  If.** P2==1 t
1b9c0 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
1b9d0 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
1b9e0 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
1b9f0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
1ba00 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
1ba10 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
1ba20 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
1ba30 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
1ba40 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1ba50 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f   Clear.*/.case O
1ba60 50 5f 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 73  P_Destroy: {.  s
1ba70 71 6c 69 74 65 42 74 72 65 65 44 72 6f 70 54 61  qliteBtreeDropTa
1ba80 62 6c 65 28 70 4f 70 2d 3e 70 32 20 3f 20 64 62  ble(pOp->p2 ? db
1ba90 2d 3e 70 42 65 54 65 6d 70 20 3a 20 70 42 74 2c  ->pBeTemp : pBt,
1baa0 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65   pOp->p1);.  bre
1bab0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1bac0 3a 20 43 6c 65 61 72 20 50 31 20 50 32 20 2a 0a  : Clear P1 P2 *.
1bad0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  **.** Delete all
1bae0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1baf0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
1bb00 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72  or index whose r
1bb10 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74  oot page.** in t
1bb20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bb30 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e   is given by P1.
1bb40 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65    But, unlike De
1bb50 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  stroy, do not.**
1bb60 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
1bb70 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
1bb80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bb90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  e..**.** The tab
1bba0 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69  le being clear i
1bbb0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  s in the main da
1bbc0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
1bbd0 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d  2==0.  If.** P2=
1bbe0 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  =1 then the tabl
1bbf0 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73  e to be clear is
1bc00 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
1bc10 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  y database file.
1bc20 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ** that is used 
1bc30 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20  to store tables 
1bc40 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45  create using CRE
1bc50 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41  ATE TEMPORARY TA
1bc60 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  BLE..**.** See a
1bc70 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a  lso: Destroy.*/.
1bc80 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b  case OP_Clear: {
1bc90 0a 20 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c  .  sqliteBtreeCl
1bca0 65 61 72 54 61 62 6c 65 28 70 4f 70 2d 3e 70 32  earTable(pOp->p2
1bcb0 20 3f 20 64 62 2d 3e 70 42 65 54 65 6d 70 20 3a   ? db->pBeTemp :
1bcc0 20 70 42 74 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a   pBt, pOp->p1);.
1bcd0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1bce0 70 63 6f 64 65 3a 20 43 72 65 61 74 65 54 61 62  pcode: CreateTab
1bcf0 6c 65 20 2a 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a  le * P2 P3.**.**
1bd00 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1bd10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
1bd20 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1bd30 69 66 20 50 32 3d 3d 30 20 6f 72 20 69 6e 20 74  if P2==0 or in t
1bd40 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  he.** auxiliary 
1bd50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
1bd60 20 50 32 3d 3d 31 2e 20 20 50 75 73 68 20 74 68   P2==1.  Push th
1bd70 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  e page number.**
1bd80 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
1bd90 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
1bda0 62 6c 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ble onto the sta
1bdb0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f  ck..**.** The ro
1bdc0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot page number i
1bdd0 73 20 61 6c 73 6f 20 77 72 69 74 74 65 6e 20 74  s also written t
1bde0 6f 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  o a memory locat
1bdf0 69 6f 6e 20 74 68 61 74 20 50 33 0a 2a 2a 20 70  ion that P3.** p
1be00 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 69 73 20  oints to.  This 
1be10 69 73 20 74 68 65 20 6d 65 63 68 61 6e 69 73 6d  is the mechanism
1be20 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
1be30 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  e the root page.
1be40 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 74  ** number into t
1be50 68 65 20 70 61 72 73 65 72 27 73 20 69 6e 74 65  he parser's inte
1be60 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
1be70 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
1be80 62 65 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 61  be the.** new ta
1be90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
1bea0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1beb0 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  n a table and an
1bec0 20 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a 20   index is this: 
1bed0 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a 2a   A table must.**
1bee0 20 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 69   have a 4-byte i
1bef0 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 63  nteger key and c
1bf00 61 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72  an have arbitrar
1bf10 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 65  y data.  An inde
1bf20 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 69  x.** has an arbi
1bf30 74 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e 6f  trary key but no
1bf40 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   data..**.** See
1bf50 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e 64   also: CreateInd
1bf60 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ex.*/./* Opcode:
1bf70 20 43 72 65 61 74 65 49 6e 64 65 78 20 2a 20 50   CreateIndex * P
1bf80 32 20 50 33 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63  2 P3.**.** Alloc
1bf90 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
1bfa0 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
1bfb0 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d  base file if P2=
1bfc0 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
1bfd0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1bfe0 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 31  se file if P2==1
1bff0 2e 20 20 50 75 73 68 20 74 68 65 20 70 61 67 65  .  Push the page
1c000 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 0a 2a   number of the.*
1c010 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
1c020 68 65 20 6e 65 77 20 69 6e 64 65 78 20 6f 6e 74  he new index ont
1c030 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  o the stack..**.
1c040 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 61  ** See documenta
1c050 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 74  tion on OP_Creat
1c060 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69 74  eTable for addit
1c070 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1c080 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72  n..*/.case OP_Cr
1c090 65 61 74 65 49 6e 64 65 78 3a 0a 63 61 73 65 20  eateIndex:.case 
1c0a0 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 3a 20  OP_CreateTable: 
1c0b0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2b 2b 70 2d  {.  int i = ++p-
1c0c0 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  >tos;.  int pgno
1c0d0 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20  ;.  VERIFY( if( 
1c0e0 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e  NeedStack(p, p->
1c0f0 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  tos) ) goto no_m
1c100 65 6d 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20  em; ).  assert( 
1c110 70 4f 70 2d 3e 70 33 21 3d 30 20 26 26 20 70 4f  pOp->p3!=0 && pO
1c120 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f  p->p3type==P3_PO
1c130 49 4e 54 45 52 20 29 3b 0a 20 20 69 66 28 20 70  INTER );.  if( p
1c140 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
1c150 72 65 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20  reateTable ){.  
1c160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72    rc = sqliteBtr
1c170 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 4f  eeCreateTable(pO
1c180 70 2d 3e 70 32 20 3f 20 64 62 2d 3e 70 42 65 54  p->p2 ? db->pBeT
1c190 65 6d 70 20 3a 20 70 42 74 2c 20 26 70 67 6e 6f  emp : pBt, &pgno
1c1a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c1b0 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
1c1c0 43 72 65 61 74 65 49 6e 64 65 78 28 70 4f 70 2d  CreateIndex(pOp-
1c1d0 3e 70 32 20 3f 20 64 62 2d 3e 70 42 65 54 65 6d  >p2 ? db->pBeTem
1c1e0 70 20 3a 20 70 42 74 2c 20 26 70 67 6e 6f 29 3b  p : pBt, &pgno);
1c1f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c210 61 53 74 61 63 6b 5b 69 5d 2e 69 20 3d 20 70 67  aStack[i].i = pg
1c220 6e 6f 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69  no;.    aStack[i
1c230 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e  ].flags = STK_In
1c240 74 3b 0a 20 20 20 20 2a 28 75 33 32 2a 29 70 4f  t;.    *(u32*)pO
1c250 70 2d 3e 70 33 20 3d 20 70 67 6e 6f 3b 0a 20 20  p->p3 = pgno;.  
1c260 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
1c270 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1c280 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72  * Opcode: Integr
1c290 69 74 79 43 6b 20 50 31 20 2a 20 2a 0a 2a 2a 0a  ityCk P1 * *.**.
1c2a0 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ** Do an analysi
1c2b0 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
1c2c0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
1c2d0 2e 20 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 65  .  Push onto the
1c2e0 0a 2a 2a 20 73 74 61 63 6b 20 74 68 65 20 74 65  .** stack the te
1c2f0 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d  xt of an error m
1c300 65 73 73 61 67 65 20 64 65 73 63 72 69 62 69 6e  essage describin
1c310 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  g any problems..
1c320 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1c330 6e 6f 20 65 72 72 6f 72 73 2c 20 70 75 73 68 20  no errors, push 
1c340 61 20 22 6f 6b 22 20 6f 6e 74 6f 20 74 68 65 20  a "ok" onto the 
1c350 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  stack..**.** P1 
1c360 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1c370 61 20 73 65 74 20 74 68 61 74 20 63 6f 6e 74 61  a set that conta
1c380 69 6e 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ins the root pag
1c390 65 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 66 6f 72  e numbers.** for
1c3a0 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
1c3b0 69 6e 64 69 63 65 73 20 69 6e 20 74 68 69 73 20  indices in this 
1c3c0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1c3d0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75  This opcode is u
1c3e0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1c3f0 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 0a 2a  purposes only..*
1c400 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 72  /.case OP_Integr
1c410 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e  ityCk: {.  int n
1c420 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 2a 61 52 6f  Root;.  int *aRo
1c430 6f 74 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20  ot;.  int tos = 
1c440 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20  ++p->tos;.  int 
1c450 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  iSet = pOp->p1;.
1c460 20 20 53 65 74 20 2a 70 53 65 74 3b 0a 20 20 69    Set *pSet;.  i
1c470 6e 74 20 6a 3b 0a 20 20 48 61 73 68 45 6c 65 6d  nt j;.  HashElem
1c480 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   *i;.  char *z;.
1c490 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 69  .  VERIFY( if( i
1c4a0 53 65 74 3c 30 20 7c 7c 20 69 53 65 74 3e 3d 70  Set<0 || iSet>=p
1c4b0 2d 3e 6e 53 65 74 20 29 20 67 6f 74 6f 20 62 61  ->nSet ) goto ba
1c4c0 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
1c4d0 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 4e  .  VERIFY( if( N
1c4e0 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74  eedStack(p, p->t
1c4f0 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  os) ) goto no_me
1c500 6d 3b 20 29 0a 20 20 70 53 65 74 20 3d 20 26 70  m; ).  pSet = &p
1c510 2d 3e 61 53 65 74 5b 69 53 65 74 5d 3b 0a 20 20  ->aSet[iSet];.  
1c520 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 48 61  nRoot = sqliteHa
1c530 73 68 43 6f 75 6e 74 28 26 70 53 65 74 2d 3e 68  shCount(&pSet->h
1c540 61 73 68 29 3b 0a 20 20 61 52 6f 6f 74 20 3d 20  ash);.  aRoot = 
1c550 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1c560 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74  zeof(int)*(nRoot
1c570 2b 31 29 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  +1) );.  for(j=0
1c580 2c 20 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  , i=sqliteHashFi
1c590 72 73 74 28 26 70 53 65 74 2d 3e 68 61 73 68 29  rst(&pSet->hash)
1c5a0 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
1c5b0 68 4e 65 78 74 28 69 29 2c 20 6a 2b 2b 29 7b 0a  hNext(i), j++){.
1c5c0 20 20 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 61      aRoot[j] = a
1c5d0 74 6f 69 28 28 63 68 61 72 2a 29 73 71 6c 69 74  toi((char*)sqlit
1c5e0 65 48 61 73 68 4b 65 79 28 69 29 29 3b 0a 20 20  eHashKey(i));.  
1c5f0 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30  }.  aRoot[j] = 0
1c600 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 42 74  ;.  z = sqliteBt
1c610 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
1c620 6b 28 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52  k(pBt, aRoot, nR
1c630 6f 6f 74 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  oot);.  if( z==0
1c640 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20   || z[0]==0 ){. 
1c650 20 20 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d     zStack[tos] =
1c660 20 22 6f 6b 22 3b 0a 20 20 20 20 61 53 74 61 63   "ok";.    aStac
1c670 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 33 3b 0a 20 20  k[tos].n = 3;.  
1c680 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c    aStack[tos].fl
1c690 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 20 7c 20  ags = STK_Str | 
1c6a0 53 54 4b 5f 53 74 61 74 69 63 3b 0a 20 20 20 20  STK_Static;.    
1c6b0 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 46 72  if( z ) sqliteFr
1c6c0 65 65 28 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ee(z);.  }else{.
1c6d0 20 20 20 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20      zStack[tos] 
1c6e0 3d 20 7a 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  = z;.    aStack[
1c6f0 74 6f 73 5d 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  tos].n = strlen(
1c700 7a 29 20 2b 20 31 3b 0a 20 20 20 20 61 53 74 61  z) + 1;.    aSta
1c710 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[tos].flags = 
1c720 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 44 79  STK_Str | STK_Dy
1c730 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  n;.  }.  sqliteF
1c740 72 65 65 28 61 52 6f 6f 74 29 3b 0a 20 20 62 72  ree(aRoot);.  br
1c750 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1c760 65 3a 20 20 4c 69 6d 69 74 20 50 31 20 50 32 20  e:  Limit P1 P2 
1c770 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 61 20 6c 69  *.**.** Set a li
1c780 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 6f  mit and offset o
1c790 6e 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 50 31  n callbacks.  P1
1c7a0 20 69 73 20 74 68 65 20 6c 69 6d 69 74 20 61 6e   is the limit an
1c7b0 64 20 50 32 20 69 73 0a 2a 2a 20 74 68 65 20 6f  d P2 is.** the o
1c7c0 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 20 6f  ffset.  If the o
1c7d0 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 69 73  ffset counter is
1c7e0 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 20 63 61   positive, no ca
1c7f0 6c 6c 62 61 63 6b 73 20 61 72 65 0a 2a 2a 20 69  llbacks are.** i
1c800 6e 76 6f 6b 65 64 20 62 75 74 20 69 6e 73 74 65  nvoked but inste
1c810 61 64 20 74 68 65 20 63 6f 75 6e 74 65 72 20 69  ad the counter i
1c820 73 20 64 65 63 72 65 6d 65 6e 74 65 64 2e 20 20  s decremented.  
1c830 4f 6e 63 65 20 74 68 65 20 6f 66 66 73 65 74 0a  Once the offset.
1c840 2a 2a 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ** counter reach
1c850 65 73 20 7a 65 72 6f 2c 20 63 61 6c 6c 62 61 63  es zero, callbac
1c860 6b 73 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 61  ks are invoked a
1c870 6e 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  nd the limit.** 
1c880 63 6f 75 6e 74 65 72 20 69 73 20 64 65 63 72 65  counter is decre
1c890 6d 65 6e 74 65 64 2e 20 20 57 68 65 6e 20 74 68  mented.  When th
1c8a0 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72 20  e limit counter 
1c8b0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
1c8c0 20 74 68 65 20 4f 50 5f 43 61 6c 6c 62 61 63 6b   the OP_Callback
1c8d0 20 6f 72 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62   or OP_SortCallb
1c8e0 61 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ack instruction 
1c8f0 65 78 65 63 75 74 65 73 20 61 20 6a 75 6d 70 0a  executes a jump.
1c900 2a 2a 20 74 68 61 74 20 73 68 6f 75 6c 64 20 65  ** that should e
1c910 6e 64 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a  nd the query..**
1c920 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1c930 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
1c940 6d 65 6e 74 20 74 68 65 20 22 4c 49 4d 49 54 20  ment the "LIMIT 
1c950 78 20 4f 46 46 53 45 54 20 79 22 20 63 6c 61 75  x OFFSET y" clau
1c960 73 65 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  se.** of a SELEC
1c970 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  T statement..*/.
1c980 63 61 73 65 20 4f 50 5f 4c 69 6d 69 74 3a 20 7b  case OP_Limit: {
1c990 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
1c9a0 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 69 4f 66  Op->p1;.  p->iOf
1c9b0 66 73 65 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  fset = pOp->p2;.
1c9c0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1c9d0 70 63 6f 64 65 3a 20 4c 69 6d 69 74 43 6b 20 50  pcode: LimitCk P
1c9e0 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20  1 P2 *.**.** If 
1c9f0 50 31 20 69 73 20 31 2c 20 74 68 65 6e 20 63 68  P1 is 1, then ch
1ca00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1ca10 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
1ca20 20 28 73 65 74 20 62 79 20 74 68 65 0a 2a 2a 20   (set by the.** 
1ca30 50 32 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 4f  P2 argument of O
1ca40 50 5f 4c 69 6d 69 74 29 20 69 73 20 70 6f 73 69  P_Limit) is posi
1ca50 74 69 76 65 2e 20 20 49 66 20 74 68 65 20 6f 66  tive.  If the of
1ca60 66 73 65 74 20 63 6f 75 6e 74 65 72 20 69 73 0a  fset counter is.
1ca70 2a 2a 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e  ** positive then
1ca80 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   decrement the c
1ca90 6f 75 6e 74 65 72 20 61 6e 64 20 6a 75 6d 70 20  ounter and jump 
1caa0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1cab0 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  2..** Otherwise 
1cac0 66 61 6c 6c 20 73 74 72 61 69 67 68 74 20 74 68  fall straight th
1cad0 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rough..**.** If 
1cae0 50 31 20 69 73 20 30 2c 20 74 68 65 6e 20 63 68  P1 is 0, then ch
1caf0 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66  eck the value of
1cb00 20 74 68 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74   the limit count
1cb10 65 72 20 28 73 65 74 20 62 79 20 74 68 65 0a 2a  er (set by the.*
1cb20 2a 20 50 31 20 61 72 67 75 6d 65 6e 74 20 6f 66  * P1 argument of
1cb30 20 4f 50 5f 4c 69 6d 69 74 29 2e 20 20 49 66 20   OP_Limit).  If 
1cb40 74 68 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65  the limit counte
1cb50 72 20 69 73 20 6e 65 67 61 74 69 76 65 20 6f 72  r is negative or
1cb60 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 6e 20 6a 75  .** zero then ju
1cb70 6d 70 20 69 6d 6d 65 64 61 74 65 6c 79 20 74 6f  mp immedately to
1cb80 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20   P2.  Otherwise 
1cb90 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 69  decrement the li
1cba0 6d 69 74 0a 2a 2a 20 63 6f 75 6e 74 65 72 20 61  mit.** counter a
1cbb0 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  nd fall through.
1cbc0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69 6d 69  .*/.case OP_Limi
1cbd0 74 43 6b 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70  tCk: {.  if( pOp
1cbe0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28 20  ->p1 ){.    if( 
1cbf0 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->iOffset ){.  
1cc00 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 2d 2d      p->iOffset--
1cc10 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  ;.      pc = pOp
1cc20 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  ->p2 - 1;.    }.
1cc30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1cc40 20 70 2d 3e 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   p->iLimit>0 ){.
1cc50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2d        p->iLimit-
1cc60 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  -;.    }else{.  
1cc70 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1cc80 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   - 1;.    }.  }.
1cc90 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
1cca0 4f 70 63 6f 64 65 3a 20 4c 69 73 74 57 72 69 74  Opcode: ListWrit
1ccb0 65 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  e * * *.**.** Wr
1ccc0 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ite the integer 
1ccd0 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
1cce0 65 20 73 74 61 63 6b 0a 2a 2a 20 69 6e 74 6f 20  e stack.** into 
1ccf0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  the temporary st
1cd00 6f 72 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 63  orage list..*/.c
1cd10 61 73 65 20 4f 50 5f 4c 69 73 74 57 72 69 74 65  ase OP_ListWrite
1cd20 3a 20 7b 0a 20 20 4b 65 79 6c 69 73 74 20 2a 70  : {.  Keylist *p
1cd30 4b 65 79 6c 69 73 74 3b 0a 20 20 56 45 52 49 46  Keylist;.  VERIF
1cd40 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 3c 30 20  Y( if( p->tos<0 
1cd50 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
1cd60 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 70 4b 65  h_stack; ).  pKe
1cd70 79 6c 69 73 74 20 3d 20 70 2d 3e 70 4c 69 73 74  ylist = p->pList
1cd80 3b 0a 20 20 69 66 28 20 70 4b 65 79 6c 69 73 74  ;.  if( pKeylist
1cd90 3d 3d 30 20 7c 7c 20 70 4b 65 79 6c 69 73 74 2d  ==0 || pKeylist-
1cda0 3e 6e 55 73 65 64 3e 3d 70 4b 65 79 6c 69 73 74  >nUsed>=pKeylist
1cdb0 2d 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b  ->nKey ){.    pK
1cdc0 65 79 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d  eylist = sqliteM
1cdd0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 4b 65  alloc( sizeof(Ke
1cde0 79 6c 69 73 74 29 2b 39 39 39 2a 73 69 7a 65 6f  ylist)+999*sizeo
1cdf0 66 28 70 4b 65 79 6c 69 73 74 2d 3e 61 4b 65 79  f(pKeylist->aKey
1ce00 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1ce10 70 4b 65 79 6c 69 73 74 3d 3d 30 20 29 20 67 6f  pKeylist==0 ) go
1ce20 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70  to no_mem;.    p
1ce30 4b 65 79 6c 69 73 74 2d 3e 6e 4b 65 79 20 3d 20  Keylist->nKey = 
1ce40 31 30 30 30 3b 0a 20 20 20 20 70 4b 65 79 6c 69  1000;.    pKeyli
1ce50 73 74 2d 3e 6e 52 65 61 64 20 3d 20 30 3b 0a 20  st->nRead = 0;. 
1ce60 20 20 20 70 4b 65 79 6c 69 73 74 2d 3e 6e 55 73     pKeylist->nUs
1ce70 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 4b 65 79  ed = 0;.    pKey
1ce80 6c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  list->pNext = p-
1ce90 3e 70 4c 69 73 74 3b 0a 20 20 20 20 70 2d 3e 70  >pList;.    p->p
1cea0 4c 69 73 74 20 3d 20 70 4b 65 79 6c 69 73 74 3b  List = pKeylist;
1ceb0 0a 20 20 7d 0a 20 20 49 6e 74 65 67 65 72 69 66  .  }.  Integerif
1cec0 79 28 70 2c 20 70 2d 3e 74 6f 73 29 3b 0a 20 20  y(p, p->tos);.  
1ced0 70 4b 65 79 6c 69 73 74 2d 3e 61 4b 65 79 5b 70  pKeylist->aKey[p
1cee0 4b 65 79 6c 69 73 74 2d 3e 6e 55 73 65 64 2b 2b  Keylist->nUsed++
1cef0 5d 20 3d 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f  ] = aStack[p->to
1cf00 73 5d 2e 69 3b 0a 20 20 50 4f 50 53 54 41 43 4b  s].i;.  POPSTACK
1cf10 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1cf20 20 4f 70 63 6f 64 65 3a 20 4c 69 73 74 52 65 77   Opcode: ListRew
1cf30 69 6e 64 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  ind * * *.**.** 
1cf40 52 65 77 69 6e 64 20 74 68 65 20 74 65 6d 70 6f  Rewind the tempo
1cf50 72 61 72 79 20 62 75 66 66 65 72 20 62 61 63 6b  rary buffer back
1cf60 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1cf70 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69  g..*/.case OP_Li
1cf80 73 74 52 65 77 69 6e 64 3a 20 7b 0a 20 20 2f 2a  stRewind: {.  /*
1cf90 20 54 68 69 73 20 69 73 20 6e 6f 77 20 61 20 6e   This is now a n
1cfa0 6f 2d 6f 70 20 2a 2f 0a 20 20 62 72 65 61 6b 3b  o-op */.  break;
1cfb0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .}../* Opcode: L
1cfc0 69 73 74 52 65 61 64 20 2a 20 50 32 20 2a 0a 2a  istRead * P2 *.*
1cfd0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1cfe0 72 65 61 64 20 61 6e 20 69 6e 74 65 67 65 72 20  read an integer 
1cff0 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
1d000 72 79 20 73 74 6f 72 61 67 65 20 62 75 66 66 65  ry storage buffe
1d010 72 0a 2a 2a 20 61 6e 64 20 70 75 73 68 20 69 74  r.** and push it
1d020 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
1d030 20 20 49 66 20 74 68 65 20 73 74 6f 72 61 67 65    If the storage
1d040 20 62 75 66 66 65 72 20 69 73 20 65 6d 70 74 79   buffer is empty
1d050 2c 20 0a 2a 2a 20 70 75 73 68 20 6e 6f 74 68 69  , .** push nothi
1d060 6e 67 20 62 75 74 20 69 6e 73 74 65 61 64 20 6a  ng but instead j
1d070 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2f 0a 63 61  ump to P2..*/.ca
1d080 73 65 20 4f 50 5f 4c 69 73 74 52 65 61 64 3a 20  se OP_ListRead: 
1d090 7b 0a 20 20 4b 65 79 6c 69 73 74 20 2a 70 4b 65  {.  Keylist *pKe
1d0a0 79 6c 69 73 74 3b 0a 20 20 70 4b 65 79 6c 69 73  ylist;.  pKeylis
1d0b0 74 20 3d 20 70 2d 3e 70 4c 69 73 74 3b 0a 20 20  t = p->pList;.  
1d0c0 69 66 28 20 70 4b 65 79 6c 69 73 74 21 3d 30 20  if( pKeylist!=0 
1d0d0 29 7b 0a 20 20 20 20 56 45 52 49 46 59 28 0a 20  ){.    VERIFY(. 
1d0e0 20 20 20 20 20 69 66 28 20 70 4b 65 79 6c 69 73       if( pKeylis
1d0f0 74 2d 3e 6e 52 65 61 64 3c 30 20 0a 20 20 20 20  t->nRead<0 .    
1d100 20 20 20 20 7c 7c 20 70 4b 65 79 6c 69 73 74 2d      || pKeylist-
1d110 3e 6e 52 65 61 64 3e 3d 70 4b 65 79 6c 69 73 74  >nRead>=pKeylist
1d120 2d 3e 6e 55 73 65 64 0a 20 20 20 20 20 20 20 20  ->nUsed.        
1d130 7c 7c 20 70 4b 65 79 6c 69 73 74 2d 3e 6e 52 65  || pKeylist->nRe
1d140 61 64 3e 3d 70 4b 65 79 6c 69 73 74 2d 3e 6e 4b  ad>=pKeylist->nK
1d150 65 79 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e  ey ) goto bad_in
1d160 73 74 72 75 63 74 69 6f 6e 3b 0a 20 20 20 20 29  struction;.    )
1d170 0a 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20  .    p->tos++;. 
1d180 20 20 20 69 66 28 20 4e 65 65 64 53 74 61 63 6b     if( NeedStack
1d190 28 70 2c 20 70 2d 3e 74 6f 73 29 20 29 20 67 6f  (p, p->tos) ) go
1d1a0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61  to no_mem;.    a
1d1b0 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69 20  Stack[p->tos].i 
1d1c0 3d 20 70 4b 65 79 6c 69 73 74 2d 3e 61 4b 65 79  = pKeylist->aKey
1d1d0 5b 70 4b 65 79 6c 69 73 74 2d 3e 6e 52 65 61 64  [pKeylist->nRead
1d1e0 2b 2b 5d 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  ++];.    aStack[
1d1f0 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  p->tos].flags = 
1d200 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 7a 53 74  STK_Int;.    zSt
1d210 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 30 3b  ack[p->tos] = 0;
1d220 0a 20 20 20 20 69 66 28 20 70 4b 65 79 6c 69 73  .    if( pKeylis
1d230 74 2d 3e 6e 52 65 61 64 3e 3d 70 4b 65 79 6c 69  t->nRead>=pKeyli
1d240 73 74 2d 3e 6e 55 73 65 64 20 29 7b 0a 20 20 20  st->nUsed ){.   
1d250 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20 70 4b     p->pList = pK
1d260 65 79 6c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  eylist->pNext;. 
1d270 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1d280 70 4b 65 79 6c 69 73 74 29 3b 0a 20 20 20 20 7d  pKeylist);.    }
1d290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
1d2a0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1d2b0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1d2c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73 74 52  /* Opcode: ListR
1d2d0 65 73 65 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  eset * * *.**.**
1d2e0 20 52 65 73 65 74 20 74 68 65 20 74 65 6d 70 6f   Reset the tempo
1d2f0 72 61 72 79 20 73 74 6f 72 61 67 65 20 62 75 66  rary storage buf
1d300 66 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 68  fer so that it h
1d310 6f 6c 64 73 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  olds nothing..*/
1d320 0a 63 61 73 65 20 4f 50 5f 4c 69 73 74 52 65 73  .case OP_ListRes
1d330 65 74 3a 20 7b 0a 20 20 69 66 28 20 70 2d 3e 70  et: {.  if( p->p
1d340 4c 69 73 74 20 29 7b 0a 20 20 20 20 4b 65 79 6c  List ){.    Keyl
1d350 69 73 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74  istFree(p->pList
1d360 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20  );.    p->pList 
1d370 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
1d380 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1d390 4c 69 73 74 50 75 73 68 20 2a 20 2a 20 2a 20 0a  ListPush * * * .
1d3a0 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63  **.** Save the c
1d3b0 75 72 72 65 6e 74 20 56 64 62 65 20 6c 69 73 74  urrent Vdbe list
1d3c0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 63 61   such that it ca
1d3d0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 79  n be restored by
1d3e0 20 61 20 4c 69 73 74 50 6f 70 0a 2a 2a 20 6f 70   a ListPop.** op
1d3f0 63 6f 64 65 2e 20 54 68 65 20 6c 69 73 74 20 69  code. The list i
1d400 73 20 65 6d 70 74 79 20 61 66 74 65 72 20 74 68  s empty after th
1d410 69 73 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  is is executed..
1d420 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69 73 74 50  */.case OP_ListP
1d430 75 73 68 3a 20 7b 0a 20 20 70 2d 3e 6b 65 79 6c  ush: {.  p->keyl
1d440 69 73 74 53 74 61 63 6b 44 65 70 74 68 2b 2b 3b  istStackDepth++;
1d450 0a 20 20 61 73 73 65 72 74 28 70 2d 3e 6b 65 79  .  assert(p->key
1d460 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20 3e  listStackDepth >
1d470 20 30 29 3b 0a 20 20 70 2d 3e 6b 65 79 6c 69 73   0);.  p->keylis
1d480 74 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 52  tStack = sqliteR
1d490 65 61 6c 6c 6f 63 28 70 2d 3e 6b 65 79 6c 69 73  ealloc(p->keylis
1d4a0 74 53 74 61 63 6b 2c 20 0a 20 20 20 20 20 20 20  tStack, .       
1d4b0 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 6c 69 73     sizeof(Keylis
1d4c0 74 20 2a 29 20 2a 20 70 2d 3e 6b 65 79 6c 69 73  t *) * p->keylis
1d4d0 74 53 74 61 63 6b 44 65 70 74 68 29 3b 0a 20 20  tStackDepth);.  
1d4e0 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 5b  p->keylistStack[
1d4f0 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44  p->keylistStackD
1d500 65 70 74 68 20 2d 20 31 5d 20 3d 20 70 2d 3e 70  epth - 1] = p->p
1d510 4c 69 73 74 3b 0a 20 20 70 2d 3e 70 4c 69 73 74  List;.  p->pList
1d520 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
1d530 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73  ../* Opcode: Lis
1d540 74 50 6f 70 20 2a 20 2a 20 2a 20 0a 2a 2a 0a 2a  tPop * * * .**.*
1d550 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 56 64  * Restore the Vd
1d560 62 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 73  be list to the s
1d570 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 77  tate it was in w
1d580 68 65 6e 20 4c 69 73 74 50 75 73 68 20 77 61 73  hen ListPush was
1d590 20 6c 61 73 74 0a 2a 2a 20 65 78 65 63 75 74 65   last.** execute
1d5a0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69  d..*/.case OP_Li
1d5b0 73 74 50 6f 70 3a 20 7b 0a 20 20 61 73 73 65 72  stPop: {.  asser
1d5c0 74 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63  t(p->keylistStac
1d5d0 6b 44 65 70 74 68 20 3e 20 30 29 3b 0a 20 20 70  kDepth > 0);.  p
1d5e0 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65  ->keylistStackDe
1d5f0 70 74 68 2d 2d 3b 0a 20 20 4b 65 79 6c 69 73 74  pth--;.  Keylist
1d600 46 72 65 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a  Free(p->pList);.
1d610 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20 70 2d 3e    p->pList = p->
1d620 6b 65 79 6c 69 73 74 53 74 61 63 6b 5b 70 2d 3e  keylistStack[p->
1d630 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74  keylistStackDept
1d640 68 5d 3b 0a 20 20 70 2d 3e 6b 65 79 6c 69 73 74  h];.  p->keylist
1d650 53 74 61 63 6b 5b 70 2d 3e 6b 65 79 6c 69 73 74  Stack[p->keylist
1d660 53 74 61 63 6b 44 65 70 74 68 5d 20 3d 20 30 3b  StackDepth] = 0;
1d670 0a 20 20 69 66 28 20 70 2d 3e 6b 65 79 6c 69 73  .  if( p->keylis
1d680 74 53 74 61 63 6b 44 65 70 74 68 20 3d 3d 20 30  tStackDepth == 0
1d690 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1d6a0 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61  ee(p->keylistSta
1d6b0 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c  ck);.    p->keyl
1d6c0 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  istStack = 0;.  
1d6d0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
1d6e0 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 50 75 74   Opcode: SortPut
1d6f0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65   * * *.**.** The
1d700 20 54 4f 53 20 69 73 20 74 68 65 20 6b 65 79 20   TOS is the key 
1d710 61 6e 64 20 74 68 65 20 4e 4f 53 20 69 73 20 74  and the NOS is t
1d720 68 65 20 64 61 74 61 2e 20 20 50 6f 70 20 62 6f  he data.  Pop bo
1d730 74 68 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  th from the stac
1d740 6b 0a 2a 2a 20 61 6e 64 20 70 75 74 20 74 68 65  k.** and put the
1d750 6d 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 2e  m on the sorter.
1d760 20 20 54 68 65 20 6b 65 79 20 61 6e 64 20 64 61    The key and da
1d770 74 61 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ta should have b
1d780 65 65 6e 0a 2a 2a 20 6d 61 64 65 20 75 73 69 6e  een.** made usin
1d790 67 20 53 6f 72 74 4d 61 6b 65 4b 65 79 20 61 6e  g SortMakeKey an
1d7a0 64 20 53 6f 72 74 4d 61 6b 65 52 65 63 2c 20 72  d SortMakeRec, r
1d7b0 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
1d7c0 63 61 73 65 20 4f 50 5f 53 6f 72 74 50 75 74 3a  case OP_SortPut:
1d7d0 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70   {.  int tos = p
1d7e0 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73  ->tos;.  int nos
1d7f0 20 3d 20 74 6f 73 20 2d 20 31 3b 0a 20 20 53 6f   = tos - 1;.  So
1d800 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20  rter *pSorter;. 
1d810 20 56 45 52 49 46 59 28 20 69 66 28 20 74 6f 73   VERIFY( if( tos
1d820 3c 31 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <1 ) goto not_en
1d830 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20  ough_stack; ).  
1d840 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
1d850 20 74 6f 73 29 20 7c 7c 20 53 74 72 69 6e 67 69   tos) || Stringi
1d860 66 79 28 70 2c 20 6e 6f 73 29 20 29 20 67 6f 74  fy(p, nos) ) got
1d870 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 53 6f 72  o no_mem;.  pSor
1d880 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ter = sqliteMall
1d890 6f 63 28 20 73 69 7a 65 6f 66 28 53 6f 72 74 65  oc( sizeof(Sorte
1d8a0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72  r) );.  if( pSor
1d8b0 74 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ter==0 ) goto no
1d8c0 5f 6d 65 6d 3b 0a 20 20 70 53 6f 72 74 65 72 2d  _mem;.  pSorter-
1d8d0 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 53 6f 72  >pNext = p->pSor
1d8e0 74 3b 0a 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20  t;.  p->pSort = 
1d8f0 70 53 6f 72 74 65 72 3b 0a 20 20 61 73 73 65 72  pSorter;.  asser
1d900 74 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66  t( aStack[tos].f
1d910 6c 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29  lags & STK_Dyn )
1d920 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 74 61  ;.  assert( aSta
1d930 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[nos].flags & 
1d940 53 54 4b 5f 44 79 6e 20 29 3b 0a 20 20 70 53 6f  STK_Dyn );.  pSo
1d950 72 74 65 72 2d 3e 6e 4b 65 79 20 3d 20 61 53 74  rter->nKey = aSt
1d960 61 63 6b 5b 74 6f 73 5d 2e 6e 3b 0a 20 20 70 53  ack[tos].n;.  pS
1d970 6f 72 74 65 72 2d 3e 7a 4b 65 79 20 3d 20 7a 53  orter->zKey = zS
1d980 74 61 63 6b 5b 74 6f 73 5d 3b 0a 20 20 70 53 6f  tack[tos];.  pSo
1d990 72 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 61 53  rter->nData = aS
1d9a0 74 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b 0a 20 20 70  tack[nos].n;.  p
1d9b0 53 6f 72 74 65 72 2d 3e 70 44 61 74 61 20 3d 20  Sorter->pData = 
1d9c0 7a 53 74 61 63 6b 5b 6e 6f 73 5d 3b 0a 20 20 61  zStack[nos];.  a
1d9d0 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
1d9e0 20 3d 20 30 3b 0a 20 20 61 53 74 61 63 6b 5b 6e   = 0;.  aStack[n
1d9f0 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  os].flags = 0;. 
1da00 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 30   zStack[tos] = 0
1da10 3b 0a 20 20 7a 53 74 61 63 6b 5b 6e 6f 73 5d 20  ;.  zStack[nos] 
1da20 3d 20 30 3b 0a 20 20 70 2d 3e 74 6f 73 20 2d 3d  = 0;.  p->tos -=
1da30 20 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   2;.  break;.}..
1da40 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 4d  /* Opcode: SortM
1da50 61 6b 65 52 65 63 20 50 31 20 2a 20 2a 0a 2a 2a  akeRec P1 * *.**
1da60 0a 2a 2a 20 54 68 65 20 74 6f 70 20 50 31 20 65  .** The top P1 e
1da70 6c 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20  lements are the 
1da80 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 63  arguments to a c
1da90 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 6d 20 74  allback.  Form t
1daa0 68 65 73 65 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73  hese.** elements
1dab0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
1dac0 61 74 61 20 65 6e 74 72 79 20 74 68 61 74 20 63  ata entry that c
1dad0 61 6e 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20  an be stored on 
1dae0 61 20 73 6f 72 74 65 72 0a 2a 2a 20 75 73 69 6e  a sorter.** usin
1daf0 67 20 53 6f 72 74 50 75 74 20 61 6e 64 20 6c 61  g SortPut and la
1db00 74 65 72 20 66 65 64 20 74 6f 20 61 20 63 61 6c  ter fed to a cal
1db10 6c 62 61 63 6b 20 75 73 69 6e 67 20 53 6f 72 74  lback using Sort
1db20 43 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73  Callback..*/.cas
1db30 65 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63  e OP_SortMakeRec
1db40 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  : {.  char *z;. 
1db50 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 0a 20   char **azArg;. 
1db60 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
1db70 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
1db80 69 2c 20 6a 3b 0a 0a 20 20 6e 46 69 65 6c 64 20  i, j;..  nField 
1db90 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 45 52  = pOp->p1;.  VER
1dba0 49 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b  IFY( if( p->tos+
1dbb0 31 3c 6e 46 69 65 6c 64 20 29 20 67 6f 74 6f 20  1<nField ) goto 
1dbc0 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
1dbd0 3b 20 29 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b  ; ).  nByte = 0;
1dbe0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d  .  for(i=p->tos-
1dbf0 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e  nField+1; i<=p->
1dc00 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tos; i++){.    i
1dc10 66 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c  f( (aStack[i].fl
1dc20 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d  ags & STK_Null)=
1dc30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1dc40 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69 29 20  Stringify(p, i) 
1dc50 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
1dc60 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 61 53       nByte += aS
1dc70 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7d  tack[i].n;.    }
1dc80 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 2b 3d 20  .  }.  nByte += 
1dc90 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 6e  sizeof(char*)*(n
1dca0 46 69 65 6c 64 2b 31 29 3b 0a 20 20 61 7a 41 72  Field+1);.  azAr
1dcb0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
1dcc0 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
1dcd0 20 61 7a 41 72 67 3d 3d 30 20 29 20 67 6f 74 6f   azArg==0 ) goto
1dce0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7a 20 3d 20 28   no_mem;.  z = (
1dcf0 63 68 61 72 2a 29 26 61 7a 41 72 67 5b 6e 46 69  char*)&azArg[nFi
1dd00 65 6c 64 2b 31 5d 3b 0a 20 20 66 6f 72 28 6a 3d  eld+1];.  for(j=
1dd10 30 2c 20 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65  0, i=p->tos-nFie
1dd20 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b  ld+1; i<=p->tos;
1dd30 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1dd40 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c  if( aStack[i].fl
1dd50 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29  ags & STK_Null )
1dd60 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6a 5d  {.      azArg[j]
1dd70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1dd80 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6a 5d 20  .      azArg[j] 
1dd90 3d 20 7a 3b 0a 20 20 20 20 20 20 73 74 72 63 70  = z;.      strcp
1dda0 79 28 7a 2c 20 7a 53 74 61 63 6b 5b 69 5d 29 3b  y(z, zStack[i]);
1ddb0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 61 53 74 61  .      z += aSta
1ddc0 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7d 0a 20  ck[i].n;.    }. 
1ddd0 20 7d 0a 20 20 50 6f 70 53 74 61 63 6b 28 70 2c   }.  PopStack(p,
1dde0 20 6e 46 69 65 6c 64 29 3b 0a 20 20 56 45 52 49   nField);.  VERI
1ddf0 46 59 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c  FY( NeedStack(p,
1de00 20 70 2d 3e 74 6f 73 2b 31 29 3b 20 29 0a 20 20   p->tos+1); ).  
1de10 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 61 53 74 61  p->tos++;.  aSta
1de20 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e  ck[p->tos].n = n
1de30 42 79 74 65 3b 0a 20 20 7a 53 74 61 63 6b 5b 70  Byte;.  zStack[p
1de40 2d 3e 74 6f 73 5d 20 3d 20 28 63 68 61 72 2a 29  ->tos] = (char*)
1de50 61 7a 41 72 67 3b 0a 20 20 61 53 74 61 63 6b 5b  azArg;.  aStack[
1de60 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  p->tos].flags = 
1de70 53 54 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e 3b  STK_Str|STK_Dyn;
1de80 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1de90 4f 70 63 6f 64 65 3a 20 53 6f 72 74 4d 61 6b 65  Opcode: SortMake
1dea0 4b 65 79 20 2a 20 2a 20 50 33 0a 2a 2a 0a 2a 2a  Key * * P3.**.**
1deb0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 74 6f 70   Convert the top
1dec0 20 66 65 77 20 65 6e 74 72 69 65 73 20 6f 66 20   few entries of 
1ded0 74 68 65 20 73 74 61 63 6b 20 69 6e 74 6f 20 61  the stack into a
1dee0 20 73 6f 72 74 20 6b 65 79 2e 20 20 54 68 65 0a   sort key.  The.
1def0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61  ** number of sta
1df00 63 6b 20 65 6e 74 72 69 65 73 20 63 6f 6e 73 75  ck entries consu
1df10 6d 65 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65  med is the numbe
1df20 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
1df30 69 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  in .** the strin
1df40 67 20 50 33 2e 20 20 4f 6e 65 20 63 68 61 72 61  g P3.  One chara
1df50 63 74 65 72 20 66 72 6f 6d 20 50 33 20 69 73 20  cter from P3 is 
1df60 70 72 65 70 65 6e 64 65 64 20 74 6f 20 65 61 63  prepended to eac
1df70 68 20 65 6e 74 72 79 2e 0a 2a 2a 20 54 68 65 20  h entry..** The 
1df80 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
1df90 6f 66 20 50 33 20 69 73 20 70 72 65 70 65 6e 64  of P3 is prepend
1dfa0 65 64 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ed to the elemen
1dfb0 74 20 6c 6f 77 65 73 74 20 69 6e 0a 2a 2a 20 74  t lowest in.** t
1dfc0 68 65 20 73 74 61 63 6b 20 61 6e 64 20 74 68 65  he stack and the
1dfd0 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
1dfe0 6f 66 20 50 33 20 69 73 20 61 70 70 65 6e 64 65  of P3 is appende
1dff0 64 20 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 0a  d to the top of.
1e000 2a 2a 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41  ** the stack.  A
1e010 6c 6c 20 73 74 61 63 6b 20 65 6e 74 72 69 65 73  ll stack entries
1e020 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
1e030 79 20 61 20 5c 30 30 30 20 63 68 61 72 61 63 74  y a \000 charact
1e040 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  er.** in the res
1e050 75 6c 74 2e 20 20 54 68 65 20 77 68 6f 6c 65 20  ult.  The whole 
1e060 6b 65 79 20 69 73 20 74 65 72 6d 69 6e 61 74 65  key is terminate
1e070 64 20 62 79 20 74 77 6f 20 5c 30 30 30 20 63 68  d by two \000 ch
1e080 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 61  aracters.** in a
1e090 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20   row..**.** See 
1e0a0 61 6c 73 6f 20 74 68 65 20 4d 61 6b 65 4b 65 79  also the MakeKey
1e0b0 20 61 6e 64 20 4d 61 6b 65 49 64 78 4b 65 79 20   and MakeIdxKey 
1e0c0 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 63 61 73 65  opcodes..*/.case
1e0d0 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 3a   OP_SortMakeKey:
1e0e0 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 4b   {.  char *zNewK
1e0f0 65 79 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ey;.  int nByte;
1e100 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
1e110 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 0a 20   int i, j, k;.. 
1e120 20 6e 46 69 65 6c 64 20 3d 20 73 74 72 6c 65 6e   nField = strlen
1e130 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 56 45 52  (pOp->p3);.  VER
1e140 49 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b  IFY( if( p->tos+
1e150 31 3c 6e 46 69 65 6c 64 20 29 20 67 6f 74 6f 20  1<nField ) goto 
1e160 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
1e170 3b 20 29 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b  ; ).  nByte = 1;
1e180 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d  .  for(i=p->tos-
1e190 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e  nField+1; i<=p->
1e1a0 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tos; i++){.    i
1e1b0 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20  f( Stringify(p, 
1e1c0 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  i) ) goto no_mem
1e1d0 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 61  ;.    nByte += a
1e1e0 53 74 61 63 6b 5b 69 5d 2e 6e 2b 32 3b 0a 20 20  Stack[i].n+2;.  
1e1f0 7d 0a 20 20 7a 4e 65 77 4b 65 79 20 3d 20 73 71  }.  zNewKey = sq
1e200 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
1e210 65 20 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4b  e );.  if( zNewK
1e220 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  ey==0 ) goto no_
1e230 6d 65 6d 3b 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  mem;.  j = 0;.  
1e240 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70  k = 0;.  for(i=p
1e250 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20  ->tos-nField+1; 
1e260 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b  i<=p->tos; i++){
1e270 0a 20 20 20 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b  .    zNewKey[j++
1e280 5d 20 3d 20 70 4f 70 2d 3e 70 33 5b 6b 2b 2b 5d  ] = pOp->p3[k++]
1e290 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4e  ;.    memcpy(&zN
1e2a0 65 77 4b 65 79 5b 6a 5d 2c 20 7a 53 74 61 63 6b  ewKey[j], zStack
1e2b0 5b 69 5d 2c 20 61 53 74 61 63 6b 5b 69 5d 2e 6e  [i], aStack[i].n
1e2c0 2d 31 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 61 53  -1);.    j += aS
1e2d0 74 61 63 6b 5b 69 5d 2e 6e 2d 31 3b 0a 20 20 20  tack[i].n-1;.   
1e2e0 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20 3d 20   zNewKey[j++] = 
1e2f0 30 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 4b 65 79  0;.  }.  zNewKey
1e300 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  [j] = 0;.  asser
1e310 74 28 20 6a 3c 6e 42 79 74 65 20 29 3b 0a 20 20  t( j<nByte );.  
1e320 50 6f 70 53 74 61 63 6b 28 70 2c 20 6e 46 69 65  PopStack(p, nFie
1e330 6c 64 29 3b 0a 20 20 56 45 52 49 46 59 28 20 4e  ld);.  VERIFY( N
1e340 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74  eedStack(p, p->t
1e350 6f 73 2b 31 29 3b 20 29 0a 20 20 70 2d 3e 74 6f  os+1); ).  p->to
1e360 73 2b 2b 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d  s++;.  aStack[p-
1e370 3e 74 6f 73 5d 2e 6e 20 3d 20 6e 42 79 74 65 3b  >tos].n = nByte;
1e380 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  .  aStack[p->tos
1e390 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74  ].flags = STK_St
1e3a0 72 7c 53 54 4b 5f 44 79 6e 3b 0a 20 20 7a 53 74  r|STK_Dyn;.  zSt
1e3b0 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 7a 4e  ack[p->tos] = zN
1e3c0 65 77 4b 65 79 3b 0a 20 20 62 72 65 61 6b 3b 0a  ewKey;.  break;.
1e3d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f  }../* Opcode: So
1e3e0 72 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  rt * * *.**.** S
1e3f0 6f 72 74 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  ort all elements
1e400 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   on the sorter. 
1e410 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 69   The algorithm i
1e420 73 20 61 0a 2a 2a 20 6d 65 72 67 65 73 6f 72 74  s a.** mergesort
1e430 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
1e440 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t: {.  int i;.  
1e450 53 6f 72 74 65 72 20 2a 70 45 6c 65 6d 3b 0a 20  Sorter *pElem;. 
1e460 20 53 6f 72 74 65 72 20 2a 61 70 53 6f 72 74 65   Sorter *apSorte
1e470 72 5b 4e 53 4f 52 54 5d 3b 0a 20 20 66 6f 72 28  r[NSORT];.  for(
1e480 69 3d 30 3b 20 69 3c 4e 53 4f 52 54 3b 20 69 2b  i=0; i<NSORT; i+
1e490 2b 29 7b 0a 20 20 20 20 61 70 53 6f 72 74 65 72  +){.    apSorter
1e4a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77  [i] = 0;.  }.  w
1e4b0 68 69 6c 65 28 20 70 2d 3e 70 53 6f 72 74 20 29  hile( p->pSort )
1e4c0 7b 0a 20 20 20 20 70 45 6c 65 6d 20 3d 20 70 2d  {.    pElem = p-
1e4d0 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e 70  >pSort;.    p->p
1e4e0 53 6f 72 74 20 3d 20 70 45 6c 65 6d 2d 3e 70 4e  Sort = pElem->pN
1e4f0 65 78 74 3b 0a 20 20 20 20 70 45 6c 65 6d 2d 3e  ext;.    pElem->
1e500 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 66  pNext = 0;.    f
1e510 6f 72 28 69 3d 30 3b 20 69 3c 4e 53 4f 52 54 2d  or(i=0; i<NSORT-
1e520 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  1; i++){.    if(
1e530 20 61 70 53 6f 72 74 65 72 5b 69 5d 3d 3d 30 20   apSorter[i]==0 
1e540 29 7b 0a 20 20 20 20 20 20 20 20 61 70 53 6f 72  ){.        apSor
1e550 74 65 72 5b 69 5d 20 3d 20 70 45 6c 65 6d 3b 0a  ter[i] = pElem;.
1e560 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e580 20 20 20 20 70 45 6c 65 6d 20 3d 20 4d 65 72 67      pElem = Merg
1e590 65 28 61 70 53 6f 72 74 65 72 5b 69 5d 2c 20 70  e(apSorter[i], p
1e5a0 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 61  Elem);.        a
1e5b0 70 53 6f 72 74 65 72 5b 69 5d 20 3d 20 30 3b 0a  pSorter[i] = 0;.
1e5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e5d0 20 20 69 66 28 20 69 3e 3d 4e 53 4f 52 54 2d 31    if( i>=NSORT-1
1e5e0 20 29 7b 0a 20 20 20 20 20 20 61 70 53 6f 72 74   ){.      apSort
1e5f0 65 72 5b 4e 53 4f 52 54 2d 31 5d 20 3d 20 4d 65  er[NSORT-1] = Me
1e600 72 67 65 28 61 70 53 6f 72 74 65 72 5b 4e 53 4f  rge(apSorter[NSO
1e610 52 54 2d 31 5d 2c 70 45 6c 65 6d 29 3b 0a 20 20  RT-1],pElem);.  
1e620 20 20 7d 0a 20 20 7d 0a 20 20 70 45 6c 65 6d 20    }.  }.  pElem 
1e630 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
1e640 69 3c 4e 53 4f 52 54 3b 20 69 2b 2b 29 7b 0a 20  i<NSORT; i++){. 
1e650 20 20 20 70 45 6c 65 6d 20 3d 20 4d 65 72 67 65     pElem = Merge
1e660 28 61 70 53 6f 72 74 65 72 5b 69 5d 2c 20 70 45  (apSorter[i], pE
1e670 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  lem);.  }.  p->p
1e680 53 6f 72 74 20 3d 20 70 45 6c 65 6d 3b 0a 20 20  Sort = pElem;.  
1e690 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1e6a0 6f 64 65 3a 20 53 6f 72 74 4e 65 78 74 20 2a 20  ode: SortNext * 
1e6b0 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20  P2 *.**.** Push 
1e6c0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
1e6d0 20 74 6f 70 6d 6f 73 74 20 65 6c 65 6d 65 6e 74   topmost element
1e6e0 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 6f   in the sorter o
1e6f0 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  nto the.** stack
1e700 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  , then remove th
1e710 65 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 74  e element from t
1e720 68 65 20 73 6f 72 74 65 72 2e 20 20 49 66 20 74  he sorter.  If t
1e730 68 65 20 73 6f 72 74 65 72 0a 2a 2a 20 69 73 20  he sorter.** is 
1e740 65 6d 70 74 79 2c 20 70 75 73 68 20 6e 6f 74 68  empty, push noth
1e750 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ing on the stack
1e760 20 61 6e 64 20 69 6e 73 74 65 61 64 20 6a 75 6d   and instead jum
1e770 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  p immediately .*
1e780 2a 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  * to instruction
1e790 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
1e7a0 53 6f 72 74 4e 65 78 74 3a 20 7b 0a 20 20 53 6f  SortNext: {.  So
1e7b0 72 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20  rter *pSorter = 
1e7c0 70 2d 3e 70 53 6f 72 74 3b 0a 20 20 69 66 28 20  p->pSort;.  if( 
1e7d0 70 53 6f 72 74 65 72 21 3d 30 20 29 7b 0a 20 20  pSorter!=0 ){.  
1e7e0 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f    p->pSort = pSo
1e7f0 72 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  rter->pNext;.   
1e800 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20 20 56   p->tos++;.    V
1e810 45 52 49 46 59 28 20 4e 65 65 64 53 74 61 63 6b  ERIFY( NeedStack
1e820 28 70 2c 20 70 2d 3e 74 6f 73 29 3b 20 29 0a 20  (p, p->tos); ). 
1e830 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73     zStack[p->tos
1e840 5d 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 44 61  ] = pSorter->pDa
1e850 74 61 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 70  ta;.    aStack[p
1e860 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 70 53 6f 72 74  ->tos].n = pSort
1e870 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61  er->nData;.    a
1e880 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
1e890 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53 54  ags = STK_Str|ST
1e8a0 4b 5f 44 79 6e 3b 0a 20 20 20 20 73 71 6c 69 74  K_Dyn;.    sqlit
1e8b0 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a  eFree(pSorter->z
1e8c0 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
1e8d0 46 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20  Free(pSorter);. 
1e8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63 20 3d   }else{.    pc =
1e8f0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1e900 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
1e910 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 43 61 6c   Opcode: SortCal
1e920 6c 62 61 63 6b 20 50 31 20 2a 20 2a 0a 2a 2a 0a  lback P1 * *.**.
1e930 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
1e940 65 20 73 74 61 63 6b 20 63 6f 6e 74 61 69 6e 73  e stack contains
1e950 20 61 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f   a callback reco
1e960 72 64 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a  rd built using.*
1e970 2a 20 74 68 65 20 53 6f 72 74 4d 61 6b 65 52 65  * the SortMakeRe
1e980 63 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68  c operation with
1e990 20 74 68 65 20 73 61 6d 65 20 50 31 20 76 61 6c   the same P1 val
1e9a0 75 65 20 61 73 20 74 68 69 73 0a 2a 2a 20 69 6e  ue as this.** in
1e9b0 73 74 72 75 63 74 69 6f 6e 2e 20 20 50 6f 70 20  struction.  Pop 
1e9c0 74 68 69 73 20 72 65 63 6f 72 64 20 66 72 6f 6d  this record from
1e9d0 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 69   the stack and i
1e9e0 6e 76 6f 6b 65 20 74 68 65 0a 2a 2a 20 63 61 6c  nvoke the.** cal
1e9f0 6c 62 61 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  lback on it..*/.
1ea00 63 61 73 65 20 4f 50 5f 53 6f 72 74 43 61 6c 6c  case OP_SortCall
1ea10 62 61 63 6b 3a 20 7b 0a 20 20 69 6e 74 20 69 20  back: {.  int i 
1ea20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49  = p->tos;.  VERI
1ea30 46 59 28 20 69 66 28 20 69 3c 30 20 29 20 67 6f  FY( if( i<0 ) go
1ea40 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
1ea50 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 78 43 61  ack; ).  if( xCa
1ea60 6c 6c 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  llback!=0 ){.   
1ea70 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74   if( sqliteSafet
1ea80 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20  yOff(db) ) goto 
1ea90 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
1eaa0 75 73 65 3b 0a 20 20 20 20 69 66 28 20 78 43 61  use;.    if( xCa
1eab0 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 70 4f 70  llback(pArg, pOp
1eac0 2d 3e 70 31 2c 20 28 63 68 61 72 2a 2a 29 7a 53  ->p1, (char**)zS
1ead0 74 61 63 6b 5b 69 5d 2c 20 70 2d 3e 61 7a 43 6f  tack[i], p->azCo
1eae0 6c 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  lName)!=0 ){.   
1eaf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41     rc = SQLITE_A
1eb00 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BORT;.    }.    
1eb10 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74 79  if( sqliteSafety
1eb20 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62  On(db) ) goto ab
1eb30 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73  ort_due_to_misus
1eb40 65 3b 0a 20 20 20 20 70 2d 3e 6e 43 61 6c 6c 62  e;.    p->nCallb
1eb50 61 63 6b 2b 2b 3b 0a 20 20 7d 0a 20 20 50 4f 50  ack++;.  }.  POP
1eb60 53 54 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c  STACK;.  if( sql
1eb70 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
1eb80 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
1eb90 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1eba0 4f 70 63 6f 64 65 3a 20 53 6f 72 74 52 65 73 65  Opcode: SortRese
1ebb0 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65  t * * *.**.** Re
1ebc0 6d 6f 76 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74  move any element
1ebd0 73 20 74 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e  s that remain on
1ebe0 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
1ebf0 63 61 73 65 20 4f 50 5f 53 6f 72 74 52 65 73 65  case OP_SortRese
1ec00 74 3a 20 7b 0a 20 20 53 6f 72 74 65 72 52 65 73  t: {.  SorterRes
1ec10 65 74 28 70 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  et(p);.  break;.
1ec20 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 69  }../* Opcode: Fi
1ec30 6c 65 4f 70 65 6e 20 2a 20 2a 20 50 33 0a 2a 2a  leOpen * * P3.**
1ec40 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
1ec50 65 20 6e 61 6d 65 64 20 62 79 20 50 33 20 66 6f  e named by P3 fo
1ec60 72 20 72 65 61 64 69 6e 67 20 75 73 69 6e 67 20  r reading using 
1ec70 74 68 65 20 46 69 6c 65 52 65 61 64 20 6f 70 63  the FileRead opc
1ec80 6f 64 65 2e 0a 2a 2a 20 49 66 20 50 33 20 69 73  ode..** If P3 is
1ec90 20 22 73 74 64 69 6e 22 20 74 68 65 6e 20 6f 70   "stdin" then op
1eca0 65 6e 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  en standard inpu
1ecb0 74 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  t for reading..*
1ecc0 2f 0a 63 61 73 65 20 4f 50 5f 46 69 6c 65 4f 70  /.case OP_FileOp
1ecd0 65 6e 3a 20 7b 0a 20 20 56 45 52 49 46 59 28 20  en: {.  VERIFY( 
1ece0 69 66 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29  if( pOp->p3==0 )
1ecf0 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75   goto bad_instru
1ed00 63 74 69 6f 6e 3b 20 29 0a 20 20 69 66 28 20 70  ction; ).  if( p
1ed10 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  ->pFile ){.    i
1ed20 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74 64  f( p->pFile!=std
1ed30 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e 70  in ) fclose(p->p
1ed40 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  File);.    p->pF
1ed50 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ile = 0;.  }.  i
1ed60 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
1ed70 28 70 4f 70 2d 3e 70 33 2c 22 73 74 64 69 6e 22  (pOp->p3,"stdin"
1ed80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  )==0 ){.    p->p
1ed90 46 69 6c 65 20 3d 20 73 74 64 69 6e 3b 0a 20 20  File = stdin;.  
1eda0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 46  }else{.    p->pF
1edb0 69 6c 65 20 3d 20 66 6f 70 65 6e 28 70 4f 70 2d  ile = fopen(pOp-
1edc0 3e 70 33 2c 20 22 72 22 29 3b 0a 20 20 7d 0a 20  >p3, "r");.  }. 
1edd0 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 3d 3d 30   if( p->pFile==0
1ede0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
1edf0 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
1ee00 2c 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  ,"unable to open
1ee10 20 66 69 6c 65 3a 20 22 2c 20 70 4f 70 2d 3e 70   file: ", pOp->p
1ee20 33 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  3, 0);.    rc = 
1ee30 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1ee40 20 20 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a    goto cleanup;.
1ee50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1ee60 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 69 6c 65 52  /* Opcode: FileR
1ee70 65 61 64 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a  ead P1 P2 P3.**.
1ee80 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
1ee90 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
1eea0 72 6f 6d 20 74 68 65 20 6f 70 65 6e 20 66 69 6c  rom the open fil
1eeb0 65 20 28 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  e (the file open
1eec0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 46 69 6c 65  ed using.** File
1eed0 4f 70 65 6e 29 2e 20 20 49 66 20 77 65 20 72 65  Open).  If we re
1eee0 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2c  ach end-of-file,
1eef0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
1ef00 79 20 74 6f 20 50 32 2e 20 20 49 66 0a 2a 2a 20  y to P2.  If.** 
1ef10 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 67  we are able to g
1ef20 65 74 20 61 6e 6f 74 68 65 72 20 6c 69 6e 65 2c  et another line,
1ef30 20 73 70 6c 69 74 20 74 68 65 20 6c 69 6e 65 20   split the line 
1ef40 61 70 61 72 74 20 75 73 69 6e 67 20 50 33 20 61  apart using P3 a
1ef50 73 0a 2a 2a 20 61 20 64 65 6c 69 6d 69 74 65 72  s.** a delimiter
1ef60 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
1ef70 62 65 20 50 31 20 66 69 65 6c 64 73 2e 20 20 49  be P1 fields.  I
1ef80 66 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  f the input line
1ef90 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
1efa0 65 20 74 68 61 6e 20 50 31 20 66 69 65 6c 64 73  e than P1 fields
1efb0 2c 20 69 67 6e 6f 72 65 20 74 68 65 20 65 78 63  , ignore the exc
1efc0 65 73 73 2e 20 20 49 66 20 74 68 65 20 69 6e 70  ess.  If the inp
1efd0 75 74 20 6c 69 6e 65 20 63 6f 6e 74 61 69 6e 73  ut line contains
1efe0 0a 2a 2a 20 66 65 77 65 72 20 74 68 61 6e 20 50  .** fewer than P
1eff0 31 20 66 69 65 6c 64 73 2c 20 61 73 73 75 6d 65  1 fields, assume
1f000 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 66   the remaining f
1f010 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 4e 55  ields contain NU
1f020 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  LLs..**.** Input
1f030 20 65 6e 64 73 20 69 66 20 61 20 6c 69 6e 65 20   ends if a line 
1f040 63 6f 6e 73 69 73 74 73 20 6f 66 20 6a 75 73 74  consists of just
1f050 20 22 5c 2e 22 2e 20 20 41 20 66 69 65 6c 64 20   "\.".  A field 
1f060 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 6c 79 0a  containing only.
1f070 2a 2a 20 22 5c 4e 22 20 69 73 20 61 20 6e 75 6c  ** "\N" is a nul
1f080 6c 20 66 69 65 6c 64 2e 20 20 54 68 65 20 62 61  l field.  The ba
1f090 63 6b 73 6c 61 73 68 20 5c 20 63 68 61 72 61 63  ckslash \ charac
1f0a0 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
1f0b0 62 65 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65 73  be used.** to es
1f0c0 63 61 70 65 20 6e 65 77 6c 69 6e 65 73 20 6f 72  cape newlines or
1f0d0 20 74 68 65 20 64 65 6c 69 6d 69 74 65 72 2e 0a   the delimiter..
1f0e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 69 6c 65 52  */.case OP_FileR
1f0f0 65 61 64 3a 20 7b 0a 20 20 69 6e 74 20 6e 2c 20  ead: {.  int n, 
1f100 65 6f 6c 2c 20 6e 46 69 65 6c 64 2c 20 69 2c 20  eol, nField, i, 
1f110 63 2c 20 6e 44 65 6c 69 6d 3b 0a 20 20 63 68 61  c, nDelim;.  cha
1f120 72 20 2a 7a 44 65 6c 69 6d 2c 20 2a 7a 3b 0a 20  r *zDelim, *z;. 
1f130 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 3d 3d 30   if( p->pFile==0
1f140 20 29 20 67 6f 74 6f 20 66 69 6c 65 72 65 61 64   ) goto fileread
1f150 5f 6a 75 6d 70 3b 0a 20 20 6e 46 69 65 6c 64 20  _jump;.  nField 
1f160 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  = pOp->p1;.  if(
1f170 20 6e 46 69 65 6c 64 3c 3d 30 20 29 20 67 6f 74   nField<=0 ) got
1f180 6f 20 66 69 6c 65 72 65 61 64 5f 6a 75 6d 70 3b  o fileread_jump;
1f190 0a 20 20 69 66 28 20 6e 46 69 65 6c 64 21 3d 70  .  if( nField!=p
1f1a0 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 70 2d 3e 61  ->nField || p->a
1f1b0 7a 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  zField==0 ){.   
1f1c0 20 63 68 61 72 20 2a 2a 61 7a 46 69 65 6c 64 20   char **azField 
1f1d0 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
1f1e0 70 2d 3e 61 7a 46 69 65 6c 64 2c 20 73 69 7a 65  p->azField, size
1f1f0 6f 66 28 63 68 61 72 2a 29 2a 6e 46 69 65 6c 64  of(char*)*nField
1f200 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 46  +1);.    if( azF
1f210 69 65 6c 64 3d 3d 30 20 29 7b 20 67 6f 74 6f 20  ield==0 ){ goto 
1f220 6e 6f 5f 6d 65 6d 3b 20 7d 0a 20 20 20 20 70 2d  no_mem; }.    p-
1f230 3e 61 7a 46 69 65 6c 64 20 3d 20 61 7a 46 69 65  >azField = azFie
1f240 6c 64 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c  ld;.    p->nFiel
1f250 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 7d 0a  d = nField;.  }.
1f260 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
1f270 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 6f 6c   0;.  while( eol
1f280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1f290 2d 3e 7a 4c 69 6e 65 3d 3d 30 20 7c 7c 20 6e 2b  ->zLine==0 || n+
1f2a0 32 30 30 3e 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f  200>p->nLineAllo
1f2b0 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  c ){.      char 
1f2c0 2a 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 70 2d  *zLine;.      p-
1f2d0 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d 20 70 2d  >nLineAlloc = p-
1f2e0 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 2a 32 20 2b 20  >nLineAlloc*2 + 
1f2f0 33 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  300;.      zLine
1f300 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
1f310 28 70 2d 3e 7a 4c 69 6e 65 2c 20 70 2d 3e 6e 4c  (p->zLine, p->nL
1f320 69 6e 65 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  ineAlloc);.     
1f330 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b   if( zLine==0 ){
1f340 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  .        p->nLin
1f350 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  eAlloc = 0;.    
1f360 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1f370 2d 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ->zLine);.      
1f380 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30 3b 0a    p->zLine = 0;.
1f390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f          goto no_
1f3a0 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mem;.      }.   
1f3b0 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 7a 4c     p->zLine = zL
1f3c0 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ine;.    }.    i
1f3d0 66 28 20 66 67 65 74 73 28 26 70 2d 3e 7a 4c 69  f( fgets(&p->zLi
1f3e0 6e 65 5b 6e 5d 2c 20 70 2d 3e 6e 4c 69 6e 65 41  ne[n], p->nLineA
1f3f0 6c 6c 6f 63 2d 6e 2c 20 70 2d 3e 70 46 69 6c 65  lloc-n, p->pFile
1f400 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6f  )==0 ){.      eo
1f410 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  l = 1;.      p->
1f420 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
1f430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1f440 6e 74 20 63 3b 0a 20 20 20 20 20 20 77 68 69 6c  nt c;.      whil
1f450 65 28 20 28 63 20 3d 20 70 2d 3e 7a 4c 69 6e 65  e( (c = p->zLine
1f460 5b 6e 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [n])!=0 ){.     
1f470 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29     if( c=='\\' )
1f480 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f490 70 2d 3e 7a 4c 69 6e 65 5b 6e 2b 31 5d 3d 3d 30  p->zLine[n+1]==0
1f4a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1f4b0 20 20 20 20 6e 20 2b 3d 20 32 3b 0a 20 20 20 20      n += 2;.    
1f4c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1f4d0 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
1f4e0 20 20 20 70 2d 3e 7a 4c 69 6e 65 5b 6e 5d 20 3d     p->zLine[n] =
1f4f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6f   0;.          eo
1f500 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  l = 1;.         
1f510 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1f520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f530 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   n++;.        }.
1f540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f550 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 67  }.  if( n==0 ) g
1f560 6f 74 6f 20 66 69 6c 65 72 65 61 64 5f 6a 75 6d  oto fileread_jum
1f570 70 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 4c 69 6e  p;.  z = p->zLin
1f580 65 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  e;.  if( z[0]=='
1f590 5c 5c 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2e 27  \\' && z[1]=='.'
1f5a0 20 26 26 20 7a 5b 32 5d 3d 3d 30 20 29 7b 0a 20   && z[2]==0 ){. 
1f5b0 20 20 20 67 6f 74 6f 20 66 69 6c 65 72 65 61 64     goto fileread
1f5c0 5f 6a 75 6d 70 3b 0a 20 20 7d 0a 20 20 7a 44 65  _jump;.  }.  zDe
1f5d0 6c 69 6d 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  lim = pOp->p3;. 
1f5e0 20 69 66 28 20 7a 44 65 6c 69 6d 3d 3d 30 20 29   if( zDelim==0 )
1f5f0 20 7a 44 65 6c 69 6d 20 3d 20 22 5c 74 22 3b 0a   zDelim = "\t";.
1f600 20 20 63 20 3d 20 7a 44 65 6c 69 6d 5b 30 5d 3b    c = zDelim[0];
1f610 0a 20 20 6e 44 65 6c 69 6d 20 3d 20 73 74 72 6c  .  nDelim = strl
1f620 65 6e 28 7a 44 65 6c 69 6d 29 3b 0a 20 20 70 2d  en(zDelim);.  p-
1f630 3e 61 7a 46 69 65 6c 64 5b 30 5d 20 3d 20 7a 3b  >azField[0] = z;
1f640 0a 20 20 66 6f 72 28 69 3d 31 3b 20 2a 7a 21 3d  .  for(i=1; *z!=
1f650 30 20 26 26 20 69 3c 3d 6e 46 69 65 6c 64 3b 20  0 && i<=nField; 
1f660 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 66 72  i++){.    int fr
1f670 6f 6d 2c 20 74 6f 3b 0a 20 20 20 20 66 72 6f 6d  om, to;.    from
1f680 20 3d 20 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69   = to = 0;.    i
1f690 66 28 20 7a 5b 30 5d 3d 3d 27 5c 5c 27 20 26 26  f( z[0]=='\\' &&
1f6a0 20 7a 5b 31 5d 3d 3d 27 4e 27 20 0a 20 20 20 20   z[1]=='N' .    
1f6b0 20 20 20 26 26 20 28 7a 5b 32 5d 3d 3d 30 20 7c     && (z[2]==0 |
1f6c0 7c 20 73 74 72 6e 63 6d 70 28 26 7a 5b 32 5d 2c  | strncmp(&z[2],
1f6d0 7a 44 65 6c 69 6d 2c 6e 44 65 6c 69 6d 29 3d 3d  zDelim,nDelim)==
1f6e0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
1f6f0 69 3c 3d 6e 46 69 65 6c 64 20 29 20 70 2d 3e 61  i<=nField ) p->a
1f700 7a 46 69 65 6c 64 5b 69 2d 31 5d 20 3d 20 30 3b  zField[i-1] = 0;
1f710 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 20 2b 20  .      z += 2 + 
1f720 6e 44 65 6c 69 6d 3b 0a 20 20 20 20 20 20 69 66  nDelim;.      if
1f730 28 20 69 3c 6e 46 69 65 6c 64 20 29 20 70 2d 3e  ( i<nField ) p->
1f740 61 7a 46 69 65 6c 64 5b 69 5d 20 3d 20 7a 3b 0a  azField[i] = z;.
1f750 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1f760 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
1f770 20 7a 5b 66 72 6f 6d 5d 20 29 7b 0a 20 20 20 20   z[from] ){.    
1f780 20 20 69 66 28 20 7a 5b 66 72 6f 6d 5d 3d 3d 27    if( z[from]=='
1f790 5c 5c 27 20 26 26 20 7a 5b 66 72 6f 6d 2b 31 5d  \\' && z[from+1]
1f7a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
1f7b0 5b 74 6f 2b 2b 5d 20 3d 20 7a 5b 66 72 6f 6d 2b  [to++] = z[from+
1f7c0 31 5d 3b 0a 20 20 20 20 20 20 20 20 66 72 6f 6d  1];.        from
1f7d0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
1f7e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1f7f0 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 66 72 6f  .      if( z[fro
1f800 6d 5d 3d 3d 63 20 26 26 20 73 74 72 6e 63 6d 70  m]==c && strncmp
1f810 28 26 7a 5b 66 72 6f 6d 5d 2c 7a 44 65 6c 69 6d  (&z[from],zDelim
1f820 2c 6e 44 65 6c 69 6d 29 3d 3d 30 20 29 20 62 72  ,nDelim)==0 ) br
1f830 65 61 6b 3b 0a 20 20 20 20 20 20 7a 5b 74 6f 2b  eak;.      z[to+
1f840 2b 5d 20 3d 20 7a 5b 66 72 6f 6d 2b 2b 5d 3b 0a  +] = z[from++];.
1f850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b      }.    if( z[
1f860 66 72 6f 6d 5d 20 29 7b 0a 20 20 20 20 20 20 7a  from] ){.      z
1f870 5b 74 6f 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  [to] = 0;.      
1f880 7a 20 2b 3d 20 66 72 6f 6d 20 2b 20 6e 44 65 6c  z += from + nDel
1f890 69 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c  im;.      if( i<
1f8a0 6e 46 69 65 6c 64 20 29 20 70 2d 3e 61 7a 46 69  nField ) p->azFi
1f8b0 65 6c 64 5b 69 5d 20 3d 20 7a 3b 0a 20 20 20 20  eld[i] = z;.    
1f8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 74  }else{.      z[t
1f8d0 6f 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  o] = 0;.      z 
1f8e0 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = "";.    }.  }.
1f8f0 20 20 77 68 69 6c 65 28 20 69 3c 6e 46 69 65 6c    while( i<nFiel
1f900 64 20 29 7b 0a 20 20 20 20 70 2d 3e 61 7a 46 69  d ){.    p->azFi
1f910 65 6c 64 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20  eld[i++] = 0;.  
1f920 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a  }.  break;..  /*
1f930 20 49 66 20 77 65 20 72 65 61 63 68 20 65 6e 64   If we reach end
1f940 2d 6f 66 2d 66 69 6c 65 2c 20 6f 72 20 69 66 20  -of-file, or if 
1f950 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1f960 6f 6e 67 2c 20 6a 75 6d 70 20 68 65 72 65 2e 0a  ong, jump here..
1f970 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 77    ** This code w
1f980 69 6c 6c 20 63 61 75 73 65 20 61 20 6a 75 6d 70  ill cause a jump
1f990 20 74 6f 20 50 32 20 2a 2f 0a 66 69 6c 65 72 65   to P2 */.filere
1f9a0 61 64 5f 6a 75 6d 70 3a 0a 20 20 70 63 20 3d 20  ad_jump:.  pc = 
1f9b0 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 62  pOp->p2 - 1;.  b
1f9c0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1f9d0 64 65 3a 20 46 69 6c 65 43 6f 6c 75 6d 6e 20 50  de: FileColumn P
1f9e0 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68  1 * *.**.** Push
1f9f0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
1fa00 74 68 65 20 50 31 2d 74 68 20 63 6f 6c 75 6d 6e  the P1-th column
1fa10 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1fa20 65 6e 74 6c 79 20 72 65 61 64 20 6c 69 6e 65 0a  ently read line.
1fa30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ** from the inpu
1fa40 74 20 66 69 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20  t file..*/.case 
1fa50 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 3a 20 7b  OP_FileColumn: {
1fa60 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e  .  int i = pOp->
1fa70 70 31 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  p1;.  char *z;. 
1fa80 20 56 45 52 49 46 59 28 20 69 66 28 20 4e 65 65   VERIFY( if( Nee
1fa90 64 53 74 61 63 6b 28 70 2c 20 70 2d 3e 74 6f 73  dStack(p, p->tos
1faa0 2b 31 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  +1) ) goto no_me
1fab0 6d 3b 20 29 0a 20 20 69 66 28 20 56 45 52 49 46  m; ).  if( VERIF
1fac0 59 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  Y( i>=0 && i<p->
1fad0 6e 46 69 65 6c 64 20 26 26 20 29 20 70 2d 3e 61  nField && ) p->a
1fae0 7a 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 7a 20  zField ){.    z 
1faf0 3d 20 70 2d 3e 61 7a 46 69 65 6c 64 5b 69 5d 3b  = p->azField[i];
1fb00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
1fb10 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 74 6f  = 0;.  }.  p->to
1fb20 73 2b 2b 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a  s++;.  if( z ){.
1fb30 20 20 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f      aStack[p->to
1fb40 73 5d 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  s].n = strlen(z)
1fb50 20 2b 20 31 3b 0a 20 20 20 20 7a 53 74 61 63 6b   + 1;.    zStack
1fb60 5b 70 2d 3e 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20  [p->tos] = z;.  
1fb70 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    aStack[p->tos]
1fb80 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72  .flags = STK_Str
1fb90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1fba0 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20  Stack[p->tos].n 
1fbb0 3d 20 30 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b  = 0;.    zStack[
1fbc0 70 2d 3e 74 6f 73 5d 20 3d 20 30 3b 0a 20 20 20  p->tos] = 0;.   
1fbd0 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e   aStack[p->tos].
1fbe0 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c  flags = STK_Null
1fbf0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1fc00 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d  ../* Opcode: Mem
1fc10 53 74 6f 72 65 20 50 31 20 50 32 20 2a 0a 2a 2a  Store P1 P2 *.**
1fc20 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 6f  .** Write the to
1fc30 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
1fc40 6e 74 6f 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  nto memory locat
1fc50 69 6f 6e 20 50 31 2e 0a 2a 2a 20 50 31 20 73 68  ion P1..** P1 sh
1fc60 6f 75 6c 64 20 62 65 20 61 20 73 6d 61 6c 6c 20  ould be a small 
1fc70 69 6e 74 65 67 65 72 20 73 69 6e 63 65 20 73 70  integer since sp
1fc80 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
1fc90 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 6f  .** for all memo
1fca0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 74  ry locations bet
1fcb0 77 65 65 6e 20 30 20 61 6e 64 20 50 31 20 69 6e  ween 0 and P1 in
1fcc0 63 6c 75 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  clusive..**.** A
1fcd0 66 74 65 72 20 74 68 65 20 64 61 74 61 20 69 73  fter the data is
1fce0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6d   stored in the m
1fcf0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20  emory location, 
1fd00 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 73 20  the.** stack is 
1fd10 70 6f 70 70 65 64 20 6f 6e 63 65 20 69 66 20 50  popped once if P
1fd20 32 20 69 73 20 31 2e 20 20 49 66 20 50 32 20 69  2 is 1.  If P2 i
1fd30 73 20 7a 65 72 6f 2c 20 74 68 65 6e 0a 2a 2a 20  s zero, then.** 
1fd40 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1fd50 61 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  a remains on the
1fd60 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20   stack..*/.case 
1fd70 4f 50 5f 4d 65 6d 53 74 6f 72 65 3a 20 7b 0a 20  OP_MemStore: {. 
1fd80 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
1fd90 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  ;.  int tos = p-
1fda0 3e 74 6f 73 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  >tos;.  char *zO
1fdb0 6c 64 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  ld;.  Mem *pMem;
1fdc0 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 74  .  VERIFY( if( t
1fdd0 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f  os<0 ) goto not_
1fde0 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a  enough_stack; ).
1fdf0 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4d 65 6d    if( i>=p->nMem
1fe00 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4f 6c 64   ){.    int nOld
1fe10 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   = p->nMem;.    
1fe20 4d 65 6d 20 2a 61 4d 65 6d 3b 0a 20 20 20 20 70  Mem *aMem;.    p
1fe30 2d 3e 6e 4d 65 6d 20 3d 20 69 20 2b 20 35 3b 0a  ->nMem = i + 5;.
1fe40 20 20 20 20 61 4d 65 6d 20 3d 20 73 71 6c 69 74      aMem = sqlit
1fe50 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4d 65 6d  eRealloc(p->aMem
1fe60 2c 20 70 2d 3e 6e 4d 65 6d 2a 73 69 7a 65 6f 66  , p->nMem*sizeof
1fe70 28 70 2d 3e 61 4d 65 6d 5b 30 5d 29 29 3b 0a 20  (p->aMem[0]));. 
1fe80 20 20 20 69 66 28 20 61 4d 65 6d 3d 3d 30 20 29     if( aMem==0 )
1fe90 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1fea0 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d    p->aMem = aMem
1feb0 3b 0a 20 20 20 20 69 66 28 20 6e 4f 6c 64 3c 70  ;.    if( nOld<p
1fec0 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20  ->nMem ){.      
1fed0 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4d 65 6d 5b  memset(&p->aMem[
1fee0 6e 4f 6c 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nOld], 0, sizeof
1fef0 28 70 2d 3e 61 4d 65 6d 5b 30 5d 29 2a 28 70 2d  (p->aMem[0])*(p-
1ff00 3e 6e 4d 65 6d 2d 6e 4f 6c 64 29 29 3b 0a 20 20  >nMem-nOld));.  
1ff10 20 20 7d 0a 20 20 7d 0a 20 20 70 4d 65 6d 20 3d    }.  }.  pMem =
1ff20 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
1ff30 69 66 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67  if( pMem->s.flag
1ff40 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20  s & STK_Dyn ){. 
1ff50 20 20 20 7a 4f 6c 64 20 3d 20 70 4d 65 6d 2d 3e     zOld = pMem->
1ff60 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
1ff70 7a 4f 6c 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zOld = 0;.  }.  
1ff80 70 4d 65 6d 2d 3e 73 20 3d 20 61 53 74 61 63 6b  pMem->s = aStack
1ff90 5b 74 6f 73 5d 3b 0a 20 20 69 66 28 20 70 4d 65  [tos];.  if( pMe
1ffa0 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 28 53 54  m->s.flags & (ST
1ffb0 4b 5f 53 74 61 74 69 63 7c 53 54 4b 5f 44 79 6e  K_Static|STK_Dyn
1ffc0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70  ) ){.    if( pOp
1ffd0 2d 3e 70 32 3d 3d 30 20 26 26 20 28 70 4d 65 6d  ->p2==0 && (pMem
1ffe0 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  ->s.flags & STK_
1fff0 44 79 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Dyn)!=0 ){.     
20000 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74   pMem->z = sqlit
20010 65 4d 61 6c 6c 6f 63 28 20 70 4d 65 6d 2d 3e 73  eMalloc( pMem->s
20020 2e 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  .n );.      if( 
20030 70 4d 65 6d 2d 3e 7a 3d 3d 30 20 29 20 67 6f 74  pMem->z==0 ) got
20040 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
20050 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20  memcpy(pMem->z, 
20060 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 70 4d 65  zStack[tos], pMe
20070 6d 2d 3e 73 2e 6e 29 3b 0a 20 20 20 20 7d 65 6c  m->s.n);.    }el
20080 73 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  se{.      pMem->
20090 7a 20 3d 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b  z = zStack[tos];
200a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
200b0 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d      pMem->z = pM
200c0 65 6d 2d 3e 73 2e 7a 3b 0a 20 20 7d 0a 20 20 69  em->s.z;.  }.  i
200d0 66 28 20 7a 4f 6c 64 20 29 20 73 71 6c 69 74 65  f( zOld ) sqlite
200e0 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 69 66  Free(zOld);.  if
200f0 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20  ( pOp->p2 ){.   
20100 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 30   zStack[tos] = 0
20110 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73  ;.    aStack[tos
20120 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ].flags = 0;.   
20130 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 7d 0a 20   POPSTACK;.  }. 
20140 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
20150 63 6f 64 65 3a 20 4d 65 6d 4c 6f 61 64 20 50 31  code: MemLoad P1
20160 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20   * *.**.** Push 
20170 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61  a copy of the va
20180 6c 75 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6c 6f  lue in memory lo
20190 63 61 74 69 6f 6e 20 50 31 20 6f 6e 74 6f 20 74  cation P1 onto t
201a0 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
201b0 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
201c0 61 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74  a string, then t
201d0 68 65 20 76 61 6c 75 65 20 70 75 73 68 65 64 20  he value pushed 
201e0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  is a pointer to.
201f0 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 74 68  ** the string th
20200 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  at is stored in 
20210 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  the memory locat
20220 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 6d 65 6d  ion.  If the mem
20230 6f 72 79 0a 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  ory.** location 
20240 69 73 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20  is subsequently 
20250 63 68 61 6e 67 65 64 20 28 75 73 69 6e 67 20 4f  changed (using O
20260 50 5f 4d 65 6d 53 74 6f 72 65 29 20 74 68 65 6e  P_MemStore) then
20270 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 75   the.** value pu
20280 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74  shed onto the st
20290 61 63 6b 20 77 69 6c 6c 20 63 68 61 6e 67 65 20  ack will change 
202a0 74 6f 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  too..*/.case OP_
202b0 4d 65 6d 4c 6f 61 64 3a 20 7b 0a 20 20 69 6e 74  MemLoad: {.  int
202c0 20 74 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b   tos = ++p->tos;
202d0 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e  .  int i = pOp->
202e0 70 31 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66  p1;.  VERIFY( if
202f0 28 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 74  ( NeedStack(p, t
20300 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  os) ) goto no_me
20310 6d 3b 20 29 0a 20 20 56 45 52 49 46 59 28 20 69  m; ).  VERIFY( i
20320 66 28 20 69 3c 30 20 7c 7c 20 69 3e 3d 70 2d 3e  f( i<0 || i>=p->
20330 6e 4d 65 6d 20 29 20 67 6f 74 6f 20 62 61 64 5f  nMem ) goto bad_
20340 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20  instruction; ). 
20350 20 6d 65 6d 63 70 79 28 26 61 53 74 61 63 6b 5b   memcpy(&aStack[
20360 74 6f 73 5d 2c 20 26 70 2d 3e 61 4d 65 6d 5b 69  tos], &p->aMem[i
20370 5d 2e 73 2c 20 73 69 7a 65 6f 66 28 61 53 74 61  ].s, sizeof(aSta
20380 63 6b 5b 74 6f 73 5d 29 2d 4e 42 46 53 29 3b 3b  ck[tos])-NBFS);;
20390 0a 20 20 69 66 28 20 61 53 74 61 63 6b 5b 74 6f  .  if( aStack[to
203a0 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53  s].flags & STK_S
203b0 74 72 20 29 7b 0a 20 20 20 20 7a 53 74 61 63 6b  tr ){.    zStack
203c0 5b 74 6f 73 5d 20 3d 20 70 2d 3e 61 4d 65 6d 5b  [tos] = p->aMem[
203d0 69 5d 2e 7a 3b 0a 20 20 20 20 61 53 74 61 63 6b  i].z;.    aStack
203e0 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 7c 3d 20 53  [tos].flags |= S
203f0 54 4b 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 61  TK_Static;.    a
20400 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
20410 20 26 3d 20 7e 53 54 4b 5f 44 79 6e 3b 0a 20 20   &= ~STK_Dyn;.  
20420 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
20430 20 4f 70 63 6f 64 65 3a 20 41 67 67 52 65 73 65   Opcode: AggRese
20440 74 20 2a 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 52  t * P2 *.**.** R
20450 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
20460 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 6e  tor so that it n
20470 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69 6e  o longer contain
20480 73 20 61 6e 79 20 64 61 74 61 2e 0a 2a 2a 20 46  s any data..** F
20490 75 74 75 72 65 20 61 67 67 72 65 67 61 74 6f 72  uture aggregator
204a0 20 65 6c 65 6d 65 6e 74 73 20 77 69 6c 6c 20 63   elements will c
204b0 6f 6e 74 61 69 6e 20 50 32 20 76 61 6c 75 65 73  ontain P2 values
204c0 20 65 61 63 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f   each..*/.case O
204d0 50 5f 41 67 67 52 65 73 65 74 3a 20 7b 0a 20 20  P_AggReset: {.  
204e0 41 67 67 52 65 73 65 74 28 26 70 2d 3e 61 67 67  AggReset(&p->agg
204f0 29 3b 0a 20 20 70 2d 3e 61 67 67 2e 6e 4d 65 6d  );.  p->agg.nMem
20500 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d   = pOp->p2;.  p-
20510 3e 61 67 67 2e 61 70 46 75 6e 63 20 3d 20 73 71  >agg.apFunc = sq
20520 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 61  liteMalloc( p->a
20530 67 67 2e 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 70  gg.nMem*sizeof(p
20540 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 30 5d 29  ->agg.apFunc[0])
20550 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   );.  break;.}..
20560 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 49 6e  /* Opcode: AggIn
20570 69 74 20 2a 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a  it * P2 P3.**.**
20580 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
20590 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
205a0 65 72 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  ers for an aggre
205b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
205c0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
205d0 77 69 6c 6c 20 6f 70 65 72 61 74 65 20 6f 75 74  will operate out
205e0 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 63 6f   of aggregate co
205f0 6c 75 6d 6e 20 50 32 2e 0a 2a 2a 20 50 33 20 69  lumn P2..** P3 i
20600 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20610 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  he FuncDef struc
20620 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 75 6e  ture for the fun
20630 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
20640 50 5f 41 67 67 49 6e 69 74 3a 20 7b 0a 20 20 69  P_AggInit: {.  i
20650 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nt i = pOp->p2;.
20660 20 20 56 45 52 49 46 59 28 20 69 66 28 20 69 3c    VERIFY( if( i<
20670 30 20 7c 7c 20 69 3e 3d 70 2d 3e 61 67 67 2e 6e  0 || i>=p->agg.n
20680 4d 65 6d 20 29 20 67 6f 74 6f 20 62 61 64 5f 69  Mem ) goto bad_i
20690 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20 20  nstruction; ).  
206a0 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 69 5d  p->agg.apFunc[i]
206b0 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70   = (FuncDef*)pOp
206c0 2d 3e 70 33 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p3;.  break;.}
206d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  ../* Opcode: Agg
206e0 46 75 6e 63 20 2a 20 50 32 20 50 33 0a 2a 2a 0a  Func * P2 P3.**.
206f0 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  ** Execute the s
20700 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  tep function for
20710 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
20720 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  The.** function 
20730 68 61 73 20 50 32 20 61 72 67 75 6d 65 6e 74 73  has P2 arguments
20740 2e 20 20 50 33 20 69 73 20 61 20 70 6f 69 6e 74  .  P3 is a point
20750 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65  er to the FuncDe
20760 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  f.** structure t
20770 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
20780 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
20790 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
207a0 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20 61   stack must be a
207b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
207c0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  is the index of.
207d0 2a 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ** the aggregate
207e0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 63 6f 72   column that cor
207f0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 69 73  responds to this
20800 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20810 69 6f 6e 2e 0a 2a 2a 20 49 64 65 61 6c 6c 79 2c  ion..** Ideally,
20820 20 74 68 69 73 20 69 6e 64 65 78 20 77 6f 75 6c   this index woul
20830 64 20 62 65 20 61 6e 6f 74 68 65 72 20 70 61 72  d be another par
20840 61 6d 65 74 65 72 2c 20 62 75 74 20 74 68 65 72  ameter, but ther
20850 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 72 65 65  e are.** no free
20860 20 70 61 72 61 6d 65 74 65 72 73 20 6c 65 66 74   parameters left
20870 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 69  .  The integer i
20880 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  s popped from th
20890 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65  e stack..*/.case
208a0 20 4f 50 5f 41 67 67 46 75 6e 63 3a 20 7b 0a 20   OP_AggFunc: {. 
208b0 20 69 6e 74 20 6e 20 3d 20 70 4f 70 2d 3e 70 32   int n = pOp->p2
208c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  ;.  int i;.  Mem
208d0 20 2a 70 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65   *pMem;.  sqlite
208e0 5f 66 75 6e 63 20 63 74 78 3b 0a 0a 20 20 56 45  _func ctx;..  VE
208f0 52 49 46 59 28 20 69 66 28 20 6e 3c 30 20 29 20  RIFY( if( n<0 ) 
20900 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63  goto bad_instruc
20910 74 69 6f 6e 3b 20 29 0a 20 20 56 45 52 49 46 59  tion; ).  VERIFY
20920 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e  ( if( p->tos+1<n
20930 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
20940 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 56 45  gh_stack; ).  VE
20950 52 49 46 59 28 20 69 66 28 20 61 53 74 61 63 6b  RIFY( if( aStack
20960 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 21 3d  [p->tos].flags!=
20970 53 54 4b 5f 49 6e 74 20 29 20 67 6f 74 6f 20 62  STK_Int ) goto b
20980 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20  ad_instruction; 
20990 29 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73  ).  for(i=p->tos
209a0 2d 6e 3b 20 69 3c 70 2d 3e 74 6f 73 3b 20 69 2b  -n; i<p->tos; i+
209b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 74 61  +){.    if( aSta
209c0 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
209d0 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  K_Null ){.      
209e0 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20  zStack[i] = 0;. 
209f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a00 69 66 28 20 53 74 72 69 6e 67 69 66 79 28 70 2c  if( Stringify(p,
20a10 20 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65   i) ) goto no_me
20a20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  m;.    }.  }.  i
20a30 20 3d 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73   = aStack[p->tos
20a40 5d 2e 69 3b 0a 20 20 56 45 52 49 46 59 28 20 69  ].i;.  VERIFY( i
20a50 66 28 20 69 3c 30 20 7c 7c 20 69 3e 3d 70 2d 3e  f( i<0 || i>=p->
20a60 61 67 67 2e 6e 4d 65 6d 20 29 20 67 6f 74 6f 20  agg.nMem ) goto 
20a70 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b  bad_instruction;
20a80 20 29 0a 20 20 63 74 78 2e 70 46 75 6e 63 20 3d   ).  ctx.pFunc =
20a90 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d 3e   (FuncDef*)pOp->
20aa0 70 33 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 70 2d  p3;.  pMem = &p-
20ab0 3e 61 67 67 2e 70 43 75 72 72 65 6e 74 2d 3e 61  >agg.pCurrent->a
20ac0 4d 65 6d 5b 69 5d 3b 0a 20 20 63 74 78 2e 7a 20  Mem[i];.  ctx.z 
20ad0 3d 20 70 4d 65 6d 2d 3e 73 2e 7a 3b 0a 20 20 63  = pMem->s.z;.  c
20ae0 74 78 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e  tx.pAgg = pMem->
20af0 7a 3b 0a 20 20 63 74 78 2e 63 6e 74 20 3d 20 2b  z;.  ctx.cnt = +
20b00 2b 70 4d 65 6d 2d 3e 73 2e 69 3b 0a 20 20 63 74  +pMem->s.i;.  ct
20b10 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  x.isError = 0;. 
20b20 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20 31 3b   ctx.isStep = 1;
20b30 0a 20 20 28 63 74 78 2e 70 46 75 6e 63 2d 3e 78  .  (ctx.pFunc->x
20b40 53 74 65 70 29 28 26 63 74 78 2c 20 6e 2c 20 28  Step)(&ctx, n, (
20b50 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 53  const char**)&zS
20b60 74 61 63 6b 5b 70 2d 3e 74 6f 73 2d 6e 5d 29 3b  tack[p->tos-n]);
20b70 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 63 74 78  .  pMem->z = ctx
20b80 2e 70 41 67 67 3b 0a 20 20 70 4d 65 6d 2d 3e 73  .pAgg;.  pMem->s
20b90 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 41 67 67  .flags = STK_Agg
20ba0 43 74 78 3b 0a 20 20 50 6f 70 53 74 61 63 6b 28  Ctx;.  PopStack(
20bb0 70 2c 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20 63  p, n+1);.  if( c
20bc0 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20  tx.isError ){.  
20bd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
20be0 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ROR;.  }.  break
20bf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
20c00 41 67 67 46 6f 63 75 73 20 2a 20 50 32 20 2a 0a  AggFocus * P2 *.
20c10 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f  **.** Pop the to
20c20 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61  p of the stack a
20c30 6e 64 20 75 73 65 20 74 68 61 74 20 61 73 20 61  nd use that as a
20c40 6e 20 61 67 67 72 65 67 61 74 6f 72 20 6b 65 79  n aggregator key
20c50 2e 20 20 49 66 0a 2a 2a 20 61 6e 20 61 67 67 72  .  If.** an aggr
20c60 65 67 61 74 6f 72 20 77 69 74 68 20 74 68 61 74  egator with that
20c70 20 73 61 6d 65 20 6b 65 79 20 61 6c 72 65 61 64   same key alread
20c80 79 20 65 78 69 73 74 73 2c 20 74 68 65 6e 20 6d  y exists, then m
20c90 61 6b 65 20 74 68 65 0a 2a 2a 20 61 67 67 72 65  ake the.** aggre
20ca0 67 61 74 6f 72 20 74 68 65 20 63 75 72 72 65 6e  gator the curren
20cb0 74 20 61 67 67 72 65 67 61 74 6f 72 20 61 6e 64  t aggregator and
20cc0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 49 66   jump to P2.  If
20cd0 20 6e 6f 20 61 67 67 72 65 67 61 74 6f 72 0a 2a   no aggregator.*
20ce0 2a 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  * with the given
20cf0 20 6b 65 79 20 65 78 69 73 74 73 2c 20 63 72 65   key exists, cre
20d00 61 74 65 20 6f 6e 65 20 61 6e 64 20 6d 61 6b 65  ate one and make
20d10 20 69 74 20 63 75 72 72 65 6e 74 20 62 75 74 0a   it current but.
20d20 2a 2a 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 0a  ** do not jump..
20d30 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 64 65 72 20  **.** The order 
20d40 6f 66 20 61 67 67 72 65 67 61 74 6f 72 20 6f 70  of aggregator op
20d50 63 6f 64 65 73 20 69 73 20 69 6d 70 6f 72 74 61  codes is importa
20d60 6e 74 2e 20 20 54 68 65 20 6f 72 64 65 72 20 69  nt.  The order i
20d70 73 3a 0a 2a 2a 20 41 67 67 52 65 73 65 74 20 41  s:.** AggReset A
20d80 67 67 46 6f 63 75 73 20 41 67 67 4e 65 78 74 2e  ggFocus AggNext.
20d90 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
20da0 2c 20 79 6f 75 20 6d 75 73 74 20 65 78 65 63 75  , you must execu
20db0 74 65 0a 2a 2a 20 41 67 67 52 65 73 65 74 20 66  te.** AggReset f
20dc0 69 72 73 74 2c 20 74 68 65 6e 20 7a 65 72 6f 20  irst, then zero 
20dd0 6f 72 20 6d 6f 72 65 20 41 67 67 46 6f 63 75 73  or more AggFocus
20de0 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74 68 65   operations, the
20df0 6e 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  n.** zero or mor
20e00 65 20 41 67 67 4e 65 78 74 20 6f 70 65 72 61 74  e AggNext operat
20e10 69 6f 6e 73 2e 20 20 59 6f 75 20 6d 75 73 74 20  ions.  You must 
20e20 6e 6f 74 20 65 78 65 63 75 74 65 20 61 6e 20 41  not execute an A
20e30 67 67 46 6f 63 75 73 0a 2a 2a 20 69 6e 20 62 65  ggFocus.** in be
20e40 74 77 65 65 6e 20 61 6e 20 41 67 67 4e 65 78 74  tween an AggNext
20e50 20 61 6e 64 20 61 6e 20 41 67 67 52 65 73 65 74   and an AggReset
20e60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
20e70 46 6f 63 75 73 3a 20 7b 0a 20 20 69 6e 74 20 74  Focus: {.  int t
20e80 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 41  os = p->tos;.  A
20e90 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  ggElem *pElem;. 
20ea0 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
20eb0 6e 74 20 6e 4b 65 79 3b 0a 0a 20 20 56 45 52 49  nt nKey;..  VERI
20ec0 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20  FY( if( tos<0 ) 
20ed0 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
20ee0 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 53  stack; ).  if( S
20ef0 74 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29  tringify(p, tos)
20f00 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
20f10 20 20 7a 4b 65 79 20 3d 20 7a 53 74 61 63 6b 5b    zKey = zStack[
20f20 74 6f 73 5d 3b 20 0a 20 20 6e 4b 65 79 20 3d 20  tos]; .  nKey = 
20f30 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 3b 0a 20  aStack[tos].n;. 
20f40 20 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48   pElem = sqliteH
20f50 61 73 68 46 69 6e 64 28 26 70 2d 3e 61 67 67 2e  ashFind(&p->agg.
20f60 68 61 73 68 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  hash, zKey, nKey
20f70 29 3b 0a 20 20 69 66 28 20 70 45 6c 65 6d 20 29  );.  if( pElem )
20f80 7b 0a 20 20 20 20 70 2d 3e 61 67 67 2e 70 43 75  {.    p->agg.pCu
20f90 72 72 65 6e 74 20 3d 20 70 45 6c 65 6d 3b 0a 20  rrent = pElem;. 
20fa0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
20fb0 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 1;.  }else{.  
20fc0 20 20 41 67 67 49 6e 73 65 72 74 28 26 70 2d 3e    AggInsert(&p->
20fd0 61 67 67 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  agg, zKey, nKey)
20fe0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
20ff0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
21000 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
21010 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20  }.  POPSTACK;.  
21020 62 72 65 61 6b 3b 20 0a 7d 0a 0a 2f 2a 20 4f 70  break; .}../* Op
21030 63 6f 64 65 3a 20 41 67 67 53 65 74 20 2a 20 50  code: AggSet * P
21040 32 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  2 *.**.** Move t
21050 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
21060 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 50 32 2d  ack into the P2-
21070 74 68 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  th field of the 
21080 63 75 72 72 65 6e 74 0a 2a 2a 20 61 67 67 72 65  current.** aggre
21090 67 61 74 65 2e 20 20 53 74 72 69 6e 67 20 76 61  gate.  String va
210a0 6c 75 65 73 20 61 72 65 20 64 75 70 6c 69 63 61  lues are duplica
210b0 74 65 64 20 69 6e 74 6f 20 6e 65 77 20 6d 65 6d  ted into new mem
210c0 6f 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ory..*/.case OP_
210d0 41 67 67 53 65 74 3a 20 7b 0a 20 20 41 67 67 45  AggSet: {.  AggE
210e0 6c 65 6d 20 2a 70 46 6f 63 75 73 20 3d 20 41 67  lem *pFocus = Ag
210f0 67 49 6e 46 6f 63 75 73 28 70 2d 3e 61 67 67 29  gInFocus(p->agg)
21100 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  ;.  int i = pOp-
21110 3e 70 32 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d  >p2;.  int tos =
21120 20 70 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49 46   p->tos;.  VERIF
21130 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67  Y( if( tos<0 ) g
21140 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
21150 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 70 46  tack; ).  if( pF
21160 6f 63 75 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  ocus==0 ) goto n
21170 6f 5f 6d 65 6d 3b 0a 20 20 69 66 28 20 56 45 52  o_mem;.  if( VER
21180 49 46 59 28 20 69 3e 3d 30 20 26 26 20 29 20 69  IFY( i>=0 && ) i
21190 3c 70 2d 3e 61 67 67 2e 6e 4d 65 6d 20 29 7b 0a  <p->agg.nMem ){.
211a0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
211b0 26 70 46 6f 63 75 73 2d 3e 61 4d 65 6d 5b 69 5d  &pFocus->aMem[i]
211c0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64  ;.    char *zOld
211d0 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
211e0 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 44 79  s.flags & STK_Dy
211f0 6e 20 29 7b 0a 20 20 20 20 20 20 7a 4f 6c 64 20  n ){.      zOld 
21200 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 7d  = pMem->z;.    }
21210 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4f 6c 64  else{.      zOld
21220 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21230 70 4d 65 6d 2d 3e 73 20 3d 20 61 53 74 61 63 6b  pMem->s = aStack
21240 5b 74 6f 73 5d 3b 0a 20 20 20 20 69 66 28 20 70  [tos];.    if( p
21250 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53  Mem->s.flags & S
21260 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  TK_Dyn ){.      
21270 70 4d 65 6d 2d 3e 7a 20 3d 20 7a 53 74 61 63 6b  pMem->z = zStack
21280 5b 74 6f 73 5d 3b 0a 20 20 20 20 20 20 7a 53 74  [tos];.      zSt
21290 61 63 6b 5b 74 6f 73 5d 20 3d 20 30 3b 0a 20 20  ack[tos] = 0;.  
212a0 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e      aStack[tos].
212b0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  flags = 0;.    }
212c0 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 73  else if( pMem->s
212d0 2e 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 53 74  .flags & (STK_St
212e0 61 74 69 63 7c 53 54 4b 5f 41 67 67 43 74 78 29  atic|STK_AggCtx)
212f0 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
21300 7a 20 3d 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b  z = zStack[tos];
21310 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
21320 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53  Mem->s.flags & S
21330 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  TK_Str ){.      
21340 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e  pMem->z = pMem->
21350 73 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  s.z;.    }.    i
21360 66 28 20 7a 4f 6c 64 20 29 20 73 71 6c 69 74 65  f( zOld ) sqlite
21370 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 0a  Free(zOld);.  }.
21380 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72    POPSTACK;.  br
21390 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
213a0 65 3a 20 41 67 67 47 65 74 20 2a 20 50 32 20 2a  e: AggGet * P2 *
213b0 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 61 20 6e 65  .**.** Push a ne
213c0 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20 74 68 65  w entry onto the
213d0 20 73 74 61 63 6b 20 77 68 69 63 68 20 69 73 20   stack which is 
213e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 50 32  a copy of the P2
213f0 2d 74 68 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20  -th field.** of 
21400 74 68 65 20 63 75 72 72 65 6e 74 20 61 67 67 72  the current aggr
21410 65 67 61 74 65 2e 20 20 53 74 72 69 6e 67 73 20  egate.  Strings 
21420 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
21430 65 64 20 73 6f 0a 2a 2a 20 73 74 72 69 6e 67 20  ed so.** string 
21440 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20 65  values will be e
21450 70 68 65 6d 65 72 61 6c 2e 0a 2a 2f 0a 63 61 73  phemeral..*/.cas
21460 65 20 4f 50 5f 41 67 67 47 65 74 3a 20 7b 0a 20  e OP_AggGet: {. 
21470 20 41 67 67 45 6c 65 6d 20 2a 70 46 6f 63 75 73   AggElem *pFocus
21480 20 3d 20 41 67 67 49 6e 46 6f 63 75 73 28 70 2d   = AggInFocus(p-
21490 3e 61 67 67 29 3b 0a 20 20 69 6e 74 20 69 20 3d  >agg);.  int i =
214a0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 6e 74 20   pOp->p2;.  int 
214b0 74 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a  tos = ++p->tos;.
214c0 20 20 56 45 52 49 46 59 28 20 69 66 28 20 4e 65    VERIFY( if( Ne
214d0 65 64 53 74 61 63 6b 28 70 2c 20 74 6f 73 29 20  edStack(p, tos) 
214e0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20 29  ) goto no_mem; )
214f0 0a 20 20 69 66 28 20 70 46 6f 63 75 73 3d 3d 30  .  if( pFocus==0
21500 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
21510 20 20 69 66 28 20 56 45 52 49 46 59 28 20 69 3e    if( VERIFY( i>
21520 3d 30 20 26 26 20 29 20 69 3c 70 2d 3e 61 67 67  =0 && ) i<p->agg
21530 2e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 4d 65 6d  .nMem ){.    Mem
21540 20 2a 70 4d 65 6d 20 3d 20 26 70 46 6f 63 75 73   *pMem = &pFocus
21550 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 61  ->aMem[i];.    a
21560 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 70 4d 65  Stack[tos] = pMe
21570 6d 2d 3e 73 3b 0a 20 20 20 20 7a 53 74 61 63 6b  m->s;.    zStack
21580 5b 74 6f 73 5d 20 3d 20 70 4d 65 6d 2d 3e 7a 3b  [tos] = pMem->z;
21590 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d  .    aStack[tos]
215a0 2e 66 6c 61 67 73 20 26 3d 20 7e 53 54 4b 5f 44  .flags &= ~STK_D
215b0 79 6e 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  yn;.  }.  break;
215c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
215d0 67 67 4e 65 78 74 20 2a 20 50 32 20 2a 0a 2a 2a  ggNext * P2 *.**
215e0 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 78  .** Make the nex
215f0 74 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75  t aggregate valu
21600 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 67  e the current ag
21610 67 72 65 67 61 74 65 2e 20 20 54 68 65 20 70 72  gregate.  The pr
21620 69 6f 72 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  ior.** aggregate
21630 20 69 73 20 64 65 6c 65 74 65 64 2e 20 20 49 66   is deleted.  If
21640 20 61 6c 6c 20 61 67 67 72 65 67 61 74 65 20 76   all aggregate v
21650 61 6c 75 65 73 20 68 61 76 65 20 62 65 65 6e 20  alues have been 
21660 63 6f 6e 73 75 6d 65 64 2c 0a 2a 2a 20 6a 75 6d  consumed,.** jum
21670 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  p to P2..**.** T
21680 68 65 20 6f 72 64 65 72 20 6f 66 20 61 67 67 72  he order of aggr
21690 65 67 61 74 6f 72 20 6f 70 63 6f 64 65 73 20 69  egator opcodes i
216a0 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68  s important.  Th
216b0 65 20 6f 72 64 65 72 20 69 73 3a 0a 2a 2a 20 41  e order is:.** A
216c0 67 67 52 65 73 65 74 20 41 67 67 46 6f 63 75 73  ggReset AggFocus
216d0 20 41 67 67 4e 65 78 74 2e 20 20 49 6e 20 6f 74   AggNext.  In ot
216e0 68 65 72 20 77 6f 72 64 73 2c 20 79 6f 75 20 6d  her words, you m
216f0 75 73 74 20 65 78 65 63 75 74 65 0a 2a 2a 20 41  ust execute.** A
21700 67 67 52 65 73 65 74 20 66 69 72 73 74 2c 20 74  ggReset first, t
21710 68 65 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  hen zero or more
21720 20 41 67 67 46 6f 63 75 73 20 6f 70 65 72 61 74   AggFocus operat
21730 69 6f 6e 73 2c 20 74 68 65 6e 0a 2a 2a 20 7a 65  ions, then.** ze
21740 72 6f 20 6f 72 20 6d 6f 72 65 20 41 67 67 4e 65  ro or more AggNe
21750 78 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  xt operations.  
21760 59 6f 75 20 6d 75 73 74 20 6e 6f 74 20 65 78 65  You must not exe
21770 63 75 74 65 20 61 6e 20 41 67 67 46 6f 63 75 73  cute an AggFocus
21780 0a 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 61  .** in between a
21790 6e 20 41 67 67 4e 65 78 74 20 61 6e 64 20 61 6e  n AggNext and an
217a0 20 41 67 67 52 65 73 65 74 2e 0a 2a 2f 0a 63 61   AggReset..*/.ca
217b0 73 65 20 4f 50 5f 41 67 67 4e 65 78 74 3a 20 7b  se OP_AggNext: {
217c0 0a 20 20 69 66 28 20 70 2d 3e 61 67 67 2e 70 53  .  if( p->agg.pS
217d0 65 61 72 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  earch==0 ){.    
217e0 70 2d 3e 61 67 67 2e 70 53 65 61 72 63 68 20 3d  p->agg.pSearch =
217f0 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74   sqliteHashFirst
21800 28 26 70 2d 3e 61 67 67 2e 68 61 73 68 29 3b 0a  (&p->agg.hash);.
21810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
21820 61 67 67 2e 70 53 65 61 72 63 68 20 3d 20 73 71  agg.pSearch = sq
21830 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 2d 3e  liteHashNext(p->
21840 61 67 67 2e 70 53 65 61 72 63 68 29 3b 0a 20 20  agg.pSearch);.  
21850 7d 0a 20 20 69 66 28 20 70 2d 3e 61 67 67 2e 70  }.  if( p->agg.p
21860 53 65 61 72 63 68 3d 3d 30 20 29 7b 0a 20 20 20  Search==0 ){.   
21870 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
21880 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
21890 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
218a0 69 74 65 5f 66 75 6e 63 20 63 74 78 3b 0a 20 20  ite_func ctx;.  
218b0 20 20 4d 65 6d 20 2a 61 4d 65 6d 3b 0a 20 20 20    Mem *aMem;.   
218c0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
218d0 20 20 20 70 2d 3e 61 67 67 2e 70 43 75 72 72 65     p->agg.pCurre
218e0 6e 74 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  nt = sqliteHashD
218f0 61 74 61 28 70 2d 3e 61 67 67 2e 70 53 65 61 72  ata(p->agg.pSear
21900 63 68 29 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20  ch);.    aMem = 
21910 70 2d 3e 61 67 67 2e 70 43 75 72 72 65 6e 74 2d  p->agg.pCurrent-
21920 3e 61 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  >aMem;.    for(i
21930 3d 30 3b 20 69 3c 70 2d 3e 61 67 67 2e 6e 4d 65  =0; i<p->agg.nMe
21940 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
21950 6e 74 20 66 72 65 65 43 74 78 3b 0a 20 20 20 20  nt freeCtx;.    
21960 20 20 69 66 28 20 70 2d 3e 61 67 67 2e 61 70 46    if( p->agg.apF
21970 75 6e 63 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  unc[i]==0 ) cont
21980 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
21990 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 69 5d  p->agg.apFunc[i]
219a0 2d 3e 78 46 69 6e 61 6c 69 7a 65 3d 3d 30 20 29  ->xFinalize==0 )
219b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
219c0 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 53   ctx.s.flags = S
219d0 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 63  TK_Null;.      c
219e0 74 78 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  tx.z = 0;.      
219f0 63 74 78 2e 70 41 67 67 20 3d 20 28 76 6f 69 64  ctx.pAgg = (void
21a00 2a 29 61 4d 65 6d 5b 69 5d 2e 7a 3b 0a 20 20 20  *)aMem[i].z;.   
21a10 20 20 20 66 72 65 65 43 74 78 20 3d 20 61 4d 65     freeCtx = aMe
21a20 6d 5b 69 5d 2e 7a 20 26 26 20 61 4d 65 6d 5b 69  m[i].z && aMem[i
21a30 5d 2e 7a 21 3d 61 4d 65 6d 5b 69 5d 2e 73 2e 7a  ].z!=aMem[i].s.z
21a40 3b 0a 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20  ;.      ctx.cnt 
21a50 3d 20 61 4d 65 6d 5b 69 5d 2e 73 2e 69 3b 0a 20  = aMem[i].s.i;. 
21a60 20 20 20 20 20 63 74 78 2e 69 73 53 74 65 70 20       ctx.isStep 
21a70 3d 20 30 3b 0a 20 20 20 20 20 20 63 74 78 2e 70  = 0;.      ctx.p
21a80 46 75 6e 63 20 3d 20 70 2d 3e 61 67 67 2e 61 70  Func = p->agg.ap
21a90 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 28  Func[i];.      (
21aa0 2a 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 69  *p->agg.apFunc[i
21ab0 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 28 26 63  ]->xFinalize)(&c
21ac0 74 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  tx);.      if( f
21ad0 72 65 65 43 74 78 20 29 7b 0a 20 20 20 20 20 20  reeCtx ){.      
21ae0 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 61 4d    sqliteFree( aM
21af0 65 6d 5b 69 5d 2e 7a 20 29 3b 0a 20 20 20 20 20  em[i].z );.     
21b00 20 7d 0a 20 20 20 20 20 20 61 4d 65 6d 5b 69 5d   }.      aMem[i]
21b10 2e 73 20 3d 20 63 74 78 2e 73 3b 0a 20 20 20 20  .s = ctx.s;.    
21b20 20 20 61 4d 65 6d 5b 69 5d 2e 7a 20 3d 20 63 74    aMem[i].z = ct
21b30 78 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  x.z;.      if( (
21b40 61 4d 65 6d 5b 69 5d 2e 73 2e 66 6c 61 67 73 20  aMem[i].s.flags 
21b50 26 20 53 54 4b 5f 53 74 72 29 20 26 26 0a 20 20  & STK_Str) &&.  
21b60 20 20 20 20 20 20 20 20 20 20 20 20 28 61 4d 65              (aMe
21b70 6d 5b 69 5d 2e 73 2e 66 6c 61 67 73 20 26 20 28  m[i].s.flags & (
21b80 53 54 4b 5f 44 79 6e 7c 53 54 4b 5f 53 74 61 74  STK_Dyn|STK_Stat
21b90 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ic))==0 ){.     
21ba0 20 20 20 61 4d 65 6d 5b 69 5d 2e 7a 20 3d 20 61     aMem[i].z = a
21bb0 4d 65 6d 5b 69 5d 2e 73 2e 7a 3b 0a 20 20 20 20  Mem[i].s.z;.    
21bc0 20 20 7d 0a 20 20 20 20 20 20 6e 45 72 72 20 2b    }.      nErr +
21bd0 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20  = ctx.isError;. 
21be0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
21bf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
21c00 53 65 74 49 6e 73 65 72 74 20 50 31 20 2a 20 50  SetInsert P1 * P
21c10 33 0a 2a 2a 0a 2a 2a 20 49 66 20 53 65 74 20 50  3.**.** If Set P
21c20 31 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  1 does not exist
21c30 20 74 68 65 6e 20 63 72 65 61 74 65 20 69 74 2e   then create it.
21c40 20 20 54 68 65 6e 20 69 6e 73 65 72 74 20 76 61    Then insert va
21c50 6c 75 65 0a 2a 2a 20 50 33 20 69 6e 74 6f 20 74  lue.** P3 into t
21c60 68 61 74 20 73 65 74 2e 20 20 49 66 20 50 33 20  hat set.  If P3 
21c70 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  is NULL, then in
21c80 73 65 72 74 20 74 68 65 20 74 6f 70 20 6f 66 20  sert the top of 
21c90 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
21ca0 6f 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 63 61  o the set..*/.ca
21cb0 73 65 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 3a  se OP_SetInsert:
21cc0 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
21cd0 2d 3e 70 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ->p1;.  if( p->n
21ce0 53 65 74 3c 3d 69 20 29 7b 0a 20 20 20 20 69 6e  Set<=i ){.    in
21cf0 74 20 6b 3b 0a 20 20 20 20 53 65 74 20 2a 61 53  t k;.    Set *aS
21d00 65 74 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  et = sqliteReall
21d10 6f 63 28 70 2d 3e 61 53 65 74 2c 20 28 69 2b 31  oc(p->aSet, (i+1
21d20 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 65 74  )*sizeof(p->aSet
21d30 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
21d40 61 53 65 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  aSet==0 ) goto n
21d50 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70 2d 3e 61 53  o_mem;.    p->aS
21d60 65 74 20 3d 20 61 53 65 74 3b 0a 20 20 20 20 66  et = aSet;.    f
21d70 6f 72 28 6b 3d 70 2d 3e 6e 53 65 74 3b 20 6b 3c  or(k=p->nSet; k<
21d80 3d 69 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  =i; k++){.      
21d90 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
21da0 70 2d 3e 61 53 65 74 5b 6b 5d 2e 68 61 73 68 2c  p->aSet[k].hash,
21db0 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
21dc0 41 52 59 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ARY, 1);.    }. 
21dd0 20 20 20 70 2d 3e 6e 53 65 74 20 3d 20 69 2b 31     p->nSet = i+1
21de0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
21df0 3e 70 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p3 ){.    sqlit
21e00 65 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  eHashInsert(&p->
21e10 61 53 65 74 5b 69 5d 2e 68 61 73 68 2c 20 70 4f  aSet[i].hash, pO
21e20 70 2d 3e 70 33 2c 20 73 74 72 6c 65 6e 28 70 4f  p->p3, strlen(pO
21e30 70 2d 3e 70 33 29 2b 31 2c 20 70 29 3b 0a 20 20  p->p3)+1, p);.  
21e40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 74  }else{.    int t
21e50 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 20  os = p->tos;.   
21e60 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
21e70 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
21e80 63 6b 3b 0a 20 20 20 20 69 66 28 20 53 74 72 69  ck;.    if( Stri
21e90 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 20 29 20  ngify(p, tos) ) 
21ea0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
21eb0 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
21ec0 74 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61  t(&p->aSet[i].ha
21ed0 73 68 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c  sh, zStack[tos],
21ee0 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20   aStack[tos].n, 
21ef0 70 29 3b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b  p);.    POPSTACK
21f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
21f10 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
21f20 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
21f30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
21f40 70 63 6f 64 65 3a 20 53 65 74 46 6f 75 6e 64 20  pcode: SetFound 
21f50 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f  P1 P2 *.**.** Po
21f60 70 20 74 68 65 20 73 74 61 63 6b 20 6f 6e 63 65  p the stack once
21f70 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 74 68 65   and compare the
21f80 20 76 61 6c 75 65 20 70 6f 70 70 65 64 20 6f 66   value popped of
21f90 66 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  f with the.** co
21fa0 6e 74 65 6e 74 73 20 6f 66 20 73 65 74 20 50 31  ntents of set P1
21fb0 2e 20 20 49 66 20 74 68 65 20 65 6c 65 6d 65 6e  .  If the elemen
21fc0 74 20 70 6f 70 70 65 64 20 65 78 69 73 74 73 20  t popped exists 
21fd0 69 6e 20 73 65 74 20 50 31 2c 0a 2a 2a 20 74 68  in set P1,.** th
21fe0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
21ff0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
22000 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20  hrough..*/.case 
22010 4f 50 5f 53 65 74 46 6f 75 6e 64 3a 20 7b 0a 20  OP_SetFound: {. 
22020 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
22030 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  ;.  int tos = p-
22040 3e 74 6f 73 3b 0a 20 20 56 45 52 49 46 59 28 20  >tos;.  VERIFY( 
22050 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f  if( tos<0 ) goto
22060 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63   not_enough_stac
22070 6b 3b 20 29 0a 20 20 69 66 28 20 53 74 72 69 6e  k; ).  if( Strin
22080 67 69 66 79 28 70 2c 20 74 6f 73 29 20 29 20 67  gify(p, tos) ) g
22090 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 69 66  oto no_mem;.  if
220a0 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26  ( VERIFY( i>=0 &
220b0 26 20 69 3c 70 2d 3e 6e 53 65 74 20 26 26 29 20  & i<p->nSet &&) 
220c0 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  .       sqliteHa
220d0 73 68 46 69 6e 64 28 26 70 2d 3e 61 53 65 74 5b  shFind(&p->aSet[
220e0 69 5d 2e 68 61 73 68 2c 20 7a 53 74 61 63 6b 5b  i].hash, zStack[
220f0 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f 73  tos], aStack[tos
22100 5d 2e 6e 29 29 7b 0a 20 20 20 20 70 63 20 3d 20  ].n)){.    pc = 
22110 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
22120 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62  .  POPSTACK;.  b
22130 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
22140 64 65 3a 20 53 65 74 4e 6f 74 46 6f 75 6e 64 20  de: SetNotFound 
22150 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f  P1 P2 *.**.** Po
22160 70 20 74 68 65 20 73 74 61 63 6b 20 6f 6e 63 65  p the stack once
22170 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 74 68 65   and compare the
22180 20 76 61 6c 75 65 20 70 6f 70 70 65 64 20 6f 66   value popped of
22190 66 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  f with the.** co
221a0 6e 74 65 6e 74 73 20 6f 66 20 73 65 74 20 50 31  ntents of set P1
221b0 2e 20 20 49 66 20 74 68 65 20 65 6c 65 6d 65 6e  .  If the elemen
221c0 74 20 70 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f  t popped does no
221d0 74 20 65 78 69 73 74 73 20 69 6e 20 0a 2a 2a 20  t exists in .** 
221e0 73 65 74 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d  set P1, then jum
221f0 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
22200 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
22210 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74  ..*/.case OP_Set
22220 4e 6f 74 46 6f 75 6e 64 3a 20 7b 0a 20 20 69 6e  NotFound: {.  in
22230 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
22240 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f   int tos = p->to
22250 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  s;.  VERIFY( if(
22260 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f   tos<0 ) goto no
22270 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20  t_enough_stack; 
22280 29 0a 20 20 69 66 28 20 53 74 72 69 6e 67 69 66  ).  if( Stringif
22290 79 28 70 2c 20 74 6f 73 29 20 29 20 67 6f 74 6f  y(p, tos) ) goto
222a0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 69 66 28 56 45   no_mem;.  if(VE
222b0 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69 3c  RIFY( i>=0 && i<
222c0 70 2d 3e 6e 53 65 74 20 26 26 29 0a 20 20 20 20  p->nSet &&).    
222d0 20 20 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e     sqliteHashFin
222e0 64 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61  d(&p->aSet[i].ha
222f0 73 68 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c  sh, zStack[tos],
22300 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 29 3d   aStack[tos].n)=
22310 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  =0 ){.    pc = p
22320 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
22330 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72    POPSTACK;.  br
22340 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
22350 65 3a 20 53 65 74 46 69 72 73 74 20 50 31 20 50  e: SetFirst P1 P
22360 32 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74  2 *.**.** Read t
22370 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
22380 20 66 72 6f 6d 20 73 65 74 20 50 31 20 61 6e 64   from set P1 and
22390 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
223a0 65 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65  e stack.  If the
223b0 0a 2a 2a 20 73 65 74 20 69 73 20 65 6d 70 74 79  .** set is empty
223c0 2c 20 70 75 73 68 20 6e 6f 74 68 69 6e 67 20 61  , push nothing a
223d0 6e 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  nd jump immediat
223e0 65 6c 79 20 74 6f 20 50 32 2e 20 20 54 68 69 73  ely to P2.  This
223f0 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 75 73   opcode is.** us
22400 65 64 20 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f  ed in combinatio
22410 6e 20 77 69 74 68 20 4f 50 5f 53 65 74 4e 65 78  n with OP_SetNex
22420 74 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  t to loop over a
22430 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 61  ll elements of a
22440 20 73 65 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f   set..*/./* Opco
22450 64 65 3a 20 53 65 74 4e 65 78 74 20 50 31 20 50  de: SetNext P1 P
22460 32 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74  2 *.**.** Read t
22470 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
22480 66 72 6f 6d 20 73 65 74 20 50 31 20 61 6e 64 20  from set P1 and 
22490 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
224a0 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 72   stack.  If ther
224b0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 6d 6f 72 65  e.** are no more
224c0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
224d0 20 73 65 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   set, do not do 
224e0 74 68 65 20 70 75 73 68 20 61 6e 64 20 66 61 6c  the push and fal
224f0 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 20 4f 74  l through..** Ot
22500 68 65 72 77 69 73 65 2c 20 6a 75 6d 70 20 74 6f  herwise, jump to
22510 20 50 32 20 61 66 74 65 72 20 70 75 73 68 69 6e   P2 after pushin
22520 67 20 74 68 65 20 6e 65 78 74 20 73 65 74 20 65  g the next set e
22530 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20  lement..*/.case 
22540 4f 50 5f 53 65 74 46 69 72 73 74 3a 20 0a 63 61  OP_SetFirst: .ca
22550 73 65 20 4f 50 5f 53 65 74 4e 65 78 74 3a 20 7b  se OP_SetNext: {
22560 0a 20 20 53 65 74 20 2a 70 53 65 74 3b 0a 20 20  .  Set *pSet;.  
22570 69 6e 74 20 74 6f 73 3b 0a 20 20 56 45 52 49 46  int tos;.  VERIF
22580 59 28 20 69 66 28 20 70 4f 70 2d 3e 70 31 3c 30  Y( if( pOp->p1<0
22590 20 7c 7c 20 70 4f 70 2d 3e 70 31 3e 3d 70 2d 3e   || pOp->p1>=p->
225a0 6e 53 65 74 20 29 20 67 6f 74 6f 20 62 61 64 5f  nSet ) goto bad_
225b0 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20  instruction; ). 
225c0 20 70 53 65 74 20 3d 20 26 70 2d 3e 61 53 65 74   pSet = &p->aSet
225d0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
225e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
225f0 5f 53 65 74 46 69 72 73 74 20 29 7b 0a 20 20 20  _SetFirst ){.   
22600 20 70 53 65 74 2d 3e 70 72 65 76 20 3d 20 73 71   pSet->prev = sq
22610 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
22620 53 65 74 2d 3e 68 61 73 68 29 3b 0a 20 20 20 20  Set->hash);.    
22630 69 66 28 20 70 53 65 74 2d 3e 70 72 65 76 3d 3d  if( pSet->prev==
22640 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
22650 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
22660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 45 52    }else{.    VER
22680 49 46 59 28 20 69 66 28 20 70 53 65 74 2d 3e 70  IFY( if( pSet->p
22690 72 65 76 3d 3d 30 20 29 20 67 6f 74 6f 20 62 61  rev==0 ) goto ba
226a0 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
226b0 0a 20 20 20 20 70 53 65 74 2d 3e 70 72 65 76 20  .    pSet->prev 
226c0 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  = sqliteHashNext
226d0 28 70 53 65 74 2d 3e 70 72 65 76 29 3b 0a 20 20  (pSet->prev);.  
226e0 20 20 69 66 28 20 70 53 65 74 2d 3e 70 72 65 76    if( pSet->prev
226f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
22700 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
22710 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
22720 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 - 1;.    }.  }
22730 0a 20 20 74 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f  .  tos = ++p->to
22740 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  s;.  VERIFY( if(
22750 20 4e 65 65 64 53 74 61 63 6b 28 70 2c 20 70 2d   NeedStack(p, p-
22760 3e 74 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  >tos) ) goto no_
22770 6d 65 6d 3b 20 29 0a 20 20 7a 53 74 61 63 6b 5b  mem; ).  zStack[
22780 74 6f 73 5d 20 3d 20 73 71 6c 69 74 65 48 61 73  tos] = sqliteHas
22790 68 4b 65 79 28 70 53 65 74 2d 3e 70 72 65 76 29  hKey(pSet->prev)
227a0 3b 0a 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  ;.  aStack[tos].
227b0 6e 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4b 65  n = sqliteHashKe
227c0 79 73 69 7a 65 28 70 53 65 74 2d 3e 70 72 65 76  ysize(pSet->prev
227d0 29 3b 0a 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d  );.  aStack[tos]
227e0 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72  .flags = STK_Str
227f0 20 7c 20 53 54 4b 5f 53 74 61 74 69 63 3b 0a 20   | STK_Static;. 
22800 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 41 6e   break;.}../* An
22810 20 6f 74 68 65 72 20 6f 70 63 6f 64 65 20 69 73   other opcode is
22820 20 69 6c 6c 65 67 61 6c 2e 2e 2e 0a 2a 2f 0a 64   illegal....*/.d
22830 65 66 61 75 6c 74 3a 20 7b 0a 20 20 73 70 72 69  efault: {.  spri
22840 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 70 4f  ntf(zBuf,"%d",pO
22850 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 73 71  p->opcode);.  sq
22860 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
22870 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e  ErrMsg, "unknown
22880 20 6f 70 63 6f 64 65 20 22 2c 20 7a 42 75 66 2c   opcode ", zBuf,
22890 20 30 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49   0);.  rc = SQLI
228a0 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 62  TE_INTERNAL;.  b
228b0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  reak;.}../******
228c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22900 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
22910 61 73 65 73 20 6f 66 20 74 68 65 20 73 77 69 74  ases of the swit
22920 63 68 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f  ch statement abo
22930 76 65 20 74 68 69 73 20 6c 69 6e 65 20 73 68 6f  ve this line sho
22940 75 6c 64 20 61 6c 6c 20 62 65 20 69 6e 64 65 6e  uld all be inden
22950 74 65 64 0a 2a 2a 20 62 79 20 36 20 73 70 61 63  ted.** by 6 spac
22960 65 73 2e 20 20 42 75 74 20 74 68 65 20 6c 65 66  es.  But the lef
22970 74 2d 6d 6f 73 74 20 36 20 73 70 61 63 65 73 20  t-most 6 spaces 
22980 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65  have been remove
22990 64 20 74 6f 20 69 6d 70 72 6f 76 65 20 74 68 65  d to improve the
229a0 0a 2a 2a 20 72 65 61 64 61 62 69 6c 69 74 79 2e  .** readability.
229b0 20 20 46 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e    From this poin
229c0 74 20 6f 6e 20 64 6f 77 6e 2c 20 74 68 65 20 6e  t on down, the n
229d0 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
229e0 6e 20 72 75 6c 65 73 20 61 72 65 0a 2a 2a 20 72  n rules are.** r
229f0 65 73 74 6f 72 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a  estored..*******
22a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a40 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 7d 0a 0a 20  ******/.    }.. 
22a50 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
22a60 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f  ing code adds no
22a70 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74  thing to the act
22a80 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  ual functionalit
22a90 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
22aa0 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20  program.  It is 
22ab0 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65  only here for te
22ac0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
22ad0 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74  ing..    ** On t
22ae0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
22af0 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20  t does burn CPU 
22b00 63 79 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d  cycles every tim
22b10 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  e through.    **
22b20 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c   the evaluator l
22b30 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20  oop.  So we can 
22b40 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77 68 65  leave it out whe
22b50 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  n NDEBUG is defi
22b60 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ned..    */.#ifn
22b70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69  def NDEBUG.    i
22b80 66 28 20 70 63 3c 2d 31 20 7c 7c 20 70 63 3e 3d  f( pc<-1 || pc>=
22b90 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
22ba0 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
22bb0 70 7a 45 72 72 4d 73 67 2c 20 22 6a 75 6d 70 20  pzErrMsg, "jump 
22bc0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 75 74 20  destination out 
22bd0 6f 66 20 72 61 6e 67 65 22 2c 20 30 29 3b 0a 20  of range", 0);. 
22be0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22bf0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 7d  _INTERNAL;.    }
22c00 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63  .    if( p->trac
22c10 65 20 26 26 20 70 2d 3e 74 6f 73 3e 3d 30 20 29  e && p->tos>=0 )
22c20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
22c30 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
22c40 74 72 61 63 65 2c 20 22 53 74 61 63 6b 3a 22 29  trace, "Stack:")
22c50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d  ;.      for(i=p-
22c60 3e 74 6f 73 3b 20 69 3e 3d 30 20 26 26 20 69 3e  >tos; i>=0 && i>
22c70 70 2d 3e 74 6f 73 2d 35 3b 20 69 2d 2d 29 7b 0a  p->tos-5; i--){.
22c80 20 20 20 20 20 20 20 20 69 66 28 20 61 53 74 61          if( aSta
22c90 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
22ca0 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  K_Null ){.      
22cb0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74      fprintf(p->t
22cc0 72 61 63 65 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a  race, " NULL");.
22cd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22ce0 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61  ( (aStack[i].fla
22cf0 67 73 20 26 20 28 53 54 4b 5f 49 6e 74 7c 53 54  gs & (STK_Int|ST
22d00 4b 5f 53 74 72 29 29 3d 3d 28 53 54 4b 5f 49 6e  K_Str))==(STK_In
22d10 74 7c 53 54 4b 5f 53 74 72 29 20 29 7b 0a 20 20  t|STK_Str) ){.  
22d20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
22d30 70 2d 3e 74 72 61 63 65 2c 20 22 20 73 69 3a 25  p->trace, " si:%
22d40 64 22 2c 20 61 53 74 61 63 6b 5b 69 5d 2e 69 29  d", aStack[i].i)
22d50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22d60 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c  if( aStack[i].fl
22d70 61 67 73 20 26 20 53 54 4b 5f 49 6e 74 20 29 7b  ags & STK_Int ){
22d80 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
22d90 74 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 20 69  tf(p->trace, " i
22da0 3a 25 64 22 2c 20 61 53 74 61 63 6b 5b 69 5d 2e  :%d", aStack[i].
22db0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
22dc0 65 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e  e if( aStack[i].
22dd0 66 6c 61 67 73 20 26 20 53 54 4b 5f 52 65 61 6c  flags & STK_Real
22de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
22df0 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 20  rintf(p->trace, 
22e00 22 20 72 3a 25 67 22 2c 20 61 53 74 61 63 6b 5b  " r:%g", aStack[
22e10 69 5d 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  i].r);.        }
22e20 65 6c 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b  else if( aStack[
22e30 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53  i].flags & STK_S
22e40 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
22e50 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 20 20  int j, k;.      
22e60 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
22e70 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42  0];.          zB
22e80 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20  uf[0] = ' ';.   
22e90 20 20 20 20 20 20 20 69 66 28 20 61 53 74 61 63         if( aStac
22ea0 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  k[i].flags & STK
22eb0 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
22ec0 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
22ed0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
22ee0 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d  se if( aStack[i]
22ef0 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 61  .flags & STK_Sta
22f00 74 69 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tic ){.         
22f10 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27     zBuf[1] = 't'
22f20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22f30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e{.            z
22f40 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20  Buf[1] = 's';.  
22f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f60 20 20 20 20 7a 42 75 66 5b 32 5d 20 3d 20 27 5b      zBuf[2] = '[
22f70 27 3b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  ';.          k =
22f80 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   3;.          fo
22f90 72 28 6a 3d 30 3b 20 6a 3c 32 30 20 26 26 20 6a  r(j=0; j<20 && j
22fa0 3c 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 20 6a 2b  <aStack[i].n; j+
22fb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
22fc0 69 6e 74 20 63 20 3d 20 7a 53 74 61 63 6b 5b 69  int c = zStack[i
22fd0 5d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ][j];.          
22fe0 20 20 69 66 28 20 63 3d 3d 30 20 26 26 20 6a 3d    if( c==0 && j=
22ff0 3d 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d 31 20 29  =aStack[i].n-1 )
23000 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23010 20 20 20 20 69 66 28 20 69 73 70 72 69 6e 74 28      if( isprint(
23020 63 29 20 26 26 20 21 69 73 73 70 61 63 65 28 63  c) && !isspace(c
23030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
23040 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63     zBuf[k++] = c
23050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
23060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23070 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27     zBuf[k++] = '
23080 2e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .';.            
23090 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
230a0 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b          zBuf[k++
230b0 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 20  ] = ']';.       
230c0 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30     zBuf[k++] = 0
230d0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
230e0 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 25  ntf(p->trace, "%
230f0 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  s", zBuf);.     
23100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23110 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74      fprintf(p->t
23120 72 61 63 65 2c 20 22 20 3f 3f 3f 22 29 3b 0a 20  race, " ???");. 
23130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23140 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
23150 2d 3e 74 72 61 63 65 2c 22 5c 6e 22 29 3b 0a 20  ->trace,"\n");. 
23160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23170 0a 63 6c 65 61 6e 75 70 3a 0a 20 20 43 6c 65 61  .cleanup:.  Clea
23180 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 72 63  nup(p);.  if( rc
23190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
231a0 20 20 20 73 77 69 74 63 68 28 20 65 72 72 6f 72     switch( error
231b0 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
231c0 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 7b  case OE_Abort: {
231d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 75 6e  .        if( !un
231e0 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29  doTransOnError )
231f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23200 74 65 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 43  teBtreeRollbackC
23210 6b 70 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  kpt(pBt);.      
23220 20 20 20 20 69 66 28 20 64 62 2d 3e 70 42 65 54      if( db->pBeT
23230 65 6d 70 20 29 20 73 71 6c 69 74 65 42 74 72 65  emp ) sqliteBtre
23240 65 52 6f 6c 6c 62 61 63 6b 43 6b 70 74 28 64 62  eRollbackCkpt(db
23250 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
23260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
23280 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * Fall through t
23290 6f 20 52 4f 4c 4c 42 41 43 4b 20 2a 2f 0a 20 20  o ROLLBACK */.  
232a0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
232b0 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 7b 0a   OE_Rollback: {.
232c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 42 74          sqliteBt
232d0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 42 74 29  reeRollback(pBt)
232e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
232f0 2d 3e 70 42 65 54 65 6d 70 20 29 20 73 71 6c 69  ->pBeTemp ) sqli
23300 74 65 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  teBtreeRollback(
23310 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20  db->pBeTemp);.  
23320 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
23330 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
23340 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ns;.        db->
23350 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
23360 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 62 72  ault;.        br
23370 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23380 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
23390 20 20 20 20 20 20 69 66 28 20 75 6e 64 6f 54 72        if( undoTr
233a0 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  ansOnError ){.  
233b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 42 74          sqliteBt
233c0 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
233d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
233e0 2d 3e 70 42 65 54 65 6d 70 20 29 20 73 71 6c 69  ->pBeTemp ) sqli
233f0 74 65 42 74 72 65 65 43 6f 6d 6d 69 74 28 64 62  teBtreeCommit(db
23400 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
23410 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
23420 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
23430 6e 73 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  ns;.          db
23440 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
23450 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
23460 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
23470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23480 20 20 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63     sqliteRollbac
23490 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  kInternalChanges
234a0 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
234b0 74 65 42 74 72 65 65 43 6f 6d 6d 69 74 43 6b 70  teBtreeCommitCkp
234c0 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 64 62  t(pBt);.  if( db
234d0 2d 3e 70 42 65 54 65 6d 70 20 29 20 73 71 6c 69  ->pBeTemp ) sqli
234e0 74 65 42 74 72 65 65 43 6f 6d 6d 69 74 43 6b 70  teBtreeCommitCkp
234f0 74 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a  t(db->pBeTemp);.
23500 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 6f 73    assert( p->tos
23510 3c 70 63 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  <pc );.  return 
23520 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  rc;..  /* Jump t
23530 6f 20 68 65 72 65 20 69 66 20 61 20 6d 61 6c 6c  o here if a mall
23540 6f 63 28 29 20 66 61 69 6c 73 2e 20 20 49 74 27  oc() fails.  It'
23550 73 20 68 61 72 64 20 74 6f 20 67 65 74 20 61 20  s hard to get a 
23560 6d 61 6c 6c 6f 63 28 29 0a 20 20 2a 2a 20 74 6f  malloc().  ** to
23570 20 66 61 69 6c 20 6f 6e 20 61 20 6d 6f 64 65 72   fail on a moder
23580 6e 20 56 4d 20 63 6f 6d 70 75 74 65 72 2c 20 73  n VM computer, s
23590 6f 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 75  o this code is u
235a0 6e 74 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 6e 6f  ntested..  */.no
235b0 5f 6d 65 6d 3a 0a 20 20 73 71 6c 69 74 65 53 65  _mem:.  sqliteSe
235c0 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
235d0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
235e0 22 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 53 51  ", 0);.  rc = SQ
235f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f  LITE_NOMEM;.  go
23600 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f  to cleanup;..  /
23610 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 66  * Jump to here f
23620 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53  or an SQLITE_MIS
23630 55 53 45 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a  USE error..  */.
23640 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
23650 75 73 65 3a 0a 20 20 72 63 20 3d 20 53 51 4c 49  use:.  rc = SQLI
23660 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 2f 2a 20  TE_MISUSE;.  /* 
23670 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 61  Fall thru into a
23680 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
23690 72 20 2a 2f 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  r */..  /* Jump 
236a0 74 6f 20 68 65 72 65 20 66 6f 72 20 61 6e 79 20  to here for any 
236b0 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 66 61  other kind of fa
236c0 74 61 6c 20 65 72 72 6f 72 2e 20 20 54 68 65 20  tal error.  The 
236d0 22 72 63 22 20 76 61 72 69 61 62 6c 65 0a 20 20  "rc" variable.  
236e0 2a 2a 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 74  ** should hold t
236f0 68 65 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 2e  he error number.
23700 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f  .  */.abort_due_
23710 74 6f 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  to_error:.  sqli
23720 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
23730 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65 72 72  rMsg, sqlite_err
23740 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 30  or_string(rc), 0
23750 29 3b 0a 20 20 67 6f 74 6f 20 63 6c 65 61 6e 75  );.  goto cleanu
23760 70 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  p;..  /* Jump to
23770 20 68 65 72 65 20 69 66 20 61 20 6f 70 65 72 61   here if a opera
23780 74 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  tor is encounter
23790 65 64 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ed that requires
237a0 20 6d 6f 72 65 20 73 74 61 63 6b 0a 20 20 2a 2a   more stack.  **
237b0 20 6f 70 65 72 61 6e 64 73 20 74 68 61 6e 20 61   operands than a
237c0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
237d0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 73 74  ilable on the st
237e0 61 63 6b 2e 0a 20 20 2a 2f 0a 6e 6f 74 5f 65 6e  ack..  */.not_en
237f0 6f 75 67 68 5f 73 74 61 63 6b 3a 0a 20 20 73 70  ough_stack:.  sp
23800 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c  rintf(zBuf,"%d",
23810 70 63 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  pc);.  sqliteSet
23820 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
23830 20 22 74 6f 6f 20 66 65 77 20 6f 70 65 72 61 6e   "too few operan
23840 64 73 20 6f 6e 20 73 74 61 63 6b 20 61 74 20 22  ds on stack at "
23850 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 63  , zBuf, 0);.  rc
23860 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
23870 41 4c 3b 0a 20 20 67 6f 74 6f 20 63 6c 65 61 6e  AL;.  goto clean
23880 75 70 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  up;..  /* Jump h
23890 65 72 65 20 69 66 20 61 6e 20 69 6c 6c 65 67 61  ere if an illega
238a0 6c 20 6f 72 20 69 6c 6c 66 6f 72 6d 65 64 20 69  l or illformed i
238b0 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
238c0 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 56 45 52  ecuted..  */.VER
238d0 49 46 59 28 0a 62 61 64 5f 69 6e 73 74 72 75 63  IFY(.bad_instruc
238e0 74 69 6f 6e 3a 0a 20 20 73 70 72 69 6e 74 66 28  tion:.  sprintf(
238f0 7a 42 75 66 2c 22 25 64 22 2c 70 63 29 3b 0a 20  zBuf,"%d",pc);. 
23900 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
23910 28 70 7a 45 72 72 4d 73 67 2c 20 22 69 6c 6c 65  (pzErrMsg, "ille
23920 67 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 61 74  gal operation at
23930 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20   ", zBuf, 0);.  
23940 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
23950 52 4e 41 4c 3b 0a 20 20 67 6f 74 6f 20 63 6c 65  RNAL;.  goto cle
23960 61 6e 75 70 3b 0a 29 0a 7d 0a                    anup;.).}.