/ Hex Artifact Content
Login

Artifact 779fa3b15148161282a71241ff9733a54a8b0648:


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 56 61 72 69 6f  ion..**.** Vario
05b0: 75 73 20 73 63 72 69 70 74 73 20 73 63 61 6e 20  us scripts scan 
05c0: 74 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65  this source file
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e   in order to gen
05e0: 65 72 61 74 65 20 48 54 4d 4c 0a 2a 2a 20 64 6f  erate HTML.** do
05f0: 63 75 6d 65 6e 74 61 74 69 6f 6e 2c 20 68 65 61  cumentation, hea
0600: 64 65 72 73 20 66 69 6c 65 73 2c 20 6f 72 20 6f  ders files, or o
0610: 74 68 65 72 20 64 65 72 69 76 65 64 20 66 69 6c  ther derived fil
0620: 65 73 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 74  es.  The formatt
0630: 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f  ing.** of the co
0640: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0650: 69 73 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 69  is, therefore, i
0660: 6d 70 6f 72 74 61 6e 74 2e 20 20 53 65 65 20 6f  mportant.  See o
0670: 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a  ther comments.**
0680: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f   in this file fo
0690: 72 20 64 65 74 61 69 6c 73 2e 20 20 49 66 20 69  r details.  If i
06a0: 6e 20 64 6f 75 62 74 2c 20 64 6f 20 6e 6f 74 20  n doubt, do not 
06b0: 64 65 76 69 61 74 65 20 66 72 6f 6d 20 65 78 69  deviate from exi
06c0: 73 74 69 6e 67 0a 2a 2a 20 63 6f 6d 6d 65 6e 74  sting.** comment
06d0: 69 6e 67 20 61 6e 64 20 69 6e 64 65 6e 74 61 74  ing and indentat
06e0: 69 6f 6e 20 70 72 61 63 74 69 63 65 73 20 77 68  ion practices wh
06f0: 65 6e 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61  en changing or a
0700: 64 64 69 6e 67 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  dding code..**.*
0710: 2a 20 24 49 64 3a 20 76 64 62 65 2e 63 2c 76 20  * $Id: vdbe.c,v 
0720: 31 2e 32 33 35 20 32 30 30 33 2f 30 37 2f 32 37  1.235 2003/07/27
0730: 20 31 37 3a 31 36 3a 30 37 20 64 72 68 20 45 78   17:16:07 drh Ex
0740: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0750: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0760: 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69  nclude "os.h".#i
0770: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0780: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 6b 65  ../*.** The make
0790: 66 69 6c 65 20 73 63 61 6e 73 20 74 68 69 73 20  file scans this 
07a0: 73 6f 75 72 63 65 20 66 69 6c 65 20 61 6e 64 20  source file and 
07b0: 63 72 65 61 74 65 73 20 74 68 65 20 66 6f 6c 6c  creates the foll
07c0: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 20 6f  owing.** array o
07d0: 66 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  f string constan
07e0: 74 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  ts which are the
07f0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 56 44   names of all VD
0800: 42 45 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 20 54  BE opcodes..** T
0810: 68 69 73 20 61 72 72 61 79 20 69 73 20 64 65 66  his array is def
0820: 69 6e 65 64 20 69 6e 20 61 20 73 65 70 61 72 61  ined in a separa
0830: 74 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66  te source code f
0840: 69 6c 65 20 6e 61 6d 65 64 20 6f 70 63 6f 64 65  ile named opcode
0850: 2e 63 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  .c.** which is a
0860: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
0870: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 6d 61  erated by the ma
0880: 6b 65 66 69 6c 65 2e 0a 2a 2f 0a 65 78 74 65 72  kefile..*/.exter
0890: 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 4f 70  n char *sqliteOp
08a0: 63 6f 64 65 4e 61 6d 65 73 5b 5d 3b 0a 0a 2f 2a  codeNames[];../*
08b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
08c0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
08d0: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
08e0: 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75   every time a cu
08f0: 72 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65  rsor.** moves, e
0900: 69 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f  ither by the OP_
0910: 4d 6f 76 65 54 6f 20 6f 72 20 74 68 65 20 4f 50  MoveTo or the OP
0920: 5f 4e 65 78 74 20 6f 70 63 6f 64 65 2e 20 20 54  _Next opcode.  T
0930: 68 65 20 74 65 73 74 0a 2a 2a 20 70 72 6f 63 65  he test.** proce
0940: 64 75 72 65 73 20 75 73 65 20 74 68 69 73 20 69  dures use this i
0950: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0960: 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 6e 64  ke sure that ind
0970: 69 63 65 73 20 61 72 65 0a 2a 2a 20 77 6f 72 6b  ices are.** work
0980: 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  ing correctly.  
0990: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
09a0: 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 74  s no function ot
09b0: 68 65 72 20 74 68 61 6e 20 74 6f 0a 2a 2a 20 68  her than to.** h
09c0: 65 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63  elp verify the c
09d0: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
09e0: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e   of the library.
09f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 73  .*/.int sqlite_s
0a00: 65 61 72 63 68 5f 63 6f 75 6e 74 20 3d 20 30 3b  earch_count = 0;
0a10: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 69 73 20 74  ../*.** SQL is t
0a20: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
0a30: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 69 6e 73   sequence of ins
0a40: 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 62 65 0a  tructions to be.
0a50: 2a 2a 20 65 78 65 63 75 74 65 64 20 62 79 20 61  ** executed by a
0a60: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
0a70: 2e 20 20 45 61 63 68 20 69 6e 73 74 72 75 63 74  .  Each instruct
0a80: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ion is an instan
0a90: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
0aa0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0ab0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0ac0: 75 63 74 20 56 64 62 65 4f 70 20 4f 70 3b 0a 0a  uct VdbeOp Op;..
0ad0: 2f 2a 0a 2a 2a 20 42 6f 6f 6c 65 61 6e 20 76 61  /*.** Boolean va
0ae0: 6c 75 65 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20  lues.*/.typedef 
0af0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 42 6f  unsigned char Bo
0b00: 6f 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72  ol;../*.** A cur
0b10: 73 6f 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  sor is a pointer
0b20: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 42   into a single B
0b30: 54 72 65 65 20 77 69 74 68 69 6e 20 61 20 64 61  Tree within a da
0b40: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
0b50: 54 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 73  The cursor can s
0b60: 65 65 6b 20 74 6f 20 61 20 42 54 72 65 65 20 65  eek to a BTree e
0b70: 6e 74 72 79 20 77 69 74 68 20 61 20 70 61 72 74  ntry with a part
0b80: 69 63 75 6c 61 72 20 6b 65 79 2c 20 6f 72 0a 2a  icular key, or.*
0b90: 2a 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * loop over all 
0ba0: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 42  entries of the B
0bb0: 74 72 65 65 2e 20 20 59 6f 75 20 63 61 6e 20 61  tree.  You can a
0bc0: 6c 73 6f 20 69 6e 73 65 72 74 20 6e 65 77 20 42  lso insert new B
0bd0: 54 72 65 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  Tree.** entries 
0be0: 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20  or retrieve the 
0bf0: 6b 65 79 20 6f 72 20 64 61 74 61 20 66 72 6f 6d  key or data from
0c00: 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
0c10: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
0c20: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
0c30: 69 6e 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 45  ing to..** .** E
0c40: 76 65 72 79 20 63 75 72 73 6f 72 20 74 68 61 74  very cursor that
0c50: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
0c60: 68 69 6e 65 20 68 61 73 20 6f 70 65 6e 20 69 73  hine has open is
0c70: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
0c80: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
0c90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
0cb0: 20 49 66 20 74 68 65 20 43 75 72 73 6f 72 2e 69   If the Cursor.i
0cc0: 73 54 72 69 67 67 65 72 52 6f 77 20 66 6c 61 67  sTriggerRow flag
0cd0: 20 69 73 20 73 65 74 20 69 74 20 6d 65 61 6e 73   is set it means
0ce0: 20 74 68 61 74 20 74 68 69 73 20 63 75 72 73 6f   that this curso
0cf0: 72 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  r is.** really a
0d00: 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74   single row that
0d10: 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
0d20: 4e 45 57 20 6f 72 20 4f 4c 44 20 70 73 65 75 64  NEW or OLD pseud
0d30: 6f 2d 74 61 62 6c 65 20 6f 66 0a 2a 2a 20 61 20  o-table of.** a 
0d40: 72 6f 77 20 74 72 69 67 67 65 72 2e 20 20 54 68  row trigger.  Th
0d50: 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  e data for the r
0d60: 6f 77 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ow is stored in 
0d70: 43 75 72 73 6f 72 2e 70 44 61 74 61 20 61 6e 64  Cursor.pData and
0d80: 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 69 73  .** the rowid is
0d90: 20 69 6e 20 43 75 72 73 6f 72 2e 69 4b 65 79 2e   in Cursor.iKey.
0da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 43 75 72 73 6f  .*/.struct Curso
0db0: 72 20 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  r {.  BtCursor *
0dc0: 70 43 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 54  pCursor;    /* T
0dd0: 68 65 20 63 75 72 73 6f 72 20 73 74 72 75 63 74  he cursor struct
0de0: 75 72 65 20 6f 66 20 74 68 65 20 62 61 63 6b 65  ure of the backe
0df0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  nd */.  int last
0e00: 52 65 63 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a  Recno;        /*
0e10: 20 4c 61 73 74 20 72 65 63 6e 6f 20 66 72 6f 6d   Last recno from
0e20: 20 61 20 4e 65 78 74 20 6f 72 20 4e 65 78 74 49   a Next or NextI
0e30: 64 78 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  dx operation */.
0e40: 20 20 69 6e 74 20 6e 65 78 74 52 6f 77 69 64 3b    int nextRowid;
0e50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
0e60: 72 6f 77 69 64 20 72 65 74 75 72 6e 65 64 20 62  rowid returned b
0e70: 79 20 4f 50 5f 4e 65 77 52 6f 77 69 64 20 2a 2f  y OP_NewRowid */
0e80: 0a 20 20 42 6f 6f 6c 20 72 65 63 6e 6f 49 73 56  .  Bool recnoIsV
0e90: 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54 72 75 65  alid;    /* True
0ea0: 20 69 66 20 6c 61 73 74 52 65 63 6e 6f 20 69 73   if lastRecno is
0eb0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 42 6f 6f 6c   valid */.  Bool
0ec0: 20 6b 65 79 41 73 44 61 74 61 3b 20 20 20 20 20   keyAsData;     
0ed0: 20 20 2f 2a 20 54 68 65 20 4f 50 5f 43 6f 6c 75    /* The OP_Colu
0ee0: 6d 6e 20 63 6f 6d 6d 61 6e 64 20 77 6f 72 6b 73  mn command works
0ef0: 20 6f 6e 20 6b 65 79 20 69 6e 73 74 65 61 64 20   on key instead 
0f00: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 42 6f 6f  of data */.  Boo
0f10: 6c 20 61 74 46 69 72 73 74 3b 20 20 20 20 20 20  l atFirst;      
0f20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6f     /* True if po
0f30: 69 6e 74 69 6e 67 20 74 6f 20 66 69 72 73 74 20  inting to first 
0f40: 65 6e 74 72 79 20 2a 2f 0a 20 20 42 6f 6f 6c 20  entry */.  Bool 
0f50: 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 3b 20  useRandomRowid; 
0f60: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6e 65 77   /* Generate new
0f70: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20   record numbers 
0f80: 73 65 6d 69 2d 72 61 6e 64 6f 6d 6c 79 20 2a 2f  semi-randomly */
0f90: 0a 20 20 42 6f 6f 6c 20 6e 75 6c 6c 52 6f 77 3b  .  Bool nullRow;
0fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0fb0: 20 69 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   if pointing to 
0fc0: 61 20 72 6f 77 20 77 69 74 68 20 6e 6f 20 64 61  a row with no da
0fd0: 74 61 20 2a 2f 0a 20 20 42 6f 6f 6c 20 6e 65 78  ta */.  Bool nex
0fe0: 74 52 6f 77 69 64 56 61 6c 69 64 3b 20 20 2f 2a  tRowidValid;  /*
0ff0: 20 54 72 75 65 20 69 66 20 74 68 65 20 6e 65 78   True if the nex
1000: 74 52 6f 77 69 64 20 66 69 65 6c 64 20 69 73 20  tRowid field is 
1010: 76 61 6c 69 64 20 2a 2f 0a 20 20 42 6f 6f 6c 20  valid */.  Bool 
1020: 70 73 65 75 64 6f 54 61 62 6c 65 3b 20 20 20 20  pseudoTable;    
1030: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 4e 45   /* This is a NE
1040: 57 20 6f 72 20 4f 4c 44 20 70 73 65 75 64 6f 2d  W or OLD pseudo-
1050: 74 61 62 6c 65 73 20 6f 66 20 61 20 74 72 69 67  tables of a trig
1060: 67 65 72 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ger */.  Btree *
1070: 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pBt;           /
1080: 2a 20 53 65 70 61 72 61 74 65 20 66 69 6c 65 20  * Separate file 
1090: 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72  holding temporar
10a0: 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  y table */.  int
10b0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
10c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10d0: 62 79 74 65 73 20 69 6e 20 70 44 61 74 61 20 2a  bytes in pData *
10e0: 2f 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b  /.  char *pData;
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1100: 61 20 66 6f 72 20 61 20 4e 45 57 20 6f 72 20 4f  a for a NEW or O
1110: 4c 44 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  LD pseudo-table 
1120: 2a 2f 0a 20 20 69 6e 74 20 69 4b 65 79 3b 20 20  */.  int iKey;  
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
1140: 79 20 66 6f 72 20 74 68 65 20 4e 45 57 20 6f 72  y for the NEW or
1150: 20 4f 4c 44 20 70 73 65 75 64 6f 2d 74 61 62 6c   OLD pseudo-tabl
1160: 65 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 74 79 70 65  e row */.};.type
1170: 64 65 66 20 73 74 72 75 63 74 20 43 75 72 73 6f  def struct Curso
1180: 72 20 43 75 72 73 6f 72 3b 0a 0a 2f 2a 0a 2a 2a  r Cursor;../*.**
1190: 20 41 20 73 6f 72 74 65 72 20 62 75 69 6c 64 73   A sorter builds
11a0: 20 61 20 6c 69 73 74 20 6f 66 20 65 6c 65 6d 65   a list of eleme
11b0: 6e 74 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  nts to be sorted
11c0: 2e 20 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  .  Each element 
11d0: 6f 66 0a 2a 2a 20 74 68 65 20 6c 69 73 74 20 69  of.** the list i
11e0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
11f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1200: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
1210: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
1220: 65 72 20 53 6f 72 74 65 72 3b 0a 73 74 72 75 63  er Sorter;.struc
1230: 74 20 53 6f 72 74 65 72 20 7b 0a 20 20 69 6e 74  t Sorter {.  int
1240: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   nKey;          
1250: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1260: 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  tes in the key *
1270: 2f 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20  /.  char *zKey; 
1280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
1290: 65 79 20 62 79 20 77 68 69 63 68 20 77 65 20 77  ey by which we w
12a0: 69 6c 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e  ill sort */.  in
12b0: 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  t nData;        
12c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
12d0: 79 74 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ytes in the data
12e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 44 61 74   */.  char *pDat
12f0: 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  a;        /* The
1300: 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1310: 20 77 69 74 68 20 74 68 69 73 20 6b 65 79 20 2a   with this key *
1320: 2f 0a 20 20 53 6f 72 74 65 72 20 2a 70 4e 65 78  /.  Sorter *pNex
1330: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1340: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 7d  in the list */.}
1350: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4e 75 6d 62 65 72  ;../* .** Number
1360: 20 6f 66 20 62 75 63 6b 65 74 73 20 75 73 65 64   of buckets used
1370: 20 66 6f 72 20 6d 65 72 67 65 2d 73 6f 72 74 2e   for merge-sort.
1380: 20 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 53    .*/.#define NS
1390: 4f 52 54 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 4e 75  ORT 30../*.** Nu
13a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
13b0: 20 73 74 72 69 6e 67 20 73 74 6f 72 61 67 65 20   string storage 
13c0: 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
13d0: 74 6f 20 65 61 63 68 20 73 74 61 63 6b 0a 2a 2a  to each stack.**
13e0: 20 6c 61 79 65 72 20 77 69 74 68 6f 75 74 20 68   layer without h
13f0: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 2e  aving to malloc.
1400: 20 20 4e 42 46 53 20 69 73 20 73 68 6f 72 74 20    NBFS is short 
1410: 66 6f 72 20 4e 75 6d 62 65 72 20 6f 66 20 42 79  for Number of By
1420: 74 65 73 0a 2a 2a 20 46 6f 72 20 53 74 72 69 6e  tes.** For Strin
1430: 67 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  gs..*/.#define N
1440: 42 46 53 20 33 32 0a 0a 2f 2a 0a 2a 2a 20 41 20  BFS 32../*.** A 
1450: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
1460: 74 68 65 20 73 74 61 63 6b 20 69 73 20 61 6e 20  the stack is an 
1470: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1480: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72  following.** str
1490: 75 63 74 75 72 65 2e 20 20 45 78 63 65 70 74 2c  ucture.  Except,
14a0: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20 61   string values a
14b0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 73  re stored on a s
14c0: 65 70 61 72 61 74 65 0a 2a 2a 20 6c 69 73 74 20  eparate.** list 
14d0: 6f 66 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  of of pointers t
14e0: 6f 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68  o character.  Th
14f0: 65 20 72 65 61 73 6f 6e 20 66 6f 72 20 73 74 6f  e reason for sto
1500: 72 69 6e 67 0a 2a 2a 20 73 74 72 69 6e 67 73 20  ring.** strings 
1510: 73 65 70 61 72 61 74 65 6c 79 20 69 73 20 73 6f  separately is so
1520: 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
1530: 65 20 65 61 73 69 6c 79 20 70 61 73 73 65 64 0a  e easily passed.
1540: 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ** to the callba
1550: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
1560: 73 74 72 75 63 74 20 53 74 61 63 6b 20 7b 0a 20  struct Stack {. 
1570: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1580: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
1590: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
15a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15b0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
15c0: 73 74 72 69 6e 67 20 76 61 6c 75 65 2c 20 69 6e  string value, in
15d0: 63 6c 75 64 69 6e 67 20 27 5c 30 27 20 2a 2f 0a  cluding '\0' */.
15e0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
15f0: 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 62 69 6e 61   /* Some combina
1600: 74 69 6f 6e 20 6f 66 20 53 54 4b 5f 4e 75 6c 6c  tion of STK_Null
1610: 2c 20 53 54 4b 5f 53 74 72 2c 20 53 54 4b 5f 44  , STK_Str, STK_D
1620: 79 6e 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 64 6f  yn, etc. */.  do
1630: 75 62 6c 65 20 72 3b 20 20 20 20 20 20 2f 2a 20  uble r;      /* 
1640: 52 65 61 6c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  Real value */.  
1650: 63 68 61 72 20 7a 5b 4e 42 46 53 5d 3b 20 20 2f  char z[NBFS];  /
1660: 2a 20 53 70 61 63 65 20 66 6f 72 20 73 68 6f 72  * Space for shor
1670: 74 20 73 74 72 69 6e 67 73 20 2a 2f 0a 7d 3b 0a  t strings */.};.
1680: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1690: 74 61 63 6b 20 53 74 61 63 6b 3b 0a 0a 2f 2a 0a  tack Stack;../*.
16a0: 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** Memory cells 
16b0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 74 72  use the same str
16c0: 75 63 74 75 72 65 20 61 73 20 74 68 65 20 73 74  ucture as the st
16d0: 61 63 6b 20 65 78 63 65 70 74 20 74 68 61 74 20  ack except that 
16e0: 73 70 61 63 65 0a 2a 2a 20 66 6f 72 20 61 6e 20  space.** for an 
16f0: 61 72 62 69 74 72 61 72 79 20 73 74 72 69 6e 67  arbitrary string
1700: 20 69 73 20 61 64 64 65 64 2e 0a 2a 2f 0a 73 74   is added..*/.st
1710: 72 75 63 74 20 4d 65 6d 20 7b 0a 20 20 53 74 61  ruct Mem {.  Sta
1720: 63 6b 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 41  ck s;       /* A
1730: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
1740: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 65 73   memory cell bes
1750: 69 64 65 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  ides string */. 
1760: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1770: 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c 75 65 20  /* String value 
1780: 66 6f 72 20 74 68 69 73 20 6d 65 6d 6f 72 79 20  for this memory 
1790: 63 65 6c 6c 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  cell */.};.typed
17a0: 65 66 20 73 74 72 75 63 74 20 4d 65 6d 20 4d 65  ef struct Mem Me
17b0: 6d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  m;../*.** Allowe
17c0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 74 61  d values for Sta
17d0: 63 6b 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  ck.flags.*/.#def
17e0: 69 6e 65 20 53 54 4b 5f 4e 75 6c 6c 20 20 20 20  ine STK_Null    
17f0: 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 56 61    0x0001   /* Va
1800: 6c 75 65 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 23  lue is NULL */.#
1810: 64 65 66 69 6e 65 20 53 54 4b 5f 53 74 72 20 20  define STK_Str  
1820: 20 20 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a       0x0002   /*
1830: 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   Value is a stri
1840: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ng */.#define ST
1850: 4b 5f 49 6e 74 20 20 20 20 20 20 20 30 78 30 30  K_Int       0x00
1860: 30 34 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73  04   /* Value is
1870: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 23   an integer */.#
1880: 64 65 66 69 6e 65 20 53 54 4b 5f 52 65 61 6c 20  define STK_Real 
1890: 20 20 20 20 20 30 78 30 30 30 38 20 20 20 2f 2a       0x0008   /*
18a0: 20 56 61 6c 75 65 20 69 73 20 61 20 72 65 61 6c   Value is a real
18b0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 64 65 66 69   number */.#defi
18c0: 6e 65 20 53 54 4b 5f 44 79 6e 20 20 20 20 20 20  ne STK_Dyn      
18d0: 20 30 78 30 30 31 30 20 20 20 2f 2a 20 4e 65 65   0x0010   /* Nee
18e0: 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
18f0: 46 72 65 65 28 29 20 6f 6e 20 7a 53 74 61 63 6b  Free() on zStack
1900: 5b 5d 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  [] */.#define ST
1910: 4b 5f 53 74 61 74 69 63 20 20 20 20 30 78 30 30  K_Static    0x00
1920: 32 30 20 20 20 2f 2a 20 7a 53 74 61 63 6b 5b 5d  20   /* zStack[]
1930: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 61   points to a sta
1940: 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 23 64  tic string */.#d
1950: 65 66 69 6e 65 20 53 54 4b 5f 45 70 68 65 6d 20  efine STK_Ephem 
1960: 20 20 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20      0x0040   /* 
1970: 7a 53 74 61 63 6b 5b 5d 20 70 6f 69 6e 74 73 20  zStack[] points 
1980: 74 6f 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  to an ephemeral 
1990: 73 74 72 69 6e 67 20 2a 2f 0a 0a 2f 2a 20 54 68  string */../* Th
19a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 54 4b 5f  e following STK_
19b0: 20 76 61 6c 75 65 20 61 70 70 65 61 72 73 20 6f   value appears o
19c0: 6e 6c 79 20 69 6e 20 41 67 67 45 6c 65 6d 2e 61  nly in AggElem.a
19d0: 4d 65 6d 2e 73 2e 66 6c 61 67 20 66 69 65 6c 64  Mem.s.flag field
19e0: 73 2e 0a 2a 2a 20 49 74 20 69 6e 64 69 63 61 74  s..** It indicat
19f0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  es that the corr
1a00: 65 73 70 6f 6e 64 69 6e 67 20 41 67 67 45 6c 65  esponding AggEle
1a10: 6d 2e 61 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20  m.aMem.z points 
1a20: 74 6f 20 61 0a 2a 2a 20 61 67 67 72 65 67 61 74  to a.** aggregat
1a30: 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65  e function conte
1a40: 78 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  xt that needs to
1a50: 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   be finalized..*
1a60: 2f 0a 23 64 65 66 69 6e 65 20 53 54 4b 5f 41 67  /.#define STK_Ag
1a70: 67 43 74 78 20 20 20 20 30 78 30 30 34 30 20 20  gCtx    0x0040  
1a80: 20 2f 2a 20 7a 53 74 61 63 6b 5b 5d 20 70 6f 69   /* zStack[] poi
1a90: 6e 74 73 20 74 6f 20 61 6e 20 61 67 67 20 66 75  nts to an agg fu
1aa0: 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  nction context *
1ab0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 63 6f  /../*.** The "co
1ac0: 6e 74 65 78 74 22 20 61 72 67 75 6d 65 6e 74 20  ntext" argument 
1ad0: 66 6f 72 20 61 20 69 6e 73 74 61 6c 6c 61 62 6c  for a installabl
1ae0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 20 70  e function.  A p
1af0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 0a 2a 2a 20  ointer to an.** 
1b00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1b10: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 74 68   structure is th
1b20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1b30: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
1b40: 20 75 73 65 64 0a 2a 2a 20 69 6d 70 6c 65 6d 65   used.** impleme
1b50: 6e 74 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  nt the SQL funct
1b60: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ions..**.** Ther
1b70: 65 20 69 73 20 61 20 74 79 70 65 64 65 66 20 66  e is a typedef f
1b80: 6f 72 20 74 68 69 73 20 73 74 72 75 63 74 75 72  or this structur
1b90: 65 20 69 6e 20 73 71 6c 69 74 65 2e 68 2e 20 20  e in sqlite.h.  
1ba0: 53 6f 20 61 6c 6c 20 72 6f 75 74 69 6e 65 73 2c  So all routines,
1bb0: 0a 2a 2a 20 65 76 65 6e 20 74 68 65 20 70 75 62  .** even the pub
1bc0: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f  lic interface to
1bd0: 20 53 51 4c 69 74 65 2c 20 63 61 6e 20 75 73 65   SQLite, can use
1be0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1bf0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
1c00: 20 42 75 74 20 74 68 69 73 20 66 69 6c 65 20 69   But this file i
1c10: 73 20 74 68 65 20 6f 6e 6c 79 20 70 6c 61 63 65  s the only place
1c20: 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 72   where the inter
1c30: 6e 61 6c 20 64 65 74 61 69 6c 73 20 6f 66 20 74  nal details of t
1c40: 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  his.** structure
1c50: 20 61 72 65 20 6b 6e 6f 77 6e 2e 0a 2a 2a 0a 2a   are known..**.*
1c60: 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65  * This structure
1c70: 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 73 69   is defined insi
1c80: 64 65 20 6f 66 20 76 64 62 65 2e 63 20 62 65 63  de of vdbe.c bec
1c90: 61 75 73 65 20 69 74 20 75 73 65 73 20 73 75 62  ause it uses sub
1ca0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 28 53  structures.** (S
1cb0: 74 61 63 6b 29 20 77 68 69 63 68 20 61 72 65 20  tack) which are 
1cc0: 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20 74 68 65  only defined the
1cd0: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71  re..*/.struct sq
1ce0: 6c 69 74 65 5f 66 75 6e 63 20 7b 0a 20 20 46 75  lite_func {.  Fu
1cf0: 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 20 20 20  ncDef *pFunc;   
1d00: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 75  /* Pointer to fu
1d10: 6e 63 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  nction informati
1d20: 6f 6e 2e 20 20 4d 55 53 54 20 42 45 20 46 49 52  on.  MUST BE FIR
1d30: 53 54 20 2a 2f 0a 20 20 53 74 61 63 6b 20 73 3b  ST */.  Stack s;
1d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
1d50: 6c 6c 20 73 74 72 69 6e 67 73 2c 20 69 6e 74 73  ll strings, ints
1d60: 2c 20 61 6e 64 20 64 6f 75 62 6c 65 20 76 61 6c  , and double val
1d70: 75 65 73 20 67 6f 20 68 65 72 65 20 2a 2f 0a 20  ues go here */. 
1d80: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1d90: 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
1da0: 68 6f 6c 64 69 6e 67 20 64 79 6e 61 6d 69 63 20  holding dynamic 
1db0: 73 74 72 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  string results *
1dc0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 67 67 3b 20  /.  void *pAgg; 
1dd0: 20 20 20 20 20 20 2f 2a 20 41 67 67 72 65 67 61        /* Aggrega
1de0: 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  te context */.  
1df0: 75 38 20 69 73 45 72 72 6f 72 3b 20 20 20 20 20  u8 isError;     
1e00: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
1e10: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 2a 2f   for an error */
1e20: 0a 20 20 75 38 20 69 73 53 74 65 70 3b 20 20 20  .  u8 isStep;   
1e30: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1e40: 69 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  in the step func
1e50: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  tion */.  int cn
1e60: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  t;          /* N
1e70: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1e80: 68 61 74 20 74 68 65 20 73 74 65 70 20 66 75 6e  hat the step fun
1e90: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1ea0: 61 6c 6c 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  alled */.};../*.
1eb0: 2a 2a 20 41 6e 20 41 67 67 20 73 74 72 75 63 74  ** An Agg struct
1ec0: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 61 6e  ure describes an
1ed0: 20 41 67 67 72 65 67 61 74 6f 72 2e 20 20 45 61   Aggregator.  Ea
1ee0: 63 68 20 41 67 67 20 63 6f 6e 73 69 73 74 73 20  ch Agg consists 
1ef0: 6f 66 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  of.** zero or mo
1f00: 72 65 20 41 67 67 72 65 67 61 74 6f 72 20 65 6c  re Aggregator el
1f10: 65 6d 65 6e 74 73 20 28 41 67 67 45 6c 65 6d 29  ements (AggElem)
1f20: 2e 20 20 45 61 63 68 20 41 67 67 45 6c 65 6d 20  .  Each AggElem 
1f30: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 6b 65  contains.** a ke
1f40: 79 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  y and one or mor
1f50: 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 76  e values.  The v
1f60: 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 69  alues are used i
1f70: 6e 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  n processing.** 
1f80: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1f90: 6f 6e 73 20 69 6e 20 61 20 53 45 4c 45 43 54 2e  ons in a SELECT.
1fa0: 20 20 54 68 65 20 6b 65 79 20 69 73 20 75 73 65    The key is use
1fb0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1fc0: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
1fd0: 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
1fe0: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1ff0: 72 75 63 74 20 41 67 67 20 41 67 67 3b 0a 74 79  ruct Agg Agg;.ty
2000: 70 65 64 65 66 20 73 74 72 75 63 74 20 41 67 67  pedef struct Agg
2010: 45 6c 65 6d 20 41 67 67 45 6c 65 6d 3b 0a 73 74  Elem AggElem;.st
2020: 72 75 63 74 20 41 67 67 20 7b 0a 20 20 69 6e 74  ruct Agg {.  int
2030: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
2040: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
2050: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
2060: 65 61 63 68 20 41 67 67 45 6c 65 6d 20 2a 2f 0a  each AggElem */.
2070: 20 20 41 67 67 45 6c 65 6d 20 2a 70 43 75 72 72    AggElem *pCurr
2080: 65 6e 74 3b 20 20 20 2f 2a 20 54 68 65 20 41 67  ent;   /* The Ag
2090: 67 45 6c 65 6d 20 63 75 72 72 65 6e 74 6c 79 20  gElem currently 
20a0: 69 6e 20 66 6f 63 75 73 20 2a 2f 0a 20 20 48 61  in focus */.  Ha
20b0: 73 68 45 6c 65 6d 20 2a 70 53 65 61 72 63 68 3b  shElem *pSearch;
20c0: 20 20 20 2f 2a 20 54 68 65 20 68 61 73 68 20 65     /* The hash e
20d0: 6c 65 6d 65 6e 74 20 66 6f 72 20 70 43 75 72 72  lement for pCurr
20e0: 65 6e 74 20 2a 2f 0a 20 20 48 61 73 68 20 68 61  ent */.  Hash ha
20f0: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sh;           /*
2100: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 61   Hash table of a
2110: 6c 6c 20 61 67 67 72 65 67 61 74 65 20 65 6c 65  ll aggregate ele
2120: 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 75 6e 63 44  ments */.  FuncD
2130: 65 66 20 2a 2a 61 70 46 75 6e 63 3b 20 20 20 20  ef **apFunc;    
2140: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
2150: 62 6f 75 74 20 61 67 67 72 65 67 61 74 65 20 66  bout aggregate f
2160: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 73  unctions */.};.s
2170: 74 72 75 63 74 20 41 67 67 45 6c 65 6d 20 7b 0a  truct AggElem {.
2180: 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 20 20 20    char *zKey;   
2190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
21a0: 79 20 74 6f 20 74 68 69 73 20 41 67 67 45 6c 65  y to this AggEle
21b0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 3b  m */.  int nKey;
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
21e0: 6e 20 74 68 65 20 6b 65 79 2c 20 69 6e 63 6c 75  n the key, inclu
21f0: 64 69 6e 67 20 27 5c 30 27 20 61 74 20 65 6e 64  ding '\0' at end
2200: 20 2a 2f 0a 20 20 4d 65 6d 20 61 4d 65 6d 5b 31   */.  Mem aMem[1
2210: 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ];         /* Th
2220: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 69  e values for thi
2230: 73 20 41 67 67 45 6c 65 6d 20 2a 2f 0a 7d 3b 0a  s AggElem */.};.
2240: 0a 2f 2a 0a 2a 2a 20 41 20 53 65 74 20 73 74 72  ./*.** A Set str
2250: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 66  ucture is used f
2260: 6f 72 20 71 75 69 63 6b 20 74 65 73 74 69 6e 67  or quick testing
2270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 76 61 6c   to see if a val
2280: 75 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66  ue.** is part of
2290: 20 61 20 73 6d 61 6c 6c 20 73 65 74 2e 20 20 53   a small set.  S
22a0: 65 74 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ets are used to 
22b0: 69 6d 70 6c 65 6d 65 6e 74 20 63 6f 64 65 20 6c  implement code l
22c0: 69 6b 65 0a 2a 2a 20 74 68 69 73 3a 0a 2a 2a 20  ike.** this:.** 
22d0: 20 20 20 20 20 20 20 20 20 20 20 78 2e 79 20 49             x.y I
22e0: 4e 20 28 27 68 69 27 2c 27 68 6f 6f 27 2c 27 68  N ('hi','hoo','h
22f0: 75 6d 27 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20  um').*/.typedef 
2300: 73 74 72 75 63 74 20 53 65 74 20 53 65 74 3b 0a  struct Set Set;.
2310: 73 74 72 75 63 74 20 53 65 74 20 7b 0a 20 20 48  struct Set {.  H
2320: 61 73 68 20 68 61 73 68 3b 20 20 20 20 20 20 20  ash hash;       
2330: 20 20 20 20 20 20 2f 2a 20 41 20 73 65 74 20 69        /* A set i
2340: 73 20 6a 75 73 74 20 61 20 68 61 73 68 20 74 61  s just a hash ta
2350: 62 6c 65 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ble */.  HashEle
2360: 6d 20 2a 70 72 65 76 3b 20 20 20 20 20 20 20 20  m *prev;        
2370: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 61 63  /* Previously ac
2380: 63 65 73 73 65 64 20 68 61 73 68 20 65 6c 65 6d  cessed hash elem
2390: 65 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  en */.};../*.** 
23a0: 41 20 4b 65 79 6c 69 73 74 20 69 73 20 61 20 62  A Keylist is a b
23b0: 75 6e 63 68 20 6f 66 20 6b 65 79 73 20 69 6e 74  unch of keys int
23c0: 6f 20 61 20 74 61 62 6c 65 2e 20 20 54 68 65 20  o a table.  The 
23d0: 6b 65 79 6c 69 73 74 20 63 61 6e 0a 2a 2a 20 67  keylist can.** g
23e0: 72 6f 77 20 77 69 74 68 6f 75 74 20 62 6f 75 6e  row without boun
23f0: 64 2e 20 20 54 68 65 20 6b 65 79 6c 69 73 74 20  d.  The keylist 
2400: 73 74 6f 72 65 73 20 74 68 65 20 52 4f 57 49 44  stores the ROWID
2410: 73 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  s of database.**
2420: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 6e 65   records that ne
2430: 65 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ed to be deleted
2440: 20 6f 72 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a   or updated..*/.
2450: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4b  typedef struct K
2460: 65 79 6c 69 73 74 20 4b 65 79 6c 69 73 74 3b 0a  eylist Keylist;.
2470: 73 74 72 75 63 74 20 4b 65 79 6c 69 73 74 20 7b  struct Keylist {
2480: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20  .  int nKey;    
2490: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24a0: 66 20 73 6c 6f 74 73 20 69 6e 20 61 4b 65 79 5b  f slots in aKey[
24b0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64  ] */.  int nUsed
24c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ;        /* Next
24d0: 20 75 6e 77 72 69 74 74 65 6e 20 73 6c 6f 74 20   unwritten slot 
24e0: 69 6e 20 61 4b 65 79 5b 5d 20 2a 2f 0a 20 20 69  in aKey[] */.  i
24f0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2500: 20 2f 2a 20 4e 65 78 74 20 75 6e 72 65 61 64 20   /* Next unread 
2510: 73 6c 6f 74 20 69 6e 20 61 4b 65 79 5b 5d 20 2a  slot in aKey[] *
2520: 2f 0a 20 20 4b 65 79 6c 69 73 74 20 2a 70 4e 65  /.  Keylist *pNe
2530: 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 62 6c  xt;   /* Next bl
2540: 6f 63 6b 20 6f 66 20 6b 65 79 73 20 2a 2f 0a 20  ock of keys */. 
2550: 20 69 6e 74 20 61 4b 65 79 5b 31 5d 3b 20 20 20   int aKey[1];   
2560: 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72     /* One or mor
2570: 65 20 6b 65 79 73 2e 20 20 45 78 74 72 61 20 73  e keys.  Extra s
2580: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
2590: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 7d 3b 0a 0a  s needed */.};..
25a0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
25b0: 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  e of the virtual
25c0: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
25d0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
25e0: 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a  ns the complete.
25f0: 2a 2a 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  ** state of the 
2600: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
2610: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  .**.** The "sqli
2620: 74 65 5f 76 6d 22 20 73 74 72 75 63 74 75 72 65  te_vm" structure
2630: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 69 73   pointer that is
2640: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2650: 69 74 65 5f 63 6f 6d 70 69 6c 65 28 29 0a 2a 2a  ite_compile().**
2660: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
2670: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
2680: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
2690: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
26a0: 20 56 64 62 65 20 7b 0a 20 20 73 71 6c 69 74 65   Vdbe {.  sqlite
26b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   *db;         /*
26c0: 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
26d0: 61 73 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70  ase */.  Vdbe *p
26e0: 50 72 65 76 2c 2a 70 4e 65 78 74 3b 20 2f 2a 20  Prev,*pNext; /* 
26f0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 56  Linked list of V
2700: 44 42 45 73 20 77 69 74 68 20 74 68 65 20 73 61  DBEs with the sa
2710: 6d 65 20 56 64 62 65 2e 64 62 20 2a 2f 0a 20 20  me Vdbe.db */.  
2720: 46 49 4c 45 20 2a 74 72 61 63 65 3b 20 20 20 20  FILE *trace;    
2730: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6e 20      /* Write an 
2740: 65 78 65 63 75 74 69 6f 6e 20 74 72 61 63 65 20  execution trace 
2750: 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  here, if not NUL
2760: 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 3b 20  L */.  int nOp; 
2770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2780: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
2790: 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 72 6f 67  ions in the prog
27a0: 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70  ram */.  int nOp
27b0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 2f 2a 20  Alloc;       /* 
27c0: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
27d0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
27e0: 70 5b 5d 20 2a 2f 0a 20 20 4f 70 20 2a 61 4f 70  p[] */.  Op *aOp
27f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2800: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
2810: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2820: 65 27 73 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  e's program */. 
2830: 20 69 6e 74 20 6e 4c 61 62 65 6c 3b 20 20 20 20   int nLabel;    
2840: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2850: 66 20 6c 61 62 65 6c 73 20 75 73 65 64 20 2a 2f  f labels used */
2860: 0a 20 20 69 6e 74 20 6e 4c 61 62 65 6c 41 6c 6c  .  int nLabelAll
2870: 6f 63 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  oc;    /* Number
2880: 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61   of slots alloca
2890: 74 65 64 20 69 6e 20 61 4c 61 62 65 6c 5b 5d 20  ted in aLabel[] 
28a0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  */.  int *aLabel
28b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63  ;        /* Spac
28c0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6c 61  e to hold the la
28d0: 62 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  bels */.  int to
28e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
28f0: 20 49 6e 64 65 78 20 6f 66 20 74 6f 70 20 6f 66   Index of top of
2900: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 53 74 61 63   stack */.  Stac
2910: 6b 20 2a 61 53 74 61 63 6b 3b 20 20 20 20 20 20  k *aStack;      
2920: 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 73  /* The operand s
2930: 74 61 63 6b 2c 20 65 78 63 65 70 74 20 73 74 72  tack, except str
2940: 69 6e 67 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ing values */.  
2950: 63 68 61 72 20 2a 2a 7a 53 74 61 63 6b 3b 20 20  char **zStack;  
2960: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 72 20 62      /* Text or b
2970: 69 6e 61 72 79 20 76 61 6c 75 65 73 20 6f 66 20  inary values of 
2980: 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63  the stack */.  c
2990: 68 61 72 20 2a 2a 61 7a 43 6f 6c 4e 61 6d 65 3b  har **azColName;
29a0: 20 20 20 2f 2a 20 42 65 63 6f 6d 65 73 20 74 68     /* Becomes th
29b0: 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72 20  e 4th parameter 
29c0: 74 6f 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  to callbacks */.
29d0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
29e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29f0: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 43 73 72  of slots in aCsr
2a00: 5b 5d 20 2a 2f 0a 20 20 43 75 72 73 6f 72 20 2a  [] */.  Cursor *
2a10: 61 43 73 72 3b 20 20 20 20 20 20 20 2f 2a 20 4f  aCsr;       /* O
2a20: 6e 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ne element of th
2a30: 69 73 20 61 72 72 61 79 20 66 6f 72 20 65 61 63  is array for eac
2a40: 68 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 2a 2f  h open cursor */
2a50: 0a 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  .  Sorter *pSort
2a60: 3b 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 6e 6b  ;      /* A link
2a70: 65 64 20 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63  ed list of objec
2a80: 74 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ts to be sorted 
2a90: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65  */.  FILE *pFile
2aa0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6d  ;        /* At m
2ab0: 6f 73 74 20 6f 6e 65 20 6f 70 65 6e 20 66 69 6c  ost one open fil
2ac0: 65 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  e handler */.  i
2ad0: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
2ae0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2af0: 66 69 6c 65 20 66 69 65 6c 64 73 20 2a 2f 0a 20  file fields */. 
2b00: 20 63 68 61 72 20 2a 2a 61 7a 46 69 65 6c 64 3b   char **azField;
2b10: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
2b20: 20 65 61 63 68 20 66 69 6c 65 20 66 69 65 6c 64   each file field
2b30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e   */.  char *zLin
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2b50: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 66   A single line f
2b60: 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 66 69  rom the input fi
2b70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 67 69  le */.  int magi
2b80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b90: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
2ba0: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
2bb0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ing */.  int nLi
2bc0: 6e 65 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  neAlloc;        
2bd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 70   /* Number of sp
2be0: 61 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  aces allocated f
2bf0: 6f 72 20 7a 4c 69 6e 65 20 2a 2f 0a 20 20 69 6e  or zLine */.  in
2c00: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
2c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c20: 6f 66 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  of memory locati
2c30: 6f 6e 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6c  ons currently al
2c40: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  located */.  Mem
2c50: 20 2a 61 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *aMem;         
2c60: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 6f       /* The memo
2c70: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a  ry locations */.
2c80: 20 20 41 67 67 20 61 67 67 3b 20 20 20 20 20 20    Agg agg;      
2c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67 67            /* Agg
2ca0: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2cb0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74  on */.  int nSet
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 74  /* Number of set
2ce0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  s allocated */. 
2cf0: 20 53 65 74 20 2a 61 53 65 74 3b 20 20 20 20 20   Set *aSet;     
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
2d10: 72 72 61 79 20 6f 66 20 73 65 74 73 20 2a 2f 0a  rray of sets */.
2d20: 20 20 69 6e 74 20 6e 43 61 6c 6c 62 61 63 6b 3b    int nCallback;
2d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d40: 62 65 72 20 6f 66 20 63 61 6c 6c 62 61 63 6b 73  ber of callbacks
2d50: 20 69 6e 76 6f 6b 65 64 20 73 6f 20 66 61 72 20   invoked so far 
2d60: 2a 2f 0a 20 20 4b 65 79 6c 69 73 74 20 2a 70 4c  */.  Keylist *pL
2d70: 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
2d80: 41 20 6c 69 73 74 20 6f 66 20 52 4f 57 49 44 73  A list of ROWIDs
2d90: 20 2a 2f 0a 20 20 69 6e 74 20 6b 65 79 6c 69 73   */.  int keylis
2da0: 74 53 74 61 63 6b 44 65 70 74 68 3b 20 20 2f 2a  tStackDepth;  /*
2db0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
2dc0: 20 22 6b 65 79 6c 69 73 74 22 20 73 74 61 63 6b   "keylist" stack
2dd0: 20 2a 2f 0a 20 20 4b 65 79 6c 69 73 74 20 2a 2a   */.  Keylist **
2de0: 6b 65 79 6c 69 73 74 53 74 61 63 6b 3b 20 2f 2a  keylistStack; /*
2df0: 20 54 68 65 20 73 74 61 63 6b 20 75 73 65 64 20   The stack used 
2e00: 62 79 20 6f 70 63 6f 64 65 73 20 4c 69 73 74 50  by opcodes ListP
2e10: 75 73 68 20 26 20 4c 69 73 74 50 6f 70 20 2a 2f  ush & ListPop */
2e20: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e40: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
2e50: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e70: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2e80: 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
2e90: 75 6e 69 71 75 65 43 6e 74 3b 20 20 20 20 20 2f  uniqueCnt;     /
2ea0: 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 4d 61 6b  * Used by OP_Mak
2eb0: 65 52 65 63 6f 72 64 20 77 68 65 6e 20 50 32 21  eRecord when P2!
2ec0: 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  =0 */.  int erro
2ed0: 72 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rAction;        
2ee0: 2f 2a 20 52 65 63 6f 76 65 72 79 20 61 63 74 69  /* Recovery acti
2ef0: 6f 6e 20 74 6f 20 64 6f 20 69 6e 20 63 61 73 65  on to do in case
2f00: 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   of an error */.
2f10: 20 20 69 6e 74 20 75 6e 64 6f 54 72 61 6e 73 4f    int undoTransO
2f20: 6e 45 72 72 6f 72 3b 20 20 20 2f 2a 20 49 66 20  nError;   /* If 
2f30: 65 72 72 6f 72 2c 20 65 69 74 68 65 72 20 52 4f  error, either RO
2f40: 4c 4c 42 41 43 4b 20 6f 72 20 43 4f 4d 4d 49 54  LLBACK or COMMIT
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 54 65 6d 70   */.  int inTemp
2f60: 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20 2f 2a  Trans;        /*
2f70: 20 54 72 75 65 20 69 66 20 74 65 6d 70 20 64 61   True if temp da
2f80: 74 61 62 61 73 65 20 69 73 20 74 72 61 6e 73 61  tabase is transa
2f90: 63 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 69 6e 74  ctioned */.  int
2fa0: 20 72 65 74 75 72 6e 53 74 61 63 6b 5b 31 30 30   returnStack[100
2fb0: 5d 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  ];   /* Return a
2fc0: 64 64 72 65 73 73 20 73 74 61 63 6b 20 66 6f 72  ddress stack for
2fd0: 20 4f 50 5f 47 6f 73 75 62 20 26 20 4f 50 5f 52   OP_Gosub & OP_R
2fe0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2ff0: 65 74 75 72 6e 44 65 70 74 68 3b 20 20 20 20 20  eturnDepth;     
3000: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
3010: 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 72 65 74  d element in ret
3020: 75 72 6e 53 74 61 63 6b 5b 5d 20 2a 2f 0a 20 20  urnStack[] */.  
3030: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 20  int nResColumn; 
3040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3050: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3060: 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
3070: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
3080: 68 61 72 20 2a 2a 61 7a 52 65 73 43 6f 6c 75 6d  har **azResColum
3090: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
30b0: 75 65 73 20 66 6f 72 20 6f 6e 65 20 72 6f 77 20  ues for one row 
30c0: 6f 66 20 72 65 73 75 6c 74 20 2a 2f 20 0a 20 20  of result */ .  
30d0: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
30e0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a  (void*,int,char*
30f0: 2a 2c 63 68 61 72 2a 2a 29 3b 20 2f 2a 20 43 61  *,char**); /* Ca
3100: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 45 4c 45 43  llback for SELEC
3110: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 76  T results */.  v
3120: 6f 69 64 20 2a 70 43 62 41 72 67 3b 20 20 20 20  oid *pCbArg;    
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3150: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
3160: 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 20 20  Callback() */.  
3170: 69 6e 74 20 70 6f 70 53 74 61 63 6b 3b 20 20 20  int popStack;   
3180: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 20 74          /* Pop t
3190: 68 65 20 73 74 61 63 6b 20 74 68 69 73 20 6d 75  he stack this mu
31a0: 63 68 20 6f 6e 20 65 6e 74 72 79 20 74 6f 20 56  ch on entry to V
31b0: 64 62 65 45 78 65 63 28 29 20 2a 2f 0a 20 20 63  dbeExec() */.  c
31c0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20  har *zErrMsg;   
31d0: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
31e0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
31f0: 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 78 70  here */.  u8 exp
3200: 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lain;           
3210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 45 58 50    /* True if EXP
3220: 4c 41 49 4e 20 70 72 65 73 65 6e 74 20 6f 6e 20  LAIN present on 
3230: 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 7d  SQL command */.}
3240: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
3250: 6c 6f 77 69 6e 67 20 61 72 65 20 61 6c 6c 6f 77  lowing are allow
3260: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 56 64  ed values for Vd
3270: 62 65 2e 6d 61 67 69 63 0a 2a 2f 0a 23 64 65 66  be.magic.*/.#def
3280: 69 6e 65 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  ine VDBE_MAGIC_I
3290: 4e 49 54 20 20 20 20 20 30 78 32 36 62 63 65 61  NIT     0x26bcea
32a0: 61 35 20 20 20 20 2f 2a 20 42 75 69 6c 64 69 6e  a5    /* Buildin
32b0: 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  g a VDBE program
32c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 56 44 42 45   */.#define VDBE
32d0: 5f 4d 41 47 49 43 5f 52 55 4e 20 20 20 20 20 20  _MAGIC_RUN      
32e0: 30 78 62 64 66 32 30 64 61 33 20 20 20 20 2f 2a  0xbdf20da3    /*
32f0: 20 56 44 42 45 20 69 73 20 72 65 61 64 79 20 74   VDBE is ready t
3300: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 23 64 65  o execute */.#de
3310: 66 69 6e 65 20 56 44 42 45 5f 4d 41 47 49 43 5f  fine VDBE_MAGIC_
3320: 48 41 4c 54 20 20 20 20 20 30 78 35 31 39 63 32  HALT     0x519c2
3330: 39 37 33 20 20 20 20 2f 2a 20 56 44 42 45 20 68  973    /* VDBE h
3340: 61 73 20 63 6f 6d 70 6c 65 74 65 64 20 65 78 65  as completed exe
3350: 63 75 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  cution */.#defin
3360: 65 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  e VDBE_MAGIC_DEA
3370: 44 20 20 20 20 20 30 78 62 36 30 36 63 33 63 38  D     0xb606c3c8
3380: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
3390: 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
33a0: 61 74 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  ated */../*.** W
33b0: 68 65 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68  hen debugging th
33c0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
33d0: 20 69 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64   in a symbolic d
33e0: 65 62 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e  ebugger, one can
33f0: 0a 2a 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69  .** set the sqli
3400: 74 65 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  te_vdbe_addop_tr
3410: 61 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c  ace to 1 and all
3420: 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65   opcodes will be
3430: 20 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74   printed.** as t
3440: 68 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f  hey are added to
3450: 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
3460: 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 6e   stream..*/.#ifn
3470: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
3480: 71 6c 69 74 65 5f 76 64 62 65 5f 61 64 64 6f 70  qlite_vdbe_addop
3490: 5f 74 72 61 63 65 20 3d 20 30 3b 0a 73 74 61 74  _trace = 0;.stat
34a0: 69 63 20 76 6f 69 64 20 76 64 62 65 50 72 69 6e  ic void vdbePrin
34b0: 74 4f 70 28 46 49 4c 45 2a 2c 20 69 6e 74 2c 20  tOp(FILE*, int, 
34c0: 4f 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Op*);.#endif../*
34d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
34e0: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
34f0: 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62  e engine..*/.Vdb
3500: 65 20 2a 73 71 6c 69 74 65 56 64 62 65 43 72 65  e *sqliteVdbeCre
3510: 61 74 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ate(sqlite *db){
3520: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20  .  Vdbe *p;.  p 
3530: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3540: 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a  sizeof(Vdbe) );.
3550: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3560: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d  urn 0;.  p->db =
3570: 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70   db;.  if( db->p
3580: 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  Vdbe ){.    db->
3590: 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70  pVdbe->pPrev = p
35a0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74  ;.  }.  p->pNext
35b0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
35c0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
35d0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20  db->pVdbe = p;. 
35e0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
35f0: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
3600: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3610: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
3620: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
3630: 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65   sqliteVdbeTrace
3640: 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a  (Vdbe *p, FILE *
3650: 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61  trace){.  p->tra
3660: 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f  ce = trace;.}../
3670: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
3680: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
3690: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
36a0: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
36b0: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
36c0: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
36d0: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
36e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
36f0: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
3700: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
3710: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
3720: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
3730: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
3740: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
3750: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
3760: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
3770: 70 32 20 20 20 20 20 20 20 20 20 20 46 69 72 73  p2          Firs
3780: 74 20 74 77 6f 20 6f 66 20 74 68 65 20 74 68 72  t two of the thr
3790: 65 65 20 70 6f 73 73 69 62 6c 65 20 6f 70 65 72  ee possible oper
37a0: 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ands..**.** Use 
37b0: 74 68 65 20 73 71 6c 69 74 65 56 64 62 65 52 65  the sqliteVdbeRe
37c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
37d0: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
37e0: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
37f0: 68 65 20 73 71 6c 69 74 65 56 64 62 65 43 68 61  he sqliteVdbeCha
3800: 6e 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP3() function
3810: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
3820: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a  alue of the P3.*
3830: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
3840: 74 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  t sqliteVdbeAddO
3850: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
3860: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
3870: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  2){.  int i;..  
3880: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  i = p->nOp;.  p-
3890: 3e 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74  >nOp++;.  assert
38a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
38b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
38c0: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 41 6c   if( i>=p->nOpAl
38d0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
38e0: 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41  ldSize = p->nOpA
38f0: 6c 6c 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e  lloc;.    Op *aN
3900: 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c  ew;.    p->nOpAl
3910: 6c 6f 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc = p->nOpAllo
3920: 63 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 61  c*2 + 100;.    a
3930: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
3940: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  loc(p->aOp, p->n
3950: 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 4f  OpAlloc*sizeof(O
3960: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  p));.    if( aNe
3970: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
3980: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f 6c 64 53  >nOpAlloc = oldS
3990: 69 7a 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ize;.      retur
39a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
39b0: 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b 0a 20 20  ->aOp = aNew;.  
39c0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
39d0: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70  [oldSize], 0, (p
39e0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69  ->nOpAlloc-oldSi
39f0: 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  ze)*sizeof(Op));
3a00: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d  .  }.  p->aOp[i]
3a10: 2e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20  .opcode = op;.  
3a20: 70 2d 3e 61 4f 70 5b 69 5d 2e 70 31 20 3d 20 70  p->aOp[i].p1 = p
3a30: 31 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26 26  1;.  if( p2<0 &&
3a40: 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61 62   (-1-p2)<p->nLab
3a50: 65 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c 5b  el && p->aLabel[
3a60: 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20 20  -1-p2]>=0 ){.   
3a70: 20 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 5b   p2 = p->aLabel[
3a80: 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70 2d  -1-p2];.  }.  p-
3a90: 3e 61 4f 70 5b 69 5d 2e 70 32 20 3d 20 70 32 3b  >aOp[i].p2 = p2;
3aa0: 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 20  .  p->aOp[i].p3 
3ab0: 3d 20 30 3b 0a 20 20 70 2d 3e 61 4f 70 5b 69 5d  = 0;.  p->aOp[i]
3ac0: 2e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  .p3type = P3_NOT
3ad0: 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20 4e 44  USED;.#ifndef ND
3ae0: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
3af0: 65 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  e_vdbe_addop_tra
3b00: 63 65 20 29 20 76 64 62 65 50 72 69 6e 74 4f 70  ce ) vdbePrintOp
3b10: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
3b20: 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ]);.#endif.  ret
3b30: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
3b40: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
3b50: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
3b60: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
3b70: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
3b80: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
3b90: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
3ba0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
3bb0: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
3bc0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
3bd0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
3be0: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
3bf0: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
3c00: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
3c10: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
3c20: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
3c30: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
3c40: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
3c50: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
3c60: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
3c70: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
3c80: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
3c90: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
3ca0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
3cb0: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
3cc0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
3cd0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
3ce0: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
3cf0: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
3d00: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
3d10: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
3d20: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
3d30: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
3d40: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
3d50: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
3d60: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
3d70: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
3d80: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
3d90: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
3da0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
3db0: 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62  i;.  i = p->nLab
3dc0: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
3dd0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3de0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3df0: 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41  f( i>=p->nLabelA
3e00: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
3e10: 2a 61 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 4c  *aNew;.    p->nL
3e20: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  abelAlloc = p->n
3e30: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31  LabelAlloc*2 + 1
3e40: 30 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  0;.    aNew = sq
3e50: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
3e60: 61 4c 61 62 65 6c 2c 20 70 2d 3e 6e 4c 61 62 65  aLabel, p->nLabe
3e70: 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  lAlloc*sizeof(p-
3e80: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
3e90: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
3ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
3eb0: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
3ec0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65    }.    p->aLabe
3ed0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
3ee0: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d 30  if( p->aLabel==0
3ef0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
3f00: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4c  l = 0;.    p->nL
3f10: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  abelAlloc = 0;. 
3f20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3f30: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20  .  p->aLabel[i] 
3f40: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 2d  = -1;.  return -
3f50: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
3f60: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
3f70: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
3f80: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
3f90: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
3fa0: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
3fb0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
3fc0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
3fd0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
3fe0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
3ff0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4000: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
4010: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
4020: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69  Label(Vdbe *p, i
4030: 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  nt x){.  int j;.
4040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
4050: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
4060: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 78 3c 30  NIT );.  if( x<0
4070: 20 26 26 20 28 2d 78 29 3c 3d 70 2d 3e 6e 4c 61   && (-x)<=p->nLa
4080: 62 65 6c 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  bel && p->aOp ){
4090: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  .    if( p->aLab
40a0: 65 6c 5b 2d 31 2d 78 5d 3d 3d 70 2d 3e 6e 4f 70  el[-1-x]==p->nOp
40b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
40c0: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
40d0: 5b 2d 31 2d 78 5d 3c 30 20 29 3b 0a 20 20 20 20  [-1-x]<0 );.    
40e0: 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 20  p->aLabel[-1-x] 
40f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 66 6f  = p->nOp;.    fo
4100: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4f 70 3b  r(j=0; j<p->nOp;
4110: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
4120: 20 70 2d 3e 61 4f 70 5b 6a 5d 2e 70 32 3d 3d 78   p->aOp[j].p2==x
4130: 20 29 20 70 2d 3e 61 4f 70 5b 6a 5d 2e 70 32 20   ) p->aOp[j].p2 
4140: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
4150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
4160: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
4170: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
4180: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
4190: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
41a0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
41b0: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
41c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
41d0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
41e0: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
41f0: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
4200: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
4210: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
4220: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
4230: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
4240: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
4250: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
4260: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
4270: 6e 74 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  nt sqliteVdbeAdd
4280: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
4290: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 20  int nOp, VdbeOp 
42a0: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
42b0: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
42c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
42d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
42e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
42f0: 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  Op >= p->nOpAllo
4300: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
4310: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
4320: 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77  oc;.    Op *aNew
4330: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
4340: 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c = p->nOpAlloc*
4350: 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20  2 + nOp + 10;.  
4360: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
4370: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70  ealloc(p->aOp, p
4380: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
4390: 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  f(Op));.    if( 
43a0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
43b0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f   p->nOpAlloc = o
43c0: 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 65  ldSize;.      re
43d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
43e0: 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b    p->aOp = aNew;
43f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  .    memset(&p->
4400: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
4410: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
4420: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
4430: 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  ));.  }.  addr =
4440: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
4450: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
4460: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
4470: 69 3c 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nOp; i++){.   
4480: 20 20 20 69 6e 74 20 70 32 20 3d 20 61 4f 70 5b     int p2 = aOp[
4490: 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 70 2d 3e  i].p2;.      p->
44a0: 61 4f 70 5b 69 2b 61 64 64 72 5d 20 3d 20 61 4f  aOp[i+addr] = aO
44b0: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  p[i];.      if( 
44c0: 70 32 3c 30 20 29 20 70 2d 3e 61 4f 70 5b 69 2b  p2<0 ) p->aOp[i+
44d0: 61 64 64 72 5d 2e 70 32 20 3d 20 61 64 64 72 20  addr].p2 = addr 
44e0: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
44f0: 20 20 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d    p->aOp[i+addr]
4500: 2e 70 33 74 79 70 65 20 3d 20 61 4f 70 5b 69 5d  .p3type = aOp[i]
4510: 2e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  .p3 ? P3_STATIC 
4520: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
4530: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
4540: 20 20 20 69 66 28 20 73 71 6c 69 74 65 5f 76 64     if( sqlite_vd
4550: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29  be_addop_trace )
4560: 20 76 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20   vdbePrintOp(0, 
4570: 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b  i+addr, &p->aOp[
4580: 69 2b 61 64 64 72 5d 29 3b 0a 23 65 6e 64 69 66  i+addr]);.#endif
4590: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
45a0: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
45b0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
45c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
45d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
45e0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
45f0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4600: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4610: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4620: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4630: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
4640: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
4650: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
4660: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  eVdbeAddOpList b
4670: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
4680: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
4690: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
46a0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
46b0: 64 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e  d sqliteVdbeChan
46c0: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
46d0: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
46e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
46f0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4700: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4710: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
4720: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
4730: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
4740: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4750: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4760: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4770: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4780: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4790: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
47a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
47b0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
47c0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
47d0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
47e0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
47f0: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
4800: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
4810: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
4820: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4830: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4840: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4850: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
4860: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
4870: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
4880: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
4890: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
48a0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
48b0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
48c0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
48d0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
48e0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
48f0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
4900: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
4910: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
4920: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
4930: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 56 64  y using sqliteVd
4940: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
4950: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
4960: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
4970: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
4980: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
4990: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
49a0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
49b0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
49c0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
49d0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
49e0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
49f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4a00: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  teMalloc()..** A
4a10: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
4a20: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
4a30: 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64  of zP3 up to and
4a40: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
4a50: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
4a60: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
4a70: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
4a80: 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP3..**.** If 
4a90: 6e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  n==P3_STATIC  it
4aa0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20   means that zP3 
4ab0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4ac0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
4ad0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
4ae0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
4af0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e   the pointer.  n
4b00: 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61  ==P3_POINTER mea
4b10: 6e 73 20 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70  ns zP3 is.** a p
4b20: 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f  ointer to some o
4b30: 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
4b40: 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a   a string..**.**
4b50: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
4b60: 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65  change P3 on the
4b70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
4b80: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
4b90: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4ba0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
4bb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4bc0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
4bd0: 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P3, int n){.  Op
4be0: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
4bf0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4c00: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4c10: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  if( p==0 || p->a
4c20: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Op==0 ) return;.
4c30: 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20    if( addr<0 || 
4c40: 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  addr>=p->nOp ){.
4c50: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
4c60: 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61  p - 1;.    if( a
4c70: 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ddr<0 ) return;.
4c80: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
4c90: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
4ca0: 20 70 4f 70 2d 3e 70 33 20 26 26 20 70 4f 70 2d   pOp->p3 && pOp-
4cb0: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41  >p3type==P3_DYNA
4cc0: 4d 49 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MIC ){.    sqlit
4cd0: 65 46 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a  eFree(pOp->p3);.
4ce0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
4cf0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 33 3d 3d  .  }.  if( zP3==
4d00: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
4d10: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
4d20: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
4d30: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
4d40: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
4d50: 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b  p3 = (char*)zP3;
4d60: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
4d70: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = n;.  }else{. 
4d80: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
4d90: 69 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50  ing(&pOp->p3, zP
4da0: 33 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f  3, n, 0);.    pO
4db0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44  p->p3type = P3_D
4dc0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f  YNAMIC;.  }.}../
4dd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f  *.** If the P3 o
4de0: 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70  perand to the sp
4df0: 65 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74  ecified instruct
4e00: 69 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74  ion appears.** t
4e10: 6f 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74  o be a quoted st
4e20: 72 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e  ring token, then
4e30: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
4e40: 72 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20  removes .** the 
4e50: 71 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  quotes..**.** Th
4e60: 65 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74  e quoting operat
4e70: 6f 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  or can be either
4e80: 20 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20   a grave ascent 
4e90: 28 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20  (ASCII 0x27).** 
4ea0: 6f 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74  or a double quot
4eb0: 65 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43  e character (ASC
4ec0: 49 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71  II 0x22).  Two q
4ed0: 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a  uotes in a row.*
4ee0: 2a 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20  * resolve to be 
4ef0: 61 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20  a single actual 
4f00: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
4f10: 77 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e  within the strin
4f20: 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
4f30: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  eVdbeDequoteP3(V
4f40: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4f50: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
4f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4f80: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4f90: 70 3d 3d 30 20 7c 7c 20 61 64 64 72 3c 30 20 7c  p==0 || addr<0 |
4fa0: 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29  | addr>=p->nOp )
4fb0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
4fc0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4fd0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3d 3d 30    if( pOp->p3==0
4fe0: 20 7c 7c 20 70 4f 70 2d 3e 70 33 5b 30 5d 3d 3d   || pOp->p3[0]==
4ff0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5000: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  ( pOp->p3type==P
5010: 33 5f 50 4f 49 4e 54 45 52 20 29 20 72 65 74 75  3_POINTER ) retu
5020: 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  rn;.  if( pOp->p
5030: 33 74 79 70 65 21 3d 50 33 5f 44 59 4e 41 4d 49  3type!=P3_DYNAMI
5040: 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  C ){.    pOp->p3
5050: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
5060: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f  pOp->p3);.    pO
5070: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44  p->p3type = P3_D
5080: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20 20 73 71  YNAMIC;.  }.  sq
5090: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4f 70 2d  liteDequote(pOp-
50a0: 3e 70 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  >p3);.}../*.** O
50b0: 6e 20 74 68 65 20 50 33 20 61 72 67 75 6d 65 6e  n the P3 argumen
50c0: 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 69  t of the given i
50d0: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 63 68 61 6e  nstruction, chan
50e0: 67 65 20 61 6c 6c 0a 2a 2a 20 73 74 72 69 6e 67  ge all.** string
50f0: 73 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20  s of whitespace 
5100: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
5110: 61 20 73 69 6e 67 6c 65 20 73 70 61 63 65 20 61  a single space a
5120: 6e 64 0a 2a 2a 20 64 65 6c 65 74 65 20 6c 65 61  nd.** delete lea
5130: 64 69 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e  ding and trailin
5140: 67 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  g whitespace..*/
5150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 64 62 65  .void sqliteVdbe
5160: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 56 64  CompressSpace(Vd
5170: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
5180: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
5190: 6e 74 20 69 2c 20 6a 3b 0a 20 20 4f 70 20 2a 70  nt i, j;.  Op *p
51a0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
51b0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
51c0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
51d0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 61 64   p->aOp==0 || ad
51e0: 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d  dr<0 || addr>=p-
51f0: 3e 6e 4f 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  >nOp ) return;. 
5200: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
5210: 64 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ddr];.  if( pOp-
5220: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
5230: 54 45 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72  TER ){.    retur
5240: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  n;.  }.  if( pOp
5250: 2d 3e 70 33 74 79 70 65 21 3d 50 33 5f 44 59 4e  ->p3type!=P3_DYN
5260: 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d  AMIC ){.    pOp-
5270: 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 44  >p3 = sqliteStrD
5280: 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  up(pOp->p3);.   
5290: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
52a0: 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20  3_DYNAMIC;.  }. 
52b0: 20 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   z = pOp->p3;.  
52c0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
52d0: 6e 3b 0a 20 20 69 20 3d 20 6a 20 3d 20 30 3b 0a  n;.  i = j = 0;.
52e0: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
52f0: 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  (z[i]) ){ i++; }
5300: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 29  .  while( z[i] )
5310: 7b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  {.    if( isspac
5320: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
5330: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
5340: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
5350: 61 63 65 28 7a 5b 2b 2b 69 5d 29 20 29 7b 7d 0a  ace(z[++i]) ){}.
5360: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5370: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 2b 2b 5d   z[j++] = z[i++]
5380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
5390: 69 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73 70  ile( j>0 && issp
53a0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
53b0: 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  --; }.  z[j] = 0
53c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
53d0: 68 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  h for the curren
53e0: 74 20 70 72 6f 67 72 61 6d 20 66 6f 72 20 74 68  t program for th
53f0: 65 20 67 69 76 65 6e 20 6f 70 63 6f 64 65 20 61  e given opcode a
5400: 6e 64 20 50 32 0a 2a 2a 20 76 61 6c 75 65 2e 20  nd P2.** value. 
5410: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
5420: 65 73 73 20 70 6c 75 73 20 31 20 69 66 20 66 6f  ess plus 1 if fo
5430: 75 6e 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  und and 0 if not
5440: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
5450: 71 6c 69 74 65 56 64 62 65 46 69 6e 64 4f 70 28  qliteVdbeFindOp(
5460: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
5470: 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 20   int p2){.  int 
5480: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
5490: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
54a0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 66 6f 72 28  C_INIT );.  for(
54b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
54c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
54d0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  aOp[i].opcode==o
54e0: 70 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  p && p->aOp[i].p
54f0: 32 3d 3d 70 32 20 29 20 72 65 74 75 72 6e 20 69  2==p2 ) return i
5500: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
5510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5520: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
5530: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
5540: 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ss..*/.VdbeOp *s
5550: 71 6c 69 74 65 56 64 62 65 47 65 74 4f 70 28 56  qliteVdbeGetOp(V
5560: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5570: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5580: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5590: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
55a0: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
55b0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
55c0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
55d0: 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ddr];.}../*.** T
55e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
55f0: 75 70 20 6f 72 20 72 6f 75 74 69 6e 65 73 20 61  up or routines a
5600: 72 65 20 65 6d 70 6c 6f 79 65 64 20 62 79 20 69  re employed by i
5610: 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63 74  nstallable funct
5620: 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 75 72  ions.** to retur
5630: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 73 2e  n their results.
5640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
5650: 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  e_set_result_str
5660: 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 20 63 61  ing() routine ca
5670: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  n be used to ret
5680: 75 72 6e 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  urn a string.** 
5690: 76 61 6c 75 65 20 6f 72 20 74 6f 20 72 65 74 75  value or to retu
56a0: 72 6e 20 61 20 4e 55 4c 4c 2e 20 20 54 6f 20 72  rn a NULL.  To r
56b0: 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2c 20 70 61  eturn a NULL, pa
56c0: 73 73 20 69 6e 20 4e 55 4c 4c 20 66 6f 72 20 7a  ss in NULL for z
56d0: 52 65 73 75 6c 74 2e 0a 2a 2a 20 41 20 63 6f 70  Result..** A cop
56e0: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
56f0: 20 73 74 72 69 6e 67 20 62 65 66 6f 72 65 20 74   string before t
5700: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5710: 72 6e 73 20 73 6f 20 69 74 20 69 73 20 73 61 66  rns so it is saf
5720: 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20 69 6e 20  e.** to pass in 
5730: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72  an ephemeral str
5740: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ing..**.** sqlit
5750: 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65 72 72  e_set_result_err
5760: 6f 72 28 29 20 77 6f 72 6b 73 20 6c 69 6b 65 20  or() works like 
5770: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
5780: 74 5f 73 74 72 69 6e 67 28 29 20 65 78 63 65 70  t_string() excep
5790: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 73 69 67  t.** that it sig
57a0: 6e 61 6c 73 20 61 20 66 61 74 61 6c 20 65 72 72  nals a fatal err
57b0: 6f 72 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  or.  The string 
57c0: 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 61 6e 79  argument, if any
57d0: 2c 20 69 73 20 74 68 65 0a 2a 2a 20 65 72 72 6f  , is the.** erro
57e0: 72 20 6d 65 73 73 61 67 65 2e 20 20 49 66 20 74  r message.  If t
57f0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  he argument is N
5800: 55 4c 4c 20 61 20 67 65 6e 65 72 69 63 20 73 75  ULL a generic su
5810: 62 73 74 69 74 75 74 65 20 65 72 72 6f 72 20 6d  bstitute error m
5820: 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 75 73 65  essage.** is use
5830: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  d..**.** The sql
5840: 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69  ite_set_result_i
5850: 6e 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f  nt() and sqlite_
5860: 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  set_result_doubl
5870: 65 28 29 20 73 65 74 20 74 68 65 20 72 65 74 75  e() set the retu
5880: 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  rn.** value of t
5890: 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
58a0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 6f   to an integer o
58b0: 72 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a  r a double..**.*
58c0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
58d0: 20 61 72 65 20 64 65 66 69 6e 65 64 20 68 65 72   are defined her
58e0: 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65 63 61  e in vdbe.c beca
58f0: 75 73 65 20 74 68 65 79 20 64 65 70 65 6e 64 20  use they depend 
5900: 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74 68  on knowing.** th
5910: 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20 74  e internals of t
5920: 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 73  he sqlite_func s
5930: 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69  tructure which i
5940: 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20 69  s only defined i
5950: 6e 20 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  n .** this sourc
5960: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 68 61 72 20  e file..*/.char 
5970: 2a 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75  *sqlite_set_resu
5980: 6c 74 5f 73 74 72 69 6e 67 28 73 71 6c 69 74 65  lt_string(sqlite
5990: 5f 66 75 6e 63 20 2a 70 2c 20 63 6f 6e 73 74 20  _func *p, const 
59a0: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 2c 20 69  char *zResult, i
59b0: 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt n){.  assert(
59c0: 20 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20   !p->isStep );. 
59d0: 20 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20   if( p->s.flags 
59e0: 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20  & STK_Dyn ){.   
59f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
5a00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65  );.  }.  if( zRe
5a10: 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  sult==0 ){.    p
5a20: 2d 3e 73 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  ->s.flags = STK_
5a30: 4e 75 6c 6c 3b 0a 20 20 20 20 6e 20 3d 20 30 3b  Null;.    n = 0;
5a40: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a 20  .    p->z = 0;. 
5a50: 20 20 20 70 2d 3e 73 2e 6e 20 3d 20 30 3b 0a 20     p->s.n = 0;. 
5a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
5a70: 6e 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  n<0 ) n = strlen
5a80: 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  (zResult);.    i
5a90: 66 28 20 6e 3c 4e 42 46 53 2d 31 20 29 7b 0a 20  f( n<NBFS-1 ){. 
5aa0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 73       memcpy(p->s
5ab0: 2e 7a 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b  .z, zResult, n);
5ac0: 0a 20 20 20 20 20 20 70 2d 3e 73 2e 7a 5b 6e 5d  .      p->s.z[n]
5ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 73   = 0;.      p->s
5ae0: 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72  .flags = STK_Str
5af0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 70  ;.      p->z = p
5b00: 2d 3e 73 2e 7a 3b 0a 20 20 20 20 7d 65 6c 73 65  ->s.z;.    }else
5b10: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 73  {.      p->z = s
5b20: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
5b30: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  n+1 );.      if(
5b40: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20   p->z ){.       
5b50: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2c 20 7a 52   memcpy(p->z, zR
5b60: 65 73 75 6c 74 2c 20 6e 29 3b 0a 20 20 20 20 20  esult, n);.     
5b70: 20 20 20 70 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b 0a     p->z[n] = 0;.
5b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
5b90: 3e 73 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 53  >s.flags = STK_S
5ba0: 74 72 20 7c 20 53 54 4b 5f 44 79 6e 3b 0a 20 20  tr | STK_Dyn;.  
5bb0: 20 20 7d 0a 20 20 20 20 70 2d 3e 73 2e 6e 20 3d    }.    p->s.n =
5bc0: 20 6e 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n+1;.  }.  retu
5bd0: 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 76 6f 69 64 20  rn p->z;.}.void 
5be0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
5bf0: 74 5f 69 6e 74 28 73 71 6c 69 74 65 5f 66 75 6e  t_int(sqlite_fun
5c00: 63 20 2a 70 2c 20 69 6e 74 20 69 52 65 73 75 6c  c *p, int iResul
5c10: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 70  t){.  assert( !p
5c20: 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20 69 66  ->isStep );.  if
5c30: 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53  ( p->s.flags & S
5c40: 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 73 71  TK_Dyn ){.    sq
5c50: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a  liteFree(p->z);.
5c60: 20 20 7d 0a 20 20 70 2d 3e 73 2e 69 20 3d 20 69    }.  p->s.i = i
5c70: 52 65 73 75 6c 74 3b 0a 20 20 70 2d 3e 73 2e 66  Result;.  p->s.f
5c80: 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a  lags = STK_Int;.
5c90: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 73 65  }.void sqlite_se
5ca0: 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  t_result_double(
5cb0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20  sqlite_func *p, 
5cc0: 64 6f 75 62 6c 65 20 72 52 65 73 75 6c 74 29 7b  double rResult){
5cd0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
5ce0: 73 53 74 65 70 20 29 3b 0a 20 20 69 66 28 20 70  sStep );.  if( p
5cf0: 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  ->s.flags & STK_
5d00: 44 79 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Dyn ){.    sqlit
5d10: 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 7d  eFree(p->z);.  }
5d20: 0a 20 20 70 2d 3e 73 2e 72 20 3d 20 72 52 65 73  .  p->s.r = rRes
5d30: 75 6c 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c 61 67  ult;.  p->s.flag
5d40: 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a 7d 0a  s = STK_Real;.}.
5d50: 76 6f 69 64 20 73 71 6c 69 74 65 5f 73 65 74 5f  void sqlite_set_
5d60: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 73 71 6c  result_error(sql
5d70: 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 63 6f 6e  ite_func *p, con
5d80: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c 20 69  st char *zMsg, i
5d90: 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt n){.  assert(
5da0: 20 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20   !p->isStep );. 
5db0: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
5dc0: 6c 74 5f 73 74 72 69 6e 67 28 70 2c 20 7a 4d 73  lt_string(p, zMs
5dd0: 67 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 45 72  g, n);.  p->isEr
5de0: 72 6f 72 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ror = 1;.}../*.*
5df0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 75 73  * Extract the us
5e00: 65 72 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73  er data from a s
5e10: 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63  qlite_func struc
5e20: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
5e30: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
5e40: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
5e50: 6f 75 74 69 6e 65 20 69 73 20 64 65 66 69 6e 65  outine is define
5e60: 64 20 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63  d here in vdbe.c
5e70: 20 62 65 63 61 75 73 65 20 69 74 20 64 65 70 65   because it depe
5e80: 6e 64 73 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a  nds on knowing.*
5e90: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 20  * the internals 
5ea0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 66 75  of the sqlite_fu
5eb0: 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 68 69  nc structure whi
5ec0: 63 68 20 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e  ch is only defin
5ed0: 65 64 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20 73  ed in .** this s
5ee0: 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76  ource file..*/.v
5ef0: 6f 69 64 20 2a 73 71 6c 69 74 65 5f 75 73 65 72  oid *sqlite_user
5f00: 5f 64 61 74 61 28 73 71 6c 69 74 65 5f 66 75 6e  _data(sqlite_fun
5f10: 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  c *p){.  assert(
5f20: 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20 29   p && p->pFunc )
5f30: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 46  ;.  return p->pF
5f40: 75 6e 63 2d 3e 70 55 73 65 72 44 61 74 61 3b 0a  unc->pUserData;.
5f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
5f60: 65 20 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20  e or return the 
5f70: 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74 65 78  aggregate contex
5f80: 74 20 66 6f 72 20 61 20 75 73 65 72 20 66 75 6e  t for a user fun
5f90: 63 74 69 6f 6e 2e 20 20 41 20 6e 65 77 0a 2a 2a  ction.  A new.**
5fa0: 20 63 6f 6e 74 65 78 74 20 69 73 20 61 6c 6c 6f   context is allo
5fb0: 63 61 74 65 64 20 6f 6e 20 74 68 65 20 66 69 72  cated on the fir
5fc0: 73 74 20 63 61 6c 6c 2e 20 20 53 75 62 73 65 71  st call.  Subseq
5fd0: 75 65 6e 74 20 63 61 6c 6c 73 20 72 65 74 75 72  uent calls retur
5fe0: 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f  n the.** same co
5ff0: 6e 74 65 78 74 20 74 68 61 74 20 77 61 73 20 72  ntext that was r
6000: 65 74 75 72 6e 65 64 20 6f 6e 20 70 72 69 6f 72  eturned on prior
6010: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   calls..**.** Th
6020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
6030: 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20 76 64  fined here in vd
6040: 62 65 2e 63 20 62 65 63 61 75 73 65 20 69 74 20  be.c because it 
6050: 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f 77 69  depends on knowi
6060: 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  ng.** the intern
6070: 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  als of the sqlit
6080: 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72 65  e_func structure
6090: 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20 64   which is only d
60a0: 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69  efined in.** thi
60b0: 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a  s source file..*
60c0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 5f 61  /.void *sqlite_a
60d0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
60e0: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c  (sqlite_func *p,
60f0: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 61   int nByte){.  a
6100: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
6110: 46 75 6e 63 20 26 26 20 70 2d 3e 70 46 75 6e 63  Func && p->pFunc
6120: 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20 69 66 28  ->xStep );.  if(
6130: 20 70 2d 3e 70 41 67 67 3d 3d 30 20 29 7b 0a 20   p->pAgg==0 ){. 
6140: 20 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 4e 42     if( nByte<=NB
6150: 46 53 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  FS ){.      p->p
6160: 41 67 67 20 3d 20 28 76 6f 69 64 2a 29 70 2d 3e  Agg = (void*)p->
6170: 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  z;.    }else{.  
6180: 20 20 20 20 70 2d 3e 70 41 67 67 20 3d 20 73 71      p->pAgg = sq
6190: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
61a0: 65 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e );.    }.  }. 
61b0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 41 67 67 3b   return p->pAgg;
61c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
61d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
61e0: 69 6d 65 73 20 74 68 65 20 53 74 65 70 20 66 75  imes the Step fu
61f0: 6e 63 74 69 6f 6e 20 6f 66 20 61 20 61 67 67 72  nction of a aggr
6200: 65 67 61 74 65 20 68 61 73 20 62 65 65 6e 20 0a  egate has been .
6210: 2a 2a 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  ** called..**.**
6220: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6230: 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e   defined here in
6240: 20 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20   vdbe.c because 
6250: 69 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e  it depends on kn
6260: 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74  owing.** the int
6270: 65 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71  ernals of the sq
6280: 6c 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74  lite_func struct
6290: 75 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c  ure which is onl
62a0: 79 20 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20  y defined in.** 
62b0: 74 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65  this source file
62c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
62d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
62e0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b  sqlite_func *p){
62f0: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
6300: 70 2d 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70  p->pFunc && p->p
6310: 46 75 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20  Func->xStep );. 
6320: 20 72 65 74 75 72 6e 20 70 2d 3e 63 6e 74 3b 0a   return p->cnt;.
6330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
6340: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
6350: 68 69 6e 65 20 74 6f 20 74 68 65 20 6e 65 78 74  hine to the next
6360: 20 6f 75 74 70 75 74 20 72 6f 77 2e 0a 2a 2a 0a   output row..**.
6370: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
6380: 6c 65 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65  le will be eithe
6390: 72 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 53  r SQLITE_BUSY, S
63a0: 51 4c 49 54 45 5f 44 4f 4e 45 2c 20 0a 2a 2a 20  QLITE_DONE, .** 
63b0: 53 51 4c 49 54 45 5f 52 4f 57 2c 20 53 51 4c 49  SQLITE_ROW, SQLI
63c0: 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c  TE_ERROR, or SQL
63d0: 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2a 0a 2a  ITE_MISUSE..**.*
63e0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 65  * SQLITE_BUSY me
63f0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 76 69 72  ans that the vir
6400: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 61 74 74  tual machine att
6410: 65 6d 70 74 65 64 20 74 6f 20 6f 70 65 6e 0a 2a  empted to open.*
6420: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
6430: 61 73 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ase and there is
6440: 20 6e 6f 20 62 75 73 79 20 63 61 6c 6c 62 61 63   no busy callbac
6450: 6b 20 72 65 67 69 73 74 65 72 65 64 2e 0a 2a 2a  k registered..**
6460: 20 43 61 6c 6c 20 73 71 6c 69 74 65 5f 73 74 65   Call sqlite_ste
6470: 70 28 29 20 61 67 61 69 6e 20 74 6f 20 72 65 74  p() again to ret
6480: 72 79 20 74 68 65 20 6f 70 65 6e 2e 20 20 2a 70  ry the open.  *p
6490: 4e 20 69 73 20 73 65 74 20 74 6f 20 30 0a 2a 2a  N is set to 0.**
64a0: 20 61 6e 64 20 2a 70 61 7a 43 6f 6c 4e 61 6d 65   and *pazColName
64b0: 20 61 6e 64 20 2a 70 61 7a 56 61 6c 75 65 20 61   and *pazValue a
64c0: 72 65 20 62 6f 74 68 20 73 65 74 20 74 6f 20 4e  re both set to N
64d0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ULL..**.** SQLIT
64e0: 45 5f 44 4f 4e 45 20 6d 65 61 6e 73 20 74 68 61  E_DONE means tha
64f0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
6500: 63 68 69 6e 65 20 68 61 73 20 66 69 6e 69 73 68  chine has finish
6510: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 2e  ed.** executing.
6520: 20 20 73 71 6c 69 74 65 5f 73 74 65 70 28 29 20    sqlite_step() 
6530: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
6540: 6c 6c 65 64 20 61 67 61 69 6e 20 6f 6e 20 74 68  lled again on th
6550: 69 73 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  is.** virtual ma
6560: 63 68 69 6e 65 2e 20 20 2a 70 4e 20 61 6e 64 20  chine.  *pN and 
6570: 2a 70 61 7a 43 6f 6c 4e 61 6d 65 20 61 72 65 20  *pazColName are 
6580: 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  set appropriatel
6590: 79 0a 2a 2a 20 62 75 74 20 2a 70 61 7a 56 61 6c  y.** but *pazVal
65a0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
65b0: 4c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  L..**.** SQLITE_
65c0: 52 4f 57 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ROW means that t
65d0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
65e0: 6e 65 20 68 61 73 20 67 65 6e 65 72 61 74 65 64  ne has generated
65f0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 72 6f 77 20   another.** row 
6600: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
6610: 74 2e 20 20 2a 70 4e 20 69 73 20 73 65 74 20 74  t.  *pN is set t
6620: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6630: 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68  columns in.** th
6640: 65 20 72 6f 77 2e 20 20 2a 70 61 7a 43 6f 6c 4e  e row.  *pazColN
6650: 61 6d 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ame is set to th
6660: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
6670: 6f 6c 75 6d 6e 73 20 66 6f 6c 6c 6f 77 65 64 0a  olumns followed.
6680: 2a 2a 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ** by the column
6690: 20 64 61 74 61 74 79 70 65 73 2e 20 20 2a 70 61   datatypes.  *pa
66a0: 7a 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  zValue is set to
66b0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 65   the values of e
66c0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e  ach.** column in
66d0: 20 74 68 65 20 72 6f 77 2e 20 20 54 68 65 20 76   the row.  The v
66e0: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 2d 74 68  alue of the i-th
66f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 28 2a 70 61 7a   column is (*paz
6700: 56 61 6c 75 65 29 5b 69 5d 2e 0a 2a 2a 20 54 68  Value)[i]..** Th
6710: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 2d  e name of the i-
6720: 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20 28 2a 70  th column is (*p
6730: 61 7a 43 6f 6c 4e 61 6d 65 29 5b 69 5d 20 61 6e  azColName)[i] an
6740: 64 20 74 68 65 20 64 61 74 61 74 79 70 65 0a 2a  d the datatype.*
6750: 2a 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 6f  * of the i-th co
6760: 6c 75 6d 6e 20 69 73 20 28 2a 70 61 7a 43 6f 6c  lumn is (*pazCol
6770: 4e 61 6d 65 29 5b 69 2b 2a 70 4e 5d 2e 0a 2a 2a  Name)[i+*pN]..**
6780: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
6790: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 72 75   means that a ru
67a0: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 28 73 75  n-time error (su
67b0: 63 68 20 61 73 20 61 20 63 6f 6e 73 74 72 61 69  ch as a constrai
67c0: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 29  nt.** violation)
67d0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 20   has occurred.  
67e0: 54 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 74  The details of t
67f0: 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
6800: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20   returned.** by 
6810: 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
6820: 20 73 71 6c 69 74 65 5f 66 69 6e 61 6c 69 7a 65   sqlite_finalize
6830: 28 29 2e 20 20 73 71 6c 69 74 65 5f 73 74 65 70  ().  sqlite_step
6840: 28 29 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  () should not.**
6850: 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e   be called again
6860: 20 6f 6e 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a   on the VM..**.*
6870: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
6880: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
6890: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
68a0: 63 61 6c 6c 65 64 20 69 6e 61 70 70 72 6f 70 72  called inappropr
68b0: 69 61 74 65 6c 79 2e 0a 2a 2a 20 50 65 72 68 61  iately..** Perha
68c0: 70 73 20 69 74 20 77 61 73 20 63 61 6c 6c 65 64  ps it was called
68d0: 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 6d 61   on a virtual ma
68e0: 63 68 69 6e 65 20 74 68 61 74 20 68 61 64 20 61  chine that had a
68f0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 66  lready been.** f
6900: 69 6e 61 6c 69 7a 65 64 20 6f 72 20 6f 6e 20 6f  inalized or on o
6910: 6e 65 20 74 68 61 74 20 68 61 64 20 70 72 65 76  ne that had prev
6920: 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
6930: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 6f 72 0a  SQLITE_ERROR or.
6940: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
6950: 20 4f 72 20 69 74 20 63 6f 75 6c 64 20 62 65 20   Or it could be 
6960: 74 68 65 20 63 61 73 65 20 74 68 65 20 74 68 65  the case the the
6970: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
6980: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  onnection.** is 
6990: 62 65 69 6e 67 20 75 73 65 64 20 73 69 6d 75 6c  being used simul
69a0: 61 74 61 6e 65 6f 75 73 6c 79 20 62 79 20 74 77  ataneously by tw
69b0: 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64  o or more thread
69c0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
69d0: 5f 73 74 65 70 28 0a 20 20 73 71 6c 69 74 65 5f  _step(.  sqlite_
69e0: 76 6d 20 2a 70 56 6d 2c 20 20 20 20 20 20 20 20  vm *pVm,        
69f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
6a00: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 6f 20  tual machine to 
6a10: 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 69 6e 74  execute */.  int
6a20: 20 2a 70 4e 2c 20 20 20 20 20 20 20 20 20 20 20   *pN,           
6a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6a40: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
6a50: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 2a 2f  mns in result */
6a60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6a70: 2a 70 61 7a 56 61 6c 75 65 2c 20 20 20 20 20 20  *pazValue,      
6a80: 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d 6e 20 64  /* OUT: Column d
6a90: 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
6aa0: 68 61 72 20 2a 2a 2a 70 61 7a 43 6f 6c 4e 61 6d  har ***pazColNam
6ab0: 65 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f  e     /* OUT: Co
6ac0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64  lumn names and d
6ad0: 61 74 61 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20  atatypes */.){. 
6ae0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
6af0: 2a 29 70 56 6d 3b 0a 20 20 73 71 6c 69 74 65 20  *)pVm;.  sqlite 
6b00: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
6b10: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
6b20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
6b30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6b40: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
6b50: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
6b60: 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74 79  if( sqliteSafety
6b70: 4f 6e 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  On(db) ){.    re
6b80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
6b90: 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  SE;.  }.  if( p-
6ba0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
6bb0: 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c  rc = sqliteVdbeL
6bc0: 69 73 74 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  ist(p);.  }else{
6bd0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6be0: 56 64 62 65 45 78 65 63 28 70 29 3b 0a 20 20 7d  VdbeExec(p);.  }
6bf0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6c00: 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
6c10: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
6c20: 69 66 28 20 70 61 7a 43 6f 6c 4e 61 6d 65 20 29  if( pazColName )
6c30: 20 2a 70 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 28   *pazColName = (
6c40: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 2d 3e  const char**)p->
6c50: 61 7a 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 69  azColName;.    i
6c60: 66 28 20 70 4e 20 29 20 2a 70 4e 20 3d 20 70 2d  f( pN ) *pN = p-
6c70: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  >nResColumn;.  }
6c80: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61  else{.    if( pa
6c90: 7a 43 6f 6c 4e 61 6d 65 29 20 2a 70 61 7a 43 6f  zColName) *pazCo
6ca0: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  lName = 0;.    i
6cb0: 66 28 20 70 4e 20 29 20 2a 70 4e 20 3d 20 30 3b  f( pN ) *pN = 0;
6cc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 7a 56 61  .  }.  if( pazVa
6cd0: 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 72  lue ){.    if( r
6ce0: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
6cf0: 0a 20 20 20 20 20 20 2a 70 61 7a 56 61 6c 75 65  .      *pazValue
6d00: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
6d10: 29 70 2d 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 3b  )p->azResColumn;
6d20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6d30: 20 20 2a 70 61 7a 56 61 6c 75 65 20 3d 20 30 3b    *pazValue = 0;
6d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6d50: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66   sqliteSafetyOff
6d60: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
6d70: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6d80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6d90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  c;.}../*.** Rese
6da0: 74 20 61 6e 20 41 67 67 20 73 74 72 75 63 74 75  t an Agg structu
6db0: 72 65 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20  re.  Delete all 
6dc0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 0a 2a  its contents. .*
6dd0: 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73 74 61 6c 6c  *.** For install
6de0: 61 62 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  able aggregate f
6df0: 75 6e 63 74 69 6f 6e 73 2c 20 69 66 20 74 68 65  unctions, if the
6e00: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 68   step function h
6e10: 61 73 20 62 65 65 6e 0a 2a 2a 20 63 61 6c 6c 65  as been.** calle
6e20: 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  d, make sure the
6e30: 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74   finalizer funct
6e40: 69 6f 6e 20 68 61 73 20 61 6c 73 6f 20 62 65 65  ion has also bee
6e50: 6e 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 0a 2a  n called.  The.*
6e60: 2a 20 66 69 6e 61 6c 69 7a 65 72 20 6d 69 67 68  * finalizer migh
6e70: 74 20 6e 65 65 64 20 74 6f 20 66 72 65 65 20 6d  t need to free m
6e80: 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 61  emory that was a
6e90: 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72 74  llocated as part
6ea0: 20 6f 66 20 69 74 73 0a 2a 2a 20 70 72 69 76 61   of its.** priva
6eb0: 74 65 20 63 6f 6e 74 65 78 74 2e 20 20 49 66 20  te context.  If 
6ec0: 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68 61  the finalizer ha
6ed0: 73 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c 65  s not been calle
6ee0: 64 20 79 65 74 2c 20 63 61 6c 6c 20 69 74 0a 2a  d yet, call it.*
6ef0: 2a 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  * now..*/.static
6f00: 20 76 6f 69 64 20 41 67 67 52 65 73 65 74 28 41   void AggReset(A
6f10: 67 67 20 2a 70 41 67 67 29 7b 0a 20 20 69 6e 74  gg *pAgg){.  int
6f20: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
6f30: 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 73 71 6c  p;.  for(p = sql
6f40: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 41  iteHashFirst(&pA
6f50: 67 67 2d 3e 68 61 73 68 29 3b 20 70 3b 20 70 20  gg->hash); p; p 
6f60: 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  = sqliteHashNext
6f70: 28 70 29 29 7b 0a 20 20 20 20 41 67 67 45 6c 65  (p)){.    AggEle
6f80: 6d 20 2a 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74  m *pElem = sqlit
6f90: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
6fa0: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
6fb0: 61 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20  apFunc!=0 );.   
6fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
6fd0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
6fe0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
6ff0: 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b  &pElem->aMem[i];
7000: 0a 20 20 20 20 20 20 69 66 28 20 70 41 67 67 2d  .      if( pAgg-
7010: 3e 61 70 46 75 6e 63 5b 69 5d 20 26 26 20 28 70  >apFunc[i] && (p
7020: 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53  Mem->s.flags & S
7030: 54 4b 5f 41 67 67 43 74 78 29 21 3d 30 20 29 7b  TK_AggCtx)!=0 ){
7040: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f  .        sqlite_
7050: 66 75 6e 63 20 63 74 78 3b 0a 20 20 20 20 20 20  func ctx;.      
7060: 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 41    ctx.pFunc = pA
7070: 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a 20  gg->apFunc[i];. 
7080: 20 20 20 20 20 20 20 63 74 78 2e 73 2e 66 6c 61         ctx.s.fla
7090: 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20  gs = STK_Null;. 
70a0: 20 20 20 20 20 20 20 63 74 78 2e 7a 20 3d 20 30         ctx.z = 0
70b0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 70 41  ;.        ctx.pA
70c0: 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  gg = pMem->z;.  
70d0: 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20 3d 20        ctx.cnt = 
70e0: 70 4d 65 6d 2d 3e 73 2e 69 3b 0a 20 20 20 20 20  pMem->s.i;.     
70f0: 20 20 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20     ctx.isStep = 
7100: 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 69  0;.        ctx.i
7110: 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  sError = 0;.    
7120: 20 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75      (*pAgg->apFu
7130: 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65  nc[i]->xFinalize
7140: 29 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20  )(&ctx);.       
7150: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20   if( pMem->z!=0 
7160: 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d  && pMem->z!=pMem
7170: 2d 3e 73 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20  ->s.z ){.       
7180: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4d     sqliteFree(pM
7190: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
71a0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
71b0: 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20  ( pMem->s.flags 
71c0: 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20  & STK_Dyn ){.   
71d0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
71e0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
71f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
7200: 74 65 46 72 65 65 28 70 45 6c 65 6d 29 3b 0a 20  teFree(pElem);. 
7210: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
7220: 6c 65 61 72 28 26 70 41 67 67 2d 3e 68 61 73 68  lear(&pAgg->hash
7230: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
7240: 70 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20  pAgg->apFunc);. 
7250: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20   pAgg->apFunc = 
7260: 30 3b 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72  0;.  pAgg->pCurr
7270: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d  ent = 0;.  pAgg-
7280: 3e 70 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20  >pSearch = 0;.  
7290: 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  pAgg->nMem = 0;.
72a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
72b0: 61 20 6e 65 77 20 61 67 67 72 65 67 61 74 65 20  a new aggregate 
72c0: 65 6c 65 6d 65 6e 74 20 61 6e 64 20 6d 61 6b 65  element and make
72d0: 20 69 74 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   it the element 
72e0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 66 6f 63 75  that.** has focu
72f0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
7300: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  0 on success and
7310: 20 31 20 69 66 20 6d 65 6d 6f 72 79 20 69 73 20   1 if memory is 
7320: 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
7330: 61 74 69 63 20 69 6e 74 20 41 67 67 49 6e 73 65  atic int AggInse
7340: 72 74 28 41 67 67 20 2a 70 2c 20 63 68 61 72 20  rt(Agg *p, char 
7350: 2a 7a 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29  *zKey, int nKey)
7360: 7b 0a 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c  {.  AggElem *pEl
7370: 65 6d 2c 20 2a 70 4f 6c 64 3b 0a 20 20 69 6e 74  em, *pOld;.  int
7380: 20 69 3b 0a 20 20 70 45 6c 65 6d 20 3d 20 73 71   i;.  pElem = sq
7390: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
73a0: 6f 66 28 41 67 67 45 6c 65 6d 29 20 2b 20 6e 4b  of(AggElem) + nK
73b0: 65 79 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ey +.           
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
73d0: 3e 6e 4d 65 6d 2d 31 29 2a 73 69 7a 65 6f 66 28  >nMem-1)*sizeof(
73e0: 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 30 5d 29 20  pElem->aMem[0]) 
73f0: 29 3b 0a 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d  );.  if( pElem==
7400: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7410: 70 45 6c 65 6d 2d 3e 7a 4b 65 79 20 3d 20 28 63  pElem->zKey = (c
7420: 68 61 72 2a 29 26 70 45 6c 65 6d 2d 3e 61 4d 65  har*)&pElem->aMe
7430: 6d 5b 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 6d 65  m[p->nMem];.  me
7440: 6d 63 70 79 28 70 45 6c 65 6d 2d 3e 7a 4b 65 79  mcpy(pElem->zKey
7450: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , zKey, nKey);. 
7460: 20 70 45 6c 65 6d 2d 3e 6e 4b 65 79 20 3d 20 6e   pElem->nKey = n
7470: 4b 65 79 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71  Key;.  pOld = sq
7480: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
7490: 70 2d 3e 68 61 73 68 2c 20 70 45 6c 65 6d 2d 3e  p->hash, pElem->
74a0: 7a 4b 65 79 2c 20 70 45 6c 65 6d 2d 3e 6e 4b 65  zKey, pElem->nKe
74b0: 79 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 69 66 28  y, pElem);.  if(
74c0: 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20   pOld!=0 ){.    
74d0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 45  assert( pOld==pE
74e0: 6c 65 6d 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  lem );  /* Mallo
74f0: 63 20 66 61 69 6c 65 64 20 6f 6e 20 69 6e 73 65  c failed on inse
7500: 72 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  rt */.    sqlite
7510: 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20  Free(pOld);.    
7520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
7540: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 45  em; i++){.    pE
7550: 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 2e 73 2e 66  lem->aMem[i].s.f
7560: 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b  lags = STK_Null;
7570: 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 75 72 72 65  .  }.  p->pCurre
7580: 6e 74 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 72 65  nt = pElem;.  re
7590: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
75a0: 20 47 65 74 20 74 68 65 20 41 67 67 45 6c 65 6d   Get the AggElem
75b0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 66 6f   currently in fo
75c0: 63 75 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  cus.*/.#define A
75d0: 67 67 49 6e 46 6f 63 75 73 28 50 29 20 20 20 28  ggInFocus(P)   (
75e0: 28 50 29 2e 70 43 75 72 72 65 6e 74 20 3f 20 28  (P).pCurrent ? (
75f0: 50 29 2e 70 43 75 72 72 65 6e 74 20 3a 20 5f 41  P).pCurrent : _A
7600: 67 67 49 6e 46 6f 63 75 73 28 26 28 50 29 29 29  ggInFocus(&(P)))
7610: 0a 73 74 61 74 69 63 20 41 67 67 45 6c 65 6d 20  .static AggElem 
7620: 2a 5f 41 67 67 49 6e 46 6f 63 75 73 28 41 67 67  *_AggInFocus(Agg
7630: 20 2a 70 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d   *p){.  HashElem
7640: 20 2a 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65   *pElem = sqlite
7650: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 68 61  HashFirst(&p->ha
7660: 73 68 29 3b 0a 20 20 69 66 28 20 70 45 6c 65 6d  sh);.  if( pElem
7670: 3d 3d 30 20 29 7b 0a 20 20 20 20 41 67 67 49 6e  ==0 ){.    AggIn
7680: 73 65 72 74 28 70 2c 22 22 2c 31 29 3b 0a 20 20  sert(p,"",1);.  
7690: 20 20 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65    pElem = sqlite
76a0: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 68 61  HashFirst(&p->ha
76b0: 73 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sh);.  }.  retur
76c0: 6e 20 70 45 6c 65 6d 20 3f 20 73 71 6c 69 74 65  n pElem ? sqlite
76d0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 20  HashData(pElem) 
76e0: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  : 0;.}../*.** Co
76f0: 6e 76 65 72 74 20 74 68 65 20 67 69 76 65 6e 20  nvert the given 
7700: 73 74 61 63 6b 20 65 6e 74 69 74 79 20 69 6e 74  stack entity int
7710: 6f 20 61 20 73 74 72 69 6e 67 20 69 66 20 69 74  o a string if it
7720: 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c   isn't one.** al
7730: 72 65 61 64 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ready..*/.#defin
7740: 65 20 53 74 72 69 6e 67 69 66 79 28 50 2c 49 29  e Stringify(P,I)
7750: 20 69 66 28 28 61 53 74 61 63 6b 5b 49 5d 2e 66   if((aStack[I].f
7760: 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 72 29 3d  lags & STK_Str)=
7770: 3d 30 29 7b 68 61 72 64 53 74 72 69 6e 67 69 66  =0){hardStringif
7780: 79 28 50 2c 49 29 3b 7d 0a 73 74 61 74 69 63 20  y(P,I);}.static 
7790: 69 6e 74 20 68 61 72 64 53 74 72 69 6e 67 69 66  int hardStringif
77a0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  y(Vdbe *p, int i
77b0: 29 7b 0a 20 20 53 74 61 63 6b 20 2a 70 53 74 61  ){.  Stack *pSta
77c0: 63 6b 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  ck = &p->aStack[
77d0: 69 5d 3b 0a 20 20 69 6e 74 20 66 67 20 3d 20 70  i];.  int fg = p
77e0: 53 74 61 63 6b 2d 3e 66 6c 61 67 73 3b 0a 20 20  Stack->flags;.  
77f0: 69 66 28 20 66 67 20 26 20 53 54 4b 5f 52 65 61  if( fg & STK_Rea
7800: 6c 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  l ){.    sprintf
7810: 28 70 53 74 61 63 6b 2d 3e 7a 2c 22 25 2e 31 35  (pStack->z,"%.15
7820: 67 22 2c 70 53 74 61 63 6b 2d 3e 72 29 3b 0a 20  g",pStack->r);. 
7830: 20 7d 65 6c 73 65 20 69 66 28 20 66 67 20 26 20   }else if( fg & 
7840: 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  STK_Int ){.    s
7850: 70 72 69 6e 74 66 28 70 53 74 61 63 6b 2d 3e 7a  printf(pStack->z
7860: 2c 22 25 64 22 2c 70 53 74 61 63 6b 2d 3e 69 29  ,"%d",pStack->i)
7870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7880: 53 74 61 63 6b 2d 3e 7a 5b 30 5d 20 3d 20 30 3b  Stack->z[0] = 0;
7890: 0a 20 20 7d 0a 20 20 70 2d 3e 7a 53 74 61 63 6b  .  }.  p->zStack
78a0: 5b 69 5d 20 3d 20 70 53 74 61 63 6b 2d 3e 7a 3b  [i] = pStack->z;
78b0: 0a 20 20 70 53 74 61 63 6b 2d 3e 6e 20 3d 20 73  .  pStack->n = s
78c0: 74 72 6c 65 6e 28 70 53 74 61 63 6b 2d 3e 7a 29  trlen(pStack->z)
78d0: 2b 31 3b 0a 20 20 70 53 74 61 63 6b 2d 3e 66 6c  +1;.  pStack->fl
78e0: 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20  ags = STK_Str;. 
78f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7900: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
7910: 67 69 76 65 6e 20 73 74 61 63 6b 20 65 6e 74 69  given stack enti
7920: 74 79 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  ty into a string
7930: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
7940: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
7950: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
7960: 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
7970: 6e 74 20 66 72 6f 6d 20 53 74 72 69 6e 67 69 66  nt from Stringif
7980: 79 28 29 20 61 62 6f 76 65 20 69 6e 20 74 68 61  y() above in tha
7990: 74 0a 2a 2a 20 53 74 72 69 6e 67 69 66 79 28 29  t.** Stringify()
79a0: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 4e 42   will use the NB
79b0: 46 53 20 62 79 74 65 73 20 6f 66 20 73 74 61 74  FS bytes of stat
79c0: 69 63 20 73 74 72 69 6e 67 20 73 70 61 63 65 20  ic string space 
79d0: 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  if the string.**
79e0: 20 77 69 6c 6c 20 66 69 74 20 62 75 74 20 74 68   will fit but th
79f0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
7a00: 73 20 6d 61 6c 6c 6f 63 73 20 66 6f 72 20 73 70  s mallocs for sp
7a10: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ace..** Return n
7a20: 6f 6e 2d 7a 65 72 6f 20 69 66 20 77 65 20 72 75  on-zero if we ru
7a30: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
7a40: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 79 6e 61  .*/.#define Dyna
7a50: 6d 69 63 69 66 79 28 50 2c 49 29 20 28 28 61 53  micify(P,I) ((aS
7a60: 74 61 63 6b 5b 49 5d 2e 66 6c 61 67 73 20 26 20  tack[I].flags & 
7a70: 53 54 4b 5f 44 79 6e 29 3d 3d 30 20 3f 20 68 61  STK_Dyn)==0 ? ha
7a80: 72 64 44 79 6e 61 6d 69 63 69 66 79 28 50 2c 49  rdDynamicify(P,I
7a90: 29 3a 30 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ):0).static int 
7aa0: 68 61 72 64 44 79 6e 61 6d 69 63 69 66 79 28 56  hardDynamicify(V
7ab0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
7ac0: 20 20 53 74 61 63 6b 20 2a 70 53 74 61 63 6b 20    Stack *pStack 
7ad0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 3b  = &p->aStack[i];
7ae0: 0a 20 20 69 6e 74 20 66 67 20 3d 20 70 53 74 61  .  int fg = pSta
7af0: 63 6b 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 68 61  ck->flags;.  cha
7b00: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 28 66 67 20  r *z;.  if( (fg 
7b10: 26 20 53 54 4b 5f 53 74 72 29 3d 3d 30 20 29 7b  & STK_Str)==0 ){
7b20: 0a 20 20 20 20 68 61 72 64 53 74 72 69 6e 67 69  .    hardStringi
7b30: 66 79 28 70 2c 20 69 29 3b 0a 20 20 7d 0a 20 20  fy(p, i);.  }.  
7b40: 61 73 73 65 72 74 28 20 28 66 67 20 26 20 53 54  assert( (fg & ST
7b50: 4b 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 7a  K_Dyn)==0 );.  z
7b60: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
7b70: 61 77 28 20 70 53 74 61 63 6b 2d 3e 6e 20 29 3b  aw( pStack->n );
7b80: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
7b90: 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 63 70 79  turn 1;.  memcpy
7ba0: 28 7a 2c 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d  (z, p->zStack[i]
7bb0: 2c 20 70 53 74 61 63 6b 2d 3e 6e 29 3b 0a 20 20  , pStack->n);.  
7bc0: 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 7a  p->zStack[i] = z
7bd0: 3b 0a 20 20 70 53 74 61 63 6b 2d 3e 66 6c 61 67  ;.  pStack->flag
7be0: 73 20 7c 3d 20 53 54 4b 5f 44 79 6e 3b 0a 20 20  s |= STK_Dyn;.  
7bf0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7c00: 2a 2a 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  ** An ephemeral 
7c10: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 28 73 69  string value (si
7c20: 67 6e 69 66 69 65 64 20 62 79 20 74 68 65 20 53  gnified by the S
7c30: 54 4b 5f 45 70 68 65 6d 20 66 6c 61 67 29 20 63  TK_Ephem flag) c
7c40: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69  ontains.** a poi
7c50: 6e 74 65 72 20 74 6f 20 61 20 64 79 6e 61 6d 69  nter to a dynami
7c60: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
7c70: 73 74 72 69 6e 67 20 77 68 65 72 65 20 73 6f 6d  string where som
7c80: 65 20 6f 74 68 65 72 20 65 6e 74 69 74 79 0a 2a  e other entity.*
7c90: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
7ca0: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e   for deallocatin
7cb0: 67 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  g that string.  
7cc0: 42 65 63 61 75 73 65 20 74 68 65 20 73 74 61 63  Because the stac
7cd0: 6b 20 65 6e 74 72 79 0a 2a 2a 20 64 6f 65 73 20  k entry.** does 
7ce0: 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  not control the 
7cf0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 69 67 68 74  string, it might
7d00: 20 62 65 20 64 65 6c 65 74 65 64 20 77 69 74 68   be deleted with
7d10: 6f 75 74 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a  out the stack.**
7d20: 20 65 6e 74 72 79 20 6b 6e 6f 77 69 6e 67 20 69   entry knowing i
7d30: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
7d40: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
7d50: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
7d60: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
7d70: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
7d80: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
7d90: 68 65 20 73 74 61 63 6b 20 65 6e 74 72 79 20 69  he stack entry i
7da0: 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20  tself controls. 
7db0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7dc0: 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20   it.** converts 
7dd0: 61 6e 20 53 54 4b 5f 45 70 68 65 6d 20 73 74 72  an STK_Ephem str
7de0: 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53 54 4b 5f  ing into an STK_
7df0: 44 79 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23  Dyn string..*/.#
7e00: 64 65 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72  define Deephemer
7e10: 61 6c 69 7a 65 28 50 2c 49 29 20 5c 0a 20 20 20  alize(P,I) \.   
7e20: 69 66 28 20 28 28 50 29 2d 3e 61 53 74 61 63 6b  if( ((P)->aStack
7e30: 5b 49 5d 2e 66 6c 61 67 73 26 53 54 4b 5f 45 70  [I].flags&STK_Ep
7e40: 68 65 6d 29 21 3d 30 20 26 26 20 68 61 72 64 44  hem)!=0 && hardD
7e50: 65 65 70 68 65 6d 28 50 2c 49 29 20 29 7b 20 67  eephem(P,I) ){ g
7e60: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 73 74 61  oto no_mem;}.sta
7e70: 74 69 63 20 69 6e 74 20 68 61 72 64 44 65 65 70  tic int hardDeep
7e80: 68 65 6d 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  hem(Vdbe *p, int
7e90: 20 69 29 7b 0a 20 20 53 74 61 63 6b 20 2a 70 53   i){.  Stack *pS
7ea0: 74 61 63 6b 20 3d 20 26 70 2d 3e 61 53 74 61 63  tack = &p->aStac
7eb0: 6b 5b 69 5d 3b 0a 20 20 63 68 61 72 20 2a 2a 70  k[i];.  char **p
7ec0: 7a 53 74 61 63 6b 20 3d 20 26 70 2d 3e 7a 53 74  zStack = &p->zSt
7ed0: 61 63 6b 5b 69 5d 3b 0a 20 20 63 68 61 72 20 2a  ack[i];.  char *
7ee0: 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  z;.  assert( (pS
7ef0: 74 61 63 6b 2d 3e 66 6c 61 67 73 20 26 20 53 54  tack->flags & ST
7f00: 4b 5f 45 70 68 65 6d 29 21 3d 30 20 29 3b 0a 20  K_Ephem)!=0 );. 
7f10: 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   z = sqliteMallo
7f20: 63 52 61 77 28 20 70 53 74 61 63 6b 2d 3e 6e 20  cRaw( pStack->n 
7f30: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
7f40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 63  return 1;.  memc
7f50: 70 79 28 7a 2c 20 2a 70 7a 53 74 61 63 6b 2c 20  py(z, *pzStack, 
7f60: 70 53 74 61 63 6b 2d 3e 6e 29 3b 0a 20 20 2a 70  pStack->n);.  *p
7f70: 7a 53 74 61 63 6b 20 3d 20 7a 3b 0a 20 20 70 53  zStack = z;.  pS
7f80: 74 61 63 6b 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  tack->flags &= ~
7f90: 53 54 4b 5f 45 70 68 65 6d 3b 0a 20 20 70 53 74  STK_Ephem;.  pSt
7fa0: 61 63 6b 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 54  ack->flags |= ST
7fb0: 4b 5f 44 79 6e 3b 0a 20 20 72 65 74 75 72 6e 20  K_Dyn;.  return 
7fc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
7fd0: 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
7fe0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
7ff0: 68 65 20 67 69 76 65 6e 20 73 74 61 63 6b 20 6c  he given stack l
8000: 65 76 65 6c 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  evel.*/.#define 
8010: 52 65 6c 65 61 73 65 28 50 2c 49 29 20 20 69 66  Release(P,I)  if
8020: 28 28 50 29 2d 3e 61 53 74 61 63 6b 5b 49 5d 2e  ((P)->aStack[I].
8030: 66 6c 61 67 73 26 53 54 4b 5f 44 79 6e 29 7b 20  flags&STK_Dyn){ 
8040: 68 61 72 64 52 65 6c 65 61 73 65 28 50 2c 49 29  hardRelease(P,I)
8050: 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ; }.static void 
8060: 68 61 72 64 52 65 6c 65 61 73 65 28 56 64 62 65  hardRelease(Vdbe
8070: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 73   *p, int i){.  s
8080: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53 74  qliteFree(p->zSt
8090: 61 63 6b 5b 69 5d 29 3b 0a 20 20 70 2d 3e 7a 53  ack[i]);.  p->zS
80a0: 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20 70  tack[i] = 0;.  p
80b0: 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ->aStack[i].flag
80c0: 73 20 26 3d 20 7e 28 53 54 4b 5f 53 74 72 7c 53  s &= ~(STK_Str|S
80d0: 54 4b 5f 44 79 6e 7c 53 54 4b 5f 53 74 61 74 69  TK_Dyn|STK_Stati
80e0: 63 7c 53 54 4b 5f 45 70 68 65 6d 29 3b 0a 7d 0a  c|STK_Ephem);.}.
80f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
8100: 55 45 20 69 66 20 7a 4e 75 6d 20 69 73 20 61 20  UE if zNum is a 
8110: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
8120: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 0a  teger and write.
8130: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
8140: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  the integer into
8150: 20 2a 70 4e 75 6d 2e 20 20 49 66 20 7a 4e 75 6d   *pNum.  If zNum
8160: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
8170: 65 72 0a 2a 2a 20 6f 72 20 69 73 20 61 6e 20 69  er.** or is an i
8180: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 74  nteger that is t
8190: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 65  oo large to be e
81a0: 78 70 72 65 73 73 65 64 20 77 69 74 68 20 6a 75  xpressed with ju
81b0: 73 74 20 33 32 0a 2a 2a 20 62 69 74 73 2c 20 74  st 32.** bits, t
81c0: 68 65 6e 20 72 65 74 75 72 6e 20 66 61 6c 73 65  hen return false
81d0: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 4c 69  ..**.** Under Li
81e0: 6e 75 78 20 28 52 65 64 48 61 74 20 37 2e 32 29  nux (RedHat 7.2)
81f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8200: 20 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61   much faster tha
8210: 6e 20 61 74 6f 69 28 29 0a 2a 2a 20 66 6f 72 20  n atoi().** for 
8220: 63 6f 6e 76 65 72 74 69 6e 67 20 73 74 72 69 6e  converting strin
8230: 67 73 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  gs into integers
8240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8250: 74 6f 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  toInt(const char
8260: 20 2a 7a 4e 75 6d 2c 20 69 6e 74 20 2a 70 4e 75   *zNum, int *pNu
8270: 6d 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  m){.  int v = 0;
8280: 0a 20 20 69 6e 74 20 6e 65 67 3b 0a 20 20 69 6e  .  int neg;.  in
8290: 74 20 69 2c 20 63 3b 0a 20 20 69 66 28 20 2a 7a  t i, c;.  if( *z
82a0: 4e 75 6d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  Num=='-' ){.    
82b0: 6e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 75  neg = 1;.    zNu
82c0: 6d 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  m++;.  }else if(
82d0: 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 7b 0a 20   *zNum=='+' ){. 
82e0: 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20 20 20     neg = 0;.    
82f0: 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  zNum++;.  }else{
8300: 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20  .    neg = 0;.  
8310: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d  }.  for(i=0; (c=
8320: 7a 4e 75 6d 5b 69 5d 29 3e 3d 27 30 27 20 26 26  zNum[i])>='0' &&
8330: 20 63 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20   c<='9'; i++){. 
8340: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20     v = v*10 + c 
8350: 2d 20 27 30 27 3b 0a 20 20 7d 0a 20 20 2a 70 4e  - '0';.  }.  *pN
8360: 75 6d 20 3d 20 6e 65 67 20 3f 20 2d 76 20 3a 20  um = neg ? -v : 
8370: 76 3b 0a 20 20 72 65 74 75 72 6e 20 63 3d 3d 30  v;.  return c==0
8380: 20 26 26 20 69 3e 30 20 26 26 20 28 69 3c 31 30   && i>0 && (i<10
8390: 20 7c 7c 20 28 69 3d 3d 31 30 20 26 26 20 6d 65   || (i==10 && me
83a0: 6d 63 6d 70 28 7a 4e 75 6d 2c 22 32 31 34 37 34  mcmp(zNum,"21474
83b0: 38 33 36 34 37 22 2c 31 30 29 3c 3d 30 29 29 3b  83647",10)<=0));
83c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
83d0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 63  t the given stac
83e0: 6b 20 65 6e 74 69 74 79 20 69 6e 74 6f 20 61 20  k entity into a 
83f0: 69 6e 74 65 67 65 72 20 69 66 20 69 74 20 69 73  integer if it is
8400: 6e 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61  n't one.** alrea
8410: 64 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 70 72  dy..**.** Any pr
8420: 69 6f 72 20 73 74 72 69 6e 67 20 6f 72 20 72 65  ior string or re
8430: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
8440: 6e 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64  n is invalidated
8450: 2e 20 20 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65  .  .** NULLs are
8460: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
8470: 30 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 6e  0..*/.#define In
8480: 74 65 67 65 72 69 66 79 28 50 2c 49 29 20 5c 0a  tegerify(P,I) \.
8490: 20 20 20 20 69 66 28 28 28 50 29 2d 3e 61 53 74      if(((P)->aSt
84a0: 61 63 6b 5b 28 49 29 5d 2e 66 6c 61 67 73 26 53  ack[(I)].flags&S
84b0: 54 4b 5f 49 6e 74 29 3d 3d 30 29 7b 20 68 61 72  TK_Int)==0){ har
84c0: 64 49 6e 74 65 67 65 72 69 66 79 28 50 2c 49 29  dIntegerify(P,I)
84d0: 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ; }.static void 
84e0: 68 61 72 64 49 6e 74 65 67 65 72 69 66 79 28 56  hardIntegerify(V
84f0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
8500: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b    if( p->aStack[
8510: 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 52  i].flags & STK_R
8520: 65 61 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  eal ){.    p->aS
8530: 74 61 63 6b 5b 69 5d 2e 69 20 3d 20 28 69 6e 74  tack[i].i = (int
8540: 29 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 72 3b  )p->aStack[i].r;
8550: 0a 20 20 20 20 52 65 6c 65 61 73 65 28 70 2c 20  .    Release(p, 
8560: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
8570: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61  p->aStack[i].fla
8580: 67 73 20 26 20 53 54 4b 5f 53 74 72 20 29 7b 0a  gs & STK_Str ){.
8590: 20 20 20 20 74 6f 49 6e 74 28 70 2d 3e 7a 53 74      toInt(p->zSt
85a0: 61 63 6b 5b 69 5d 2c 20 26 70 2d 3e 61 53 74 61  ack[i], &p->aSta
85b0: 63 6b 5b 69 5d 2e 69 29 3b 0a 20 20 20 20 52 65  ck[i].i);.    Re
85c0: 6c 65 61 73 65 28 70 2c 20 69 29 3b 0a 20 20 7d  lease(p, i);.  }
85d0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 53 74  else{.    p->aSt
85e0: 61 63 6b 5b 69 5d 2e 69 20 3d 20 30 3b 0a 20 20  ack[i].i = 0;.  
85f0: 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d  }.  p->aStack[i]
8600: 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74  .flags = STK_Int
8610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
8620: 20 76 61 6c 69 64 20 52 65 61 6c 20 72 65 70 72   valid Real repr
8630: 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
8640: 68 65 20 67 69 76 65 6e 20 73 74 61 63 6b 20 65  he given stack e
8650: 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lement..**.** An
8660: 79 20 70 72 69 6f 72 20 73 74 72 69 6e 67 20 6f  y prior string o
8670: 72 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  r integer repres
8680: 65 6e 74 61 74 69 6f 6e 20 69 73 20 72 65 74 61  entation is reta
8690: 69 6e 65 64 2e 0a 2a 2a 20 4e 55 4c 4c 73 20 61  ined..** NULLs a
86a0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
86b0: 6f 20 30 2e 30 2e 0a 2a 2f 0a 23 64 65 66 69 6e  o 0.0..*/.#defin
86c0: 65 20 52 65 61 6c 69 66 79 28 50 2c 49 29 20 5c  e Realify(P,I) \
86d0: 0a 20 20 20 20 69 66 28 28 28 50 29 2d 3e 61 53  .    if(((P)->aS
86e0: 74 61 63 6b 5b 28 49 29 5d 2e 66 6c 61 67 73 26  tack[(I)].flags&
86f0: 53 54 4b 5f 52 65 61 6c 29 3d 3d 30 29 7b 20 68  STK_Real)==0){ h
8700: 61 72 64 52 65 61 6c 69 66 79 28 50 2c 49 29 3b  ardRealify(P,I);
8710: 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68   }.static void h
8720: 61 72 64 52 65 61 6c 69 66 79 28 56 64 62 65 20  ardRealify(Vdbe 
8730: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66  *p, int i){.  if
8740: 28 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 66  ( p->aStack[i].f
8750: 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 72 20 29  lags & STK_Str )
8760: 7b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b  {.    p->aStack[
8770: 69 5d 2e 72 20 3d 20 61 74 6f 66 28 70 2d 3e 7a  i].r = atof(p->z
8780: 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 7d 65 6c  Stack[i]);.  }el
8790: 73 65 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  se if( p->aStack
87a0: 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [i].flags & STK_
87b0: 49 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  Int ){.    p->aS
87c0: 74 61 63 6b 5b 69 5d 2e 72 20 3d 20 70 2d 3e 61  tack[i].r = p->a
87d0: 53 74 61 63 6b 5b 69 5d 2e 69 3b 0a 20 20 7d 65  Stack[i].i;.  }e
87e0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 53 74 61  lse{.    p->aSta
87f0: 63 6b 5b 69 5d 2e 72 20 3d 20 30 2e 30 3b 0a 20  ck[i].r = 0.0;. 
8800: 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69   }.  p->aStack[i
8810: 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 54 4b 5f 52  ].flags |= STK_R
8820: 65 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  eal;.}../*.** Po
8830: 70 20 74 68 65 20 73 74 61 63 6b 20 4e 20 74 69  p the stack N ti
8840: 6d 65 73 2e 20 20 46 72 65 65 20 61 6e 79 20 6d  mes.  Free any m
8850: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
8860: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 70 6f 70   with the.** pop
8870: 70 65 64 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e  ped stack elemen
8880: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
8890: 69 64 20 50 6f 70 53 74 61 63 6b 28 56 64 62 65  id PopStack(Vdbe
88a0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
88b0: 73 73 65 72 74 28 20 4e 3e 3d 30 20 29 3b 0a 20  ssert( N>=0 );. 
88c0: 20 69 66 28 20 70 2d 3e 7a 53 74 61 63 6b 3d 3d   if( p->zStack==
88d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
88e0: 73 65 72 74 28 20 70 2d 3e 61 53 74 61 63 6b 20  sert( p->aStack 
88f0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
8900: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  _failed );.  if(
8910: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 20   p->aStack==0 ) 
8920: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
8930: 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   N-- > 0 ){.    
8940: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  if( p->aStack[p-
8950: 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54  >tos].flags & ST
8960: 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73  K_Dyn ){.      s
8970: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53 74  qliteFree(p->zSt
8980: 61 63 6b 5b 70 2d 3e 74 6f 73 5d 29 3b 0a 20 20  ack[p->tos]);.  
8990: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53 74 61 63    }.    p->aStac
89a0: 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20  k[p->tos].flags 
89b0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 53 74 61  = 0;.    p->zSta
89c0: 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 30 3b 0a  ck[p->tos] = 0;.
89d0: 20 20 20 20 70 2d 3e 74 6f 73 2d 2d 3b 0a 20 20      p->tos--;.  
89e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  }.}../*.** Here 
89f0: 69 73 20 61 20 6d 61 63 72 6f 20 74 6f 20 68 61  is a macro to ha
8a00: 6e 64 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ndle the common 
8a10: 63 61 73 65 20 6f 66 20 70 6f 70 70 69 6e 67 20  case of popping 
8a20: 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 6f 6e 63  the stack.** onc
8a30: 65 2e 20 20 54 68 69 73 20 6d 61 63 72 6f 20 6f  e.  This macro o
8a40: 6e 6c 79 20 77 6f 72 6b 73 20 66 72 6f 6d 20 77  nly works from w
8a50: 69 74 68 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ithin the sqlite
8a60: 56 64 62 65 45 78 65 63 28 29 0a 2a 2a 20 66 75  VdbeExec().** fu
8a70: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  nction..*/.#defi
8a80: 6e 65 20 50 4f 50 53 54 41 43 4b 20 5c 0a 20 20  ne POPSTACK \.  
8a90: 61 73 73 65 72 74 28 70 2d 3e 74 6f 73 3e 3d 30  assert(p->tos>=0
8aa0: 29 3b 20 5c 0a 20 20 69 66 28 20 61 53 74 61 63  ); \.  if( aStac
8ab0: 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20  k[p->tos].flags 
8ac0: 26 20 53 54 4b 5f 44 79 6e 20 29 20 73 71 6c 69  & STK_Dyn ) sqli
8ad0: 74 65 46 72 65 65 28 7a 53 74 61 63 6b 5b 70 2d  teFree(zStack[p-
8ae0: 3e 74 6f 73 5d 29 3b 20 5c 0a 20 20 70 2d 3e 74  >tos]); \.  p->t
8af0: 6f 73 2d 2d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  os--;../*.** Del
8b00: 65 74 65 20 61 20 6b 65 79 6c 69 73 74 0a 2a 2f  ete a keylist.*/
8b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4b 65 79  .static void Key
8b20: 6c 69 73 74 46 72 65 65 28 4b 65 79 6c 69 73 74  listFree(Keylist
8b30: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
8b40: 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74 20   ){.    Keylist 
8b50: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
8b60: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  t;.    sqliteFre
8b70: 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  e(p);.    p = pN
8b80: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
8b90: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
8ba0: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
8bb0: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
8bc0: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
8bd0: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
8be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
8bf0: 65 61 6e 75 70 43 75 72 73 6f 72 28 43 75 72 73  eanupCursor(Curs
8c00: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
8c10: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
8c20: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 43      sqliteBtreeC
8c30: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
8c40: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
8c50: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
8c60: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 43      sqliteBtreeC
8c70: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
8c80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
8c90: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
8ca0: 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73  memset(pCx, 0, s
8cb0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 0a  izeof(Cursor));.
8cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
8cd0: 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74  ll cursors.*/.st
8ce0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
8cf0: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
8d00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  p){.  int i;.  f
8d10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
8d20: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
8d30: 63 6c 65 61 6e 75 70 43 75 72 73 6f 72 28 26 70  cleanupCursor(&p
8d40: 2d 3e 61 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a  ->aCsr[i]);.  }.
8d50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
8d60: 61 43 73 72 29 3b 0a 20 20 70 2d 3e 61 43 73 72  aCsr);.  p->aCsr
8d70: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 75 72 73   = 0;.  p->nCurs
8d80: 6f 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  or = 0;.}../*.**
8d90: 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6c 65 6d   Remove any elem
8da0: 65 6e 74 73 20 74 68 61 74 20 72 65 6d 61 69 6e  ents that remain
8db0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 66   on the sorter f
8dc0: 6f 72 20 74 68 65 20 56 44 42 45 20 67 69 76 65  or the VDBE give
8dd0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
8de0: 64 20 53 6f 72 74 65 72 52 65 73 65 74 28 56 64  d SorterReset(Vd
8df0: 62 65 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  be *p){.  while(
8e00: 20 70 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20 20   p->pSort ){.   
8e10: 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72   Sorter *pSorter
8e20: 20 3d 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20 20   = p->pSort;.   
8e30: 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f 72   p->pSort = pSor
8e40: 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ter->pNext;.    
8e50: 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74  sqliteFree(pSort
8e60: 65 72 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20 73  er->zKey);.    s
8e70: 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74 65  qliteFree(pSorte
8e80: 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  r->pData);.    s
8e90: 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74 65  qliteFree(pSorte
8ea0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
8eb0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
8ec0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
8ed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8ee0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
8ef0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
8f00: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
8f10: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
8f20: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
8f30: 66 74 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ft open..*/.stat
8f40: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
8f50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8f60: 69 3b 0a 20 20 50 6f 70 53 74 61 63 6b 28 70 2c  i;.  PopStack(p,
8f70: 20 70 2d 3e 74 6f 73 2b 31 29 3b 0a 20 20 63 6c   p->tos+1);.  cl
8f80: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
8f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
8fa0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
8fb0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
8fc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4d  .      if( p->aM
8fd0: 65 6d 5b 69 5d 2e 73 2e 66 6c 61 67 73 20 26 20  em[i].s.flags & 
8fe0: 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  STK_Dyn ){.     
8ff0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
9000: 3e 61 4d 65 6d 5b 69 5d 2e 7a 29 3b 0a 20 20 20  >aMem[i].z);.   
9010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
9030: 4d 65 6d 29 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20  Mem);.  p->aMem 
9040: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d  = 0;.  p->nMem =
9050: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   0;.  if( p->pLi
9060: 73 74 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73  st ){.    Keylis
9070: 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74 29 3b  tFree(p->pList);
9080: 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20  .    p->pList = 
9090: 30 3b 0a 20 20 7d 0a 20 20 53 6f 72 74 65 72 52  0;.  }.  SorterR
90a0: 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 70  eset(p);.  if( p
90b0: 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  ->pFile ){.    i
90c0: 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74 64  f( p->pFile!=std
90d0: 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e 70  in ) fclose(p->p
90e0: 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  File);.    p->pF
90f0: 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ile = 0;.  }.  i
9100: 66 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29 7b  f( p->azField ){
9110: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9120: 70 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20 20  p->azField);.   
9130: 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30 3b   p->azField = 0;
9140: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  .  }.  p->nField
9150: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
9160: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Line ){.    sqli
9170: 74 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65 29  teFree(p->zLine)
9180: 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d  ;.    p->zLine =
9190: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 69   0;.  }.  p->nLi
91a0: 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 41  neAlloc = 0;.  A
91b0: 67 67 52 65 73 65 74 28 26 70 2d 3e 61 67 67 29  ggReset(&p->agg)
91c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 65 74 20  ;.  if( p->aSet 
91d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
91e0: 69 3c 70 2d 3e 6e 53 65 74 3b 20 69 2b 2b 29 7b  i<p->nSet; i++){
91f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
9200: 68 43 6c 65 61 72 28 26 70 2d 3e 61 53 65 74 5b  hClear(&p->aSet[
9210: 69 5d 2e 68 61 73 68 29 3b 0a 20 20 20 20 7d 0a  i].hash);.    }.
9220: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
9230: 28 70 2d 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e  (p->aSet);.  p->
9240: 61 53 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  aSet = 0;.  p->n
9250: 53 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Set = 0;.  if( p
9260: 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 20 29  ->keylistStack )
9270: 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
9280: 20 20 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69    for(ii = 0; ii
9290: 20 3c 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61   < p->keylistSta
92a0: 63 6b 44 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a  ckDepth; ii++){.
92b0: 20 20 20 20 20 20 4b 65 79 6c 69 73 74 46 72 65        KeylistFre
92c0: 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63  e(p->keylistStac
92d0: 6b 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  k[ii]);.    }.  
92e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
92f0: 6b 65 79 6c 69 73 74 53 74 61 63 6b 29 3b 0a 20  keylistStack);. 
9300: 20 20 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61     p->keylistSta
9310: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20  ckDepth = 0;.   
9320: 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b   p->keylistStack
9330: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
9340: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  teFree(p->zErrMs
9350: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
9360: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = 0;.  p->magic
9370: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
9380: 41 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  AD;.}../*.** Del
9390: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
93a0: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
93b0: 74 65 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  teVdbeDelete(Vdb
93c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
93d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
93e0: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
93f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
9400: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
9410: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
9420: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
9430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
9440: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
9450: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
9460: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
9470: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
9480: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
9490: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
94a0: 20 20 7d 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d    }.  p->pPrev =
94b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
94c0: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
94d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ==0 ){.    p->aO
94e0: 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4f  p = 0;.    p->nO
94f0: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  p = 0;.  }.  for
9500: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
9510: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  i++){.    if( p-
9520: 3e 61 4f 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d  >aOp[i].p3type==
9530: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
9540: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
9550: 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20  ->aOp[i].p3);.  
9560: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
9570: 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  Free(p->aOp);.  
9580: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c  sqliteFree(p->aL
9590: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46  abel);.  sqliteF
95a0: 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a  ree(p->aStack);.
95b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
95c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  .}../*.** Give a
95d0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
95e0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
95f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
9600: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
9610: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
9620: 61 73 20 73 71 6c 69 74 65 56 64 62 65 45 78 65  as sqliteVdbeExe
9630: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
9640: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
9650: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
9660: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
9670: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
9680: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
9690: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
96a0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
96b0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a  t "EXPLAIN"..*/.
96c0: 69 6e 74 20 73 71 6c 69 74 65 56 64 62 65 4c 69  int sqliteVdbeLi
96d0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
9700: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
9710: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
9720: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
9730: 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 5d 20  azColumnNames[] 
9740: 3d 20 7b 0a 20 20 20 20 20 22 61 64 64 72 22 2c  = {.     "addr",
9750: 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c   "opcode", "p1",
9760: 20 20 22 70 32 22 2c 20 20 22 70 33 22 2c 20 0a    "p2",  "p3", .
9770: 20 20 20 20 20 22 69 6e 74 22 2c 20 20 22 74 65       "int",  "te
9780: 78 74 22 2c 20 20 20 22 69 6e 74 22 2c 20 22 69  xt",   "int", "i
9790: 6e 74 22 2c 20 22 74 65 78 74 22 2c 0a 20 20 20  nt", "text",.   
97a0: 20 20 30 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65    0.  };..  asse
97b0: 72 74 28 20 70 2d 3e 70 6f 70 53 74 61 63 6b 3d  rt( p->popStack=
97c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
97d0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
97e0: 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 61  p->azColName = a
97f0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 73 3b 0a 20 20  zColumnNames;.  
9800: 70 2d 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d  p->azResColumn =
9810: 20 70 2d 3e 7a 53 74 61 63 6b 3b 0a 20 20 66 6f   p->zStack;.  fo
9820: 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=0; i<5; i++)
9830: 20 70 2d 3e 7a 53 74 61 63 6b 5b 69 5d 20 3d 20   p->zStack[i] = 
9840: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 7a 3b 0a  p->aStack[i].z;.
9850: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9860: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  _OK;.  for(i=p->
9870: 70 63 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  pc; p->rc==SQLIT
9880: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 4f 70  E_OK && i<p->nOp
9890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
98a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
98b0: 54 45 5f 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  TE_Interrupt ){.
98c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
98d0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
98e0: 72 75 70 74 3b 0a 20 20 20 20 20 20 69 66 28 20  rupt;.      if( 
98f0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
9900: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a  E_MAGIC_BUSY ){.
9910: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
9920: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
9930: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9940: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9950: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
9960: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9970: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  teSetString(&p->
9980: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f  zErrMsg, sqlite_
9990: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e  error_string(p->
99a0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  rc), 0);.      b
99b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
99c0: 73 70 72 69 6e 74 66 28 70 2d 3e 7a 53 74 61 63  sprintf(p->zStac
99d0: 6b 5b 30 5d 2c 22 25 64 22 2c 69 29 3b 0a 20 20  k[0],"%d",i);.  
99e0: 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 53 74    sprintf(p->zSt
99f0: 61 63 6b 5b 32 5d 2c 22 25 64 22 2c 20 70 2d 3e  ack[2],"%d", p->
9a00: 61 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20 20  aOp[i].p1);.    
9a10: 73 70 72 69 6e 74 66 28 70 2d 3e 7a 53 74 61 63  sprintf(p->zStac
9a20: 6b 5b 33 5d 2c 22 25 64 22 2c 20 70 2d 3e 61 4f  k[3],"%d", p->aO
9a30: 70 5b 69 5d 2e 70 32 29 3b 0a 20 20 20 20 69 66  p[i].p2);.    if
9a40: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79  ( p->aOp[i].p3ty
9a50: 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29  pe==P3_POINTER )
9a60: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
9a70: 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a 2c 20  p->aStack[4].z, 
9a80: 22 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74  "ptr(%#x)", (int
9a90: 29 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a  )p->aOp[i].p3);.
9aa0: 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b        p->zStack[
9ab0: 34 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 34  4] = p->aStack[4
9ac0: 5d 2e 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ].z;.    }else{.
9ad0: 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 63 6b 5b        p->zStack[
9ae0: 34 5d 20 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  4] = p->aOp[i].p
9af0: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  3;.    }.    p->
9b00: 7a 53 74 61 63 6b 5b 31 5d 20 3d 20 73 71 6c 69  zStack[1] = sqli
9b10: 74 65 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 2d  teOpcodeNames[p-
9b20: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 5d 3b  >aOp[i].opcode];
9b30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 78 43 61 6c  .    if( p->xCal
9b40: 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  lback==0 ){.    
9b50: 20 20 70 2d 3e 70 63 20 3d 20 69 2b 31 3b 0a 20    p->pc = i+1;. 
9b60: 20 20 20 20 20 70 2d 3e 61 7a 52 65 73 43 6f 6c       p->azResCol
9b70: 75 6d 6e 20 3d 20 70 2d 3e 7a 53 74 61 63 6b 3b  umn = p->zStack;
9b80: 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  .      p->nResCo
9b90: 6c 75 6d 6e 20 3d 20 35 3b 0a 20 20 20 20 20 20  lumn = 5;.      
9ba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f  return SQLITE_RO
9bb0: 57 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  W;.    }.    if(
9bc0: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66   sqliteSafetyOff
9bd0: 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  (db) ){.      p-
9be0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
9bf0: 55 53 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  USE;.      break
9c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9c10: 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 70 2d 3e  p->xCallback(p->
9c20: 70 43 62 41 72 67 2c 20 35 2c 20 70 2d 3e 7a 53  pCbArg, 5, p->zS
9c30: 74 61 63 6b 2c 20 70 2d 3e 61 7a 43 6f 6c 4e 61  tack, p->azColNa
9c40: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  me) ){.      p->
9c50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52  rc = SQLITE_ABOR
9c60: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
9c70: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e 28   sqliteSafetyOn(
9c80: 64 62 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  db) ){.      p->
9c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
9ca0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SE;.    }.  }.  
9cb0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3d 3d 53 51  return p->rc==SQ
9cc0: 4c 49 54 45 5f 4f 4b 20 3f 20 53 51 4c 49 54 45  LITE_OK ? SQLITE
9cd0: 5f 44 4f 4e 45 20 3a 20 53 51 4c 49 54 45 5f 45  _DONE : SQLITE_E
9ce0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
9cf0: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  he parameters ar
9d00: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  e pointers to th
9d10: 65 20 68 65 61 64 20 6f 66 20 74 77 6f 20 73 6f  e head of two so
9d20: 72 74 65 64 20 6c 69 73 74 73 0a 2a 2a 20 6f 66  rted lists.** of
9d30: 20 53 6f 72 74 65 72 20 73 74 72 75 63 74 75 72   Sorter structur
9d40: 65 73 2e 20 20 4d 65 72 67 65 20 74 68 65 73 65  es.  Merge these
9d50: 20 74 77 6f 20 6c 69 73 74 73 20 74 6f 67 65 74   two lists toget
9d60: 68 65 72 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  her and return.*
9d70: 2a 20 61 20 73 69 6e 67 6c 65 20 73 6f 72 74 65  * a single sorte
9d80: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 72 6f  d list.  This ro
9d90: 75 74 69 6e 65 20 66 6f 72 6d 73 20 74 68 65 20  utine forms the 
9da0: 63 6f 72 65 20 6f 66 20 74 68 65 20 6d 65 72 67  core of the merg
9db0: 65 2d 73 6f 72 74 0a 2a 2a 20 61 6c 67 6f 72 69  e-sort.** algori
9dc0: 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  thm..**.** In th
9dd0: 65 20 63 61 73 65 20 6f 66 20 61 20 74 69 65 2c  e case of a tie,
9de0: 20 6c 65 66 74 20 73 6f 72 74 73 20 69 6e 20 66   left sorts in f
9df0: 72 6f 6e 74 20 6f 66 20 72 69 67 68 74 2e 0a 2a  ront of right..*
9e00: 2f 0a 73 74 61 74 69 63 20 53 6f 72 74 65 72 20  /.static Sorter 
9e10: 2a 4d 65 72 67 65 28 53 6f 72 74 65 72 20 2a 70  *Merge(Sorter *p
9e20: 4c 65 66 74 2c 20 53 6f 72 74 65 72 20 2a 70 52  Left, Sorter *pR
9e30: 69 67 68 74 29 7b 0a 20 20 53 6f 72 74 65 72 20  ight){.  Sorter 
9e40: 73 48 65 61 64 3b 0a 20 20 53 6f 72 74 65 72 20  sHead;.  Sorter 
9e50: 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
9e60: 3d 20 26 73 48 65 61 64 3b 0a 20 20 70 54 61 69  = &sHead;.  pTai
9e70: 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  l->pNext = 0;.  
9e80: 77 68 69 6c 65 28 20 70 4c 65 66 74 20 26 26 20  while( pLeft && 
9e90: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 69 6e  pRight ){.    in
9ea0: 74 20 63 20 3d 20 73 71 6c 69 74 65 53 6f 72 74  t c = sqliteSort
9eb0: 43 6f 6d 70 61 72 65 28 70 4c 65 66 74 2d 3e 7a  Compare(pLeft->z
9ec0: 4b 65 79 2c 20 70 52 69 67 68 74 2d 3e 7a 4b 65  Key, pRight->zKe
9ed0: 79 29 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 30  y);.    if( c<=0
9ee0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d   ){.      pTail-
9ef0: 3e 70 4e 65 78 74 20 3d 20 70 4c 65 66 74 3b 0a  >pNext = pLeft;.
9f00: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c        pLeft = pL
9f10: 65 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  eft->pNext;.    
9f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
9f30: 69 6c 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  il->pNext = pRig
9f40: 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ht;.      pRight
9f50: 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78 74   = pRight->pNext
9f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
9f70: 6c 20 3d 20 70 54 61 69 6c 2d 3e 70 4e 65 78 74  l = pTail->pNext
9f80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 65 66  ;.  }.  if( pLef
9f90: 74 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  t ){.    pTail->
9fa0: 70 4e 65 78 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pNext = pLeft;. 
9fb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
9fc0: 74 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  t ){.    pTail->
9fd0: 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
9fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 48 65    }.  return sHe
9ff0: 61 64 2e 70 4e 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a  ad.pNext;.}../*.
a000: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e  ** Convert an in
a010: 74 65 67 65 72 20 69 6e 20 62 65 74 77 65 65 6e  teger in between
a020: 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65   the native inte
a030: 67 65 72 20 66 6f 72 6d 61 74 20 61 6e 64 0a 2a  ger format and.*
a040: 2a 20 74 68 65 20 62 69 67 45 6e 64 69 61 6e 20  * the bigEndian 
a050: 66 6f 72 6d 61 74 20 75 73 65 64 20 61 73 20 74  format used as t
a060: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
a070: 20 66 6f 72 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a   for tables..**.
a080: 2a 2a 20 54 68 65 20 62 69 67 45 6e 64 69 61 6e  ** The bigEndian
a090: 20 66 6f 72 6d 61 74 20 28 6d 6f 73 74 20 73 69   format (most si
a0a0: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 66  gnificant byte f
a0b0: 69 72 73 74 29 20 69 73 20 75 73 65 64 20 66 6f  irst) is used fo
a0c0: 72 0a 2a 2a 20 72 65 63 6f 72 64 20 6e 75 6d 62  r.** record numb
a0d0: 65 72 73 20 73 6f 20 74 68 61 74 20 72 65 63 6f  ers so that reco
a0e0: 72 64 73 20 77 69 6c 6c 20 73 6f 72 74 20 69 6e  rds will sort in
a0f0: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  to the correct o
a100: 72 64 65 72 0a 2a 2a 20 65 76 65 6e 20 74 68 6f  rder.** even tho
a110: 75 67 68 20 6d 65 6d 63 6d 70 28 29 20 69 73 20  ugh memcmp() is 
a120: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
a130: 74 68 65 20 6b 65 79 73 2e 20 20 4f 6e 20 6d 61  the keys.  On ma
a140: 63 68 69 6e 65 73 0a 2a 2a 20 77 68 6f 73 65 20  chines.** whose 
a150: 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 66  native integer f
a160: 6f 72 6d 61 74 20 69 73 20 6c 69 74 74 6c 65 20  ormat is little 
a170: 65 6e 64 69 61 6e 20 28 65 78 3a 20 69 34 38 36  endian (ex: i486
a180: 29 20 74 68 65 0a 2a 2a 20 6f 72 64 65 72 20 6f  ) the.** order o
a190: 66 20 62 79 74 65 73 20 69 73 20 72 65 76 65 72  f bytes is rever
a1a0: 73 65 64 2e 20 20 4f 6e 20 6e 61 74 69 76 65 20  sed.  On native 
a1b0: 62 69 67 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69  big-endian machi
a1c0: 6e 65 73 0a 2a 2a 20 28 65 78 3a 20 41 6c 70 68  nes.** (ex: Alph
a1d0: 61 2c 20 53 70 61 72 63 2c 20 4d 6f 74 6f 72 6f  a, Sparc, Motoro
a1e0: 6c 61 29 20 74 68 65 20 62 79 74 65 20 6f 72 64  la) the byte ord
a1f0: 65 72 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  er is the same..
a200: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a210: 69 6f 6e 20 69 73 20 69 74 73 20 6f 77 6e 20 69  ion is its own i
a220: 6e 76 65 72 73 65 2e 20 20 49 6e 20 6f 74 68 65  nverse.  In othe
a230: 72 20 77 6f 72 64 73 0a 2a 2a 0a 2a 2a 20 20 20  r words.**.**   
a240: 20 20 20 20 20 20 58 20 3d 3d 20 62 79 74 65 53        X == byteS
a250: 77 61 70 28 62 79 74 65 53 77 61 70 28 58 29 29  wap(byteSwap(X))
a260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
a270: 79 74 65 53 77 61 70 28 69 6e 74 20 78 29 7b 0a  yteSwap(int x){.
a280: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 20 63    union {.     c
a290: 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28  har zBuf[sizeof(
a2a0: 69 6e 74 29 5d 3b 0a 20 20 20 20 20 69 6e 74 20  int)];.     int 
a2b0: 69 3b 0a 20 20 7d 20 75 78 3b 0a 20 20 75 78 2e  i;.  } ux;.  ux.
a2c0: 7a 42 75 66 5b 33 5d 20 3d 20 78 26 30 78 66 66  zBuf[3] = x&0xff
a2d0: 3b 0a 20 20 75 78 2e 7a 42 75 66 5b 32 5d 20 3d  ;.  ux.zBuf[2] =
a2e0: 20 28 78 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20   (x>>8)&0xff;.  
a2f0: 75 78 2e 7a 42 75 66 5b 31 5d 20 3d 20 28 78 3e  ux.zBuf[1] = (x>
a300: 3e 31 36 29 26 30 78 66 66 3b 0a 20 20 75 78 2e  >16)&0xff;.  ux.
a310: 7a 42 75 66 5b 30 5d 20 3d 20 28 78 3e 3e 32 34  zBuf[0] = (x>>24
a320: 29 26 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  )&0xff;.  return
a330: 20 75 78 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   ux.i;.}../*.** 
a340: 57 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20  When converting 
a350: 66 72 6f 6d 20 74 68 65 20 6e 61 74 69 76 65 20  from the native 
a360: 66 6f 72 6d 61 74 20 74 6f 20 74 68 65 20 6b 65  format to the ke
a370: 79 20 66 6f 72 6d 61 74 20 61 6e 64 20 62 61 63  y format and bac
a380: 6b 0a 2a 2a 20 61 67 61 69 6e 2c 20 69 6e 20 61  k.** again, in a
a390: 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  ddition to chang
a3a0: 69 6e 67 20 74 68 65 20 62 79 74 65 20 6f 72 64  ing the byte ord
a3b0: 65 72 20 77 65 20 69 6e 76 65 72 74 20 74 68 65  er we invert the
a3c0: 20 68 69 67 68 2d 6f 72 64 65 72 0a 2a 2a 20 62   high-order.** b
a3d0: 69 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 73  it of the most s
a3e0: 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 2e  ignificant byte.
a3f0: 20 20 54 68 69 73 20 63 61 75 73 65 73 20 6e 65    This causes ne
a400: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 73 20 74  gative numbers t
a410: 6f 0a 2a 2a 20 73 6f 72 74 20 62 65 66 6f 72 65  o.** sort before
a420: 20 70 6f 73 69 74 69 76 65 20 6e 75 6d 62 65 72   positive number
a430: 73 20 69 6e 20 74 68 65 20 6d 65 6d 63 6d 70 28  s in the memcmp(
a440: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23  ) function..*/.#
a450: 64 65 66 69 6e 65 20 6b 65 79 54 6f 49 6e 74 28  define keyToInt(
a460: 58 29 20 20 20 28 62 79 74 65 53 77 61 70 28 58  X)   (byteSwap(X
a470: 29 20 5e 20 30 78 38 30 30 30 30 30 30 30 29 0a  ) ^ 0x80000000).
a480: 23 64 65 66 69 6e 65 20 69 6e 74 54 6f 4b 65 79  #define intToKey
a490: 28 58 29 20 20 20 28 62 79 74 65 53 77 61 70 28  (X)   (byteSwap(
a4a0: 28 58 29 20 5e 20 30 78 38 30 30 30 30 30 30 30  (X) ^ 0x80000000
a4b0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 63  ))../*.** Code c
a4c0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
a4d0: 74 68 65 20 56 45 52 49 46 59 28 29 20 6d 61 63  the VERIFY() mac
a4e0: 72 6f 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ro is not needed
a4f0: 20 66 6f 72 20 63 6f 72 72 65 63 74 0a 2a 2a 20   for correct.** 
a500: 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 69  execution.  It i
a510: 73 20 74 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20  s there only to 
a520: 63 61 74 63 68 20 65 72 72 6f 72 73 2e 20 20 53  catch errors.  S
a530: 6f 20 77 68 65 6e 20 77 65 20 63 6f 6d 70 69 6c  o when we compil
a540: 65 0a 2a 2a 20 77 69 74 68 20 4e 44 45 42 55 47  e.** with NDEBUG
a550: 3d 31 2c 20 74 68 65 20 56 45 52 49 46 59 28 29  =1, the VERIFY()
a560: 20 63 6f 64 65 20 69 73 20 6f 6d 69 74 74 65 64   code is omitted
a570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 4e 44 45 42  ..*/.#ifdef NDEB
a580: 55 47 0a 23 20 64 65 66 69 6e 65 20 56 45 52 49  UG.# define VERI
a590: 46 59 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  FY(X).#else.# de
a5a0: 66 69 6e 65 20 56 45 52 49 46 59 28 58 29 20 58  fine VERIFY(X) X
a5b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
a5c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a5d0: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
a5e0: 61 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 66 6f  a replacement fo
a5f0: 72 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a  r the standard.*
a600: 2a 20 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e  * library routin
a610: 65 20 66 67 65 74 73 28 29 2e 20 20 54 68 65 20  e fgets().  The 
a620: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6e  difference is in
a630: 20 68 6f 77 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65   how end-of-line
a640: 20 28 45 4f 4c 29 0a 2a 2a 20 69 73 20 68 61 6e   (EOL).** is han
a650: 64 6c 65 64 2e 20 20 53 74 61 6e 64 61 72 64 20  dled.  Standard 
a660: 66 67 65 74 73 28 29 20 75 73 65 73 20 4c 46 20  fgets() uses LF 
a670: 66 6f 72 20 45 4f 4c 20 75 6e 64 65 72 20 75 6e  for EOL under un
a680: 69 78 2c 20 43 52 4c 46 0a 2a 2a 20 75 6e 64 65  ix, CRLF.** unde
a690: 72 20 77 69 6e 64 6f 77 73 2c 20 61 6e 64 20 43  r windows, and C
a6a0: 52 20 75 6e 64 65 72 20 6d 61 63 2e 20 20 54 68  R under mac.  Th
a6b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 63 63 65 70  is routine accep
a6c0: 74 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 0a  ts any of these.
a6d0: 2a 2a 20 63 68 61 72 61 63 74 65 72 20 73 65 71  ** character seq
a6e0: 75 65 6e 63 65 73 20 61 73 20 61 6e 20 45 4f 4c  uences as an EOL
a6f0: 20 6d 61 72 6b 2e 20 20 54 68 65 20 45 4f 4c 20   mark.  The EOL 
a700: 6d 61 72 6b 20 69 73 20 72 65 70 6c 61 63 65 64  mark is replaced
a710: 20 62 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   by.** a single 
a720: 4c 46 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  LF character in 
a730: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
a740: 63 68 61 72 20 2a 76 64 62 65 5f 66 67 65 74 73  char *vdbe_fgets
a750: 28 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74  (char *zBuf, int
a760: 20 6e 42 75 66 2c 20 46 49 4c 45 20 2a 69 6e 29   nBuf, FILE *in)
a770: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  {.  int i, c;.  
a780: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 2d  for(i=0; i<nBuf-
a790: 31 20 26 26 20 28 63 3d 67 65 74 63 28 69 6e 29  1 && (c=getc(in)
a7a0: 29 21 3d 45 4f 46 3b 20 69 2b 2b 29 7b 0a 20 20  )!=EOF; i++){.  
a7b0: 20 20 7a 42 75 66 5b 69 5d 20 3d 20 63 3b 0a 20    zBuf[i] = c;. 
a7c0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 7c     if( c=='\r' |
a7d0: 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  | c=='\n' ){.   
a7e0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29     if( c=='\r' )
a7f0: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 69  {.        zBuf[i
a800: 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ] = '\n';.      
a810: 20 20 63 20 3d 20 67 65 74 63 28 69 6e 29 3b 0a    c = getc(in);.
a820: 20 20 20 20 20 20 20 20 69 66 28 20 63 21 3d 45          if( c!=E
a830: 4f 46 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  OF && c!='\n' ) 
a840: 75 6e 67 65 74 63 28 63 2c 20 69 6e 29 3b 0a 20  ungetc(c, in);. 
a850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b       }.      i++
a860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a870: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 42 75 66 5b     }.  }.  zBuf[
a880: 69 5d 20 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  i]  = 0;.  retur
a890: 6e 20 69 3e 30 20 3f 20 7a 42 75 66 20 3a 20 30  n i>0 ? zBuf : 0
a8a0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
a8b0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
a8c0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a8d0: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
a8e0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
a8f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a900: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
a910: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  ing only..*/.sta
a920: 74 69 63 20 76 6f 69 64 20 76 64 62 65 50 72 69  tic void vdbePri
a930: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
a940: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
a950: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
a960: 20 20 63 68 61 72 20 7a 50 74 72 5b 34 30 5d 3b    char zPtr[40];
a970: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79  .  if( pOp->p3ty
a980: 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29  pe==P3_POINTER )
a990: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 50  {.    sprintf(zP
a9a0: 74 72 2c 20 22 70 74 72 28 25 23 78 29 22 2c 20  tr, "ptr(%#x)", 
a9b0: 28 69 6e 74 29 70 4f 70 2d 3e 70 33 29 3b 0a 20  (int)pOp->p3);. 
a9c0: 20 20 20 7a 50 33 20 3d 20 7a 50 74 72 3b 0a 20     zP3 = zPtr;. 
a9d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 33 20   }else{.    zP3 
a9e0: 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20  = pOp->p3;.  }. 
a9f0: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
aa00: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
aa10: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 34  fprintf(pOut,"%4
aa20: 64 20 25 2d 31 32 73 20 25 34 64 20 25 34 64 20  d %-12s %4d %4d 
aa30: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 70 63 2c  %s\n",.      pc,
aa40: 20 73 71 6c 69 74 65 4f 70 63 6f 64 65 4e 61 6d   sqliteOpcodeNam
aa50: 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c  es[pOp->opcode],
aa60: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
aa70: 32 2c 20 7a 50 33 20 3f 20 7a 50 33 20 3a 20 22  2, zP3 ? zP3 : "
aa80: 22 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75  ");.  fflush(pOu
aa90: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
aaa0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
aab0: 65 72 65 20 69 73 20 73 70 61 63 65 20 69 6e 20  ere is space in 
aac0: 74 68 65 20 56 64 62 65 20 73 74 72 75 63 74 75  the Vdbe structu
aad0: 72 65 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  re to hold at le
aae0: 61 73 74 0a 2a 2a 20 6d 78 43 75 72 73 6f 72 20  ast.** mxCursor 
aaf0: 63 75 72 73 6f 72 73 2e 20 20 49 66 20 74 68 65  cursors.  If the
ab00: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
ab10: 74 6c 79 20 65 6e 6f 75 67 68 20 73 70 61 63 65  tly enough space
ab20: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  , then.** alloca
ab30: 74 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  te more..**.** I
ab40: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
ab50: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
ab60: 72 73 2c 20 72 65 74 75 72 6e 20 31 2e 20 20 52  rs, return 1.  R
ab70: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 65 76  eturn 0 if.** ev
ab80: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a  erything works..
ab90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
aba0: 70 61 6e 64 43 75 72 73 6f 72 41 72 72 61 79 53  pandCursorArrayS
abb0: 69 7a 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ize(Vdbe *p, int
abc0: 20 6d 78 43 75 72 73 6f 72 29 7b 0a 20 20 69 66   mxCursor){.  if
abd0: 28 20 6d 78 43 75 72 73 6f 72 3e 3d 70 2d 3e 6e  ( mxCursor>=p->n
abe0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 43 75  Cursor ){.    Cu
abf0: 72 73 6f 72 20 2a 61 43 73 72 20 3d 20 73 71 6c  rsor *aCsr = sql
ac00: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
ac10: 43 73 72 2c 20 28 6d 78 43 75 72 73 6f 72 2b 31  Csr, (mxCursor+1
ac20: 29 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29  )*sizeof(Cursor)
ac30: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 43 73 72   );.    if( aCsr
ac40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
ac50: 20 20 20 20 70 2d 3e 61 43 73 72 20 3d 20 61 43      p->aCsr = aC
ac60: 73 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  sr;.    memset(&
ac70: 70 2d 3e 61 43 73 72 5b 70 2d 3e 6e 43 75 72 73  p->aCsr[p->nCurs
ac80: 6f 72 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43  or], 0, sizeof(C
ac90: 75 72 73 6f 72 29 2a 28 6d 78 43 75 72 73 6f 72  ursor)*(mxCursor
aca0: 2b 31 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 29 3b  +1-p->nCursor));
acb0: 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
acc0: 3d 20 6d 78 43 75 72 73 6f 72 2b 31 3b 0a 20 20  = mxCursor+1;.  
acd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ace0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
acf0: 46 49 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  FILE./*.** The f
ad00: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
ad10: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70   only works on p
ad20: 65 6e 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f  entium-class pro
ad30: 63 65 73 73 6f 72 73 2e 0a 2a 2a 20 49 74 20 75  cessors..** It u
ad40: 73 65 73 20 74 68 65 20 52 44 54 53 43 20 6f 70  ses the RDTSC op
ad50: 63 6f 64 65 20 74 6f 20 72 65 61 64 20 63 79 63  code to read cyc
ad60: 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 20 6f  le count value o
ad70: 75 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ut of the.** pro
ad80: 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74 75 72  cessor and retur
ad90: 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e 20 20  ns that value.  
ada0: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
adb0: 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0a 2a 2a   for high-res.**
adc0: 20 70 72 6f 66 69 6c 69 6e 67 2e 0a 2a 2f 0a 5f   profiling..*/._
add0: 5f 69 6e 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e  _inline__ unsign
ade0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ed long long int
adf0: 20 68 77 74 69 6d 65 28 76 6f 69 64 29 7b 0a 20   hwtime(void){. 
ae00: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
ae10: 6f 6e 67 20 69 6e 74 20 78 3b 0a 20 20 5f 5f 61  ong int x;.  __a
ae20: 73 6d 5f 5f 28 22 72 64 74 73 63 5c 6e 5c 74 22  sm__("rdtsc\n\t"
ae30: 0a 20 20 20 20 20 20 20 20 20 20 22 6d 6f 76 20  .          "mov 
ae40: 25 25 65 64 78 2c 20 25 25 65 63 78 5c 6e 5c 74  %%edx, %%ecx\n\t
ae50: 22 0a 20 20 20 20 20 20 20 20 20 20 3a 22 3d 41  ".          :"=A
ae60: 22 20 28 78 29 29 3b 0a 20 20 72 65 74 75 72 6e  " (x));.  return
ae70: 20 78 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   x;.}.#endif../*
ae80: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 46 4f  .** The CHECK_FO
ae90: 52 5f 49 4e 54 45 52 52 55 50 54 20 6d 61 63 72  R_INTERRUPT macr
aea0: 6f 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6c  o defined here l
aeb0: 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ooks to see if t
aec0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 69 6e 74  he.** sqlite_int
aed0: 65 72 72 75 70 74 28 29 20 72 6f 75 74 69 6e 65  errupt() routine
aee0: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
aef0: 2e 20 20 49 66 20 69 74 20 68 61 73 20 62 65 65  .  If it has bee
af00: 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63 65  n, then.** proce
af10: 73 73 69 6e 67 20 6f 66 20 74 68 65 20 56 44 42  ssing of the VDB
af20: 45 20 70 72 6f 67 72 61 6d 20 69 73 20 69 6e 74  E program is int
af30: 65 72 72 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  errupted..**.** 
af40: 54 68 69 73 20 6d 61 63 72 6f 20 61 64 64 65 64  This macro added
af50: 20 74 6f 20 65 76 65 72 79 20 69 6e 73 74 72 75   to every instru
af60: 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
af70: 61 20 6a 75 6d 70 20 69 6e 20 6f 72 64 65 72 20  a jump in order 
af80: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
af90: 61 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 74 65  a loop.  This te
afa0: 73 74 20 75 73 65 64 20 74 6f 20 62 65 20 6f 6e  st used to be on
afb0: 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 69 6e   every single in
afc0: 73 74 72 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75  struction,.** bu
afd0: 74 20 74 68 61 74 20 6d 65 61 6e 74 20 77 65 20  t that meant we 
afe0: 6d 6f 72 65 20 74 65 73 74 69 6e 67 20 74 68 61  more testing tha
aff0: 74 20 77 65 20 6e 65 65 64 65 64 2e 20 20 42 79  t we needed.  By
b000: 20 6f 6e 6c 79 20 74 65 73 74 69 6e 67 20 74 68   only testing th
b010: 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 6a 75 6d  e.** flag on jum
b020: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c 20  p instructions, 
b030: 77 65 20 67 65 74 20 61 20 28 73 6d 61 6c 6c 29  we get a (small)
b040: 20 73 70 65 65 64 20 69 6d 70 72 6f 76 65 6d 65   speed improveme
b050: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  nt..*/.#define C
b060: 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55  HECK_FOR_INTERRU
b070: 50 54 20 5c 0a 20 20 20 69 66 28 20 64 62 2d 3e  PT \.   if( db->
b080: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
b090: 6e 74 65 72 72 75 70 74 20 29 20 67 6f 74 6f 20  nterrupt ) goto 
b0a0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74  abort_due_to_int
b0b0: 65 72 72 75 70 74 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  errupt;.../*.** 
b0c0: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
b0d0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
b0e0: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
b0f0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
b100: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
b110: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
b120: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
b130: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
b140: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
b150: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
b160: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
b170: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
b180: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
b190: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 56 64 62  lls to sqliteVdb
b1a0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
b1b0: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
b1c0: 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63 28   sqliteVdbeExec(
b1d0: 29 20 69 73 20 69 6e 66 6c 75 65 6e 63 65 64 20  ) is influenced 
b1e0: 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  by the parameter
b1f0: 73 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  s to.** this rou
b200: 74 69 6e 65 2e 20 20 49 66 20 78 43 61 6c 6c 62  tine.  If xCallb
b210: 61 63 6b 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ack is NULL, the
b220: 6e 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63  n sqliteVdbeExec
b230: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  () will return.*
b240: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 52 4f  * with SQLITE_RO
b250: 57 20 77 68 65 6e 65 76 65 72 20 74 68 65 72 65  W whenever there
b260: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 74 68 65   is a row of the
b270: 20 72 65 73 75 6c 74 20 73 65 74 20 72 65 61 64   result set read
b280: 79 0a 2a 2a 20 74 6f 20 62 65 20 64 65 6c 69 76  y.** to be deliv
b290: 65 72 65 64 2e 20 20 70 2d 3e 61 7a 52 65 73 43  ered.  p->azResC
b2a0: 6f 6c 75 6d 6e 20 77 69 6c 6c 20 70 6f 69 6e 74  olumn will point
b2b0: 20 74 6f 20 74 68 65 20 72 6f 77 20 61 6e 64 20   to the row and 
b2c0: 0a 2a 2a 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  .** p->nResColum
b2d0: 6e 20 67 69 76 65 73 20 74 68 65 20 6e 75 6d 62  n gives the numb
b2e0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
b2f0: 20 74 68 65 20 72 6f 77 2e 20 20 49 66 20 78 43   the row.  If xC
b300: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 6e 6f  allback.** is no
b310: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
b320: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 72 6f 75   xCallback() rou
b330: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
b340: 74 6f 20 70 72 6f 63 65 73 73 20 65 61 63 68 0a  to process each.
b350: 2a 2a 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ** row in the re
b360: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  sult set..*/.voi
b370: 64 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  d sqliteVdbeMake
b380: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
b390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b3a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
b3b0: 44 42 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  DBE */.  sqlite_
b3c0: 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61  callback xCallba
b3d0: 63 6b 2c 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ck,     /* Resul
b3e0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
b3f0: 76 6f 69 64 20 2a 70 43 61 6c 6c 62 61 63 6b 41  void *pCallbackA
b400: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg,            /
b410: 2a 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74  * 1st argument t
b420: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
b430: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
b460: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
b470: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
b480: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  ){.  int n;..  a
b490: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
b4a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 74 61   assert( p->aSta
b4b0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
b4c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
b4d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
b4e0: 0a 20 20 2f 2a 20 41 64 64 20 61 20 48 41 4c 54  .  /* Add a HALT
b4f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
b500: 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20  the very end of 
b510: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a  the program..  *
b520: 2f 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  /.  sqliteVdbeAd
b530: 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74 2c 20  dOp(p, OP_Halt, 
b540: 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  0, 0);..  /* No 
b550: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72  instruction ever
b560: 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61   pushes more tha
b570: 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  n a single eleme
b580: 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nt onto the.  **
b590: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65   stack.  And the
b5a0: 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f   stack never gro
b5b0: 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65  ws on successive
b5c0: 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74   executions of t
b5d0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f  he.  ** same loo
b5e0: 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c  p.  So the total
b5f0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72   number of instr
b600: 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70  uctions is an up
b610: 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f  per bound.  ** o
b620: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74  n the maximum st
b630: 61 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72  ack depth requir
b640: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c  ed..  **.  ** Al
b650: 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65  location all the
b660: 20 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20   stack space we 
b670: 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a  will ever need..
b680: 20 20 2a 2f 0a 20 20 6e 20 3d 20 69 73 45 78 70    */.  n = isExp
b690: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 70 2d 3e 6e  lain ? 10 : p->n
b6a0: 4f 70 3b 0a 20 20 70 2d 3e 61 53 74 61 63 6b 20  Op;.  p->aStack 
b6b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
b6c0: 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74  n*(sizeof(p->aSt
b6d0: 61 63 6b 5b 30 5d 29 20 2b 20 32 2a 73 69 7a 65  ack[0]) + 2*size
b6e0: 6f 66 28 63 68 61 72 2a 29 29 20 29 3b 0a 20 20  of(char*)) );.  
b6f0: 70 2d 3e 7a 53 74 61 63 6b 20 3d 20 28 63 68 61  p->zStack = (cha
b700: 72 2a 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 6e  r**)&p->aStack[n
b710: 5d 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d  ];.  p->azColNam
b720: 65 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  e = (char**)&p->
b730: 7a 53 74 61 63 6b 5b 6e 5d 3b 0a 0a 20 20 73 71  zStack[n];..  sq
b740: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 70 2d  liteHashInit(&p-
b750: 3e 61 67 67 2e 68 61 73 68 2c 20 53 51 4c 49 54  >agg.hash, SQLIT
b760: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
b770: 29 3b 0a 20 20 70 2d 3e 61 67 67 2e 70 53 65 61  );.  p->agg.pSea
b780: 72 63 68 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rch = 0;.#ifdef 
b790: 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a 20 20 69  MEMORY_DEBUG.  i
b7a0: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45  f( sqliteOsFileE
b7b0: 78 69 73 74 73 28 22 76 64 62 65 5f 74 72 61 63  xists("vdbe_trac
b7c0: 65 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72  e") ){.    p->tr
b7d0: 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ace = stdout;.  
b7e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 74 6f  }.#endif.  p->to
b7f0: 73 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 70 63 20  s = -1;.  p->pc 
b800: 3d 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  = 0;.  p->rc = S
b810: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75  QLITE_OK;.  p->u
b820: 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20  niqueCnt = 0;.  
b830: 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d  p->returnDepth =
b840: 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63   0;.  p->errorAc
b850: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
b860: 0a 20 20 70 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f  .  p->undoTransO
b870: 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  nError = 0;.  p-
b880: 3e 78 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  >xCallback = xCa
b890: 6c 6c 62 61 63 6b 3b 0a 20 20 70 2d 3e 70 43 62  llback;.  p->pCb
b8a0: 41 72 67 20 3d 20 70 43 61 6c 6c 62 61 63 6b 41  Arg = pCallbackA
b8b0: 72 67 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63  rg;.  p->popStac
b8c0: 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  k =  0;.  p->exp
b8d0: 6c 61 69 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e  lain = isExplain
b8e0: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
b8f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 23  DBE_MAGIC_RUN;.#
b900: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
b910: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
b920: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
b930: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
b940: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
b950: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
b960: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
b970: 2a 2a 20 45 78 65 63 75 74 65 20 61 73 20 6d 75  ** Execute as mu
b980: 63 68 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f  ch of a VDBE pro
b990: 67 72 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74  gram as we can t
b9a0: 68 65 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a  hen return..**.*
b9b0: 2a 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  * sqliteVdbeMake
b9c0: 52 65 61 64 79 28 29 20 6d 75 73 74 20 62 65 20  Ready() must be 
b9d0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68  called before th
b9e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
b9f0: 64 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20  der to.** close 
ba00: 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68  the program with
ba10: 20 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74   a final OP_Halt
ba20: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
ba30: 68 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20  he callbacks.** 
ba40: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
ba50: 73 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  ssage pointer..*
ba60: 2a 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20  *.** Whenever a 
ba70: 72 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61  row or result da
ba80: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ta is available,
ba90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
baa0: 6c 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76  ll either.** inv
bab0: 6f 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20 63  oke the result c
bac0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72  allback (if ther
bad0: 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74  e is one) or ret
bae0: 75 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  urn with.** SQLI
baf0: 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66  TE_ROW..**.** If
bb00: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
bb10: 61 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f  ade to open a lo
bb20: 63 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  cked database, t
bb30: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
bb40: 0a 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20  .** will either 
bb50: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
bb60: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  callback (if the
bb70: 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74  re is one) or it
bb80: 20 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20   will.** return 
bb90: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
bba0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
bbb0: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
bbc0: 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
bbd0: 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  en to memory obt
bbe0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
bbf0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
bc00: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73 20 6d   p->zErrMsg is m
bc10: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
bc20: 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20  that memory..** 
bc30: 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  The error code i
bc40: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e 72  s stored in p->r
bc50: 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  c and this routi
bc60: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
bc70: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49  E_ERROR..**.** I
bc80: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 65  f the callback e
bc90: 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ver returns non-
bca0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
bcb0: 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a 2a 20  rogram exits.** 
bcc0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68  immediately.  Th
bcd0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 65  ere will be no e
bce0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 75 74  rror message but
bcf0: 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65 6c 64   the p->rc field
bd00: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 53 51   is.** set to SQ
bd10: 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64 20 74  LITE_ABORT and t
bd20: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bd30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bd40: 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65  RROR..**.** A me
bd50: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
bd60: 65 72 72 6f 72 20 63 61 75 73 65 73 20 70 2d 3e  error causes p->
bd70: 72 63 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  rc to be set to 
bd80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
bd90: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
bda0: 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
bdb0: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f  E_ERROR..**.** O
bdc0: 74 68 65 72 20 66 61 74 61 6c 20 65 72 72 6f 72  ther fatal error
bdd0: 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
bde0: 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  ERROR..**.** Aft
bdf0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
be00: 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 73 71  has finished, sq
be10: 6c 69 74 65 56 64 62 65 46 69 6e 61 6c 69 7a 65  liteVdbeFinalize
be20: 28 29 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  () should be.** 
be30: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
be40: 20 74 68 65 20 6d 65 73 73 20 74 68 61 74 20 77   the mess that w
be50: 61 73 20 6c 65 66 74 20 62 65 68 69 6e 64 2e 0a  as left behind..
be60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 64 62  */.int sqliteVdb
be70: 65 45 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70  eExec(.  Vdbe *p
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
bea0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61     /* The progra
bed0: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4f  m counter */.  O
bee0: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
bef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
bf00: 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rent operation *
bf10: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
bf20: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f  ITE_OK;        /
bf30: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
bf40: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  n */.  sqlite *d
bf50: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
bf60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
bf70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 7a 53  e */.  char **zS
bf80: 74 61 63 6b 20 3d 20 70 2d 3e 7a 53 74 61 63 6b  tack = p->zStack
bf90: 3b 20 2f 2a 20 54 65 78 74 20 73 74 61 63 6b 20  ; /* Text stack 
bfa0: 2a 2f 0a 20 20 53 74 61 63 6b 20 2a 61 53 74 61  */.  Stack *aSta
bfb0: 63 6b 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 20  ck = p->aStack; 
bfc0: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 73 74  /* Additional st
bfd0: 61 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ack information 
bfe0: 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  */.  char zBuf[1
bff0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
c000: 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 70 72 69  /* Space to spri
c010: 6e 74 66 28 29 20 61 6e 20 69 6e 74 65 67 65 72  ntf() an integer
c020: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
c030: 50 52 4f 46 49 4c 45 0a 20 20 75 6e 73 69 67 6e  PROFILE.  unsign
c040: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 74 61  ed long long sta
c050: 72 74 3b 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63  rt;  /* CPU cloc
c060: 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74  k count at start
c070: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   of opcode */.  
c080: 69 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20  int origPc;     
c090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
c0a0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74  ogram counter at
c0b0: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
c0c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   */.#endif..  if
c0d0: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
c0e0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74  _MAGIC_RUN ) ret
c0f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c100: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  E;.  assert( db-
c110: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
c120: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
c130: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
c140: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
c150: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
c160: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
c170: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c180: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b  p->explain==0 );
c190: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
c1a0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
c1b0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 69 66 28  to no_mem;.  if(
c1c0: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 29 7b 0a   p->popStack ){.
c1d0: 20 20 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20      PopStack(p, 
c1e0: 70 2d 3e 70 6f 70 53 74 61 63 6b 29 3b 0a 20 20  p->popStack);.  
c1f0: 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20    p->popStack = 
c200: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 63 3d  0;.  }.  for(pc=
c210: 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51 4c 49 54  p->pc; rc==SQLIT
c220: 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a 20 20 20  E_OK; pc++){.   
c230: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 30 20 26   assert( pc>=0 &
c240: 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 23  & pc<p->nOp );.#
c250: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c260: 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20 3d 20  LE.    origPc = 
c270: 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20 3d 20  pc;.    start = 
c280: 68 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66  hwtime();.#endif
c290: 0a 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  .    pOp = &p->a
c2a0: 4f 70 5b 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20  Op[pc];..    /* 
c2b0: 4f 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69  Only allow traci
c2c0: 6e 67 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ng if NDEBUG is 
c2d0: 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20  not defined..   
c2e0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
c2f0: 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72  UG.    if( p->tr
c300: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 76 64 62  ace ){.      vdb
c310: 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72 61 63  ePrintOp(p->trac
c320: 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20 20 20  e, pc, pOp);.   
c330: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
c340: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
c350: 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  de ){../********
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3a0: 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f  *****.** What fo
c3b0: 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73 73 69  llows is a massi
c3c0: 76 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d  ve switch statem
c3d0: 65 6e 74 20 77 68 65 72 65 20 65 61 63 68 20 63  ent where each c
c3e0: 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ase implements a
c3f0: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 73  .** separate ins
c400: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
c410: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
c420: 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74    If we follow t
c430: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65  he usual.** inde
c440: 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69  ntation conventi
c450: 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65 20 73  ons, each case s
c460: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
c470: 64 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  d by 6 spaces.  
c480: 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  But.** that is a
c490: 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64 20 73   lot of wasted s
c4a0: 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  pace on the left
c4b0: 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74 68 65   margin.  So the
c4c0: 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20   code within.** 
c4d0: 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65  the switch state
c4e0: 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61 6b 20  ment will break 
c4f0: 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  with convention 
c500: 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c 65 66  and be flush-lef
c510: 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69  t. Another.** bi
c520: 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c  g comment (simil
c530: 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65 29 20  ar to this one) 
c540: 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f  will mark the po
c550: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
c560: 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e  where.** we tran
c570: 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e  sition back to n
c580: 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
c590: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
c5a0: 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63 68 20  matting of each 
c5b0: 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  case is importan
c5c0: 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69 6c 65  t.  The makefile
c5d0: 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67   for SQLite.** g
c5e0: 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43 20 66  enerates two C f
c5f0: 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e 68 22  iles "opcodes.h"
c600: 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e 63 22   and "opcodes.c"
c610: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
c620: 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e  s.** file lookin
c630: 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68 61 74  g for lines that
c640: 20 62 65 67 69 6e 20 77 69 74 68 20 22 63 61 73   begin with "cas
c650: 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f 70 63  e OP_".  The opc
c660: 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20  odes.h files.** 
c670: 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64 20 77  will be filled w
c680: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
c690: 74 20 67 69 76 65 20 75 6e 69 71 75 65 20 69 6e  t give unique in
c6a0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20  teger values to 
c6b0: 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  each.** opcode a
c6c0: 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73 2e 63  nd the opcodes.c
c6d0: 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65 64 20   file is filled 
c6e0: 77 69 74 68 20 61 6e 20 61 72 72 61 79 20 6f 66  with an array of
c6f0: 20 73 74 72 69 6e 67 73 20 77 68 65 72 65 0a 2a   strings where.*
c700: 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20 69 73  * each string is
c710: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
c720: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  me for the corre
c730: 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e  sponding opcode.
c740: 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61  .**.** Documenta
c750: 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20  tion about VDBE 
c760: 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72  opcodes is gener
c770: 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  ated by scanning
c780: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f   this file.** fo
c790: 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20  r lines of that 
c7a0: 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a  contain "Opcode:
c7b0: 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e  ".  That line an
c7c0: 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
c7d0: 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65  .** comment line
c7e0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
c7f0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
c800: 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20  the opcode.html 
c810: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  documentation.**
c820: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d   file..**.** SUM
c830: 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  MARY:.**.**     
c840: 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d  Formatting is im
c850: 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70  portant to scrip
c860: 74 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69  ts that scan thi
c870: 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44  s file..**     D
c880: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
c890: 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e  om the formattin
c8a0: 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c  g style currentl
c8b0: 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a  y in use..**.***
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
c910: 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20  Opcode:  Goto * 
c920: 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e  P2 *.**.** An un
c930: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
c940: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a   to address P2..
c950: 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74  ** The next inst
c960: 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64  ruction executed
c970: 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65   will be .** the
c980: 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32   one at index P2
c990: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
c9a0: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72  ing of.** the pr
c9b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ogram..*/.case O
c9c0: 50 5f 47 6f 74 6f 3a 20 7b 0a 20 20 43 48 45 43  P_Goto: {.  CHEC
c9d0: 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b  K_FOR_INTERRUPT;
c9e0: 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20  .  pc = pOp->p2 
c9f0: 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  - 1;.  break;.}.
ca00: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73  ./* Opcode:  Gos
ca10: 75 62 20 2a 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  ub * P2 *.**.** 
ca20: 50 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74  Push the current
ca30: 20 61 64 64 72 65 73 73 20 70 6c 75 73 20 31 20   address plus 1 
ca40: 6f 6e 74 6f 20 74 68 65 20 72 65 74 75 72 6e 20  onto the return 
ca50: 61 64 64 72 65 73 73 20 73 74 61 63 6b 0a 2a 2a  address stack.**
ca60: 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74   and then jump t
ca70: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  o address P2..**
ca80: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61  .** The return a
ca90: 64 64 72 65 73 73 20 73 74 61 63 6b 20 69 73 20  ddress stack is 
caa0: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
cab0: 2e 20 20 49 66 20 74 6f 6f 20 6d 61 6e 79 0a 2a  .  If too many.*
cac0: 2a 20 4f 50 5f 47 6f 73 75 62 20 6f 70 65 72 61  * OP_Gosub opera
cad0: 74 69 6f 6e 73 20 6f 63 63 75 72 20 77 69 74 68  tions occur with
cae0: 6f 75 74 20 69 6e 74 65 72 76 65 6e 69 6e 67 20  out intervening 
caf0: 4f 50 5f 52 65 74 75 72 6e 73 2c 20 74 68 65 6e  OP_Returns, then
cb00: 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 20 61  .** the return a
cb10: 64 64 72 65 73 73 20 73 74 61 63 6b 20 77 69 6c  ddress stack wil
cb20: 6c 20 66 69 6c 6c 20 75 70 20 61 6e 64 20 70 72  l fill up and pr
cb30: 6f 63 65 73 73 69 6e 67 20 77 69 6c 6c 20 61 62  ocessing will ab
cb40: 6f 72 74 0a 2a 2a 20 77 69 74 68 20 61 20 66 61  ort.** with a fa
cb50: 74 61 6c 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 61  tal error..*/.ca
cb60: 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 0a 20  se OP_Gosub: {. 
cb70: 20 69 66 28 20 70 2d 3e 72 65 74 75 72 6e 44 65   if( p->returnDe
cb80: 70 74 68 3e 3d 73 69 7a 65 6f 66 28 70 2d 3e 72  pth>=sizeof(p->r
cb90: 65 74 75 72 6e 53 74 61 63 6b 29 2f 73 69 7a 65  eturnStack)/size
cba0: 6f 66 28 70 2d 3e 72 65 74 75 72 6e 53 74 61 63  of(p->returnStac
cbb0: 6b 5b 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c  k[0]) ){.    sql
cbc0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d  iteSetString(&p-
cbd0: 3e 7a 45 72 72 4d 73 67 2c 20 22 72 65 74 75 72  >zErrMsg, "retur
cbe0: 6e 20 61 64 64 72 65 73 73 20 73 74 61 63 6b 20  n address stack 
cbf0: 6f 76 65 72 66 6c 6f 77 22 2c 20 30 29 3b 0a 20  overflow", 0);. 
cc00: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
cc10: 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20  E_INTERNAL;.    
cc20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
cc30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65  ROR;.  }.  p->re
cc40: 74 75 72 6e 53 74 61 63 6b 5b 70 2d 3e 72 65 74  turnStack[p->ret
cc50: 75 72 6e 44 65 70 74 68 2b 2b 5d 20 3d 20 70 63  urnDepth++] = pc
cc60: 2b 31 3b 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e  +1;.  pc = pOp->
cc70: 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b  p2 - 1;.  break;
cc80: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
cc90: 52 65 74 75 72 6e 20 2a 20 2a 20 2a 0a 2a 2a 0a  Return * * *.**.
cca0: 2a 2a 20 4a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** Jump immediat
ccb0: 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
ccc0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
ccd0: 72 20 74 68 65 20 6c 61 73 74 20 75 6e 72 65 74  r the last unret
cce0: 75 72 6e 65 64 0a 2a 2a 20 4f 50 5f 47 6f 73 75  urned.** OP_Gosu
ccf0: 62 2e 20 20 49 66 20 61 6e 20 4f 50 5f 52 65 74  b.  If an OP_Ret
cd00: 75 72 6e 20 68 61 73 20 6f 63 63 75 72 72 65 64  urn has occurred
cd10: 20 66 6f 72 20 61 6c 6c 20 4f 50 5f 47 6f 73 75   for all OP_Gosu
cd20: 62 73 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63  bs, then.** proc
cd30: 65 73 73 69 6e 67 20 61 62 6f 72 74 73 20 77 69  essing aborts wi
cd40: 74 68 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72  th a fatal error
cd50: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74  ..*/.case OP_Ret
cd60: 75 72 6e 3a 20 7b 0a 20 20 69 66 28 20 70 2d 3e  urn: {.  if( p->
cd70: 72 65 74 75 72 6e 44 65 70 74 68 3c 3d 30 20 29  returnDepth<=0 )
cd80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
cd90: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
cda0: 67 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65  g, "return addre
cdb0: 73 73 20 73 74 61 63 6b 20 75 6e 64 65 72 66 6c  ss stack underfl
cdc0: 6f 77 22 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  ow", 0);.    p->
cdd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
cde0: 52 4e 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNAL;.    return
cdf0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ce00: 20 7d 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65   }.  p->returnDe
ce10: 70 74 68 2d 2d 3b 0a 20 20 70 63 20 3d 20 70 2d  pth--;.  pc = p-
ce20: 3e 72 65 74 75 72 6e 53 74 61 63 6b 5b 70 2d 3e  >returnStack[p->
ce30: 72 65 74 75 72 6e 44 65 70 74 68 5d 20 2d 20 31  returnDepth] - 1
ce40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
ce50: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50   Opcode:  Halt P
ce60: 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69  1 P2 *.**.** Exi
ce70: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  t immediately.  
ce80: 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  All open cursors
ce90: 2c 20 4c 69 73 74 73 2c 20 53 6f 72 74 73 2c 20  , Lists, Sorts, 
cea0: 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a  etc are closed.*
ceb0: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  * automatically.
cec0: 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
ced0: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74   result code ret
cee0: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 5f  urned by sqlite_
cef0: 65 78 65 63 28 29 2e 20 20 46 6f 72 20 61 20 6e  exec().  For a n
cf00: 6f 72 6d 61 6c 0a 2a 2a 20 68 61 6c 74 2c 20 74  ormal.** halt, t
cf10: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51  his should be SQ
cf20: 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 20 20 46 6f  LITE_OK (0).  Fo
cf30: 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e  r errors, it can
cf40: 20 62 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   be some.** othe
cf50: 72 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21  r value.  If P1!
cf60: 3d 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20  =0 then P2 will 
cf70: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
cf80: 72 20 6f 72 20 6e 6f 74 20 74 6f 0a 2a 2a 20 72  r or not to.** r
cf90: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72  ollback the curr
cfa0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
cfb0: 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63    Do not rollbac
cfc0: 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c  k if P2==OE_Fail
cfd0: 2e 0a 2a 2a 20 44 6f 20 74 68 65 20 72 6f 6c 6c  ..** Do the roll
cfe0: 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52  back if P2==OE_R
cff0: 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d  ollback.  If P2=
d000: 3d 4f 45 5f 41 62 6f 72 74 2c 20 74 68 65 6e 20  =OE_Abort, then 
d010: 62 61 63 6b 0a 2a 2a 20 6f 75 74 20 61 6c 6c 20  back.** out all 
d020: 63 68 61 6e 67 65 73 20 74 68 61 74 20 68 61 76  changes that hav
d030: 65 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e  e occurred durin
d040: 67 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e  g this execution
d050: 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c   of the.** VDBE,
d060: 20 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c   but do not roll
d070: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
d080: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  tion. .**.** The
d090: 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  re is an implied
d0a0: 20 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e   "Halt 0 0 0" in
d0b0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74  struction insert
d0c0: 65 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65  ed at the very e
d0d0: 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70  nd of.** every p
d0e0: 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75  rogram.  So a ju
d0f0: 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  mp past the last
d100: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
d110: 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69  the program.** i
d120: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  s the same as ex
d130: 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f  ecuting Halt..*/
d140: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b  .case OP_Halt: {
d150: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
d160: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
d170: 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 53 51   if( pOp->p1!=SQ
d180: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
d190: 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ->rc = pOp->p1;.
d1a0: 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
d1b0: 6f 6e 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  on = pOp->p2;.  
d1c0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b    if( pOp->p3 ){
d1d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
d1e0: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
d1f0: 73 67 2c 20 70 4f 70 2d 3e 70 33 2c 20 30 29 3b  sg, pOp->p3, 0);
d200: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
d210: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
d220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
d230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d250: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  E_DONE;.  }.}../
d260: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65  * Opcode: Intege
d270: 72 20 50 31 20 2a 20 50 33 0a 2a 2a 0a 2a 2a 20  r P1 * P3.**.** 
d280: 54 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  The integer valu
d290: 65 20 50 31 20 69 73 20 70 75 73 68 65 64 20 6f  e P1 is pushed o
d2a0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
d2b0: 49 66 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72  If P3 is not zer
d2c0: 6f 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  o.** then it is 
d2d0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 20  assumed to be a 
d2e0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
d2f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
d300: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61  e integer..*/.ca
d310: 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b  se OP_Integer: {
d320: 0a 20 20 69 6e 74 20 69 20 3d 20 2b 2b 70 2d 3e  .  int i = ++p->
d330: 74 6f 73 3b 0a 20 20 61 53 74 61 63 6b 5b 69 5d  tos;.  aStack[i]
d340: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  .i = pOp->p1;.  
d350: 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20  aStack[i].flags 
d360: 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 69 66 28  = STK_Int;.  if(
d370: 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20   pOp->p3 ){.    
d380: 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 70 4f 70 2d  zStack[i] = pOp-
d390: 3e 70 33 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  >p3;.    aStack[
d3a0: 69 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 54 4b 5f  i].flags |= STK_
d3b0: 53 74 72 20 7c 20 53 54 4b 5f 53 74 61 74 69 63  Str | STK_Static
d3c0: 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e  ;.    aStack[i].
d3d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4f 70 2d 3e  n = strlen(pOp->
d3e0: 70 33 29 2b 31 3b 0a 20 20 7d 0a 20 20 62 72 65  p3)+1;.  }.  bre
d3f0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
d400: 3a 20 53 74 72 69 6e 67 20 2a 20 2a 20 50 33 0a  : String * * P3.
d410: 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67  **.** The string
d420: 20 76 61 6c 75 65 20 50 33 20 69 73 20 70 75 73   value P3 is pus
d430: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
d440: 63 6b 2e 20 20 49 66 20 50 33 3d 3d 30 20 74 68  ck.  If P3==0 th
d450: 65 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20  en a.** NULL is 
d460: 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
d470: 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f  stack..*/.case O
d480: 50 5f 53 74 72 69 6e 67 3a 20 7b 0a 20 20 69 6e  P_String: {.  in
d490: 74 20 69 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a  t i = ++p->tos;.
d4a0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 7a 20 3d    char *z;.  z =
d4b0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
d4c0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 74 61  z==0 ){.    zSta
d4d0: 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  ck[i] = 0;.    a
d4e0: 53 74 61 63 6b 5b 69 5d 2e 6e 20 3d 20 30 3b 0a  Stack[i].n = 0;.
d4f0: 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c      aStack[i].fl
d500: 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a  ags = STK_Null;.
d510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 74    }else{.    zSt
d520: 61 63 6b 5b 69 5d 20 3d 20 7a 3b 0a 20 20 20 20  ack[i] = z;.    
d530: 61 53 74 61 63 6b 5b 69 5d 2e 6e 20 3d 20 73 74  aStack[i].n = st
d540: 72 6c 65 6e 28 7a 29 20 2b 20 31 3b 0a 20 20 20  rlen(z) + 1;.   
d550: 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73   aStack[i].flags
d560: 20 3d 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b   = STK_Str | STK
d570: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 0a 20 20 62  _Static;.  }.  b
d580: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
d590: 64 65 3a 20 50 6f 70 20 50 31 20 2a 20 2a 0a 2a  de: Pop P1 * *.*
d5a0: 2a 0a 2a 2a 20 50 31 20 65 6c 65 6d 65 6e 74 73  *.** P1 elements
d5b0: 20 61 72 65 20 70 6f 70 70 65 64 20 6f 66 66 20   are popped off 
d5c0: 6f 66 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74  of the top of st
d5d0: 61 63 6b 20 61 6e 64 20 64 69 73 63 61 72 64 65  ack and discarde
d5e0: 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 6f  d..*/.case OP_Po
d5f0: 70 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p: {.  assert( p
d600: 2d 3e 74 6f 73 2b 31 3e 3d 70 4f 70 2d 3e 70 31  ->tos+1>=pOp->p1
d610: 20 29 3b 0a 20 20 50 6f 70 53 74 61 63 6b 28 70   );.  PopStack(p
d620: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72  , pOp->p1);.  br
d630: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
d640: 65 3a 20 44 75 70 20 50 31 20 50 32 20 2a 0a 2a  e: Dup P1 P2 *.*
d650: 2a 0a 2a 2a 20 41 20 63 6f 70 79 20 6f 66 20 74  *.** A copy of t
d660: 68 65 20 50 31 2d 74 68 20 65 6c 65 6d 65 6e 74  he P1-th element
d670: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 0a 2a   of the stack .*
d680: 2a 20 69 73 20 6d 61 64 65 20 61 6e 64 20 70 75  * is made and pu
d690: 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 74 6f  shed onto the to
d6a0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
d6b0: 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
d6c0: 65 20 73 74 61 63 6b 20 69 73 20 65 6c 65 6d 65  e stack is eleme
d6d0: 6e 74 20 30 2e 20 20 53 6f 20 74 68 65 0a 2a 2a  nt 0.  So the.**
d6e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 22 44 75   instruction "Du
d6f0: 70 20 30 20 30 20 30 22 20 77 69 6c 6c 20 6d 61  p 0 0 0" will ma
d700: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d710: 0a 2a 2a 20 74 6f 70 20 6f 66 20 74 68 65 20 73  .** top of the s
d720: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tack..**.** If t
d730: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
d740: 65 20 50 31 2d 74 68 20 65 6c 65 6d 65 6e 74 20  e P1-th element 
d750: 69 73 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  is a dynamically
d760: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 73 74  .** allocated st
d770: 72 69 6e 67 2c 20 74 68 65 6e 20 61 20 6e 65 77  ring, then a new
d780: 20 63 6f 70 79 20 6f 66 20 74 68 61 74 20 73 74   copy of that st
d790: 72 69 6e 67 0a 2a 2a 20 69 73 20 6d 61 64 65 20  ring.** is made 
d7a0: 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 20 50 32  if P2==0.  If P2
d7b0: 21 3d 30 2c 20 74 68 65 6e 20 6a 75 73 74 20 61  !=0, then just a
d7c0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
d7d0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 63 6f 70  he string is cop
d7e0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ied..**.** Also 
d7f0: 73 65 65 20 74 68 65 20 50 75 6c 6c 20 69 6e 73  see the Pull ins
d800: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
d810: 65 20 4f 50 5f 44 75 70 3a 20 7b 0a 20 20 69 6e  e OP_Dup: {.  in
d820: 74 20 69 20 3d 20 70 2d 3e 74 6f 73 20 2d 20 70  t i = p->tos - p
d830: 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 6a 20  Op->p1;.  int j 
d840: 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 56 45  = ++p->tos;.  VE
d850: 52 49 46 59 28 20 69 66 28 20 69 3c 30 20 29 20  RIFY( if( i<0 ) 
d860: 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
d870: 73 74 61 63 6b 3b 20 29 0a 20 20 6d 65 6d 63 70  stack; ).  memcp
d880: 79 28 26 61 53 74 61 63 6b 5b 6a 5d 2c 20 26 61  y(&aStack[j], &a
d890: 53 74 61 63 6b 5b 69 5d 2c 20 73 69 7a 65 6f 66  Stack[i], sizeof
d8a0: 28 61 53 74 61 63 6b 5b 69 5d 29 2d 4e 42 46 53  (aStack[i])-NBFS
d8b0: 29 3b 0a 20 20 69 66 28 20 61 53 74 61 63 6b 5b  );.  if( aStack[
d8c0: 6a 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53  j].flags & STK_S
d8d0: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  tr ){.    int is
d8e0: 53 74 61 74 69 63 20 3d 20 28 61 53 74 61 63 6b  Static = (aStack
d8f0: 5b 6a 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [j].flags & STK_
d900: 53 74 61 74 69 63 29 21 3d 30 3b 0a 20 20 20 20  Static)!=0;.    
d910: 69 66 28 20 70 4f 70 2d 3e 70 32 20 7c 7c 20 69  if( pOp->p2 || i
d920: 73 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  sStatic ){.     
d930: 20 7a 53 74 61 63 6b 5b 6a 5d 20 3d 20 7a 53 74   zStack[j] = zSt
d940: 61 63 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 61 53  ack[i];.      aS
d950: 74 61 63 6b 5b 6a 5d 2e 66 6c 61 67 73 20 26 3d  tack[j].flags &=
d960: 20 7e 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20   ~STK_Dyn;.     
d970: 20 69 66 28 20 21 69 73 53 74 61 74 69 63 20 29   if( !isStatic )
d980: 20 61 53 74 61 63 6b 5b 6a 5d 2e 66 6c 61 67 73   aStack[j].flags
d990: 20 7c 3d 20 53 54 4b 5f 45 70 68 65 6d 3b 0a 20   |= STK_Ephem;. 
d9a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 74     }else if( aSt
d9b0: 61 63 6b 5b 69 5d 2e 6e 3c 3d 4e 42 46 53 20 29  ack[i].n<=NBFS )
d9c0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  {.      memcpy(a
d9d0: 53 74 61 63 6b 5b 6a 5d 2e 7a 2c 20 7a 53 74 61  Stack[j].z, zSta
d9e0: 63 6b 5b 69 5d 2c 20 61 53 74 61 63 6b 5b 6a 5d  ck[i], aStack[j]
d9f0: 2e 6e 29 3b 0a 20 20 20 20 20 20 7a 53 74 61 63  .n);.      zStac
da00: 6b 5b 6a 5d 20 3d 20 61 53 74 61 63 6b 5b 6a 5d  k[j] = aStack[j]
da10: 2e 7a 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b  .z;.      aStack
da20: 5b 6a 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 28 53  [j].flags &= ~(S
da30: 54 4b 5f 53 74 61 74 69 63 7c 53 54 4b 5f 44 79  TK_Static|STK_Dy
da40: 6e 7c 53 54 4b 5f 45 70 68 65 6d 29 3b 0a 20 20  n|STK_Ephem);.  
da50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
da60: 53 74 61 63 6b 5b 6a 5d 20 3d 20 73 71 6c 69 74  Stack[j] = sqlit
da70: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 61 53 74 61  eMallocRaw( aSta
da80: 63 6b 5b 6a 5d 2e 6e 20 29 3b 0a 20 20 20 20 20  ck[j].n );.     
da90: 20 69 66 28 20 7a 53 74 61 63 6b 5b 6a 5d 3d 3d   if( zStack[j]==
daa0: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
dab0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53  .      memcpy(zS
dac0: 74 61 63 6b 5b 6a 5d 2c 20 7a 53 74 61 63 6b 5b  tack[j], zStack[
dad0: 69 5d 2c 20 61 53 74 61 63 6b 5b 6a 5d 2e 6e 29  i], aStack[j].n)
dae0: 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 6a  ;.      aStack[j
daf0: 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 28 53 54 4b  ].flags &= ~(STK
db00: 5f 53 74 61 74 69 63 7c 53 54 4b 5f 45 70 68 65  _Static|STK_Ephe
db10: 6d 29 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b  m);.      aStack
db20: 5b 6a 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 54 4b  [j].flags |= STK
db30: 5f 44 79 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _Dyn;.    }.  }.
db40: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
db50: 70 63 6f 64 65 3a 20 50 75 6c 6c 20 50 31 20 2a  pcode: Pull P1 *
db60: 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 2d   *.**.** The P1-
db70: 74 68 20 65 6c 65 6d 65 6e 74 20 69 73 20 72 65  th element is re
db80: 6d 6f 76 65 64 20 66 72 6f 6d 20 69 74 73 20 63  moved from its c
db90: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
dba0: 6f 6e 20 0a 2a 2a 20 74 68 65 20 73 74 61 63 6b  on .** the stack
dbb0: 20 61 6e 64 20 70 75 73 68 65 64 20 62 61 63 6b   and pushed back
dbc0: 20 6f 6e 20 74 6f 70 20 6f 66 20 74 68 65 20 73   on top of the s
dbd0: 74 61 63 6b 2e 20 20 54 68 65 0a 2a 2a 20 74 6f  tack.  The.** to
dbe0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
dbf0: 73 20 65 6c 65 6d 65 6e 74 20 30 2c 20 73 6f 20  s element 0, so 
dc00: 22 50 75 6c 6c 20 30 20 30 20 30 22 20 69 73 0a  "Pull 0 0 0" is.
dc10: 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 22 50 75  ** a no-op.  "Pu
dc20: 6c 6c 20 31 20 30 20 30 22 20 73 77 61 70 73 20  ll 1 0 0" swaps 
dc30: 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d  the top two elem
dc40: 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73  ents of.** the s
dc50: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tack..**.** See 
dc60: 61 6c 73 6f 20 74 68 65 20 44 75 70 20 69 6e 73  also the Dup ins
dc70: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
dc80: 65 20 4f 50 5f 50 75 6c 6c 3a 20 7b 0a 20 20 69  e OP_Pull: {.  i
dc90: 6e 74 20 66 72 6f 6d 20 3d 20 70 2d 3e 74 6f 73  nt from = p->tos
dca0: 20 2d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e   - pOp->p1;.  in
dcb0: 74 20 74 6f 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20  t to = p->tos;. 
dcc0: 20 69 6e 74 20 69 3b 0a 20 20 53 74 61 63 6b 20   int i;.  Stack 
dcd0: 74 73 3b 0a 20 20 63 68 61 72 20 2a 74 7a 3b 0a  ts;.  char *tz;.
dce0: 20 20 56 45 52 49 46 59 28 20 69 66 28 20 66 72    VERIFY( if( fr
dcf0: 6f 6d 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f  om<0 ) goto not_
dd00: 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a  enough_stack; ).
dd10: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
dd20: 28 70 2c 20 66 72 6f 6d 29 3b 0a 20 20 74 73 20  (p, from);.  ts 
dd30: 3d 20 61 53 74 61 63 6b 5b 66 72 6f 6d 5d 3b 0a  = aStack[from];.
dd40: 20 20 74 7a 20 3d 20 7a 53 74 61 63 6b 5b 66 72    tz = zStack[fr
dd50: 6f 6d 5d 3b 0a 20 20 44 65 65 70 68 65 6d 65 72  om];.  Deephemer
dd60: 61 6c 69 7a 65 28 70 2c 20 74 6f 29 3b 0a 20 20  alize(p, to);.  
dd70: 66 6f 72 28 69 3d 66 72 6f 6d 3b 20 69 3c 74 6f  for(i=from; i<to
dd80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 65 65 70  ; i++){.    Deep
dd90: 68 65 6d 65 72 61 6c 69 7a 65 28 70 2c 20 69 29  hemeralize(p, i)
dda0: 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 20  ;.    aStack[i] 
ddb0: 3d 20 61 53 74 61 63 6b 5b 69 2b 31 5d 3b 0a 20  = aStack[i+1];. 
ddc0: 20 20 20 61 73 73 65 72 74 28 20 28 61 53 74 61     assert( (aSta
ddd0: 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
dde0: 4b 5f 45 70 68 65 6d 29 3d 3d 30 20 29 3b 0a 20  K_Ephem)==0 );. 
ddf0: 20 20 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d     if( aStack[i]
de00: 2e 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 44 79  .flags & (STK_Dy
de10: 6e 7c 53 54 4b 5f 53 74 61 74 69 63 29 20 29 7b  n|STK_Static) ){
de20: 0a 20 20 20 20 20 20 7a 53 74 61 63 6b 5b 69 5d  .      zStack[i]
de30: 20 3d 20 7a 53 74 61 63 6b 5b 69 2b 31 5d 3b 0a   = zStack[i+1];.
de40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de50: 20 7a 53 74 61 63 6b 5b 69 5d 20 3d 20 61 53 74   zStack[i] = aSt
de60: 61 63 6b 5b 69 5d 2e 7a 3b 0a 20 20 20 20 7d 0a  ack[i].z;.    }.
de70: 20 20 7d 0a 20 20 61 53 74 61 63 6b 5b 74 6f 5d    }.  aStack[to]
de80: 20 3d 20 74 73 3b 0a 20 20 61 73 73 65 72 74 28   = ts;.  assert(
de90: 20 28 61 53 74 61 63 6b 5b 74 6f 5d 2e 66 6c 61   (aStack[to].fla
dea0: 67 73 20 26 20 53 54 4b 5f 45 70 68 65 6d 29 3d  gs & STK_Ephem)=
deb0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 61 53 74 61  =0 );.  if( aSta
dec0: 63 6b 5b 74 6f 5d 2e 66 6c 61 67 73 20 26 20 28  ck[to].flags & (
ded0: 53 54 4b 5f 44 79 6e 7c 53 54 4b 5f 53 74 61 74  STK_Dyn|STK_Stat
dee0: 69 63 29 20 29 7b 0a 20 20 20 20 7a 53 74 61 63  ic) ){.    zStac
def0: 6b 5b 74 6f 5d 20 3d 20 74 7a 3b 0a 20 20 7d 65  k[to] = tz;.  }e
df00: 6c 73 65 7b 0a 20 20 20 20 7a 53 74 61 63 6b 5b  lse{.    zStack[
df10: 74 6f 5d 20 3d 20 61 53 74 61 63 6b 5b 74 6f 5d  to] = aStack[to]
df20: 2e 7a 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  .z;.  }.  break;
df30: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  .}../* Opcode: P
df40: 75 73 68 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a  ush P1 * *.**.**
df50: 20 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 76   Overwrite the v
df60: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 2d 74  alue of the P1-t
df70: 68 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e 20 6f  h element down o
df80: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 28  n the.** stack (
df90: 50 31 3d 3d 30 20 69 73 20 74 68 65 20 74 6f 70  P1==0 is the top
dfa0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 29 20 77   of the stack) w
dfb0: 69 74 68 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ith the value.**
dfc0: 20 6f 66 20 74 68 65 20 74 6f 70 20 6f 66 20 74   of the top of t
dfd0: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 6e 20  he stack.  Then 
dfe0: 70 6f 70 20 74 68 65 20 74 6f 70 20 6f 66 20 74  pop the top of t
dff0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73  he stack..*/.cas
e000: 65 20 4f 50 5f 50 75 73 68 3a 20 7b 0a 20 20 69  e OP_Push: {.  i
e010: 6e 74 20 66 72 6f 6d 20 3d 20 70 2d 3e 74 6f 73  nt from = p->tos
e020: 3b 0a 20 20 69 6e 74 20 74 6f 20 3d 20 70 2d 3e  ;.  int to = p->
e030: 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31 3b 0a 0a  tos - pOp->p1;..
e040: 20 20 56 45 52 49 46 59 28 20 69 66 28 20 74 6f    VERIFY( if( to
e050: 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <0 ) goto not_en
e060: 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20  ough_stack; ).  
e070: 69 66 28 20 61 53 74 61 63 6b 5b 74 6f 5d 2e 66  if( aStack[to].f
e080: 6c 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29  lags & STK_Dyn )
e090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
e0a0: 28 7a 53 74 61 63 6b 5b 74 6f 5d 29 3b 0a 20 20  (zStack[to]);.  
e0b0: 7d 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69  }.  Deephemerali
e0c0: 7a 65 28 70 2c 20 66 72 6f 6d 29 3b 0a 20 20 61  ze(p, from);.  a
e0d0: 53 74 61 63 6b 5b 74 6f 5d 20 3d 20 61 53 74 61  Stack[to] = aSta
e0e0: 63 6b 5b 66 72 6f 6d 5d 3b 0a 20 20 69 66 28 20  ck[from];.  if( 
e0f0: 61 53 74 61 63 6b 5b 74 6f 5d 2e 66 6c 61 67 73  aStack[to].flags
e100: 20 26 20 28 53 54 4b 5f 44 79 6e 7c 53 54 4b 5f   & (STK_Dyn|STK_
e110: 53 74 61 74 69 63 7c 53 54 4b 5f 45 70 68 65 6d  Static|STK_Ephem
e120: 29 20 29 7b 0a 20 20 20 20 7a 53 74 61 63 6b 5b  ) ){.    zStack[
e130: 74 6f 5d 20 3d 20 7a 53 74 61 63 6b 5b 66 72 6f  to] = zStack[fro
e140: 6d 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m];.  }else{.   
e150: 20 7a 53 74 61 63 6b 5b 74 6f 5d 20 3d 20 61 53   zStack[to] = aS
e160: 74 61 63 6b 5b 74 6f 5d 2e 7a 3b 0a 20 20 7d 0a  tack[to].z;.  }.
e170: 20 20 61 53 74 61 63 6b 5b 66 72 6f 6d 5d 2e 66    aStack[from].f
e180: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 74  lags = 0;.  p->t
e190: 6f 73 2d 2d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  os--;.  break;.}
e1a0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c  ../* Opcode: Col
e1b0: 75 6d 6e 4e 61 6d 65 20 50 31 20 2a 20 50 33 0a  umnName P1 * P3.
e1c0: 2a 2a 0a 2a 2a 20 50 33 20 62 65 63 6f 6d 65 73  **.** P3 becomes
e1d0: 20 74 68 65 20 50 31 2d 74 68 20 63 6f 6c 75 6d   the P1-th colum
e1e0: 6e 20 6e 61 6d 65 20 28 66 69 72 73 74 20 69 73  n name (first is
e1f0: 20 30 29 2e 20 20 41 6e 20 61 72 72 61 79 20 6f   0).  An array o
e200: 66 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  f pointers.** to
e210: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   all column name
e220: 73 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  s is passed as t
e230: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72  he 4th parameter
e240: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
e250: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c  ..*/.case OP_Col
e260: 75 6d 6e 4e 61 6d 65 3a 20 7b 0a 20 20 61 73 73  umnName: {.  ass
e270: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
e280: 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 4f  && pOp->p1<p->nO
e290: 70 20 29 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 4e  p );.  p->azColN
e2a0: 61 6d 65 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 70  ame[pOp->p1] = p
e2b0: 4f 70 2d 3e 70 33 3b 0a 20 20 70 2d 3e 6e 43 61  Op->p3;.  p->nCa
e2c0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 62 72  llback = 0;.  br
e2d0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
e2e0: 65 3a 20 43 61 6c 6c 62 61 63 6b 20 50 31 20 2a  e: Callback P1 *
e2f0: 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 50 31 20   *.**.** Pop P1 
e300: 76 61 6c 75 65 73 20 6f 66 66 20 74 68 65 20 73  values off the s
e310: 74 61 63 6b 20 61 6e 64 20 66 6f 72 6d 20 74 68  tack and form th
e320: 65 6d 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  em into an array
e330: 2e 20 20 54 68 65 6e 0a 2a 2a 20 69 6e 76 6f 6b  .  Then.** invok
e340: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
e350: 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  unction using th
e360: 65 20 6e 65 77 6c 79 20 66 6f 72 6d 65 64 20 61  e newly formed a
e370: 72 72 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 33  rray as the.** 3
e380: 72 64 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  rd parameter..*/
e390: 0a 63 61 73 65 20 4f 50 5f 43 61 6c 6c 62 61 63  .case OP_Callbac
e3a0: 6b 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  k: {.  int i = p
e3b0: 2d 3e 74 6f 73 20 2d 20 70 4f 70 2d 3e 70 31 20  ->tos - pOp->p1 
e3c0: 2b 20 31 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  + 1;.  int j;.  
e3d0: 56 45 52 49 46 59 28 20 69 66 28 20 69 3c 30 20  VERIFY( if( i<0 
e3e0: 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
e3f0: 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 66 6f 72  h_stack; ).  for
e400: 28 6a 3d 69 3b 20 6a 3c 3d 70 2d 3e 74 6f 73 3b  (j=i; j<=p->tos;
e410: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   j++){.    if( a
e420: 53 74 61 63 6b 5b 6a 5d 2e 66 6c 61 67 73 20 26  Stack[j].flags &
e430: 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   STK_Null ){.   
e440: 20 20 20 7a 53 74 61 63 6b 5b 6a 5d 20 3d 20 30     zStack[j] = 0
e450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e460: 20 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20     Stringify(p, 
e470: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  j);.    }.  }.  
e480: 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 2b 31 5d  zStack[p->tos+1]
e490: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 78   = 0;.  if( p->x
e4a0: 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  Callback==0 ){. 
e4b0: 20 20 20 70 2d 3e 61 7a 52 65 73 43 6f 6c 75 6d     p->azResColum
e4c0: 6e 20 3d 20 26 7a 53 74 61 63 6b 5b 69 5d 3b 0a  n = &zStack[i];.
e4d0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
e4e0: 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  n = pOp->p1;.   
e4f0: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 70   p->popStack = p
e500: 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 2d 3e 70  Op->p1;.    p->p
e510: 63 20 3d 20 70 63 20 2b 20 31 3b 0a 20 20 20 20  c = pc + 1;.    
e520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f  return SQLITE_RO
e530: 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  W;.  }.  if( sql
e540: 69 74 65 53 61 66 65 74 79 4f 66 66 28 64 62 29  iteSafetyOff(db)
e550: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
e560: 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 20 0a 20 20  e_to_misuse; .  
e570: 69 66 28 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b  if( p->xCallback
e580: 28 70 2d 3e 70 43 62 41 72 67 2c 20 70 4f 70 2d  (p->pCbArg, pOp-
e590: 3e 70 31 2c 20 26 7a 53 74 61 63 6b 5b 69 5d 2c  >p1, &zStack[i],
e5a0: 20 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 29 21 3d   p->azColName)!=
e5b0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
e5c0: 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
e5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65    if( sqliteSafe
e5e0: 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20  tyOn(db) ) goto 
e5f0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
e600: 75 73 65 3b 0a 20 20 70 2d 3e 6e 43 61 6c 6c 62  use;.  p->nCallb
e610: 61 63 6b 2b 2b 3b 0a 20 20 50 6f 70 53 74 61 63  ack++;.  PopStac
e620: 6b 28 70 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  k(p, pOp->p1);. 
e630: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
e640: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
e650: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 62 72 65 61 6b   no_mem;.  break
e660: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
e670: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 20 50 31 20  NullCallback P1 
e680: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  * *.**.** Invoke
e690: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
e6a0: 6e 63 74 69 6f 6e 20 6f 6e 63 65 20 77 69 74 68  nction once with
e6b0: 20 74 68 65 20 32 6e 64 20 61 72 67 75 6d 65 6e   the 2nd argumen
e6c0: 74 20 28 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  t (the.** number
e6d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 29 20 65 71 75   of columns) equ
e6e0: 61 6c 20 74 6f 20 50 31 20 61 6e 64 20 77 69 74  al to P1 and wit
e6f0: 68 20 74 68 65 20 34 74 68 20 61 72 67 75 6d 65  h the 4th argume
e700: 6e 74 20 28 74 68 65 0a 2a 2a 20 6e 61 6d 65 73  nt (the.** names
e710: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 29   of the columns)
e720: 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20 74   set according t
e730: 6f 20 70 72 69 6f 72 20 4f 50 5f 43 6f 6c 75 6d  o prior OP_Colum
e740: 6e 4e 61 6d 65 0a 2a 2a 20 69 6e 73 74 72 75 63  nName.** instruc
e750: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 69 73 20  tions.  This is 
e760: 61 6c 6c 20 6c 69 6b 65 20 74 68 65 20 72 65 67  all like the reg
e770: 75 6c 61 72 0a 2a 2a 20 4f 50 5f 43 61 6c 6c 62  ular.** OP_Callb
e780: 61 63 6b 20 6f 72 20 4f 50 5f 53 6f 72 74 43 61  ack or OP_SortCa
e790: 6c 6c 62 61 63 6b 20 6f 70 63 6f 64 65 73 2e 20  llback opcodes. 
e7a0: 20 42 75 74 20 74 68 65 20 33 72 64 20 61 72 67   But the 3rd arg
e7b0: 75 6d 65 6e 74 0a 2a 2a 20 77 68 69 63 68 20 6e  ument.** which n
e7c0: 6f 72 6d 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  ormally contains
e7d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
e7e0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
e7f0: 72 73 20 74 6f 0a 2a 2a 20 64 61 74 61 20 69 73  rs to.** data is
e800: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
e810: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 6c   callback is onl
e820: 79 20 69 6e 76 6f 6b 65 64 20 69 66 20 74 68 65  y invoked if the
e830: 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
e840: 70 72 69 6f 72 20 63 61 6c 6c 73 0a 2a 2a 20 74  prior calls.** t
e850: 6f 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 20 6f 72  o OP_Callback or
e860: 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b   OP_SortCallback
e870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
e880: 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 72  ode is used to r
e890: 65 70 6f 72 74 20 74 68 65 20 6e 75 6d 62 65 72  eport the number
e8a0: 20 61 6e 64 20 6e 61 6d 65 73 20 6f 66 20 63 6f   and names of co
e8b0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  lumns.** in case
e8c0: 73 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  s where the resu
e8d0: 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74 79 2e  lt set is empty.
e8e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
e8f0: 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 69 66  Callback: {.  if
e900: 28 20 70 2d 3e 6e 43 61 6c 6c 62 61 63 6b 3d 3d  ( p->nCallback==
e910: 30 20 26 26 20 70 2d 3e 78 43 61 6c 6c 62 61 63  0 && p->xCallbac
e920: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  k!=0 ){.    if( 
e930: 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66 28  sqliteSafetyOff(
e940: 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  db) ) goto abort
e950: 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 20  _due_to_misuse; 
e960: 0a 20 20 20 20 69 66 28 20 70 2d 3e 78 43 61 6c  .    if( p->xCal
e970: 6c 62 61 63 6b 28 70 2d 3e 70 43 62 41 72 67 2c  lback(p->pCbArg,
e980: 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 70 2d 3e   pOp->p1, 0, p->
e990: 61 7a 43 6f 6c 4e 61 6d 65 29 21 3d 30 20 29 7b  azColName)!=0 ){
e9a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e9b0: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a  TE_ABORT;.    }.
e9c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 61      if( sqliteSa
e9d0: 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74  fetyOn(db) ) got
e9e0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
e9f0: 69 73 75 73 65 3b 0a 20 20 20 20 70 2d 3e 6e 43  isuse;.    p->nC
ea00: 61 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 69  allback++;.    i
ea10: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
ea20: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e  _failed ) goto n
ea30: 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  o_mem;.  }.  p->
ea40: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70 4f 70  nResColumn = pOp
ea50: 2d 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p1;.  break;.}
ea60: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e  ../* Opcode: Con
ea70: 63 61 74 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a  cat P1 P2 P3.**.
ea80: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 66  ** Look at the f
ea90: 69 72 73 74 20 50 31 20 65 6c 65 6d 65 6e 74 73  irst P1 elements
eaa0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
eab0: 41 70 70 65 6e 64 20 74 68 65 6d 20 61 6c 6c 20  Append them all 
eac0: 0a 2a 2a 20 74 6f 67 65 74 68 65 72 20 77 69 74  .** together wit
ead0: 68 20 74 68 65 20 6c 6f 77 65 73 74 20 65 6c 65  h the lowest ele
eae0: 6d 65 6e 74 20 66 69 72 73 74 2e 20 20 55 73 65  ment first.  Use
eaf0: 20 50 33 20 61 73 20 61 20 73 65 70 61 72 61 74   P3 as a separat
eb00: 6f 72 2e 20 20 0a 2a 2a 20 50 75 74 20 74 68 65  or.  .** Put the
eb10: 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74   result on the t
eb20: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
eb30: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 50    The original P
eb40: 31 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 61 72  1 elements.** ar
eb50: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
eb60: 65 20 73 74 61 63 6b 20 69 66 20 50 32 3d 3d 30  e stack if P2==0
eb70: 20 61 6e 64 20 72 65 74 61 69 6e 65 64 20 69 66   and retained if
eb80: 20 50 32 3d 3d 31 2e 20 20 49 66 0a 2a 2a 20 61   P2==1.  If.** a
eb90: 6e 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ny element of th
eba0: 65 20 73 74 61 63 6b 20 69 73 20 4e 55 4c 4c 2c  e stack is NULL,
ebb0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
ebc0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
ebd0: 49 66 20 50 33 20 69 73 20 4e 55 4c 4c 2c 20 74  If P3 is NULL, t
ebe0: 68 65 6e 20 75 73 65 20 6e 6f 20 73 65 70 61 72  hen use no separ
ebf0: 61 74 6f 72 2e 20 20 57 68 65 6e 20 50 31 3d 3d  ator.  When P1==
ec00: 31 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  1, this routine.
ec10: 2a 2a 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20  ** makes a copy 
ec20: 6f 66 20 74 68 65 20 74 6f 70 20 73 74 61 63 6b  of the top stack
ec30: 20 65 6c 65 6d 65 6e 74 20 69 6e 74 6f 20 6d 65   element into me
ec40: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
ec50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
ec60: 6f 63 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  oc()..*/.case OP
ec70: 5f 43 6f 6e 63 61 74 3a 20 7b 0a 20 20 63 68 61  _Concat: {.  cha
ec80: 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *zNew;.  int n
ec90: 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 46 69 65  Byte;.  int nFie
eca0: 6c 64 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ld;.  int i, j;.
ecb0: 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20    char *zSep;.  
ecc0: 69 6e 74 20 6e 53 65 70 3b 0a 0a 20 20 6e 46 69  int nSep;..  nFi
ecd0: 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  eld = pOp->p1;. 
ece0: 20 7a 53 65 70 20 3d 20 70 4f 70 2d 3e 70 33 3b   zSep = pOp->p3;
ecf0: 0a 20 20 69 66 28 20 7a 53 65 70 3d 3d 30 20 29  .  if( zSep==0 )
ed00: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 6e 53   zSep = "";.  nS
ed10: 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70  ep = strlen(zSep
ed20: 29 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  );.  VERIFY( if(
ed30: 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69 65 6c 64   p->tos+1<nField
ed40: 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
ed50: 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 6e 42  gh_stack; ).  nB
ed60: 79 74 65 20 3d 20 31 20 2d 20 6e 53 65 70 3b 0a  yte = 1 - nSep;.
ed70: 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e    for(i=p->tos-n
ed80: 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74  Field+1; i<=p->t
ed90: 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  os; i++){.    if
eda0: 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ( aStack[i].flag
edb0: 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a  s & STK_Null ){.
edc0: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 2d 31        nByte = -1
edd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ede0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edf0: 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69 29 3b  Stringify(p, i);
ee00: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
ee10: 61 53 74 61 63 6b 5b 69 5d 2e 6e 20 2d 20 31 20  aStack[i].n - 1 
ee20: 2b 20 6e 53 65 70 3b 0a 20 20 20 20 7d 0a 20 20  + nSep;.    }.  
ee30: 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20  }.  if( nByte<0 
ee40: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
ee50: 70 32 3d 3d 30 20 29 20 50 6f 70 53 74 61 63 6b  p2==0 ) PopStack
ee60: 28 70 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  (p, nField);.   
ee70: 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20 20 61   p->tos++;.    a
ee80: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
ee90: 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a  ags = STK_Null;.
eea0: 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f      zStack[p->to
eeb0: 73 5d 20 3d 20 30 3b 0a 20 20 20 20 62 72 65 61  s] = 0;.    brea
eec0: 6b 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 20 3d 20  k;.  }.  zNew = 
eed0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
eee0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
eef0: 7a 4e 65 77 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  zNew==0 ) goto n
ef00: 6f 5f 6d 65 6d 3b 0a 20 20 6a 20 3d 20 30 3b 0a  o_mem;.  j = 0;.
ef10: 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e    for(i=p->tos-n
ef20: 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74  Field+1; i<=p->t
ef30: 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  os; i++){.    if
ef40: 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61  ( (aStack[i].fla
ef50: 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 3d 3d  gs & STK_Null)==
ef60: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
ef70: 79 28 26 7a 4e 65 77 5b 6a 5d 2c 20 7a 53 74 61  y(&zNew[j], zSta
ef80: 63 6b 5b 69 5d 2c 20 61 53 74 61 63 6b 5b 69 5d  ck[i], aStack[i]
ef90: 2e 6e 2d 31 29 3b 0a 20 20 20 20 20 20 6a 20 2b  .n-1);.      j +
efa0: 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 2d 31 3b  = aStack[i].n-1;
efb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
efc0: 53 65 70 3e 30 20 26 26 20 69 3c 70 2d 3e 74 6f  Sep>0 && i<p->to
efd0: 73 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  s ){.      memcp
efe0: 79 28 26 7a 4e 65 77 5b 6a 5d 2c 20 7a 53 65 70  y(&zNew[j], zSep
eff0: 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nSep);.      j
f000: 20 2b 3d 20 6e 53 65 70 3b 0a 20 20 20 20 7d 0a   += nSep;.    }.
f010: 20 20 7d 0a 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20    }.  zNew[j] = 
f020: 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  0;.  if( pOp->p2
f030: 3d 3d 30 20 29 20 50 6f 70 53 74 61 63 6b 28 70  ==0 ) PopStack(p
f040: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 70 2d 3e  , nField);.  p->
f050: 74 6f 73 2b 2b 3b 0a 20 20 61 53 74 61 63 6b 5b  tos++;.  aStack[
f060: 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e 42 79 74  p->tos].n = nByt
f070: 65 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74  e;.  aStack[p->t
f080: 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  os].flags = STK_
f090: 53 74 72 7c 53 54 4b 5f 44 79 6e 3b 0a 20 20 7a  Str|STK_Dyn;.  z
f0a0: 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20  Stack[p->tos] = 
f0b0: 7a 4e 65 77 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  zNew;.  break;.}
f0c0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64  ../* Opcode: Add
f0d0: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70   * * *.**.** Pop
f0e0: 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65   the top two ele
f0f0: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
f100: 74 61 63 6b 2c 20 61 64 64 20 74 68 65 6d 20 74  tack, add them t
f110: 6f 67 65 74 68 65 72 2c 0a 2a 2a 20 61 6e 64 20  ogether,.** and 
f120: 70 75 73 68 20 74 68 65 20 72 65 73 75 6c 74 20  push the result 
f130: 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 73 74  back onto the st
f140: 61 63 6b 2e 20 20 49 66 20 65 69 74 68 65 72 20  ack.  If either 
f150: 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  element.** is a 
f160: 73 74 72 69 6e 67 20 74 68 65 6e 20 69 74 20 69  string then it i
f170: 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  s converted to a
f180: 20 64 6f 75 62 6c 65 20 75 73 69 6e 67 20 74 68   double using th
f190: 65 20 61 74 6f 66 28 29 0a 2a 2a 20 66 75 6e 63  e atof().** func
f1a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
f1b0: 61 64 64 69 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  addition..** If 
f1c0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
f1d0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
f1e0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
f1f0: 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70  * Opcode: Multip
f200: 6c 79 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  ly * * *.**.** P
f210: 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
f220: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
f230: 20 73 74 61 63 6b 2c 20 6d 75 6c 74 69 70 6c 79   stack, multiply
f240: 20 74 68 65 6d 20 74 6f 67 65 74 68 65 72 2c 0a   them together,.
f250: 2a 2a 20 61 6e 64 20 70 75 73 68 20 74 68 65 20  ** and push the 
f260: 72 65 73 75 6c 74 20 62 61 63 6b 20 6f 6e 74 6f  result back onto
f270: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
f280: 65 69 74 68 65 72 20 65 6c 65 6d 65 6e 74 0a 2a  either element.*
f290: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  * is a string th
f2a0: 65 6e 20 69 74 20 69 73 20 63 6f 6e 76 65 72 74  en it is convert
f2b0: 65 64 20 74 6f 20 61 20 64 6f 75 62 6c 65 20 75  ed to a double u
f2c0: 73 69 6e 67 20 74 68 65 20 61 74 6f 66 28 29 0a  sing the atof().
f2d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f  ** function befo
f2e0: 72 65 20 74 68 65 20 6d 75 6c 74 69 70 6c 69 63  re the multiplic
f2f0: 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 65 69 74  ation..** If eit
f300: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
f310: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
f320: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
f330: 70 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20  pcode: Subtract 
f340: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20  * * *.**.** Pop 
f350: 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d  the top two elem
f360: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
f370: 61 63 6b 2c 20 73 75 62 74 72 61 63 74 20 74 68  ack, subtract th
f380: 65 0a 2a 2a 20 66 69 72 73 74 20 28 77 68 61 74  e.** first (what
f390: 20 77 61 73 20 6f 6e 20 74 6f 70 20 6f 66 20 74   was on top of t
f3a0: 68 65 20 73 74 61 63 6b 29 20 66 72 6f 6d 20 74  he stack) from t
f3b0: 68 65 20 73 65 63 6f 6e 64 20 28 74 68 65 0a 2a  he second (the.*
f3c0: 2a 20 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b 29  * next on stack)
f3d0: 0a 2a 2a 20 61 6e 64 20 70 75 73 68 20 74 68 65  .** and push the
f3e0: 20 72 65 73 75 6c 74 20 62 61 63 6b 20 6f 6e 74   result back ont
f3f0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  o the stack.  If
f400: 20 65 69 74 68 65 72 20 65 6c 65 6d 65 6e 74 0a   either element.
f410: 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 74  ** is a string t
f420: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 76 65 72  hen it is conver
f430: 74 65 64 20 74 6f 20 61 20 64 6f 75 62 6c 65 20  ted to a double 
f440: 75 73 69 6e 67 20 74 68 65 20 61 74 6f 66 28 29  using the atof()
f450: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 62 65 66  .** function bef
f460: 6f 72 65 20 74 68 65 20 73 75 62 74 72 61 63 74  ore the subtract
f470: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  ion..** If eithe
f480: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f490: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
f4a0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
f4b0: 6f 64 65 3a 20 44 69 76 69 64 65 20 2a 20 2a 20  ode: Divide * * 
f4c0: 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  *.**.** Pop the 
f4d0: 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  top two elements
f4e0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2c   from the stack,
f4f0: 20 64 69 76 69 64 65 20 74 68 65 0a 2a 2a 20 66   divide the.** f
f500: 69 72 73 74 20 28 77 68 61 74 20 77 61 73 20 6f  irst (what was o
f510: 6e 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  n top of the sta
f520: 63 6b 29 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ck) from the sec
f530: 6f 6e 64 20 28 74 68 65 0a 2a 2a 20 6e 65 78 74  ond (the.** next
f540: 20 6f 6e 20 73 74 61 63 6b 29 0a 2a 2a 20 61 6e   on stack).** an
f550: 64 20 70 75 73 68 20 74 68 65 20 72 65 73 75 6c  d push the resul
f560: 74 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20  t back onto the 
f570: 73 74 61 63 6b 2e 20 20 49 66 20 65 69 74 68 65  stack.  If eithe
f580: 72 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  r element.** is 
f590: 61 20 73 74 72 69 6e 67 20 74 68 65 6e 20 69 74  a string then it
f5a0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
f5b0: 20 61 20 64 6f 75 62 6c 65 20 75 73 69 6e 67 20   a double using 
f5c0: 74 68 65 20 61 74 6f 66 28 29 0a 2a 2a 20 66 75  the atof().** fu
f5d0: 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  nction before th
f5e0: 65 20 64 69 76 69 73 69 6f 6e 2e 20 20 44 69 76  e division.  Div
f5f0: 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 20 72 65  ision by zero re
f600: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  turns NULL..** I
f610: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
f620: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
f630: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
f640: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61  ./* Opcode: Rema
f650: 69 6e 64 65 72 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  inder * * *.**.*
f660: 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74 77  * Pop the top tw
f670: 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  o elements from 
f680: 74 68 65 20 73 74 61 63 6b 2c 20 64 69 76 69 64  the stack, divid
f690: 65 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 28  e the.** first (
f6a0: 77 68 61 74 20 77 61 73 20 6f 6e 20 74 6f 70 20  what was on top 
f6b0: 6f 66 20 74 68 65 20 73 74 61 63 6b 29 20 66 72  of the stack) fr
f6c0: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 28 74  om the second (t
f6d0: 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 6e 20 73 74  he.** next on st
f6e0: 61 63 6b 29 0a 2a 2a 20 61 6e 64 20 70 75 73 68  ack).** and push
f6f0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61   the remainder a
f700: 66 74 65 72 20 64 69 76 69 73 69 6f 6e 20 6f 6e  fter division on
f710: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  to the stack.  I
f720: 66 20 65 69 74 68 65 72 20 65 6c 65 6d 65 6e 74  f either element
f730: 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
f740: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 76 65  then it is conve
f750: 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62 6c 65  rted to a double
f760: 20 75 73 69 6e 67 20 74 68 65 20 61 74 6f 66 28   using the atof(
f770: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 62 65  ).** function be
f780: 66 6f 72 65 20 74 68 65 20 64 69 76 69 73 69 6f  fore the divisio
f790: 6e 2e 20 20 44 69 76 69 73 69 6f 6e 20 62 79 20  n.  Division by 
f7a0: 7a 65 72 6f 20 72 65 74 75 72 6e 73 20 4e 55 4c  zero returns NUL
f7b0: 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  L..** If either 
f7c0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c  operand is NULL,
f7d0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
f7e0: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
f7f0: 41 64 64 3a 0a 63 61 73 65 20 4f 50 5f 53 75 62  Add:.case OP_Sub
f800: 74 72 61 63 74 3a 0a 63 61 73 65 20 4f 50 5f 4d  tract:.case OP_M
f810: 75 6c 74 69 70 6c 79 3a 0a 63 61 73 65 20 4f 50  ultiply:.case OP
f820: 5f 44 69 76 69 64 65 3a 0a 63 61 73 65 20 4f 50  _Divide:.case OP
f830: 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 0a 20 20  _Remainder: {.  
f840: 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73  int tos = p->tos
f850: 3b 0a 20 20 69 6e 74 20 6e 6f 73 20 3d 20 74 6f  ;.  int nos = to
f860: 73 20 2d 20 31 3b 0a 20 20 56 45 52 49 46 59 28  s - 1;.  VERIFY(
f870: 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74   if( nos<0 ) got
f880: 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
f890: 63 6b 3b 20 29 0a 20 20 69 66 28 20 28 28 61 53  ck; ).  if( ((aS
f8a0: 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
f8b0: 7c 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c  | aStack[nos].fl
f8c0: 61 67 73 29 20 26 20 53 54 4b 5f 4e 75 6c 6c 29  ags) & STK_Null)
f8d0: 21 3d 30 20 29 7b 0a 20 20 20 20 50 4f 50 53 54  !=0 ){.    POPST
f8e0: 41 43 4b 3b 0a 20 20 20 20 52 65 6c 65 61 73 65  ACK;.    Release
f8f0: 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 61 53  (p, nos);.    aS
f900: 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20  tack[nos].flags 
f910: 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 7d 65  = STK_Null;.  }e
f920: 6c 73 65 20 69 66 28 20 28 61 53 74 61 63 6b 5b  lse if( (aStack[
f930: 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 61 53 74  tos].flags & aSt
f940: 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 26  ack[nos].flags &
f950: 20 53 54 4b 5f 49 6e 74 29 3d 3d 53 54 4b 5f 49   STK_Int)==STK_I
f960: 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 2c  nt ){.    int a,
f970: 20 62 3b 0a 20 20 20 20 61 20 3d 20 61 53 74 61   b;.    a = aSta
f980: 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20 20 20 62  ck[tos].i;.    b
f990: 20 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69   = aStack[nos].i
f9a0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f  ;.    switch( pO
f9b0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
f9c0: 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20     case OP_Add: 
f9d0: 20 20 20 20 20 20 20 20 62 20 2b 3d 20 61 3b 20          b += a; 
f9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f9f0: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
fa00: 61 63 74 3a 20 20 20 20 62 20 2d 3d 20 61 3b 20  act:    b -= a; 
fa10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fa20: 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69     case OP_Multi
fa30: 70 6c 79 3a 20 20 20 20 62 20 2a 3d 20 61 3b 20  ply:    b *= a; 
fa40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fa50: 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64     case OP_Divid
fa60: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
fa70: 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 69 76   a==0 ) goto div
fa80: 69 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a 20 20 20  ide_by_zero;.   
fa90: 20 20 20 20 20 62 20 2f 3d 20 61 3b 0a 20 20 20       b /= a;.   
faa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fab0: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
fac0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
fad0: 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 69 76   a==0 ) goto div
fae0: 69 64 65 5f 62 79 5f 7a 65 72 6f 3b 0a 20 20 20  ide_by_zero;.   
faf0: 20 20 20 20 20 62 20 25 3d 20 61 3b 0a 20 20 20       b %= a;.   
fb00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fb10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 50 4f    }.    }.    PO
fb20: 50 53 54 41 43 4b 3b 0a 20 20 20 20 52 65 6c 65  PSTACK;.    Rele
fb30: 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20  ase(p, nos);.   
fb40: 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 20 3d   aStack[nos].i =
fb50: 20 62 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 6e   b;.    aStack[n
fb60: 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  os].flags = STK_
fb70: 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Int;.  }else{.  
fb80: 20 20 64 6f 75 62 6c 65 20 61 2c 20 62 3b 0a 20    double a, b;. 
fb90: 20 20 20 52 65 61 6c 69 66 79 28 70 2c 20 74 6f     Realify(p, to
fba0: 73 29 3b 0a 20 20 20 20 52 65 61 6c 69 66 79 28  s);.    Realify(
fbb0: 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 61 20 3d  p, nos);.    a =
fbc0: 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 3b 0a   aStack[tos].r;.
fbd0: 20 20 20 20 62 20 3d 20 61 53 74 61 63 6b 5b 6e      b = aStack[n
fbe0: 6f 73 5d 2e 72 3b 0a 20 20 20 20 73 77 69 74 63  os].r;.    switc
fbf0: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
fc00: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
fc10: 41 64 64 3a 20 20 20 20 20 20 20 20 20 62 20 2b  Add:         b +
fc20: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
fc30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
fc40: 53 75 62 74 72 61 63 74 3a 20 20 20 20 62 20 2d  Subtract:    b -
fc50: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
fc60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
fc70: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 62 20 2a  Multiply:    b *
fc80: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
fc90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
fca0: 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20  Divide: {.      
fcb0: 20 20 69 66 28 20 61 3d 3d 30 2e 30 20 29 20 67    if( a==0.0 ) g
fcc0: 6f 74 6f 20 64 69 76 69 64 65 5f 62 79 5f 7a 65  oto divide_by_ze
fcd0: 72 6f 3b 0a 20 20 20 20 20 20 20 20 62 20 2f 3d  ro;.        b /=
fce0: 20 61 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   a;.        brea
fcf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
fd00: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
fd10: 20 20 20 20 69 6e 74 20 69 61 20 3d 20 28 69 6e      int ia = (in
fd20: 74 29 61 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t)a;.        int
fd30: 20 69 62 20 3d 20 28 69 6e 74 29 62 3b 0a 20 20   ib = (int)b;.  
fd40: 20 20 20 20 20 20 69 66 28 20 69 61 3d 3d 30 2e        if( ia==0.
fd50: 30 20 29 20 67 6f 74 6f 20 64 69 76 69 64 65 5f  0 ) goto divide_
fd60: 62 79 5f 7a 65 72 6f 3b 0a 20 20 20 20 20 20 20  by_zero;.       
fd70: 20 62 20 3d 20 69 62 20 25 20 69 61 3b 0a 20 20   b = ib % ia;.  
fd80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fd90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 50     }.    }.    P
fda0: 4f 50 53 54 41 43 4b 3b 0a 20 20 20 20 52 65 6c  OPSTACK;.    Rel
fdb0: 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a 20 20  ease(p, nos);.  
fdc0: 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 72 20    aStack[nos].r 
fdd0: 3d 20 62 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  = b;.    aStack[
fde0: 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  nos].flags = STK
fdf0: 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 62 72 65  _Real;.  }.  bre
fe00: 61 6b 3b 0a 0a 64 69 76 69 64 65 5f 62 79 5f 7a  ak;..divide_by_z
fe10: 65 72 6f 3a 0a 20 20 50 6f 70 53 74 61 63 6b 28  ero:.  PopStack(
fe20: 70 2c 20 32 29 3b 0a 20 20 70 2d 3e 74 6f 73 20  p, 2);.  p->tos 
fe30: 3d 20 6e 6f 73 3b 0a 20 20 61 53 74 61 63 6b 5b  = nos;.  aStack[
fe40: 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  nos].flags = STK
fe50: 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a  _Null;.  break;.
fe60: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75  }../* Opcode: Fu
fe70: 6e 63 74 69 6f 6e 20 50 31 20 2a 20 50 33 0a 2a  nction P1 * P3.*
fe80: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73  *.** Invoke a us
fe90: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 33 20  er function (P3 
fea0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
feb0: 61 20 46 75 6e 63 74 69 6f 6e 20 73 74 72 75 63  a Function struc
fec0: 74 75 72 65 20 74 68 61 74 0a 2a 2a 20 64 65 66  ture that.** def
fed0: 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f  ines the functio
fee0: 6e 29 20 77 69 74 68 20 50 31 20 73 74 72 69 6e  n) with P1 strin
fef0: 67 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65  g arguments take
ff00: 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  n from the stack
ff10: 2e 0a 2a 2a 20 50 6f 70 20 61 6c 6c 20 61 72 67  ..** Pop all arg
ff20: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  uments from the 
ff30: 73 74 61 63 6b 20 61 6e 64 20 70 75 73 68 20 62  stack and push b
ff40: 61 63 6b 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ack the result..
ff50: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
ff60: 41 67 67 46 75 6e 63 0a 2a 2f 0a 63 61 73 65 20  AggFunc.*/.case 
ff70: 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20  OP_Function: {. 
ff80: 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 71 6c   int n, i;.  sql
ff90: 69 74 65 5f 66 75 6e 63 20 63 74 78 3b 0a 0a 20  ite_func ctx;.. 
ffa0: 20 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   n = pOp->p1;.  
ffb0: 56 45 52 49 46 59 28 20 69 66 28 20 6e 3c 30 20  VERIFY( if( n<0 
ffc0: 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72  ) goto bad_instr
ffd0: 75 63 74 69 6f 6e 3b 20 29 0a 20 20 56 45 52 49  uction; ).  VERI
ffe0: 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b 31  FY( if( p->tos+1
fff0: 3c 6e 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <n ) goto not_en
10000 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20  ough_stack; ).  
10010 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 2b 31  for(i=p->tos-n+1
10020 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b  ; i<=p->tos; i++
10030 29 7b 0a 20 20 20 20 69 66 28 20 61 53 74 61 63  ){.    if( aStac
10040 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  k[i].flags & STK
10050 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 7a  _Null ){.      z
10060 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20  Stack[i] = 0;.  
10070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
10080 74 72 69 6e 67 69 66 79 28 70 2c 20 69 29 3b 0a  tringify(p, i);.
10090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 74 78 2e      }.  }.  ctx.
100a0 70 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66  pFunc = (FuncDef
100b0 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 63 74 78  *)pOp->p3;.  ctx
100c0 2e 73 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e  .s.flags = STK_N
100d0 75 6c 6c 3b 0a 20 20 63 74 78 2e 7a 20 3d 20 30  ull;.  ctx.z = 0
100e0 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ;.  ctx.isError 
100f0 3d 20 30 3b 0a 20 20 63 74 78 2e 69 73 53 74 65  = 0;.  ctx.isSte
10100 70 20 3d 20 30 3b 0a 20 20 28 2a 63 74 78 2e 70  p = 0;.  (*ctx.p
10110 46 75 6e 63 2d 3e 78 46 75 6e 63 29 28 26 63 74  Func->xFunc)(&ct
10120 78 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61  x, n, (const cha
10130 72 2a 2a 29 26 7a 53 74 61 63 6b 5b 70 2d 3e 74  r**)&zStack[p->t
10140 6f 73 2d 6e 2b 31 5d 29 3b 0a 20 20 50 6f 70 53  os-n+1]);.  PopS
10150 74 61 63 6b 28 70 2c 20 6e 29 3b 0a 20 20 70 2d  tack(p, n);.  p-
10160 3e 74 6f 73 2b 2b 3b 0a 20 20 61 53 74 61 63 6b  >tos++;.  aStack
10170 5b 70 2d 3e 74 6f 73 5d 20 3d 20 63 74 78 2e 73  [p->tos] = ctx.s
10180 3b 0a 20 20 69 66 28 20 63 74 78 2e 73 2e 66 6c  ;.  if( ctx.s.fl
10190 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b  ags & STK_Dyn ){
101a0 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74  .    zStack[p->t
101b0 6f 73 5d 20 3d 20 63 74 78 2e 7a 3b 0a 20 20 7d  os] = ctx.z;.  }
101c0 65 6c 73 65 20 69 66 28 20 63 74 78 2e 73 2e 66  else if( ctx.s.f
101d0 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 72 20 29  lags & STK_Str )
101e0 7b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e  {.    zStack[p->
101f0 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b 5b 70 2d  tos] = aStack[p-
10200 3e 74 6f 73 5d 2e 7a 3b 0a 20 20 7d 65 6c 73 65  >tos].z;.  }else
10210 7b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e  {.    zStack[p->
10220 74 6f 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tos] = 0;.  }.  
10230 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20  if( ctx.isError 
10240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
10250 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
10260 73 67 2c 20 0a 20 20 20 20 20 20 20 7a 53 74 61  sg, .       zSta
10270 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3f 20 7a 53 74  ck[p->tos] ? zSt
10280 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3a 20 22 75  ack[p->tos] : "u
10290 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 65 72 72  ser function err
102a0 6f 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  or", 0);.    rc 
102b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
102c0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
102d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e  /* Opcode: BitAn
102e0 64 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f  d * * *.**.** Po
102f0 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c  p the top two el
10300 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
10310 73 74 61 63 6b 2e 20 20 43 6f 6e 76 65 72 74 20  stack.  Convert 
10320 62 6f 74 68 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a  both elements.**
10330 20 74 6f 20 69 6e 74 65 67 65 72 73 2e 20 20 50   to integers.  P
10340 75 73 68 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68  ush back onto th
10350 65 20 73 74 61 63 6b 20 74 68 65 20 62 69 74 2d  e stack the bit-
10360 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65 0a  wise AND of the.
10370 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2e  ** two elements.
10380 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70  .** If either op
10390 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74  erand is NULL, t
103a0 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
103b0 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
103c0 20 42 69 74 4f 72 20 2a 20 2a 20 2a 0a 2a 2a 0a   BitOr * * *.**.
103d0 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74  ** Pop the top t
103e0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  wo elements from
103f0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 43 6f 6e   the stack.  Con
10400 76 65 72 74 20 62 6f 74 68 20 65 6c 65 6d 65 6e  vert both elemen
10410 74 73 0a 2a 2a 20 74 6f 20 69 6e 74 65 67 65 72  ts.** to integer
10420 73 2e 20 20 50 75 73 68 20 62 61 63 6b 20 6f 6e  s.  Push back on
10430 74 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68 65  to the stack the
10440 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20   bit-wise OR of 
10450 74 68 65 0a 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  the.** two eleme
10460 6e 74 73 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  nts..** If eithe
10470 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
10480 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
10490 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
104a0 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20 2a  ode: ShiftLeft *
104b0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74   * *.**.** Pop t
104c0 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
104d0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
104e0 63 6b 2e 20 20 43 6f 6e 76 65 72 74 20 62 6f 74  ck.  Convert bot
104f0 68 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 6f  h elements.** to
10500 20 69 6e 74 65 67 65 72 73 2e 20 20 50 75 73 68   integers.  Push
10510 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 73   back onto the s
10520 74 61 63 6b 20 74 68 65 20 74 6f 70 20 65 6c 65  tack the top ele
10530 6d 65 6e 74 20 73 68 69 66 74 65 64 0a 2a 2a 20  ment shifted.** 
10540 6c 65 66 74 20 62 79 20 4e 20 62 69 74 73 20 77  left by N bits w
10550 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 73 65  here N is the se
10560 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  cond element on 
10570 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 49 66  the stack..** If
10580 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
10590 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
105a0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
105b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74  /* Opcode: Shift
105c0 52 69 67 68 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  Right * * *.**.*
105d0 2a 20 50 6f 70 20 74 68 65 20 74 6f 70 20 74 77  * Pop the top tw
105e0 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  o elements from 
105f0 74 68 65 20 73 74 61 63 6b 2e 20 20 43 6f 6e 76  the stack.  Conv
10600 65 72 74 20 62 6f 74 68 20 65 6c 65 6d 65 6e 74  ert both element
10610 73 0a 2a 2a 20 74 6f 20 69 6e 74 65 67 65 72 73  s.** to integers
10620 2e 20 20 50 75 73 68 20 62 61 63 6b 20 6f 6e 74  .  Push back ont
10630 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68 65 20  o the stack the 
10640 74 6f 70 20 65 6c 65 6d 65 6e 74 20 73 68 69 66  top element shif
10650 74 65 64 0a 2a 2a 20 72 69 67 68 74 20 62 79 20  ted.** right by 
10660 4e 20 62 69 74 73 20 77 68 65 72 65 20 4e 20 69  N bits where N i
10670 73 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  s the second ele
10680 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 74 61 63  ment on the stac
10690 6b 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  k..** If either 
106a0 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c  operand is NULL,
106b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
106c0 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
106d0 42 69 74 41 6e 64 3a 0a 63 61 73 65 20 4f 50 5f  BitAnd:.case OP_
106e0 42 69 74 4f 72 3a 0a 63 61 73 65 20 4f 50 5f 53  BitOr:.case OP_S
106f0 68 69 66 74 4c 65 66 74 3a 0a 63 61 73 65 20 4f  hiftLeft:.case O
10700 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20 7b 0a  P_ShiftRight: {.
10710 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
10720 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20 3d 20  os;.  int nos = 
10730 74 6f 73 20 2d 20 31 3b 0a 20 20 69 6e 74 20 61  tos - 1;.  int a
10740 2c 20 62 3b 0a 20 20 56 45 52 49 46 59 28 20 69  , b;.  VERIFY( i
10750 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74 6f 20  f( nos<0 ) goto 
10760 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
10770 3b 20 29 0a 20 20 69 66 28 20 28 61 53 74 61 63  ; ).  if( (aStac
10780 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 7c 20 61  k[tos].flags | a
10790 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73  Stack[nos].flags
107a0 29 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a  ) & STK_Null ){.
107b0 20 20 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20      POPSTACK;.  
107c0 20 20 52 65 6c 65 61 73 65 28 70 2c 6e 6f 73 29    Release(p,nos)
107d0 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f 73  ;.    aStack[nos
107e0 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75  ].flags = STK_Nu
107f0 6c 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ll;.    break;. 
10800 20 7d 0a 20 20 49 6e 74 65 67 65 72 69 66 79 28   }.  Integerify(
10810 70 2c 20 74 6f 73 29 3b 0a 20 20 49 6e 74 65 67  p, tos);.  Integ
10820 65 72 69 66 79 28 70 2c 20 6e 6f 73 29 3b 0a 20  erify(p, nos);. 
10830 20 61 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d   a = aStack[tos]
10840 2e 69 3b 0a 20 20 62 20 3d 20 61 53 74 61 63 6b  .i;.  b = aStack
10850 5b 6e 6f 73 5d 2e 69 3b 0a 20 20 73 77 69 74 63  [nos].i;.  switc
10860 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
10870 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 42 69  {.    case OP_Bi
10880 74 41 6e 64 3a 20 20 20 20 20 20 61 20 26 3d 20  tAnd:      a &= 
10890 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  b;     break;.  
108a0 20 20 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a    case OP_BitOr:
108b0 20 20 20 20 20 20 20 61 20 7c 3d 20 62 3b 20 20         a |= b;  
108c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
108d0 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a  se OP_ShiftLeft:
108e0 20 20 20 61 20 3c 3c 3d 20 62 3b 20 20 20 20 62     a <<= b;    b
108f0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
10900 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20 20 61  P_ShiftRight:  a
10910 20 3e 3e 3d 20 62 3b 20 20 20 20 62 72 65 61 6b   >>= b;    break
10920 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
10930 20 2f 2a 20 43 41 4e 54 20 48 41 50 50 45 4e 20   /* CANT HAPPEN 
10940 2a 2f 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  */     break;.  
10950 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20  }.  POPSTACK;.  
10960 52 65 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b  Release(p, nos);
10970 0a 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69  .  aStack[nos].i
10980 20 3d 20 61 3b 0a 20 20 61 53 74 61 63 6b 5b 6e   = a;.  aStack[n
10990 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  os].flags = STK_
109a0 49 6e 74 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  Int;.  break;.}.
109b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49  ./* Opcode: AddI
109c0 6d 6d 20 20 50 31 20 2a 20 2a 0a 2a 2a 20 0a 2a  mm  P1 * *.** .*
109d0 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20  * Add the value 
109e0 50 31 20 74 6f 20 77 68 61 74 65 76 65 72 20 69  P1 to whatever i
109f0 73 20 6f 6e 20 74 6f 70 20 6f 66 20 74 68 65 20  s on top of the 
10a00 73 74 61 63 6b 2e 20 20 54 68 65 20 72 65 73 75  stack.  The resu
10a10 6c 74 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  lt.** is always 
10a20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  an integer..**.*
10a30 2a 20 54 6f 20 66 6f 72 63 65 20 74 68 65 20 74  * To force the t
10a40 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
10a50 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  to be an integer
10a60 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f  , just add 0..*/
10a70 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a  .case OP_AddImm:
10a80 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70   {.  int tos = p
10a90 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49 46 59 28  ->tos;.  VERIFY(
10aa0 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
10ab0 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
10ac0 63 6b 3b 20 29 0a 20 20 49 6e 74 65 67 65 72 69  ck; ).  Integeri
10ad0 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 61 53  fy(p, tos);.  aS
10ae0 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 2b 3d 20 70  tack[tos].i += p
10af0 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b  Op->p1;.  break;
10b00 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
10b10 73 4e 75 6d 65 72 69 63 20 50 31 20 50 32 20 2a  sNumeric P1 P2 *
10b20 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  .**.** Check the
10b30 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
10b40 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  k to see if it i
10b50 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75  s a numeric valu
10b60 65 2e 20 20 41 20 6e 75 6d 65 72 69 63 0a 2a 2a  e.  A numeric.**
10b70 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74   value is an int
10b80 65 67 65 72 2c 20 61 20 72 65 61 6c 20 6e 75 6d  eger, a real num
10b90 62 65 72 2c 20 6f 72 20 61 20 73 74 72 69 6e 67  ber, or a string
10ba0 20 74 68 61 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65   that looks like
10bb0 20 61 6e 20 0a 2a 2a 20 69 6e 74 65 67 65 72 20   an .** integer 
10bc0 6f 72 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72  or a real number
10bd0 2e 20 20 57 68 65 6e 20 50 31 3d 3d 30 2c 20 70  .  When P1==0, p
10be0 6f 70 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64  op the stack and
10bf0 20 6a 75 6d 70 20 74 6f 20 50 32 0a 2a 2a 20 69   jump to P2.** i
10c00 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
10c10 75 6d 65 72 69 63 2e 20 20 4f 74 68 65 72 77 69  umeric.  Otherwi
10c20 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
10c30 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 73 74  and leave the st
10c40 61 63 6b 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ack.** unchanged
10c50 2e 20 20 54 68 65 20 73 65 6e 73 65 20 6f 66 20  .  The sense of 
10c60 74 68 65 20 74 65 73 74 20 69 73 20 69 6e 76 65  the test is inve
10c70 72 74 65 64 20 77 68 65 6e 20 50 31 3d 3d 31 2e  rted when P1==1.
10c80 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75  .*/.case OP_IsNu
10c90 6d 65 72 69 63 3a 20 7b 0a 20 20 69 6e 74 20 74  meric: {.  int t
10ca0 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69  os = p->tos;.  i
10cb0 6e 74 20 72 3b 0a 20 20 56 45 52 49 46 59 28 20  nt r;.  VERIFY( 
10cc0 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f  if( tos<0 ) goto
10cd0 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63   not_enough_stac
10ce0 6b 3b 20 29 0a 20 20 72 20 3d 20 28 61 53 74 61  k; ).  r = (aSta
10cf0 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
10d00 28 53 54 4b 5f 49 6e 74 7c 53 54 4b 5f 52 65 61  (STK_Int|STK_Rea
10d10 6c 29 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  l))!=0 .        
10d20 20 20 20 7c 7c 20 28 7a 53 74 61 63 6b 5b 74 6f     || (zStack[to
10d30 73 5d 20 26 26 20 73 71 6c 69 74 65 49 73 4e 75  s] && sqliteIsNu
10d40 6d 62 65 72 28 7a 53 74 61 63 6b 5b 74 6f 73 5d  mber(zStack[tos]
10d50 29 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  ));.  if( pOp->p
10d60 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 21 72 3b  1 ){.    r = !r;
10d70 0a 20 20 7d 0a 20 20 69 66 28 20 72 20 29 7b 0a  .  }.  if( r ){.
10d80 20 20 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20      POPSTACK;.  
10d90 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
10da0 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
10db0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
10dc0 75 73 74 42 65 49 6e 74 20 50 31 20 50 32 20 2a  ustBeInt P1 P2 *
10dd0 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
10de0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
10df0 63 6b 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65  ck to be an inte
10e00 67 65 72 2e 20 20 49 66 20 74 68 65 20 74 6f 70  ger.  If the top
10e10 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
10e20 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
10e30 65 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65  er and cannot be
10e40 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
10e50 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69  an integer.** wi
10e60 74 68 20 6f 75 74 20 64 61 74 61 20 6c 6f 73 73  th out data loss
10e70 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
10e80 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f  diately to P2, o
10e90 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61  r if P2==0.** ra
10ea0 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
10eb0 53 4d 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e  SMATCH exception
10ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
10ed0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
10ee0 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
10ef0 72 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  r and P2 is not 
10f00 7a 65 72 6f 20 61 6e 64 0a 2a 2a 20 50 31 20 69  zero and.** P1 i
10f10 73 20 31 2c 20 74 68 65 6e 20 74 68 65 20 73 74  s 1, then the st
10f20 61 63 6b 20 69 73 20 70 6f 70 70 65 64 2e 20 20  ack is popped.  
10f30 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
10f40 65 73 2c 20 74 68 65 20 64 65 70 74 68 0a 2a 2a  es, the depth.**
10f50 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
10f60 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 63   unchanged..*/.c
10f70 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  ase OP_MustBeInt
10f80 3a 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20  : {.  int tos = 
10f90 70 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49 46 59  p->tos;.  VERIFY
10fa0 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f  ( if( tos<0 ) go
10fb0 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
10fc0 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 61 53 74  ack; ).  if( aSt
10fd0 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26  ack[tos].flags &
10fe0 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20   STK_Int ){.    
10ff0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
11000 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 74  .  }else if( aSt
11010 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26  ack[tos].flags &
11020 20 53 54 4b 5f 52 65 61 6c 20 29 7b 0a 20 20 20   STK_Real ){.   
11030 20 69 6e 74 20 69 20 3d 20 61 53 74 61 63 6b 5b   int i = aStack[
11040 74 6f 73 5d 2e 72 3b 0a 20 20 20 20 64 6f 75 62  tos].r;.    doub
11050 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 69  le r = (double)i
11060 3b 0a 20 20 20 20 69 66 28 20 72 21 3d 61 53 74  ;.    if( r!=aSt
11070 61 63 6b 5b 74 6f 73 5d 2e 72 20 29 7b 0a 20 20  ack[tos].r ){.  
11080 20 20 20 20 67 6f 74 6f 20 6d 69 73 6d 61 74 63      goto mismatc
11090 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  h;.    }.    aSt
110a0 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d 20 69 3b 0a  ack[tos].i = i;.
110b0 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 74 61    }else if( aSta
110c0 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
110d0 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  STK_Str ){.    i
110e0 6e 74 20 76 3b 0a 20 20 20 20 69 66 28 20 21 74  nt v;.    if( !t
110f0 6f 49 6e 74 28 7a 53 74 61 63 6b 5b 74 6f 73 5d  oInt(zStack[tos]
11100 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 64  , &v) ){.      d
11110 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 69  ouble r;.      i
11120 66 28 20 21 73 71 6c 69 74 65 49 73 4e 75 6d 62  f( !sqliteIsNumb
11130 65 72 28 7a 53 74 61 63 6b 5b 74 6f 73 5d 29 20  er(zStack[tos]) 
11140 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11150 6d 69 73 6d 61 74 63 68 3b 0a 20 20 20 20 20 20  mismatch;.      
11160 7d 0a 20 20 20 20 20 20 52 65 61 6c 69 66 79 28  }.      Realify(
11170 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 20 20 61  p, tos);.      a
11180 73 73 65 72 74 28 20 28 61 53 74 61 63 6b 5b 74  ssert( (aStack[t
11190 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  os].flags & STK_
111a0 52 65 61 6c 29 21 3d 30 20 29 3b 0a 20 20 20 20  Real)!=0 );.    
111b0 20 20 76 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73    v = aStack[tos
111c0 5d 2e 72 3b 0a 20 20 20 20 20 20 72 20 3d 20 28  ].r;.      r = (
111d0 64 6f 75 62 6c 65 29 76 3b 0a 20 20 20 20 20 20  double)v;.      
111e0 69 66 28 20 72 21 3d 61 53 74 61 63 6b 5b 74 6f  if( r!=aStack[to
111f0 73 5d 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  s].r ){.        
11200 67 6f 74 6f 20 6d 69 73 6d 61 74 63 68 3b 0a 20  goto mismatch;. 
11210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11220 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d   aStack[tos].i =
11230 20 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   v;.  }else{.   
11240 20 67 6f 74 6f 20 6d 69 73 6d 61 74 63 68 3b 0a   goto mismatch;.
11250 20 20 7d 0a 20 20 52 65 6c 65 61 73 65 28 70 2c    }.  Release(p,
11260 20 74 6f 73 29 3b 0a 20 20 61 53 74 61 63 6b 5b   tos);.  aStack[
11270 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  tos].flags = STK
11280 5f 49 6e 74 3b 0a 20 20 62 72 65 61 6b 3b 0a 0a  _Int;.  break;..
11290 6d 69 73 6d 61 74 63 68 3a 0a 20 20 69 66 28 20  mismatch:.  if( 
112a0 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20  pOp->p2==0 ){.  
112b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49    rc = SQLITE_MI
112c0 53 4d 41 54 43 48 3b 0a 20 20 20 20 67 6f 74 6f  SMATCH;.    goto
112d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
112e0 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
112f0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 20    if( pOp->p1 ) 
11300 50 4f 50 53 54 41 43 4b 3b 0a 20 20 20 20 70 63  POPSTACK;.    pc
11310 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
11320 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
11330 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31  /* Opcode: Eq P1
11340 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20   P2 *.**.** Pop 
11350 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d  the top two elem
11360 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
11370 61 63 6b 2e 20 20 49 66 20 74 68 65 79 20 61 72  ack.  If they ar
11380 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 0a 2a 2a  e equal, then.**
11390 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
113a0 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65 72 77  tion P2.  Otherw
113b0 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  ise, continue to
113c0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
113d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
113e0 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
113f0 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68 75 73  s NULL (and thus
11400 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
11410 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68 65 6e 0a  s unknown) then.
11420 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
11430 20 69 66 20 50 31 20 69 73 20 74 72 75 65 2e 0a   if P1 is true..
11440 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 76 61  **.** If both va
11450 6c 75 65 73 20 61 72 65 20 6e 75 6d 65 72 69 63  lues are numeric
11460 2c 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65  , they are conve
11470 72 74 65 64 20 74 6f 20 64 6f 75 62 6c 65 73 20  rted to doubles 
11480 75 73 69 6e 67 20 61 74 6f 66 28 29 0a 2a 2a 20  using atof().** 
11490 61 6e 64 20 63 6f 6d 70 61 72 65 64 20 66 6f 72  and compared for
114a0 20 65 71 75 61 6c 69 74 79 20 74 68 61 74 20 77   equality that w
114b0 61 79 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ay.  Otherwise t
114c0 68 65 20 73 74 72 63 6d 70 28 29 20 6c 69 62 72  he strcmp() libr
114d0 61 72 79 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  ary.** routine i
114e0 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  s used for the c
114f0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 46 6f 72 20  omparison.  For 
11500 61 20 70 75 72 65 20 74 65 78 74 20 63 6f 6d 70  a pure text comp
11510 61 72 69 73 6f 6e 0a 2a 2a 20 75 73 65 20 4f 50  arison.** use OP
11520 5f 53 74 72 45 71 2e 0a 2a 2a 0a 2a 2a 20 49 66  _StrEq..**.** If
11530 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f 20   P2 is zero, do 
11540 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65  not jump.  Inste
11550 61 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74 65  ad, push an inte
11560 67 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a 2a  ger 1 onto the.*
11570 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 6a  * stack if the j
11580 75 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20 62  ump would have b
11590 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61 20  een taken, or a 
115a0 30 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68 20  0 if not.  Push 
115b0 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69 74  a.** NULL if eit
115c0 68 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73 20  her operand was 
115d0 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
115e0 64 65 3a 20 4e 65 20 50 31 20 50 32 20 2a 0a 2a  de: Ne P1 P2 *.*
115f0 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f 70  *.** Pop the top
11600 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72   two elements fr
11610 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  om the stack.  I
11620 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 65  f they are not e
11630 71 75 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 6a 75  qual, then.** ju
11640 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
11650 6e 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  n P2.  Otherwise
11660 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68  , continue to th
11670 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
11680 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  on..**.** If eit
11690 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
116a0 55 4c 4c 20 28 61 6e 64 20 74 68 75 73 20 69 66  ULL (and thus if
116b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 75   the result is u
116c0 6e 6b 6e 6f 77 6e 29 20 74 68 65 6e 0a 2a 2a 20  nknown) then.** 
116d0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
116e0 20 50 31 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a   P1 is true..**.
116f0 2a 2a 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  ** If both value
11700 73 20 61 72 65 20 6e 75 6d 65 72 69 63 2c 20 74  s are numeric, t
11710 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
11720 64 20 74 6f 20 64 6f 75 62 6c 65 73 20 75 73 69  d to doubles usi
11730 6e 67 20 61 74 6f 66 28 29 0a 2a 2a 20 61 6e 64  ng atof().** and
11740 20 63 6f 6d 70 61 72 65 64 20 69 6e 20 74 68 61   compared in tha
11750 74 20 66 6f 72 6d 61 74 2e 20 20 4f 74 68 65 72  t format.  Other
11760 77 69 73 65 20 74 68 65 20 73 74 72 63 6d 70 28  wise the strcmp(
11770 29 20 6c 69 62 72 61 72 79 0a 2a 2a 20 72 6f 75  ) library.** rou
11780 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
11790 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
117a0 20 20 46 6f 72 20 61 20 70 75 72 65 20 74 65 78    For a pure tex
117b0 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  t comparison.** 
117c0 75 73 65 20 4f 50 5f 53 74 72 4e 65 2e 0a 2a 2a  use OP_StrNe..**
117d0 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72  .** If P2 is zer
117e0 6f 2c 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20  o, do not jump. 
117f0 20 49 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61   Instead, push a
11800 6e 20 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f  n integer 1 onto
11810 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
11820 20 74 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20   the jump would 
11830 68 61 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c  have been taken,
11840 20 6f 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20   or a 0 if not. 
11850 20 50 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20   Push a.** NULL 
11860 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
11870 64 20 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  d was NULL..*/./
11880 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 20  * Opcode: Lt P1 
11890 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74  P2 *.**.** Pop t
118a0 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
118b0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
118c0 63 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64 20 65  ck.  If second e
118d0 6c 65 6d 65 6e 74 20 28 74 68 65 0a 2a 2a 20 6e  lement (the.** n
118e0 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20 69 73  ext on stack) is
118f0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 66   less than the f
11900 69 72 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66  irst (the top of
11910 20 73 74 61 63 6b 29 2c 20 74 68 65 6e 0a 2a 2a   stack), then.**
11920 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
11930 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65 72 77  tion P2.  Otherw
11940 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  ise, continue to
11950 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
11960 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68  ction..** In oth
11970 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69  er words, jump i
11980 66 20 4e 4f 53 3c 54 4f 53 2e 0a 2a 2a 0a 2a 2a  f NOS<TOS..**.**
11990 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
119a0 6e 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20  nd is NULL (and 
119b0 74 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75  thus if the resu
119c0 6c 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74  lt is unknown) t
119d0 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
119e0 6a 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72  jump if P1 is tr
119f0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74  ue..**.** If bot
11a00 68 20 76 61 6c 75 65 73 20 61 72 65 20 6e 75 6d  h values are num
11a10 65 72 69 63 2c 20 74 68 65 79 20 61 72 65 20 63  eric, they are c
11a20 6f 6e 76 65 72 74 65 64 20 74 6f 20 64 6f 75 62  onverted to doub
11a30 6c 65 73 20 75 73 69 6e 67 20 61 74 6f 66 28 29  les using atof()
11a40 0a 2a 2a 20 61 6e 64 20 63 6f 6d 70 61 72 65 64  .** and compared
11a50 20 69 6e 20 74 68 61 74 20 66 6f 72 6d 61 74 2e   in that format.
11a60 20 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73    Numeric values
11a70 20 61 72 65 20 61 6c 77 61 79 73 20 6c 65 73 73   are always less
11a80 20 74 68 61 6e 0a 2a 2a 20 6e 6f 6e 2d 6e 75 6d   than.** non-num
11a90 65 72 69 63 20 76 61 6c 75 65 73 2e 20 20 49 66  eric values.  If
11aa0 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
11ab0 72 65 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 2c 20  re non-numeric, 
11ac0 74 68 65 20 73 74 72 63 6d 70 28 29 20 6c 69 62  the strcmp() lib
11ad0 72 61 72 79 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rary.** routine 
11ae0 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  is used for the 
11af0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 46 6f 72  comparison.  For
11b00 20 61 20 70 75 72 65 20 74 65 78 74 20 63 6f 6d   a pure text com
11b10 70 61 72 69 73 6f 6e 0a 2a 2a 20 75 73 65 20 4f  parison.** use O
11b20 50 5f 53 74 72 4c 74 2e 0a 2a 2a 0a 2a 2a 20 49  P_StrLt..**.** I
11b30 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f  f P2 is zero, do
11b40 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74   not jump.  Inst
11b50 65 61 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74  ead, push an int
11b60 65 67 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a  eger 1 onto the.
11b70 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
11b80 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20  jump would have 
11b90 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61  been taken, or a
11ba0 20 30 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68   0 if not.  Push
11bb0 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69   a.** NULL if ei
11bc0 74 68 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73  ther operand was
11bd0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
11be0 6f 64 65 3a 20 4c 65 20 50 31 20 50 32 20 2a 0a  ode: Le P1 P2 *.
11bf0 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 74 6f  **.** Pop the to
11c00 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66  p two elements f
11c10 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20  rom the stack.  
11c20 49 66 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  If second elemen
11c30 74 20 28 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f  t (the.** next o
11c40 6e 20 73 74 61 63 6b 29 20 69 73 20 6c 65 73 73  n stack) is less
11c50 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
11c60 6f 20 74 68 65 20 66 69 72 73 74 20 28 74 68 65  o the first (the
11c70 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 29 2c 0a   top of stack),.
11c80 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ** then jump to 
11c90 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
11ca0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
11cb0 6a 75 6d 70 20 69 66 20 4e 4f 53 3c 3d 54 4f 53  jump if NOS<=TOS
11cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
11cd0 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
11ce0 4c 20 28 61 6e 64 20 74 68 75 73 20 69 66 20 74  L (and thus if t
11cf0 68 65 20 72 65 73 75 6c 74 20 69 73 20 75 6e 6b  he result is unk
11d00 6e 6f 77 6e 29 20 74 68 65 6e 0a 2a 2a 20 74 61  nown) then.** ta
11d10 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50  ke the jump if P
11d20 31 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  1 is true..**.**
11d30 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
11d40 61 72 65 20 6e 75 6d 65 72 69 63 2c 20 74 68 65  are numeric, the
11d50 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  y are converted 
11d60 74 6f 20 64 6f 75 62 6c 65 73 20 75 73 69 6e 67  to doubles using
11d70 20 61 74 6f 66 28 29 0a 2a 2a 20 61 6e 64 20 63   atof().** and c
11d80 6f 6d 70 61 72 65 64 20 69 6e 20 74 68 61 74 20  ompared in that 
11d90 66 6f 72 6d 61 74 2e 20 20 4e 75 6d 65 72 69 63  format.  Numeric
11da0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77 61   values are alwa
11db0 79 73 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  ys less than.** 
11dc0 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20 76 61 6c 75  non-numeric valu
11dd0 65 73 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65  es.  If both ope
11de0 72 61 6e 64 73 20 61 72 65 20 6e 6f 6e 2d 6e 75  rands are non-nu
11df0 6d 65 72 69 63 2c 20 74 68 65 20 73 74 72 63 6d  meric, the strcm
11e00 70 28 29 20 6c 69 62 72 61 72 79 0a 2a 2a 20 72  p() library.** r
11e10 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
11e20 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
11e30 6e 2e 20 20 46 6f 72 20 61 20 70 75 72 65 20 74  n.  For a pure t
11e40 65 78 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ext comparison.*
11e50 2a 20 75 73 65 20 4f 50 5f 53 74 72 4c 65 2e 0a  * use OP_StrLe..
11e60 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 7a  **.** If P2 is z
11e70 65 72 6f 2c 20 64 6f 20 6e 6f 74 20 6a 75 6d 70  ero, do not jump
11e80 2e 20 20 49 6e 73 74 65 61 64 2c 20 70 75 73 68  .  Instead, push
11e90 20 61 6e 20 69 6e 74 65 67 65 72 20 31 20 6f 6e   an integer 1 on
11ea0 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  to the.** stack 
11eb0 69 66 20 74 68 65 20 6a 75 6d 70 20 77 6f 75 6c  if the jump woul
11ec0 64 20 68 61 76 65 20 62 65 65 6e 20 74 61 6b 65  d have been take
11ed0 6e 2c 20 6f 72 20 61 20 30 20 69 66 20 6e 6f 74  n, or a 0 if not
11ee0 2e 20 20 50 75 73 68 20 61 0a 2a 2a 20 4e 55 4c  .  Push a.** NUL
11ef0 4c 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  L if either oper
11f00 61 6e 64 20 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f  and was NULL..*/
11f10 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20 50  ./* Opcode: Gt P
11f20 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70  1 P2 *.**.** Pop
11f30 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65   the top two ele
11f40 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
11f50 74 61 63 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64  tack.  If second
11f60 20 65 6c 65 6d 65 6e 74 20 28 74 68 65 0a 2a 2a   element (the.**
11f70 20 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20   next on stack) 
11f80 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11f90 74 68 65 20 66 69 72 73 74 20 28 74 68 65 20 74  the first (the t
11fa0 6f 70 20 6f 66 20 73 74 61 63 6b 29 2c 0a 2a 2a  op of stack),.**
11fb0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 69 6e   then jump to in
11fc0 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 49 6e  struction P2. In
11fd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6a 75   other words, ju
11fe0 6d 70 20 69 66 20 4e 4f 53 3e 54 4f 53 2e 0a 2a  mp if NOS>TOS..*
11ff0 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
12000 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 28  perand is NULL (
12010 61 6e 64 20 74 68 75 73 20 69 66 20 74 68 65 20  and thus if the 
12020 72 65 73 75 6c 74 20 69 73 20 75 6e 6b 6e 6f 77  result is unknow
12030 6e 29 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  n) then.** take 
12040 74 68 65 20 6a 75 6d 70 20 69 66 20 50 31 20 69  the jump if P1 i
12050 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
12060 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
12070 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 79 20 61   numeric, they a
12080 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  re converted to 
12090 64 6f 75 62 6c 65 73 20 75 73 69 6e 67 20 61 74  doubles using at
120a0 6f 66 28 29 0a 2a 2a 20 61 6e 64 20 63 6f 6d 70  of().** and comp
120b0 61 72 65 64 20 69 6e 20 74 68 61 74 20 66 6f 72  ared in that for
120c0 6d 61 74 2e 20 20 4e 75 6d 65 72 69 63 20 76 61  mat.  Numeric va
120d0 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  lues are always 
120e0 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 6f 6e  less than.** non
120f0 2d 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e  -numeric values.
12100 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e    If both operan
12110 64 73 20 61 72 65 20 6e 6f 6e 2d 6e 75 6d 65 72  ds are non-numer
12120 69 63 2c 20 74 68 65 20 73 74 72 63 6d 70 28 29  ic, the strcmp()
12130 20 6c 69 62 72 61 72 79 0a 2a 2a 20 72 6f 75 74   library.** rout
12140 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
12150 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
12160 20 46 6f 72 20 61 20 70 75 72 65 20 74 65 78 74   For a pure text
12170 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 75   comparison.** u
12180 73 65 20 4f 50 5f 53 74 72 47 74 2e 0a 2a 2a 0a  se OP_StrGt..**.
12190 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f  ** If P2 is zero
121a0 2c 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20  , do not jump.  
121b0 49 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e  Instead, push an
121c0 20 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20   integer 1 onto 
121d0 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
121e0 74 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68  the jump would h
121f0 61 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20  ave been taken, 
12200 6f 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20  or a 0 if not.  
12210 50 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69  Push a.** NULL i
12220 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
12230 20 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a   was NULL..*/./*
12240 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50   Opcode: Ge P1 P
12250 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68  2 *.**.** Pop th
12260 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e  e top two elemen
12270 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ts from the stac
12280 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64 20 65 6c  k.  If second el
12290 65 6d 65 6e 74 20 28 74 68 65 20 6e 65 78 74 0a  ement (the next.
122a0 2a 2a 20 6f 6e 20 73 74 61 63 6b 29 20 69 73 20  ** on stack) is 
122b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
122c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 66 69 72  equal to the fir
122d0 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66 20 73  st (the top of s
122e0 74 61 63 6b 29 2c 0a 2a 2a 20 74 68 65 6e 20 6a  tack),.** then j
122f0 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
12300 6f 6e 20 50 32 2e 20 49 6e 20 6f 74 68 65 72 20  on P2. In other 
12310 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69 66 20 4e  words, jump if N
12320 4f 53 3e 3d 54 4f 53 2e 0a 2a 2a 0a 2a 2a 20 49  OS>=TOS..**.** I
12330 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
12340 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68   is NULL (and th
12350 75 73 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  us if the result
12360 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68 65   is unknown) the
12370 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
12380 6d 70 20 69 66 20 50 31 20 69 73 20 74 72 75 65  mp if P1 is true
12390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
123a0 76 61 6c 75 65 73 20 61 72 65 20 6e 75 6d 65 72  values are numer
123b0 69 63 2c 20 74 68 65 79 20 61 72 65 20 63 6f 6e  ic, they are con
123c0 76 65 72 74 65 64 20 74 6f 20 64 6f 75 62 6c 65  verted to double
123d0 73 20 75 73 69 6e 67 20 61 74 6f 66 28 29 0a 2a  s using atof().*
123e0 2a 20 61 6e 64 20 63 6f 6d 70 61 72 65 64 20 69  * and compared i
123f0 6e 20 74 68 61 74 20 66 6f 72 6d 61 74 2e 20 20  n that format.  
12400 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
12410 72 65 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74  re always less t
12420 68 61 6e 0a 2a 2a 20 6e 6f 6e 2d 6e 75 6d 65 72  han.** non-numer
12430 69 63 20 76 61 6c 75 65 73 2e 20 20 49 66 20 62  ic values.  If b
12440 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
12450 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 2c 20 74 68   non-numeric, th
12460 65 20 73 74 72 63 6d 70 28 29 20 6c 69 62 72 61  e strcmp() libra
12470 72 79 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  ry.** routine is
12480 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f   used for the co
12490 6d 70 61 72 69 73 6f 6e 2e 20 20 46 6f 72 20 61  mparison.  For a
124a0 20 70 75 72 65 20 74 65 78 74 20 63 6f 6d 70 61   pure text compa
124b0 72 69 73 6f 6e 0a 2a 2a 20 75 73 65 20 4f 50 5f  rison.** use OP_
124c0 53 74 72 47 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  StrGe..**.** If 
124d0 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f 20 6e  P2 is zero, do n
124e0 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61  ot jump.  Instea
124f0 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74 65 67  d, push an integ
12500 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a  er 1 onto the.**
12510 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 6a 75   stack if the ju
12520 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  mp would have be
12530 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61 20 30  en taken, or a 0
12540 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68 20 61   if not.  Push a
12550 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69 74 68  .** NULL if eith
12560 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73 20 4e  er operand was N
12570 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
12580 45 71 3a 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 0a  Eq:.case OP_Ne:.
12590 63 61 73 65 20 4f 50 5f 4c 74 3a 0a 63 61 73 65  case OP_Lt:.case
125a0 20 4f 50 5f 4c 65 3a 0a 63 61 73 65 20 4f 50 5f   OP_Le:.case OP_
125b0 47 74 3a 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20  Gt:.case OP_Ge: 
125c0 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d  {.  int tos = p-
125d0 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20  >tos;.  int nos 
125e0 3d 20 74 6f 73 20 2d 20 31 3b 0a 20 20 69 6e 74  = tos - 1;.  int
125f0 20 63 2c 20 76 3b 0a 20 20 69 6e 74 20 66 74 2c   c, v;.  int ft,
12600 20 66 6e 3b 0a 20 20 56 45 52 49 46 59 28 20 69   fn;.  VERIFY( i
12610 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f 74 6f 20  f( nos<0 ) goto 
12620 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b  not_enough_stack
12630 3b 20 29 0a 20 20 66 74 20 3d 20 61 53 74 61 63  ; ).  ft = aStac
12640 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 3b 0a 20 20  k[tos].flags;.  
12650 66 6e 20 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d  fn = aStack[nos]
12660 2e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  .flags;.  if( (f
12670 74 20 7c 20 66 6e 29 20 26 20 53 54 4b 5f 4e 75  t | fn) & STK_Nu
12680 6c 6c 20 29 7b 0a 20 20 20 20 50 4f 50 53 54 41  ll ){.    POPSTA
12690 43 4b 3b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b  CK;.    POPSTACK
126a0 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
126b0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
126c0 4f 70 2d 3e 70 31 20 29 20 70 63 20 3d 20 70 4f  Op->p1 ) pc = pO
126d0 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 7d 65 6c  p->p2-1;.    }el
126e0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 6f 73  se{.      p->tos
126f0 2b 2b 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b  ++;.      aStack
12700 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [nos].flags = ST
12710 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  K_Null;.    }.  
12720 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65    break;.  }else
12730 20 69 66 28 20 28 66 74 20 26 20 66 6e 20 26 20   if( (ft & fn & 
12740 53 54 4b 5f 49 6e 74 29 3d 3d 53 54 4b 5f 49 6e  STK_Int)==STK_In
12750 74 20 29 7b 0a 20 20 20 20 63 20 3d 20 61 53 74  t ){.    c = aSt
12760 61 63 6b 5b 6e 6f 73 5d 2e 69 20 2d 20 61 53 74  ack[nos].i - aSt
12770 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20 7d 65  ack[tos].i;.  }e
12780 6c 73 65 20 69 66 28 20 28 66 74 20 26 20 53 54  lse if( (ft & ST
12790 4b 5f 49 6e 74 29 21 3d 30 20 26 26 20 28 66 6e  K_Int)!=0 && (fn
127a0 20 26 20 53 54 4b 5f 53 74 72 29 21 3d 30 20 26   & STK_Str)!=0 &
127b0 26 20 74 6f 49 6e 74 28 7a 53 74 61 63 6b 5b 6e  & toInt(zStack[n
127c0 6f 73 5d 2c 26 76 29 20 29 7b 0a 20 20 20 20 52  os],&v) ){.    R
127d0 65 6c 65 61 73 65 28 70 2c 20 6e 6f 73 29 3b 0a  elease(p, nos);.
127e0 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e      aStack[nos].
127f0 69 20 3d 20 76 3b 0a 20 20 20 20 61 53 74 61 63  i = v;.    aStac
12800 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[nos].flags = S
12810 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 63 20 3d 20  TK_Int;.    c = 
12820 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 20 2d 20  aStack[nos].i - 
12830 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20  aStack[tos].i;. 
12840 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6e 20 26   }else if( (fn &
12850 20 53 54 4b 5f 49 6e 74 29 21 3d 30 20 26 26 20   STK_Int)!=0 && 
12860 28 66 74 20 26 20 53 54 4b 5f 53 74 72 29 21 3d  (ft & STK_Str)!=
12870 30 20 26 26 20 74 6f 49 6e 74 28 7a 53 74 61 63  0 && toInt(zStac
12880 6b 5b 74 6f 73 5d 2c 26 76 29 20 29 7b 0a 20 20  k[tos],&v) ){.  
12890 20 20 52 65 6c 65 61 73 65 28 70 2c 20 74 6f 73    Release(p, tos
128a0 29 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f  );.    aStack[to
128b0 73 5d 2e 69 20 3d 20 76 3b 0a 20 20 20 20 61 53  s].i = v;.    aS
128c0 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
128d0 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 63  = STK_Int;.    c
128e0 20 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69   = aStack[nos].i
128f0 20 2d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69   - aStack[tos].i
12900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
12910 74 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29  tringify(p, tos)
12920 3b 0a 20 20 20 20 53 74 72 69 6e 67 69 66 79 28  ;.    Stringify(
12930 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 63 20 3d  p, nos);.    c =
12940 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 7a   sqliteCompare(z
12950 53 74 61 63 6b 5b 6e 6f 73 5d 2c 20 7a 53 74 61  Stack[nos], zSta
12960 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 7d 0a 20 20  ck[tos]);.  }.  
12970 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
12980 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
12990 4f 50 5f 45 71 3a 20 20 20 20 63 20 3d 20 63 3d  OP_Eq:    c = c=
129a0 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
129b0 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20     case OP_Ne:  
129c0 20 20 63 20 3d 20 63 21 3d 30 3b 20 20 20 20 20    c = c!=0;     
129d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
129e0 4f 50 5f 4c 74 3a 20 20 20 20 63 20 3d 20 63 3c  OP_Lt:    c = c<
129f0 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  0;      break;. 
12a00 20 20 20 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20     case OP_Le:  
12a10 20 20 63 20 3d 20 63 3c 3d 30 3b 20 20 20 20 20    c = c<=0;     
12a20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12a30 4f 50 5f 47 74 3a 20 20 20 20 63 20 3d 20 63 3e  OP_Gt:    c = c>
12a40 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  0;      break;. 
12a50 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
12a60 20 20 63 20 3d 20 63 3e 3d 30 3b 20 20 20 20 20    c = c>=0;     
12a70 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 50 4f 50  break;.  }.  POP
12a80 53 54 41 43 4b 3b 0a 20 20 50 4f 50 53 54 41 43  STACK;.  POPSTAC
12a90 4b 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  K;.  if( pOp->p2
12aa0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 20 29 20   ){.    if( c ) 
12ab0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a  pc = pOp->p2-1;.
12ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
12ad0 74 6f 73 2b 2b 3b 0a 20 20 20 20 61 53 74 61 63  tos++;.    aStac
12ae0 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[nos].flags = S
12af0 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 61 53 74 61  TK_Int;.    aSta
12b00 63 6b 5b 6e 6f 73 5d 2e 69 20 3d 20 63 3b 0a 20  ck[nos].i = c;. 
12b10 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a   }.  break;.}./*
12b20 20 49 4e 53 45 52 54 20 4e 4f 20 43 4f 44 45 20   INSERT NO CODE 
12b30 48 45 52 45 21 0a 2a 2a 0a 2a 2a 20 54 68 65 20  HERE!.**.** The 
12b40 6f 70 63 6f 64 65 20 6e 75 6d 62 65 72 73 20 61  opcode numbers a
12b50 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
12b60 6d 20 74 68 69 73 20 73 6f 75 72 63 65 20 66 69  m this source fi
12b70 6c 65 20 62 79 20 64 6f 69 6e 67 0a 2a 2a 0a 2a  le by doing.**.*
12b80 2a 20 20 20 20 67 72 65 70 20 27 5e 63 61 73 65  *    grep '^case
12b90 20 4f 50 5f 27 20 76 64 62 65 2e 63 20 7c 20 2e   OP_' vdbe.c | .
12ba0 2e 2e 20 3e 6f 70 63 6f 64 65 73 2e 68 0a 2a 2a  .. >opcodes.h.**
12bb0 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20  .** The opcodes 
12bc0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 69 6e 20  are numbered in 
12bd0 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
12be0 68 65 79 20 61 70 70 65 61 72 20 69 6e 20 74 68  hey appear in th
12bf0 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  is file..** But 
12c00 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  in order for the
12c10 20 65 78 70 72 65 73 73 69 6f 6e 20 67 65 6e 65   expression gene
12c20 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 77  rating code to w
12c30 6f 72 6b 20 72 69 67 68 74 2c 20 74 68 65 0a 2a  ork right, the.*
12c40 2a 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  * string compari
12c50 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 68  son operators th
12c60 61 74 20 66 6f 6c 6c 6f 77 20 6d 75 73 74 20 62  at follow must b
12c70 65 20 6e 75 6d 62 65 72 65 64 20 65 78 61 63 74  e numbered exact
12c80 6c 79 20 36 0a 2a 2a 20 67 72 65 61 74 65 72 20  ly 6.** greater 
12c90 74 68 61 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  than the numeric
12ca0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
12cb0 64 65 73 20 61 62 6f 76 65 2e 20 20 53 6f 20 6e  des above.  So n
12cc0 6f 20 6f 74 68 65 72 0a 2a 2a 20 63 61 73 65 73  o other.** cases
12cd0 20 63 61 6e 20 61 70 70 65 61 72 20 62 65 74 77   can appear betw
12ce0 65 65 6e 20 74 68 65 20 74 77 6f 2e 0a 2a 2f 0a  een the two..*/.
12cf0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 45 71  /* Opcode: StrEq
12d00 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50   P1 P2 *.**.** P
12d10 6f 70 20 74 68 65 20 74 6f 70 20 74 77 6f 20 65  op the top two e
12d20 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
12d30 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 79   stack.  If they
12d40 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
12d50 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  .** jump to inst
12d60 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68  ruction P2.  Oth
12d70 65 72 77 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65  erwise, continue
12d80 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
12d90 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
12da0 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
12db0 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74  d is NULL (and t
12dc0 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75 6c  hus if the resul
12dd0 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68  t is unknown) th
12de0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
12df0 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72 75  ump if P1 is tru
12e00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72  e..**.** The str
12e10 63 6d 70 28 29 20 6c 69 62 72 61 72 79 20 72 6f  cmp() library ro
12e20 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
12e30 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
12e40 2e 20 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d 65  .  For a.** nume
12e50 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ric comparison, 
12e60 75 73 65 20 4f 50 5f 45 71 2e 0a 2a 2a 0a 2a 2a  use OP_Eq..**.**
12e70 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20   If P2 is zero, 
12e80 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e  do not jump.  In
12e90 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20 69  stead, push an i
12ea0 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74 68  nteger 1 onto th
12eb0 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
12ec0 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61 76  e jump would hav
12ed0 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72  e been taken, or
12ee0 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50 75   a 0 if not.  Pu
12ef0 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20  sh a.** NULL if 
12f00 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 77  either operand w
12f10 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  as NULL..*/./* O
12f20 70 63 6f 64 65 3a 20 53 74 72 4e 65 20 50 31 20  pcode: StrNe P1 
12f30 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74  P2 *.**.** Pop t
12f40 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
12f50 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
12f60 63 6b 2e 20 20 49 66 20 74 68 65 79 20 61 72 65  ck.  If they are
12f70 20 6e 6f 74 20 65 71 75 61 6c 2c 20 74 68 65 6e   not equal, then
12f80 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  .** jump to inst
12f90 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68  ruction P2.  Oth
12fa0 65 72 77 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65  erwise, continue
12fb0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
12fc0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
12fd0 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
12fe0 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74  d is NULL (and t
12ff0 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75 6c  hus if the resul
13000 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68  t is unknown) th
13010 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
13020 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72 75  ump if P1 is tru
13030 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72  e..**.** The str
13040 63 6d 70 28 29 20 6c 69 62 72 61 72 79 20 72 6f  cmp() library ro
13050 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
13060 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
13070 2e 20 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d 65  .  For a.** nume
13080 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ric comparison, 
13090 75 73 65 20 4f 50 5f 4e 65 2e 0a 2a 2a 0a 2a 2a  use OP_Ne..**.**
130a0 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20   If P2 is zero, 
130b0 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e  do not jump.  In
130c0 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20 69  stead, push an i
130d0 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74 68  nteger 1 onto th
130e0 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
130f0 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61 76  e jump would hav
13100 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72  e been taken, or
13110 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50 75   a 0 if not.  Pu
13120 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20  sh a.** NULL if 
13130 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 77  either operand w
13140 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  as NULL..*/./* O
13150 70 63 6f 64 65 3a 20 53 74 72 4c 74 20 50 31 20  pcode: StrLt P1 
13160 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74  P2 *.**.** Pop t
13170 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65  he top two eleme
13180 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
13190 63 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64 20 65  ck.  If second e
131a0 6c 65 6d 65 6e 74 20 28 74 68 65 0a 2a 2a 20 6e  lement (the.** n
131b0 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20 69 73  ext on stack) is
131c0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 66   less than the f
131d0 69 72 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66  irst (the top of
131e0 20 73 74 61 63 6b 29 2c 20 74 68 65 6e 0a 2a 2a   stack), then.**
131f0 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
13200 74 69 6f 6e 20 50 32 2e 20 20 4f 74 68 65 72 77  tion P2.  Otherw
13210 69 73 65 2c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  ise, continue to
13220 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
13230 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68  ction..** In oth
13240 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69  er words, jump i
13250 66 20 4e 4f 53 3c 54 4f 53 2e 0a 2a 2a 0a 2a 2a  f NOS<TOS..**.**
13260 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
13270 6e 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20  nd is NULL (and 
13280 74 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75  thus if the resu
13290 6c 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74  lt is unknown) t
132a0 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
132b0 6a 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72  jump if P1 is tr
132c0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  ue..**.** The st
132d0 72 63 6d 70 28 29 20 6c 69 62 72 61 72 79 20 72  rcmp() library r
132e0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
132f0 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
13300 6e 2e 20 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d  n.  For a.** num
13310 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  eric comparison,
13320 20 75 73 65 20 4f 50 5f 4c 74 2e 0a 2a 2a 0a 2a   use OP_Lt..**.*
13330 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c  * If P2 is zero,
13340 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49   do not jump.  I
13350 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20  nstead, push an 
13360 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74  integer 1 onto t
13370 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
13380 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61  he jump would ha
13390 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f  ve been taken, o
133a0 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50  r a 0 if not.  P
133b0 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66  ush a.** NULL if
133c0 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
133d0 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20  was NULL..*/./* 
133e0 4f 70 63 6f 64 65 3a 20 53 74 72 4c 65 20 50 31  Opcode: StrLe P1
133f0 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20   P2 *.**.** Pop 
13400 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d  the top two elem
13410 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
13420 61 63 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64 20  ack.  If second 
13430 65 6c 65 6d 65 6e 74 20 28 74 68 65 0a 2a 2a 20  element (the.** 
13440 6e 65 78 74 20 6f 6e 20 73 74 61 63 6b 29 20 69  next on stack) i
13450 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
13460 71 75 61 6c 20 74 6f 20 74 68 65 20 66 69 72 73  qual to the firs
13470 74 20 28 74 68 65 20 74 6f 70 20 6f 66 20 73 74  t (the top of st
13480 61 63 6b 29 2c 0a 2a 2a 20 74 68 65 6e 20 6a 75  ack),.** then ju
13490 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
134a0 6e 20 50 32 2e 20 49 6e 20 6f 74 68 65 72 20 77  n P2. In other w
134b0 6f 72 64 73 2c 20 6a 75 6d 70 20 69 66 20 4e 4f  ords, jump if NO
134c0 53 3c 3d 54 4f 53 2e 0a 2a 2a 0a 2a 2a 20 49 66  S<=TOS..**.** If
134d0 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
134e0 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68 75  is NULL (and thu
134f0 73 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  s if the result 
13500 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74 68 65 6e  is unknown) then
13510 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
13520 70 20 69 66 20 50 31 20 69 73 20 74 72 75 65 2e  p if P1 is true.
13530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 63 6d  .**.** The strcm
13540 70 28 29 20 6c 69 62 72 61 72 79 20 72 6f 75 74  p() library rout
13550 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
13560 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
13570 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d 65 72 69   For a.** numeri
13580 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 75 73  c comparison, us
13590 65 20 4f 50 5f 4c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e OP_Le..**.** I
135a0 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 64 6f  f P2 is zero, do
135b0 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74   not jump.  Inst
135c0 65 61 64 2c 20 70 75 73 68 20 61 6e 20 69 6e 74  ead, push an int
135d0 65 67 65 72 20 31 20 6f 6e 74 6f 20 74 68 65 0a  eger 1 onto the.
135e0 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
135f0 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61 76 65 20  jump would have 
13600 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f 72 20 61  been taken, or a
13610 20 30 20 69 66 20 6e 6f 74 2e 20 20 50 75 73 68   0 if not.  Push
13620 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 65 69   a.** NULL if ei
13630 74 68 65 72 20 6f 70 65 72 61 6e 64 20 77 61 73  ther operand was
13640 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
13650 6f 64 65 3a 20 53 74 72 47 74 20 50 31 20 50 32  ode: StrGt P1 P2
13660 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65   *.**.** Pop the
13670 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d 65 6e 74   top two element
13680 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
13690 2e 20 20 49 66 20 73 65 63 6f 6e 64 20 65 6c 65  .  If second ele
136a0 6d 65 6e 74 20 28 74 68 65 0a 2a 2a 20 6e 65 78  ment (the.** nex
136b0 74 20 6f 6e 20 73 74 61 63 6b 29 20 69 73 20 67  t on stack) is g
136c0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
136d0 66 69 72 73 74 20 28 74 68 65 20 74 6f 70 20 6f  first (the top o
136e0 66 20 73 74 61 63 6b 29 2c 0a 2a 2a 20 74 68 65  f stack),.** the
136f0 6e 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  n jump to instru
13700 63 74 69 6f 6e 20 50 32 2e 20 49 6e 20 6f 74 68  ction P2. In oth
13710 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69  er words, jump i
13720 66 20 4e 4f 53 3e 54 4f 53 2e 0a 2a 2a 0a 2a 2a  f NOS>TOS..**.**
13730 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
13740 6e 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20  nd is NULL (and 
13750 74 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75  thus if the resu
13760 6c 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74  lt is unknown) t
13770 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
13780 6a 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72  jump if P1 is tr
13790 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  ue..**.** The st
137a0 72 63 6d 70 28 29 20 6c 69 62 72 61 72 79 20 72  rcmp() library r
137b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
137c0 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
137d0 6e 2e 20 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d  n.  For a.** num
137e0 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  eric comparison,
137f0 20 75 73 65 20 4f 50 5f 47 74 2e 0a 2a 2a 0a 2a   use OP_Gt..**.*
13800 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c  * If P2 is zero,
13810 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49   do not jump.  I
13820 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20  nstead, push an 
13830 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74  integer 1 onto t
13840 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
13850 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61  he jump would ha
13860 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f  ve been taken, o
13870 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50  r a 0 if not.  P
13880 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66  ush a.** NULL if
13890 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
138a0 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20  was NULL..*/./* 
138b0 4f 70 63 6f 64 65 3a 20 53 74 72 47 65 20 50 31  Opcode: StrGe P1
138c0 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20   P2 *.**.** Pop 
138d0 74 68 65 20 74 6f 70 20 74 77 6f 20 65 6c 65 6d  the top two elem
138e0 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
138f0 61 63 6b 2e 20 20 49 66 20 73 65 63 6f 6e 64 20  ack.  If second 
13900 65 6c 65 6d 65 6e 74 20 28 74 68 65 20 6e 65 78  element (the nex
13910 74 0a 2a 2a 20 6f 6e 20 73 74 61 63 6b 29 20 69  t.** on stack) i
13920 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
13930 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 66  r equal to the f
13940 69 72 73 74 20 28 74 68 65 20 74 6f 70 20 6f 66  irst (the top of
13950 20 73 74 61 63 6b 29 2c 0a 2a 2a 20 74 68 65 6e   stack),.** then
13960 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
13970 74 69 6f 6e 20 50 32 2e 20 49 6e 20 6f 74 68 65  tion P2. In othe
13980 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70 20 69 66  r words, jump if
13990 20 4e 4f 53 3e 3d 54 4f 53 2e 0a 2a 2a 0a 2a 2a   NOS>=TOS..**.**
139a0 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
139b0 6e 64 20 69 73 20 4e 55 4c 4c 20 28 61 6e 64 20  nd is NULL (and 
139c0 74 68 75 73 20 69 66 20 74 68 65 20 72 65 73 75  thus if the resu
139d0 6c 74 20 69 73 20 75 6e 6b 6e 6f 77 6e 29 20 74  lt is unknown) t
139e0 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
139f0 6a 75 6d 70 20 69 66 20 50 31 20 69 73 20 74 72  jump if P1 is tr
13a00 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  ue..**.** The st
13a10 72 63 6d 70 28 29 20 6c 69 62 72 61 72 79 20 72  rcmp() library r
13a20 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
13a30 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
13a40 6e 2e 20 20 46 6f 72 20 61 0a 2a 2a 20 6e 75 6d  n.  For a.** num
13a50 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  eric comparison,
13a60 20 75 73 65 20 4f 50 5f 47 65 2e 0a 2a 2a 0a 2a   use OP_Ge..**.*
13a70 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c  * If P2 is zero,
13a80 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49   do not jump.  I
13a90 6e 73 74 65 61 64 2c 20 70 75 73 68 20 61 6e 20  nstead, push an 
13aa0 69 6e 74 65 67 65 72 20 31 20 6f 6e 74 6f 20 74  integer 1 onto t
13ab0 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
13ac0 68 65 20 6a 75 6d 70 20 77 6f 75 6c 64 20 68 61  he jump would ha
13ad0 76 65 20 62 65 65 6e 20 74 61 6b 65 6e 2c 20 6f  ve been taken, o
13ae0 72 20 61 20 30 20 69 66 20 6e 6f 74 2e 20 20 50  r a 0 if not.  P
13af0 75 73 68 20 61 0a 2a 2a 20 4e 55 4c 4c 20 69 66  ush a.** NULL if
13b00 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
13b10 77 61 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  was NULL..*/.cas
13b20 65 20 4f 50 5f 53 74 72 45 71 3a 0a 63 61 73 65  e OP_StrEq:.case
13b30 20 4f 50 5f 53 74 72 4e 65 3a 0a 63 61 73 65 20   OP_StrNe:.case 
13b40 4f 50 5f 53 74 72 4c 74 3a 0a 63 61 73 65 20 4f  OP_StrLt:.case O
13b50 50 5f 53 74 72 4c 65 3a 0a 63 61 73 65 20 4f 50  P_StrLe:.case OP
13b60 5f 53 74 72 47 74 3a 0a 63 61 73 65 20 4f 50 5f  _StrGt:.case OP_
13b70 53 74 72 47 65 3a 20 7b 0a 20 20 69 6e 74 20 74  StrGe: {.  int t
13b80 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 69  os = p->tos;.  i
13b90 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d 20 31  nt nos = tos - 1
13ba0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 56 45 52  ;.  int c;.  VER
13bb0 49 46 59 28 20 69 66 28 20 6e 6f 73 3c 30 20 29  IFY( if( nos<0 )
13bc0 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68   goto not_enough
13bd0 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20  _stack; ).  if( 
13be0 28 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61  (aStack[nos].fla
13bf0 67 73 20 7c 20 61 53 74 61 63 6b 5b 74 6f 73 5d  gs | aStack[tos]
13c00 2e 66 6c 61 67 73 29 20 26 20 53 54 4b 5f 4e 75  .flags) & STK_Nu
13c10 6c 6c 20 29 7b 0a 20 20 20 20 50 4f 50 53 54 41  ll ){.    POPSTA
13c20 43 4b 3b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b  CK;.    POPSTACK
13c30 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
13c40 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
13c50 4f 70 2d 3e 70 31 20 29 20 70 63 20 3d 20 70 4f  Op->p1 ) pc = pO
13c60 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 7d 65 6c  p->p2-1;.    }el
13c70 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 6f 73  se{.      p->tos
13c80 2b 2b 3b 0a 20 20 20 20 20 20 61 53 74 61 63 6b  ++;.      aStack
13c90 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [nos].flags = ST
13ca0 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  K_Null;.    }.  
13cb0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65    break;.  }else
13cc0 7b 0a 20 20 20 20 53 74 72 69 6e 67 69 66 79 28  {.    Stringify(
13cd0 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 53 74 72  p, tos);.    Str
13ce0 69 6e 67 69 66 79 28 70 2c 20 6e 6f 73 29 3b 0a  ingify(p, nos);.
13cf0 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a      c = strcmp(z
13d00 53 74 61 63 6b 5b 6e 6f 73 5d 2c 20 7a 53 74 61  Stack[nos], zSta
13d10 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 7d 0a 20 20  ck[tos]);.  }.  
13d20 2f 2a 20 54 68 65 20 61 73 73 65 72 74 73 20 6f  /* The asserts o
13d30 6e 20 65 61 63 68 20 63 61 73 65 20 6f 66 20 74  n each case of t
13d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 77 69  he following swi
13d50 74 63 68 20 61 72 65 20 74 68 65 72 65 20 74 6f  tch are there to
13d60 20 76 65 72 69 66 79 0a 20 20 2a 2a 20 74 68 61   verify.  ** tha
13d70 74 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  t string compari
13d80 73 6f 6e 20 6f 70 63 6f 64 65 73 20 61 72 65 20  son opcodes are 
13d90 61 6c 77 61 79 73 20 65 78 61 63 74 6c 79 20 36  always exactly 6
13da0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
13db0 65 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  e.  ** correspon
13dc0 64 69 6e 67 20 6e 75 6d 65 72 69 63 20 63 6f 6d  ding numeric com
13dd0 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 2e  parison opcodes.
13de0 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72    The code gener
13df0 61 74 6f 72 20 64 65 70 65 6e 64 73 0a 20 20 2a  ator depends.  *
13e00 2a 20 6f 6e 20 74 68 69 73 20 66 61 63 74 2e 0a  * on this fact..
13e10 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13e20 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
13e30 20 20 63 61 73 65 20 4f 50 5f 53 74 72 45 71 3a    case OP_StrEq:
13e40 20 20 20 20 63 20 3d 20 63 3d 3d 30 3b 20 20 20      c = c==0;   
13e50 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
13e60 63 6f 64 65 2d 36 3d 3d 4f 50 5f 45 71 20 29 3b  code-6==OP_Eq );
13e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
13e80 73 65 20 4f 50 5f 53 74 72 4e 65 3a 20 20 20 20  se OP_StrNe:    
13e90 63 20 3d 20 63 21 3d 30 3b 20 20 20 20 61 73 73  c = c!=0;    ass
13ea0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
13eb0 2d 36 3d 3d 4f 50 5f 4e 65 20 29 3b 20 20 20 62  -6==OP_Ne );   b
13ec0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
13ed0 50 5f 53 74 72 4c 74 3a 20 20 20 20 63 20 3d 20  P_StrLt:    c = 
13ee0 63 3c 30 3b 20 20 20 20 20 61 73 73 65 72 74 28  c<0;     assert(
13ef0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 2d 36 3d 3d   pOp->opcode-6==
13f00 4f 50 5f 4c 74 20 29 3b 20 20 20 62 72 65 61 6b  OP_Lt );   break
13f10 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74  ;.    case OP_St
13f20 72 4c 65 3a 20 20 20 20 63 20 3d 20 63 3c 3d 30  rLe:    c = c<=0
13f30 3b 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;    assert( pOp
13f40 2d 3e 6f 70 63 6f 64 65 2d 36 3d 3d 4f 50 5f 4c  ->opcode-6==OP_L
13f50 65 20 29 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  e );   break;.  
13f60 20 20 63 61 73 65 20 4f 50 5f 53 74 72 47 74 3a    case OP_StrGt:
13f70 20 20 20 20 63 20 3d 20 63 3e 30 3b 20 20 20 20      c = c>0;    
13f80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
13f90 63 6f 64 65 2d 36 3d 3d 4f 50 5f 47 74 20 29 3b  code-6==OP_Gt );
13fa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
13fb0 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
13fc0 63 20 3d 20 63 3e 3d 30 3b 20 20 20 20 61 73 73  c = c>=0;    ass
13fd0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
13fe0 2d 36 3d 3d 4f 50 5f 47 65 20 29 3b 20 20 20 62  -6==OP_Ge );   b
13ff0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 50 4f 50 53  reak;.  }.  POPS
14000 54 41 43 4b 3b 0a 20 20 50 4f 50 53 54 41 43 4b  TACK;.  POPSTACK
14010 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20  ;.  if( pOp->p2 
14020 29 7b 0a 20 20 20 20 69 66 28 20 63 20 29 20 70  ){.    if( c ) p
14030 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
14040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 74   }else{.    p->t
14050 6f 73 2b 2b 3b 0a 20 20 20 20 61 53 74 61 63 6b  os++;.    aStack
14060 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [nos].flags = ST
14070 4b 5f 49 6e 74 3b 0a 20 20 20 20 61 53 74 61 63  K_Int;.    aStac
14080 6b 5b 6e 6f 73 5d 2e 69 20 3d 20 63 3b 0a 20 20  k[nos].i = c;.  
14090 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
140a0 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 2a 20 2a   Opcode: And * *
140b0 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 77 6f   *.**.** Pop two
140c0 20 76 61 6c 75 65 73 20 6f 66 66 20 74 68 65 20   values off the 
140d0 73 74 61 63 6b 2e 20 20 54 61 6b 65 20 74 68 65  stack.  Take the
140e0 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20   logical AND of 
140f0 74 68 65 0a 2a 2a 20 74 77 6f 20 76 61 6c 75 65  the.** two value
14100 73 20 61 6e 64 20 70 75 73 68 20 74 68 65 20 72  s and push the r
14110 65 73 75 6c 74 69 6e 67 20 62 6f 6f 6c 65 61 6e  esulting boolean
14120 20 76 61 6c 75 65 20 62 61 63 6b 20 6f 6e 74 6f   value back onto
14130 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 20 0a   the.** stack. .
14140 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72  */./* Opcode: Or
14150 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70   * * *.**.** Pop
14160 20 74 77 6f 20 76 61 6c 75 65 73 20 6f 66 66 20   two values off 
14170 74 68 65 20 73 74 61 63 6b 2e 20 20 54 61 6b 65  the stack.  Take
14180 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20   the logical OR 
14190 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 76 61  of the.** two va
141a0 6c 75 65 73 20 61 6e 64 20 70 75 73 68 20 74 68  lues and push th
141b0 65 20 72 65 73 75 6c 74 69 6e 67 20 62 6f 6f 6c  e resulting bool
141c0 65 61 6e 20 76 61 6c 75 65 20 62 61 63 6b 20 6f  ean value back o
141d0 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  nto the.** stack
141e0 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e  . .*/.case OP_An
141f0 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b  d:.case OP_Or: {
14200 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e  .  int tos = p->
14210 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73 20 3d  tos;.  int nos =
14220 20 74 6f 73 20 2d 20 31 3b 0a 20 20 69 6e 74 20   tos - 1;.  int 
14230 76 31 2c 20 76 32 3b 20 20 20 20 2f 2a 20 30 3d  v1, v2;    /* 0=
14240 3d 54 52 55 45 2c 20 31 3d 3d 46 41 4c 53 45 2c  =TRUE, 1==FALSE,
14250 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
14260 55 4c 4c 20 2a 2f 0a 0a 20 20 56 45 52 49 46 59  ULL */..  VERIFY
14270 28 20 69 66 28 20 6e 6f 73 3c 30 20 29 20 67 6f  ( if( nos<0 ) go
14280 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
14290 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 61 53 74  ack; ).  if( aSt
142a0 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26  ack[tos].flags &
142b0 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   STK_Null ){.   
142c0 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65   v1 = 2;.  }else
142d0 7b 0a 20 20 20 20 49 6e 74 65 67 65 72 69 66 79  {.    Integerify
142e0 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 76 31  (p, tos);.    v1
142f0 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69   = aStack[tos].i
14300 3d 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ==0;.  }.  if( a
14310 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73  Stack[nos].flags
14320 20 26 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20   & STK_Null ){. 
14330 20 20 20 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c     v2 = 2;.  }el
14340 73 65 7b 0a 20 20 20 20 49 6e 74 65 67 65 72 69  se{.    Integeri
14350 66 79 28 70 2c 20 6e 6f 73 29 3b 0a 20 20 20 20  fy(p, nos);.    
14360 76 32 20 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d  v2 = aStack[nos]
14370 2e 69 3d 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28  .i==0;.  }.  if(
14380 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
14390 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74  _And ){.    stat
143a0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
143b0 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63  d char and_logic
143c0 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
143d0 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32  1, 1, 1, 2, 1, 2
143e0 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64   };.    v1 = and
143f0 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b  _logic[v1*3+v2];
14400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
14410 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
14420 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69  ned char or_logi
14430 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c  c[] = { 0, 0, 0,
14440 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20   0, 1, 2, 0, 2, 
14450 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72  2 };.    v1 = or
14460 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b  _logic[v1*3+v2];
14470 0a 20 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b  .  }.  POPSTACK;
14480 0a 20 20 52 65 6c 65 61 73 65 28 70 2c 20 6e 6f  .  Release(p, no
14490 73 29 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32 20  s);.  if( v1==2 
144a0 29 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 6e 6f  ){.    aStack[no
144b0 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e  s].flags = STK_N
144c0 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ull;.  }else{.  
144d0 20 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 20    aStack[nos].i 
144e0 3d 20 76 31 3d 3d 30 3b 0a 20 20 20 20 61 53 74  = v1==0;.    aSt
144f0 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[nos].flags =
14500 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20   STK_Int;.  }.  
14510 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
14520 6f 64 65 3a 20 4e 65 67 61 74 69 76 65 20 2a 20  ode: Negative * 
14530 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 65 61 74 20  * *.**.** Treat 
14540 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
14550 74 61 63 6b 20 61 73 20 61 20 6e 75 6d 65 72 69  tack as a numeri
14560 63 20 71 75 61 6e 74 69 74 79 2e 20 20 52 65 70  c quantity.  Rep
14570 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  lace it.** with 
14580 69 74 73 20 61 64 64 69 74 69 76 65 20 69 6e 76  its additive inv
14590 65 72 73 65 2e 20 20 49 66 20 74 68 65 20 74 6f  erse.  If the to
145a0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
145b0 73 20 4e 55 4c 4c 0a 2a 2a 20 69 74 73 20 76 61  s NULL.** its va
145c0 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  lue is unchanged
145d0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
145e0 41 62 73 56 61 6c 75 65 20 2a 20 2a 20 2a 0a 2a  AbsValue * * *.*
145f0 2a 0a 2a 2a 20 54 72 65 61 74 20 74 68 65 20 74  *.** Treat the t
14600 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
14610 61 73 20 61 20 6e 75 6d 65 72 69 63 20 71 75 61  as a numeric qua
14620 6e 74 69 74 79 2e 20 20 52 65 70 6c 61 63 65 20  ntity.  Replace 
14630 69 74 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 61  it.** with its a
14640 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 2e 20 49  bsolute value. I
14650 66 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  f the top of the
14660 20 73 74 61 63 6b 20 69 73 20 4e 55 4c 4c 0a 2a   stack is NULL.*
14670 2a 20 69 74 73 20 76 61 6c 75 65 20 69 73 20 75  * its value is u
14680 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 63 61 73  nchanged..*/.cas
14690 65 20 4f 50 5f 4e 65 67 61 74 69 76 65 3a 0a 63  e OP_Negative:.c
146a0 61 73 65 20 4f 50 5f 41 62 73 56 61 6c 75 65 3a  ase OP_AbsValue:
146b0 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70   {.  int tos = p
146c0 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49 46 59 28  ->tos;.  VERIFY(
146d0 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
146e0 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
146f0 63 6b 3b 20 29 0a 20 20 69 66 28 20 61 53 74 61  ck; ).  if( aSta
14700 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
14710 53 54 4b 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  STK_Real ){.    
14720 52 65 6c 65 61 73 65 28 70 2c 20 74 6f 73 29 3b  Release(p, tos);
14730 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
14740 63 6f 64 65 3d 3d 4f 50 5f 4e 65 67 61 74 69 76  code==OP_Negativ
14750 65 20 7c 7c 20 61 53 74 61 63 6b 5b 74 6f 73 5d  e || aStack[tos]
14760 2e 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 20 20  .r<0.0 ){.      
14770 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 20 3d 20  aStack[tos].r = 
14780 2d 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 3b 0a  -aStack[tos].r;.
14790 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 63 6b      }.    aStack
147a0 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [tos].flags = ST
147b0 4b 5f 52 65 61 6c 3b 0a 20 20 7d 65 6c 73 65 20  K_Real;.  }else 
147c0 69 66 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  if( aStack[tos].
147d0 66 6c 61 67 73 20 26 20 53 54 4b 5f 49 6e 74 20  flags & STK_Int 
147e0 29 7b 0a 20 20 20 20 52 65 6c 65 61 73 65 28 70  ){.    Release(p
147f0 2c 20 74 6f 73 29 3b 0a 20 20 20 20 69 66 28 20  , tos);.    if( 
14800 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
14810 4e 65 67 61 74 69 76 65 20 7c 7c 20 20 61 53 74  Negative ||  aSt
14820 61 63 6b 5b 74 6f 73 5d 2e 69 3c 30 20 29 7b 0a  ack[tos].i<0 ){.
14830 20 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73        aStack[tos
14840 5d 2e 69 20 3d 20 2d 61 53 74 61 63 6b 5b 74 6f  ].i = -aStack[to
14850 73 5d 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s].i;.    }.    
14860 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
14870 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 7d  s = STK_Int;.  }
14880 65 6c 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b  else if( aStack[
14890 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  tos].flags & STK
148a0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  _Null ){.    /* 
148b0 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
148c0 7d 65 6c 73 65 7b 0a 20 20 20 20 52 65 61 6c 69  }else{.    Reali
148d0 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20  fy(p, tos);.    
148e0 52 65 6c 65 61 73 65 28 70 2c 20 74 6f 73 29 3b  Release(p, tos);
148f0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
14900 63 6f 64 65 3d 3d 4f 50 5f 4e 65 67 61 74 69 76  code==OP_Negativ
14910 65 20 7c 7c 20 20 61 53 74 61 63 6b 5b 74 6f 73  e ||  aStack[tos
14920 5d 2e 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 20  ].r<0.0 ){.     
14930 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 20 3d   aStack[tos].r =
14940 20 2d 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 72 3b   -aStack[tos].r;
14950 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 63  .    }.    aStac
14960 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[tos].flags = S
14970 54 4b 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 62  TK_Real;.  }.  b
14980 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
14990 64 65 3a 20 4e 6f 74 20 2a 20 2a 20 2a 0a 2a 2a  de: Not * * *.**
149a0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
149b0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
149c0 63 6b 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  ck as a boolean 
149d0 76 61 6c 75 65 2e 20 20 52 65 70 6c 61 63 65 20  value.  Replace 
149e0 69 74 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 63  it.** with its c
149f0 6f 6d 70 6c 65 6d 65 6e 74 2e 20 20 49 66 20 74  omplement.  If t
14a00 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
14a10 61 63 6b 20 69 73 20 4e 55 4c 4c 20 69 74 73 20  ack is NULL its 
14a20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 75 6e 63 68  value.** is unch
14a30 61 6e 67 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  anged..*/.case O
14a40 50 5f 4e 6f 74 3a 20 7b 0a 20 20 69 6e 74 20 74  P_Not: {.  int t
14a50 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56  os = p->tos;.  V
14a60 45 52 49 46 59 28 20 69 66 28 20 70 2d 3e 74 6f  ERIFY( if( p->to
14a70 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65  s<0 ) goto not_e
14a80 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20  nough_stack; ). 
14a90 20 69 66 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d   if( aStack[tos]
14aa0 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c  .flags & STK_Nul
14ab0 6c 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a 20 44  l ) break;  /* D
14ac0 6f 20 6e 6f 74 68 69 6e 67 20 74 6f 20 4e 55 4c  o nothing to NUL
14ad0 4c 73 20 2a 2f 0a 20 20 49 6e 74 65 67 65 72 69  Ls */.  Integeri
14ae0 66 79 28 70 2c 20 74 6f 73 29 3b 0a 20 20 52 65  fy(p, tos);.  Re
14af0 6c 65 61 73 65 28 70 2c 20 74 6f 73 29 3b 0a 20  lease(p, tos);. 
14b00 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20 3d   aStack[tos].i =
14b10 20 21 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b   !aStack[tos].i;
14b20 0a 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66  .  aStack[tos].f
14b30 6c 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a  lags = STK_Int;.
14b40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
14b50 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 2a 20  pcode: BitNot * 
14b60 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  * *.**.** Interp
14b70 72 65 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ret the top of t
14b80 68 65 20 73 74 61 63 6b 20 61 73 20 61 6e 20 76  he stack as an v
14b90 61 6c 75 65 2e 20 20 52 65 70 6c 61 63 65 20 69  alue.  Replace i
14ba0 74 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 6f 6e  t.** with its on
14bb0 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 2e 20 20  es-complement.  
14bc0 49 66 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  If the top of th
14bd0 65 20 73 74 61 63 6b 20 69 73 20 4e 55 4c 4c 20  e stack is NULL 
14be0 69 74 73 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  its.** value is 
14bf0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 63 61  unchanged..*/.ca
14c00 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 0a  se OP_BitNot: {.
14c10 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
14c20 6f 73 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66  os;.  VERIFY( if
14c30 28 20 70 2d 3e 74 6f 73 3c 30 20 29 20 67 6f 74  ( p->tos<0 ) got
14c40 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
14c50 63 6b 3b 20 29 0a 20 20 69 66 28 20 61 53 74 61  ck; ).  if( aSta
14c60 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
14c70 53 54 4b 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b  STK_Null ) break
14c80 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  ;  /* Do nothing
14c90 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 49   to NULLs */.  I
14ca0 6e 74 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73  ntegerify(p, tos
14cb0 29 3b 0a 20 20 52 65 6c 65 61 73 65 28 70 2c 20  );.  Release(p, 
14cc0 74 6f 73 29 3b 0a 20 20 61 53 74 61 63 6b 5b 74  tos);.  aStack[t
14cd0 6f 73 5d 2e 69 20 3d 20 7e 61 53 74 61 63 6b 5b  os].i = ~aStack[
14ce0 74 6f 73 5d 2e 69 3b 0a 20 20 61 53 74 61 63 6b  tos].i;.  aStack
14cf0 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [tos].flags = ST
14d00 4b 5f 49 6e 74 3b 0a 20 20 62 72 65 61 6b 3b 0a  K_Int;.  break;.
14d10 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f  }../* Opcode: No
14d20 6f 70 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44  op * * *.**.** D
14d30 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69 73  o nothing.  This
14d40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
14d50 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73 20  often useful as 
14d60 61 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69 6e  a jump.** destin
14d70 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
14d80 50 5f 4e 6f 6f 70 3a 20 7b 0a 20 20 62 72 65 61  P_Noop: {.  brea
14d90 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
14da0 20 49 66 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a   If P1 P2 *.**.*
14db0 2a 20 50 6f 70 20 61 20 73 69 6e 67 6c 65 20 62  * Pop a single b
14dc0 6f 6f 6c 65 61 6e 20 66 72 6f 6d 20 74 68 65 20  oolean from the 
14dd0 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 20 62  stack.  If the b
14de0 6f 6f 6c 65 61 6e 20 70 6f 70 70 65 64 20 69 73  oolean popped is
14df0 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 6a  .** true, then j
14e00 75 6d 70 20 74 6f 20 70 32 2e 20 20 4f 74 68 65  ump to p2.  Othe
14e10 72 77 69 73 65 20 63 6f 6e 74 69 6e 75 65 20 74  rwise continue t
14e20 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
14e30 75 63 74 69 6f 6e 2e 0a 2a 2a 20 41 6e 20 69 6e  uction..** An in
14e40 74 65 67 65 72 20 69 73 20 66 61 6c 73 65 20 69  teger is false i
14e50 66 20 7a 65 72 6f 20 61 6e 64 20 74 72 75 65 20  f zero and true 
14e60 6f 74 68 65 72 77 69 73 65 2e 20 20 41 20 73 74  otherwise.  A st
14e70 72 69 6e 67 20 69 73 0a 2a 2a 20 66 61 6c 73 65  ring is.** false
14e80 20 69 66 20 69 74 20 68 61 73 20 7a 65 72 6f 20   if it has zero 
14e90 6c 65 6e 67 74 68 20 61 6e 64 20 74 72 75 65 20  length and true 
14ea0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
14eb0 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 70 6f   If the value po
14ec0 70 70 65 64 20 6f 66 20 74 68 65 20 73 74 61 63  pped of the stac
14ed0 6b 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  k is NULL, then 
14ee0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
14ef0 20 50 31 0a 2a 2a 20 69 73 20 74 72 75 65 20 61   P1.** is true a
14f00 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
14f10 69 66 20 50 31 20 69 73 20 66 61 6c 73 65 2e 0a  if P1 is false..
14f20 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  */./* Opcode: If
14f30 4e 6f 74 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a  Not P1 P2 *.**.*
14f40 2a 20 50 6f 70 20 61 20 73 69 6e 67 6c 65 20 62  * Pop a single b
14f50 6f 6f 6c 65 61 6e 20 66 72 6f 6d 20 74 68 65 20  oolean from the 
14f60 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 20 62  stack.  If the b
14f70 6f 6f 6c 65 61 6e 20 70 6f 70 70 65 64 20 69 73  oolean popped is
14f80 0a 2a 2a 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  .** false, then 
14f90 6a 75 6d 70 20 74 6f 20 70 32 2e 20 20 4f 74 68  jump to p2.  Oth
14fa0 65 72 77 69 73 65 20 63 6f 6e 74 69 6e 75 65 20  erwise continue 
14fb0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
14fc0 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 41 6e 20 69  ruction..** An i
14fd0 6e 74 65 67 65 72 20 69 73 20 66 61 6c 73 65 20  nteger is false 
14fe0 69 66 20 7a 65 72 6f 20 61 6e 64 20 74 72 75 65  if zero and true
14ff0 20 6f 74 68 65 72 77 69 73 65 2e 20 20 41 20 73   otherwise.  A s
15000 74 72 69 6e 67 20 69 73 0a 2a 2a 20 66 61 6c 73  tring is.** fals
15010 65 20 69 66 20 69 74 20 68 61 73 20 7a 65 72 6f  e if it has zero
15020 20 6c 65 6e 67 74 68 20 61 6e 64 20 74 72 75 65   length and true
15030 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
15040 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 70  * If the value p
15050 6f 70 70 65 64 20 6f 66 20 74 68 65 20 73 74 61  opped of the sta
15060 63 6b 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ck is NULL, then
15070 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
15080 66 20 50 31 0a 2a 2a 20 69 73 20 74 72 75 65 20  f P1.** is true 
15090 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  and fall through
150a0 20 69 66 20 50 31 20 69 73 20 66 61 6c 73 65 2e   if P1 is false.
150b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 0a  .*/.case OP_If:.
150c0 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b  case OP_IfNot: {
150d0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 56 45 52 49  .  int c;.  VERI
150e0 46 59 28 20 69 66 28 20 70 2d 3e 74 6f 73 3c 30  FY( if( p->tos<0
150f0 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
15100 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66  gh_stack; ).  if
15110 28 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d  ( aStack[p->tos]
15120 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c  .flags & STK_Nul
15130 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 4f 70  l ){.    c = pOp
15140 2d 3e 70 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->p1;.  }else{. 
15150 20 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c     Integerify(p,
15160 20 70 2d 3e 74 6f 73 29 3b 0a 20 20 20 20 63 20   p->tos);.    c 
15170 3d 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d  = aStack[p->tos]
15180 2e 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  .i;.    if( pOp-
15190 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f  >opcode==OP_IfNo
151a0 74 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a  t ) c = !c;.  }.
151b0 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 69 66    POPSTACK;.  if
151c0 28 20 63 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  ( c ) pc = pOp->
151d0 70 32 2d 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  p2-1;.  break;.}
151e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e  ../* Opcode: IsN
151f0 75 6c 6c 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a  ull P1 P2 *.**.*
15200 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
15210 74 6f 70 20 61 62 73 28 50 31 29 20 76 61 6c 75  top abs(P1) valu
15220 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  es on the stack 
15230 61 72 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  are NULL, then j
15240 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 20 54  ump.** to P2.  T
15250 68 65 20 73 74 61 63 6b 20 69 73 20 70 6f 70 70  he stack is popp
15260 65 64 20 50 31 20 74 69 6d 65 73 20 69 66 20 50  ed P1 times if P
15270 31 3e 30 2e 20 20 49 66 20 50 31 3c 30 20 74 68  1>0.  If P1<0 th
15280 65 6e 20 61 6c 6c 20 76 61 6c 75 65 73 0a 2a 2a  en all values.**
15290 20 61 72 65 20 6c 65 66 74 20 75 6e 63 68 61 6e   are left unchan
152a0 67 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ged on the stack
152b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e  ..*/.case OP_IsN
152c0 75 6c 6c 3a 20 7b 0a 20 20 69 6e 74 20 69 2c 20  ull: {.  int i, 
152d0 63 6e 74 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70  cnt;.  cnt = pOp
152e0 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 6e 74 3c  ->p1;.  if( cnt<
152f0 30 20 29 20 63 6e 74 20 3d 20 2d 63 6e 74 3b 0a  0 ) cnt = -cnt;.
15300 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70 2d    VERIFY( if( p-
15310 3e 74 6f 73 2b 31 2d 63 6e 74 3c 30 20 29 20 67  >tos+1-cnt<0 ) g
15320 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
15330 74 61 63 6b 3b 20 29 0a 20 20 66 6f 72 28 69 3d  tack; ).  for(i=
15340 30 3b 20 69 3c 63 6e 74 3b 20 69 2b 2b 29 7b 0a  0; i<cnt; i++){.
15350 20 20 20 20 69 66 28 20 61 53 74 61 63 6b 5b 70      if( aStack[p
15360 2d 3e 74 6f 73 2d 69 5d 2e 66 6c 61 67 73 20 26  ->tos-i].flags &
15370 20 53 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   STK_Null ){.   
15380 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d     pc = pOp->p2-
15390 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
153a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
153b0 70 4f 70 2d 3e 70 31 3e 30 20 29 20 50 6f 70 53  pOp->p1>0 ) PopS
153c0 74 61 63 6b 28 70 2c 20 63 6e 74 29 3b 0a 20 20  tack(p, cnt);.  
153d0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
153e0 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
153f0 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20  P2 *.**.** Jump 
15400 74 6f 20 50 32 20 69 66 20 74 68 65 20 74 6f 70  to P2 if the top
15410 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 74   value on the st
15420 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ack is not NULL.
15430 20 20 50 6f 70 20 74 68 65 0a 2a 2a 20 73 74 61    Pop the.** sta
15440 63 6b 20 69 66 20 50 31 20 69 73 20 67 72 65 61  ck if P1 is grea
15450 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20  ter than zero.  
15460 49 66 20 50 31 20 69 73 20 6c 65 73 73 20 74 68  If P1 is less th
15470 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 2a  an or equal to.*
15480 2a 20 7a 65 72 6f 20 74 68 65 6e 20 6c 65 61 76  * zero then leav
15490 65 20 74 68 65 20 76 61 6c 75 65 20 6f 6e 20 74  e the value on t
154a0 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73  he stack..*/.cas
154b0 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 0a  e OP_NotNull: {.
154c0 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70 2d    VERIFY( if( p-
154d0 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  >tos<0 ) goto no
154e0 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20  t_enough_stack; 
154f0 29 0a 20 20 69 66 28 20 28 61 53 74 61 63 6b 5b  ).  if( (aStack[
15500 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  p->tos].flags & 
15510 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 70  STK_Null)==0 ) p
15520 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
15530 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29   if( pOp->p1>0 )
15540 7b 20 50 4f 50 53 54 41 43 4b 3b 20 7d 0a 20 20  { POPSTACK; }.  
15550 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
15560 6f 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20  ode: MakeRecord 
15570 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f  P1 P2 *.**.** Co
15580 6e 76 65 72 74 20 74 68 65 20 74 6f 70 20 50 31  nvert the top P1
15590 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
155a0 73 74 61 63 6b 20 69 6e 74 6f 20 61 20 73 69 6e  stack into a sin
155b0 67 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 73 75 69  gle entry.** sui
155c0 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61 73  table for use as
155d0 20 61 20 64 61 74 61 20 72 65 63 6f 72 64 20 69   a data record i
155e0 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
155f0 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 64 65 74 61  le.  The.** deta
15600 69 6c 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61  ils of the forma
15610 74 20 61 72 65 20 69 72 72 65 6c 61 76 61 6e 74  t are irrelavant
15620 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
15630 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63  OP_Column.** opc
15640 6f 64 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74  ode can decode t
15650 68 65 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e  he record later.
15660 20 20 52 65 66 65 72 20 74 6f 20 73 6f 75 72 63    Refer to sourc
15670 65 20 63 6f 64 65 0a 2a 2a 20 63 6f 6d 6d 65 6e  e code.** commen
15680 74 73 20 66 6f 72 20 74 68 65 20 64 65 74 61 69  ts for the detai
15690 6c 73 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ls of the record
156a0 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
156b0 66 20 50 32 20 69 73 20 74 72 75 65 20 28 6e 6f  f P2 is true (no
156c0 6e 2d 7a 65 72 6f 29 20 61 6e 64 20 6f 6e 65 20  n-zero) and one 
156d0 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 50  or more of the P
156e0 31 20 65 6e 74 72 69 65 73 0a 2a 2a 20 74 68 61  1 entries.** tha
156f0 74 20 67 6f 20 69 6e 74 6f 20 62 75 69 6c 64 69  t go into buildi
15700 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  ng the record is
15710 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 64 64 20   NULL, then add 
15720 73 6f 6d 65 20 65 78 74 72 61 0a 2a 2a 20 62 79  some extra.** by
15730 74 65 73 20 74 6f 20 74 68 65 20 72 65 63 6f 72  tes to the recor
15740 64 20 74 6f 20 6d 61 6b 65 20 69 74 20 64 69 73  d to make it dis
15750 74 69 6e 63 74 20 66 6f 72 20 6f 74 68 65 72 20  tinct for other 
15760 65 6e 74 72 69 65 73 20 63 72 65 61 74 65 64 0a  entries created.
15770 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 73 61  ** during the sa
15780 6d 65 20 72 75 6e 20 6f 66 20 74 68 65 20 56 44  me run of the VD
15790 42 45 2e 20 20 54 68 65 20 65 78 74 72 61 20 62  BE.  The extra b
157a0 79 74 65 73 20 61 64 64 65 64 20 61 72 65 20 61  ytes added are a
157b0 0a 2a 2a 20 63 6f 75 6e 74 65 72 20 74 68 61 74  .** counter that
157c0 20 69 73 20 72 65 73 65 74 20 77 69 74 68 20 65   is reset with e
157d0 61 63 68 20 72 75 6e 20 6f 66 20 74 68 65 20 56  ach run of the V
157e0 44 42 45 2c 20 73 6f 20 72 65 63 6f 72 64 73 0a  DBE, so records.
157f0 2a 2a 20 63 72 65 61 74 65 64 20 74 68 69 73 20  ** created this 
15800 77 61 79 20 77 69 6c 6c 20 6e 6f 74 20 6e 65 63  way will not nec
15810 65 73 73 61 72 69 6c 79 20 62 65 20 64 69 73 74  essarily be dist
15820 69 6e 63 74 20 61 63 72 6f 73 73 20 72 75 6e 73  inct across runs
15830 2e 0a 2a 2a 20 42 75 74 20 74 68 65 79 20 73 68  ..** But they sh
15840 6f 75 6c 64 20 62 65 20 64 69 73 74 69 6e 63 74  ould be distinct
15850 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 74   for transient t
15860 61 62 6c 65 73 20 28 63 72 65 61 74 65 64 20 75  ables (created u
15870 73 69 6e 67 0a 2a 2a 20 4f 50 5f 4f 70 65 6e 54  sing.** OP_OpenT
15880 65 6d 70 29 20 77 68 69 63 68 20 69 73 20 77 68  emp) which is wh
15890 61 74 20 74 68 65 79 20 61 72 65 20 69 6e 74 65  at they are inte
158a0 6e 64 65 64 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20  nded for..**.** 
158b0 28 4c 61 74 65 72 3a 29 20 54 68 65 20 50 32 3d  (Later:) The P2=
158c0 3d 31 20 6f 70 74 69 6f 6e 20 77 61 73 20 69 6e  =1 option was in
158d0 74 65 6e 64 65 64 20 74 6f 20 6d 61 6b 65 20 4e  tended to make N
158e0 55 4c 4c 73 20 64 69 73 74 69 6e 63 74 0a 2a 2a  ULLs distinct.**
158f0 20 66 6f 72 20 74 68 65 20 55 4e 49 4f 4e 20 6f   for the UNION o
15900 70 65 72 61 74 6f 72 2e 20 20 42 75 74 20 49 20  perator.  But I 
15910 68 61 76 65 20 73 69 6e 63 65 20 64 69 73 63 6f  have since disco
15920 76 65 72 65 64 20 74 68 61 74 20 4e 55 4c 4c 73  vered that NULLs
15930 0a 2a 2a 20 61 72 65 20 69 6e 64 69 73 74 69 6e  .** are indistin
15940 63 74 20 66 6f 72 20 55 4e 49 4f 4e 2e 20 20 53  ct for UNION.  S
15950 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  o this option is
15960 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2f 0a   never used..*/.
15970 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  case OP_MakeReco
15980 72 64 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  rd: {.  char *zN
15990 65 77 52 65 63 6f 72 64 3b 0a 20 20 69 6e 74 20  ewRecord;.  int 
159a0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 46 69  nByte;.  int nFi
159b0 65 6c 64 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  eld;.  int i, j;
159c0 0a 20 20 69 6e 74 20 69 64 78 57 69 64 74 68 3b  .  int idxWidth;
159d0 0a 20 20 75 33 32 20 61 64 64 72 3b 0a 20 20 69  .  u32 addr;.  i
159e0 6e 74 20 61 64 64 55 6e 69 71 75 65 20 3d 20 30  nt addUnique = 0
159f0 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63  ;   /* True to c
15a00 61 75 73 65 20 62 79 74 65 73 20 74 6f 20 62 65  ause bytes to be
15a10 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
15a20 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
15a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 65 6e            ** gen
15a40 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 64 69  erated record di
15a50 73 74 69 6e 63 74 20 2a 2f 0a 20 20 63 68 61 72  stinct */.  char
15a60 20 7a 54 65 6d 70 5b 4e 42 46 53 5d 3b 20 20 20   zTemp[NBFS];   
15a70 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
15a80 6f 72 20 73 6d 61 6c 6c 20 72 65 63 6f 72 64 73  or small records
15a90 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69   */..  /* Assumi
15aa0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ng the record co
15ab0 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
15ac0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
15ad0 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69  at looks.  ** li
15ae0 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
15af0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
15b40 7c 20 69 64 78 30 20 7c 20 69 64 78 31 20 7c 20  | idx0 | idx1 | 
15b50 2e 2e 2e 20 7c 20 69 64 78 28 4e 2d 31 29 20 7c  ... | idx(N-1) |
15b60 20 69 64 78 28 4e 29 20 7c 20 64 61 74 61 30 20   idx(N) | data0 
15b70 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 28 4e 2d 31  | ... | data(N-1
15b80 29 20 7c 0a 20 20 2a 2a 20 20 20 2d 2d 2d 2d 2d  ) |.  **   -----
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15bd0 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 61 74   **.  ** All dat
15be0 61 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6e  a fields are con
15bf0 76 65 72 74 65 64 20 74 6f 20 73 74 72 69 6e 67  verted to string
15c00 73 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 73  s before being s
15c10 74 6f 72 65 64 20 61 6e 64 0a 20 20 2a 2a 20 61  tored and.  ** a
15c20 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 20 74  re stored with t
15c30 68 65 69 72 20 6e 75 6c 6c 20 74 65 72 6d 69 6e  heir null termin
15c40 61 74 6f 72 73 2e 20 20 4e 55 4c 4c 20 65 6e 74  ators.  NULL ent
15c50 72 69 65 73 20 6f 6d 69 74 20 74 68 65 0a 20 20  ries omit the.  
15c60 2a 2a 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  ** null terminat
15c70 6f 72 2e 20 20 54 68 75 73 20 61 6e 20 65 6d 70  or.  Thus an emp
15c80 74 79 20 73 74 72 69 6e 67 20 75 73 65 73 20 31  ty string uses 1
15c90 20 62 79 74 65 20 61 6e 64 20 61 20 4e 55 4c 4c   byte and a NULL
15ca0 20 75 73 65 73 0a 20 20 2a 2a 20 7a 65 72 6f 20   uses.  ** zero 
15cb0 62 79 74 65 73 2e 20 20 44 61 74 61 28 30 29 20  bytes.  Data(0) 
15cc0 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
15cd0 65 20 6c 6f 77 65 73 74 20 65 6c 65 6d 65 6e 74  e lowest element
15ce0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20   of the stack.  
15cf0 2a 2a 20 61 6e 64 20 64 61 74 61 28 4e 2d 31 29  ** and data(N-1)
15d00 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74   is the top of t
15d10 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
15d20 20 2a 2a 20 45 61 63 68 20 6f 66 20 74 68 65 20   ** Each of the 
15d30 69 64 78 28 29 20 65 6e 74 72 69 65 73 20 69 73  idx() entries is
15d40 20 65 69 74 68 65 72 20 31 2c 20 32 2c 20 6f 72   either 1, 2, or
15d50 20 33 20 62 79 74 65 73 20 64 65 70 65 6e 64 69   3 bytes dependi
15d60 6e 67 20 6f 6e 0a 20 20 2a 2a 20 68 6f 77 20 62  ng on.  ** how b
15d70 69 67 20 74 68 65 20 74 6f 74 61 6c 20 72 65 63  ig the total rec
15d80 6f 72 64 20 69 73 2e 20 20 49 64 78 28 30 29 20  ord is.  Idx(0) 
15d90 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
15da0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
15db0 0a 20 20 2a 2a 20 6f 66 20 64 61 74 61 28 30 29  .  ** of data(0)
15dc0 2e 20 20 49 64 78 28 6b 29 20 63 6f 6e 74 61 69  .  Idx(k) contai
15dd0 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  ns the offset to
15de0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64 61   the start of da
15df0 74 61 28 6b 29 2e 0a 20 20 2a 2a 20 49 64 78 28  ta(k)..  ** Idx(
15e00 4e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  N) contains the 
15e10 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
15e20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63  bytes in the rec
15e30 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65  ord..  */.  nFie
15e40 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  ld = pOp->p1;.  
15e50 56 45 52 49 46 59 28 20 69 66 28 20 70 2d 3e 74  VERIFY( if( p->t
15e60 6f 73 2b 31 3c 6e 46 69 65 6c 64 20 29 20 67 6f  os+1<nField ) go
15e70 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
15e80 61 63 6b 3b 20 29 0a 20 20 6e 42 79 74 65 20 3d  ack; ).  nByte =
15e90 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74   0;.  for(i=p->t
15ea0 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
15eb0 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20  p->tos; i++){.  
15ec0 20 20 69 66 28 20 28 61 53 74 61 63 6b 5b 69 5d    if( (aStack[i]
15ed0 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c  .flags & STK_Nul
15ee0 6c 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64 55  l) ){.      addU
15ef0 6e 69 71 75 65 20 3d 20 70 4f 70 2d 3e 70 32 3b  nique = pOp->p2;
15f00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15f10 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 69    Stringify(p, i
15f20 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  );.      nByte +
15f30 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20  = aStack[i].n;. 
15f40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61     }.  }.  if( a
15f50 64 64 55 6e 69 71 75 65 20 29 20 6e 42 79 74 65  ddUnique ) nByte
15f60 20 2b 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 75 6e   += sizeof(p->un
15f70 69 71 75 65 43 6e 74 29 3b 0a 20 20 69 66 28 20  iqueCnt);.  if( 
15f80 6e 42 79 74 65 20 2b 20 6e 46 69 65 6c 64 20 2b  nByte + nField +
15f90 20 31 20 3c 20 32 35 36 20 29 7b 0a 20 20 20 20   1 < 256 ){.    
15fa0 69 64 78 57 69 64 74 68 20 3d 20 31 3b 0a 20 20  idxWidth = 1;.  
15fb0 7d 65 6c 73 65 20 69 66 28 20 6e 42 79 74 65 20  }else if( nByte 
15fc0 2b 20 32 2a 6e 46 69 65 6c 64 20 2b 20 32 20 3c  + 2*nField + 2 <
15fd0 20 36 35 35 33 36 20 29 7b 0a 20 20 20 20 69 64   65536 ){.    id
15fe0 78 57 69 64 74 68 20 3d 20 32 3b 0a 20 20 7d 65  xWidth = 2;.  }e
15ff0 6c 73 65 7b 0a 20 20 20 20 69 64 78 57 69 64 74  lse{.    idxWidt
16000 68 20 3d 20 33 3b 0a 20 20 7d 0a 20 20 6e 42 79  h = 3;.  }.  nBy
16010 74 65 20 2b 3d 20 69 64 78 57 69 64 74 68 2a 28  te += idxWidth*(
16020 6e 46 69 65 6c 64 20 2b 20 31 29 3b 0a 20 20 69  nField + 1);.  i
16030 66 28 20 6e 42 79 74 65 3e 4d 41 58 5f 42 59 54  f( nByte>MAX_BYT
16040 45 53 5f 50 45 52 5f 52 4f 57 20 29 7b 0a 20 20  ES_PER_ROW ){.  
16050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f    rc = SQLITE_TO
16060 4f 42 49 47 3b 0a 20 20 20 20 67 6f 74 6f 20 61  OBIG;.    goto a
16070 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
16080 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79  r;.  }.  if( nBy
16090 74 65 3c 3d 4e 42 46 53 20 29 7b 0a 20 20 20 20  te<=NBFS ){.    
160a0 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20 7a 54 65  zNewRecord = zTe
160b0 6d 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mp;.  }else{.   
160c0 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20 73 71   zNewRecord = sq
160d0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
160e0 42 79 74 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Byte );.    if( 
160f0 7a 4e 65 77 52 65 63 6f 72 64 3d 3d 30 20 29 20  zNewRecord==0 ) 
16100 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
16110 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 61 64 64 72  .  j = 0;.  addr
16120 20 3d 20 69 64 78 57 69 64 74 68 2a 28 6e 46 69   = idxWidth*(nFi
16130 65 6c 64 2b 31 29 20 2b 20 61 64 64 55 6e 69 71  eld+1) + addUniq
16140 75 65 2a 73 69 7a 65 6f 66 28 70 2d 3e 75 6e 69  ue*sizeof(p->uni
16150 71 75 65 43 6e 74 29 3b 0a 20 20 66 6f 72 28 69  queCnt);.  for(i
16160 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31  =p->tos-nField+1
16170 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b  ; i<=p->tos; i++
16180 29 7b 0a 20 20 20 20 7a 4e 65 77 52 65 63 6f 72  ){.    zNewRecor
16190 64 5b 6a 2b 2b 5d 20 3d 20 61 64 64 72 20 26 20  d[j++] = addr & 
161a0 30 78 66 66 3b 0a 20 20 20 20 69 66 28 20 69 64  0xff;.    if( id
161b0 78 57 69 64 74 68 3e 31 20 29 7b 0a 20 20 20 20  xWidth>1 ){.    
161c0 20 20 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 2b 2b    zNewRecord[j++
161d0 5d 20 3d 20 28 61 64 64 72 3e 3e 38 29 26 30 78  ] = (addr>>8)&0x
161e0 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64  ff;.      if( id
161f0 78 57 69 64 74 68 3e 32 20 29 7b 0a 20 20 20 20  xWidth>2 ){.    
16200 20 20 20 20 7a 4e 65 77 52 65 63 6f 72 64 5b 6a      zNewRecord[j
16210 2b 2b 5d 20 3d 20 28 61 64 64 72 3e 3e 31 36 29  ++] = (addr>>16)
16220 26 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20  &0xff;.      }. 
16230 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 61 53     }.    if( (aS
16240 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20  tack[i].flags & 
16250 53 54 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  STK_Null)==0 ){.
16260 20 20 20 20 20 20 61 64 64 72 20 2b 3d 20 61 53        addr += aS
16270 74 61 63 6b 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7d  tack[i].n;.    }
16280 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72  .  }.  zNewRecor
16290 64 5b 6a 2b 2b 5d 20 3d 20 61 64 64 72 20 26 20  d[j++] = addr & 
162a0 30 78 66 66 3b 0a 20 20 69 66 28 20 69 64 78 57  0xff;.  if( idxW
162b0 69 64 74 68 3e 31 20 29 7b 0a 20 20 20 20 7a 4e  idth>1 ){.    zN
162c0 65 77 52 65 63 6f 72 64 5b 6a 2b 2b 5d 20 3d 20  ewRecord[j++] = 
162d0 28 61 64 64 72 3e 3e 38 29 26 30 78 66 66 3b 0a  (addr>>8)&0xff;.
162e0 20 20 20 20 69 66 28 20 69 64 78 57 69 64 74 68      if( idxWidth
162f0 3e 32 20 29 7b 0a 20 20 20 20 20 20 7a 4e 65 77  >2 ){.      zNew
16300 52 65 63 6f 72 64 5b 6a 2b 2b 5d 20 3d 20 28 61  Record[j++] = (a
16310 64 64 72 3e 3e 31 36 29 26 30 78 66 66 3b 0a 20  ddr>>16)&0xff;. 
16320 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61     }.  }.  if( a
16330 64 64 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  ddUnique ){.    
16340 6d 65 6d 63 70 79 28 26 7a 4e 65 77 52 65 63 6f  memcpy(&zNewReco
16350 72 64 5b 6a 5d 2c 20 26 70 2d 3e 75 6e 69 71 75  rd[j], &p->uniqu
16360 65 43 6e 74 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  eCnt, sizeof(p->
16370 75 6e 69 71 75 65 43 6e 74 29 29 3b 0a 20 20 20  uniqueCnt));.   
16380 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 2b 2b 3b   p->uniqueCnt++;
16390 0a 20 20 20 20 6a 20 2b 3d 20 73 69 7a 65 6f 66  .    j += sizeof
163a0 28 70 2d 3e 75 6e 69 71 75 65 43 6e 74 29 3b 0a  (p->uniqueCnt);.
163b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74    }.  for(i=p->t
163c0 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d  os-nField+1; i<=
163d0 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20  p->tos; i++){.  
163e0 20 20 69 66 28 20 28 61 53 74 61 63 6b 5b 69 5d    if( (aStack[i]
163f0 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c  .flags & STK_Nul
16400 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  l)==0 ){.      m
16410 65 6d 63 70 79 28 26 7a 4e 65 77 52 65 63 6f 72  emcpy(&zNewRecor
16420 64 5b 6a 5d 2c 20 7a 53 74 61 63 6b 5b 69 5d 2c  d[j], zStack[i],
16430 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 29 3b 0a 20   aStack[i].n);. 
16440 20 20 20 20 20 6a 20 2b 3d 20 61 53 74 61 63 6b       j += aStack
16450 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i].n;.    }.  }
16460 0a 20 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 6e  .  PopStack(p, n
16470 46 69 65 6c 64 29 3b 0a 20 20 70 2d 3e 74 6f 73  Field);.  p->tos
16480 2b 2b 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e  ++;.  aStack[p->
16490 74 6f 73 5d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  tos].n = nByte;.
164a0 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 4e 42 46    if( nByte<=NBF
164b0 53 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  S ){.    assert(
164c0 20 7a 4e 65 77 52 65 63 6f 72 64 3d 3d 7a 54 65   zNewRecord==zTe
164d0 6d 70 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  mp );.    memcpy
164e0 28 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e  (aStack[p->tos].
164f0 7a 2c 20 7a 54 65 6d 70 2c 20 6e 42 79 74 65 29  z, zTemp, nByte)
16500 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e  ;.    zStack[p->
16510 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b 5b 70 2d  tos] = aStack[p-
16520 3e 74 6f 73 5d 2e 7a 3b 0a 20 20 20 20 61 53 74  >tos].z;.    aSt
16530 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67  ack[p->tos].flag
16540 73 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 7d  s = STK_Str;.  }
16550 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
16560 28 20 7a 4e 65 77 52 65 63 6f 72 64 21 3d 7a 54  ( zNewRecord!=zT
16570 65 6d 70 20 29 3b 0a 20 20 20 20 61 53 74 61 63  emp );.    aStac
16580 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20  k[p->tos].flags 
16590 3d 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f  = STK_Str | STK_
165a0 44 79 6e 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b  Dyn;.    zStack[
165b0 70 2d 3e 74 6f 73 5d 20 3d 20 7a 4e 65 77 52 65  p->tos] = zNewRe
165c0 63 6f 72 64 3b 0a 20 20 7d 0a 20 20 62 72 65 61  cord;.  }.  brea
165d0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
165e0 20 4d 61 6b 65 4b 65 79 20 50 31 20 50 32 20 50   MakeKey P1 P2 P
165f0 33 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  3.**.** Convert 
16600 74 68 65 20 74 6f 70 20 50 31 20 65 6e 74 72 69  the top P1 entri
16610 65 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  es of the stack 
16620 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e  into a single en
16630 74 72 79 20 73 75 69 74 61 62 6c 65 0a 2a 2a 20  try suitable.** 
16640 66 6f 72 20 75 73 65 20 61 73 20 74 68 65 20 6b  for use as the k
16650 65 79 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20  ey in an index. 
16660 20 54 68 65 20 74 6f 70 20 50 31 20 72 65 63 6f   The top P1 reco
16670 72 64 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 76 65  rds are.** conve
16680 72 74 65 64 20 74 6f 20 73 74 72 69 6e 67 73 20  rted to strings 
16690 61 6e 64 20 6d 65 72 67 65 64 2e 20 20 54 68 65  and merged.  The
166a0 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 6f 72   null-terminator
166b0 73 20 0a 2a 2a 20 61 72 65 20 72 65 74 61 69 6e  s .** are retain
166c0 65 64 20 61 6e 64 20 75 73 65 64 20 61 73 20 73  ed and used as s
166d0 65 70 61 72 61 74 6f 72 73 2e 0a 2a 2a 20 54 68  eparators..** Th
166e0 65 20 6c 6f 77 65 73 74 20 65 6e 74 72 79 20 69  e lowest entry i
166f0 6e 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  n the stack is t
16700 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 61  he first field a
16710 6e 64 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  nd the top of th
16720 65 0a 2a 2a 20 73 74 61 63 6b 20 62 65 63 6f 6d  e.** stack becom
16730 65 73 20 74 68 65 20 6c 61 73 74 2e 0a 2a 2a 0a  es the last..**.
16740 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20  ** If P2 is not 
16750 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6f  zero, then the o
16760 72 69 67 69 6e 61 6c 20 65 6e 74 72 69 65 73 20  riginal entries 
16770 72 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73 74  remain on the st
16780 61 63 6b 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ack.** and the n
16790 65 77 20 6b 65 79 20 69 73 20 70 75 73 68 65 64  ew key is pushed
167a0 20 6f 6e 20 74 6f 70 2e 20 20 49 66 20 50 32 20   on top.  If P2 
167b0 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 6f 72 69  is zero, the ori
167c0 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 69 73  ginal.** data is
167d0 20 70 6f 70 70 65 64 20 6f 66 66 20 74 68 65 20   popped off the 
167e0 73 74 61 63 6b 20 66 69 72 73 74 20 74 68 65 6e  stack first then
167f0 20 74 68 65 20 6e 65 77 20 6b 65 79 20 69 73 20   the new key is 
16800 70 75 73 68 65 64 0a 2a 2a 20 62 61 63 6b 20 69  pushed.** back i
16810 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2a 0a  n its place..**.
16820 2a 2a 20 50 33 20 69 73 20 61 20 73 74 72 69 6e  ** P3 is a strin
16830 67 20 74 68 61 74 20 69 73 20 50 31 20 63 68 61  g that is P1 cha
16840 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 45  racters long.  E
16850 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 73  ach character is
16860 20 65 69 74 68 65 72 0a 2a 2a 20 61 6e 20 27 6e   either.** an 'n
16870 27 20 6f 72 20 61 20 27 74 27 20 74 6f 20 69 6e  ' or a 't' to in
16880 64 69 63 61 74 65 73 20 69 66 20 74 68 65 20 61  dicates if the a
16890 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
168a0 65 20 6e 75 6d 65 72 69 63 20 6f 72 0a 2a 2a 20  e numeric or.** 
168b0 74 65 78 74 2e 20 20 54 68 65 20 66 69 72 73 74  text.  The first
168c0 20 63 68 61 72 61 63 74 65 72 20 63 6f 72 72 65   character corre
168d0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c 6f  sponds to the lo
168e0 77 65 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  west element on 
168f0 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 20 20 49  the.** stack.  I
16900 66 20 50 33 20 69 73 20 4e 55 4c 4c 20 74 68 65  f P3 is NULL the
16910 6e 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20  n all arguments 
16920 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
16930 65 20 6e 75 6d 65 72 69 63 2e 0a 2a 2a 0a 2a 2a  e numeric..**.**
16940 20 54 68 65 20 6b 65 79 20 69 73 20 61 20 63 6f   The key is a co
16950 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 66  ncatenation of f
16960 69 65 6c 64 73 2e 20 20 45 61 63 68 20 66 69 65  ields.  Each fie
16970 6c 64 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  ld is terminated
16980 20 62 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   by.** a single 
16990 30 78 30 30 20 63 68 61 72 61 63 74 65 72 2e 20  0x00 character. 
169a0 20 41 20 4e 55 4c 4c 20 66 69 65 6c 64 20 69 73   A NULL field is
169b0 20 69 6e 74 72 6f 64 75 63 65 64 20 62 79 20 61   introduced by a
169c0 6e 20 27 61 27 20 61 6e 64 0a 2a 2a 20 69 73 20  n 'a' and.** is 
169d0 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65 64 69 61  followed immedia
169e0 74 65 6c 79 20 62 79 20 69 74 73 20 30 78 30 30  tely by its 0x00
169f0 20 74 65 72 6d 69 6e 61 74 6f 72 2e 20 20 41 20   terminator.  A 
16a00 6e 75 6d 65 72 69 63 20 66 69 65 6c 64 20 69 73  numeric field is
16a10 0a 2a 2a 20 69 6e 74 72 6f 64 75 63 65 64 20 62  .** introduced b
16a20 79 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  y a single chara
16a30 63 74 65 72 20 27 62 27 20 61 6e 64 20 69 73 20  cter 'b' and is 
16a40 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 73 65  followed by a se
16a50 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 63 68 61  quence.** of cha
16a60 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
16a70 72 65 73 65 6e 74 20 74 68 65 20 6e 75 6d 62 65  resent the numbe
16a80 72 20 73 75 63 68 20 74 68 61 74 20 61 20 63 6f  r such that a co
16a90 6d 70 61 72 69 73 6f 6e 20 6f 66 0a 2a 2a 20 74  mparison of.** t
16aa0 68 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  he character str
16ab0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
16ac0 28 29 20 73 6f 72 74 73 20 74 68 65 20 6e 75 6d  () sorts the num
16ad0 62 65 72 73 20 69 6e 20 6e 75 6d 65 72 69 63 61  bers in numerica
16ae0 6c 0a 2a 2a 20 6f 72 64 65 72 2e 20 20 54 68 65  l.** order.  The
16af0 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
16b00 67 73 20 66 6f 72 20 6e 75 6d 62 65 72 73 20 61  gs for numbers a
16b10 72 65 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  re generated usi
16b20 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
16b30 52 65 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 29  RealToSortable()
16b40 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 20 74 65   function.  A te
16b50 78 74 20 66 69 65 6c 64 20 69 73 20 69 6e 74 72  xt field is intr
16b60 6f 64 75 63 65 64 20 62 79 20 61 0a 2a 2a 20 27  oduced by a.** '
16b70 63 27 20 63 68 61 72 61 63 74 65 72 20 61 6e 64  c' character and
16b80 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
16b90 74 68 65 20 65 78 61 63 74 20 74 65 78 74 20 6f  the exact text o
16ba0 66 20 74 68 65 20 66 69 65 6c 64 2e 20 20 54 68  f the field.  Th
16bb0 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 6e 20 27  e.** use of an '
16bc0 61 27 2c 20 27 62 27 2c 20 6f 72 20 27 63 27 20  a', 'b', or 'c' 
16bd0 63 68 61 72 61 63 74 65 72 20 61 74 20 74 68 65  character at the
16be0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 61   beginning of ea
16bf0 63 68 20 66 69 65 6c 64 0a 2a 2a 20 67 75 61 72  ch field.** guar
16c00 61 6e 74 65 65 73 20 74 68 61 74 20 4e 55 4c 4c  antees that NULL
16c10 20 73 6f 72 74 20 62 65 66 6f 72 65 20 6e 75 6d   sort before num
16c20 62 65 72 73 20 61 6e 64 20 74 68 61 74 20 6e 75  bers and that nu
16c30 6d 62 65 72 73 20 73 6f 72 74 0a 2a 2a 20 62 65  mbers sort.** be
16c40 66 6f 72 65 20 74 65 78 74 2e 20 20 30 78 30 30  fore text.  0x00
16c50 20 63 68 61 72 61 63 74 65 72 73 20 64 6f 20 6e   characters do n
16c60 6f 74 20 6f 63 63 75 72 20 65 78 63 65 70 74 20  ot occur except 
16c70 61 73 20 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a  as separators.**
16c80 20 62 65 74 77 65 65 6e 20 66 69 65 6c 64 73 2e   between fields.
16c90 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
16ca0 20 4d 61 6b 65 49 64 78 4b 65 79 2c 20 53 6f 72   MakeIdxKey, Sor
16cb0 74 4d 61 6b 65 4b 65 79 0a 2a 2f 0a 2f 2a 20 4f  tMakeKey.*/./* O
16cc0 70 63 6f 64 65 3a 20 4d 61 6b 65 49 64 78 4b 65  pcode: MakeIdxKe
16cd0 79 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a  y P1 P2 P3.**.**
16ce0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 74 6f 70   Convert the top
16cf0 20 50 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74   P1 entries of t
16d00 68 65 20 73 74 61 63 6b 20 69 6e 74 6f 20 61 20  he stack into a 
16d10 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 73 75 69  single entry sui
16d20 74 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 75 73 65  table.** for use
16d30 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 61   as the key in a
16d40 6e 20 69 6e 64 65 78 2e 20 20 49 6e 20 61 64 64  n index.  In add
16d50 69 74 69 6f 6e 2c 20 74 61 6b 65 20 6f 6e 65 20  ition, take one 
16d60 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
16d70 65 72 0a 2a 2a 20 6f 66 66 20 6f 66 20 74 68 65  er.** off of the
16d80 20 73 74 61 63 6b 2c 20 74 72 65 61 74 20 74 68   stack, treat th
16d90 61 74 20 69 6e 74 65 67 65 72 20 61 73 20 61 20  at integer as a 
16da0 66 6f 75 72 2d 62 79 74 65 20 72 65 63 6f 72 64  four-byte record
16db0 20 6e 75 6d 62 65 72 2c 20 61 6e 64 0a 2a 2a 20   number, and.** 
16dc0 61 70 70 65 6e 64 20 74 68 65 20 66 6f 75 72 20  append the four 
16dd0 62 79 74 65 73 20 74 6f 20 74 68 65 20 6b 65 79  bytes to the key
16de0 2e 20 20 54 68 75 73 20 61 20 74 6f 74 61 6c 20  .  Thus a total 
16df0 6f 66 20 50 31 2b 31 20 65 6e 74 72 69 65 73 20  of P1+1 entries 
16e00 61 72 65 0a 2a 2a 20 70 6f 70 70 65 64 20 66 72  are.** popped fr
16e10 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  om the stack for
16e20 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
16e30 6e 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 65  n and a single e
16e40 6e 74 72 79 20 69 73 20 70 75 73 68 65 64 0a 2a  ntry is pushed.*
16e50 2a 20 62 61 63 6b 2e 20 20 54 68 65 20 66 69 72  * back.  The fir
16e60 73 74 20 50 31 20 65 6e 74 72 69 65 73 20 74 68  st P1 entries th
16e70 61 74 20 61 72 65 20 70 6f 70 70 65 64 20 61 72  at are popped ar
16e80 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 74 68  e strings and th
16e90 65 20 6c 61 73 74 0a 2a 2a 20 65 6e 74 72 79 20  e last.** entry 
16ea0 28 74 68 65 20 6c 6f 77 65 73 74 20 6f 6e 20 74  (the lowest on t
16eb0 68 65 20 73 74 61 63 6b 29 20 69 73 20 61 6e 20  he stack) is an 
16ec0 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e  integer record n
16ed0 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  umber..**.** The
16ee0 20 63 6f 6e 76 65 72 73 74 69 6f 6e 20 6f 66 20   converstion of 
16ef0 74 68 65 20 66 69 72 73 74 20 50 31 20 73 74 72  the first P1 str
16f00 69 6e 67 20 65 6e 74 72 69 65 73 20 6f 63 63 75  ing entries occu
16f10 72 73 20 6a 75 73 74 20 6c 69 6b 65 20 69 6e 0a  rs just like in.
16f20 2a 2a 20 4d 61 6b 65 4b 65 79 2e 20 20 45 61 63  ** MakeKey.  Eac
16f30 68 20 65 6e 74 72 79 20 69 73 20 73 65 70 61 72  h entry is separ
16f40 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
16f50 68 65 72 73 20 62 79 20 61 20 6e 75 6c 6c 2e 0a  hers by a null..
16f60 2a 2a 20 54 68 65 20 65 6e 74 69 72 65 20 63 6f  ** The entire co
16f70 6e 63 61 74 65 6e 61 74 69 6f 6e 20 69 73 20 6e  ncatenation is n
16f80 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ull-terminated. 
16f90 20 54 68 65 20 6c 6f 77 65 73 74 20 65 6e 74 72   The lowest entr
16fa0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 73 74 61 63  y.** in the stac
16fb0 6b 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  k is the first f
16fc0 69 65 6c 64 20 61 6e 64 20 74 68 65 20 74 6f 70  ield and the top
16fd0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 62 65   of the stack be
16fe0 63 6f 6d 65 73 20 74 68 65 0a 2a 2a 20 6c 61 73  comes the.** las
16ff0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69  t..**.** If P2 i
17000 73 20 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 6f  s not zero and o
17010 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
17020 65 20 50 31 20 65 6e 74 72 69 65 73 20 74 68 61  e P1 entries tha
17030 74 20 67 6f 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  t go into the.**
17040 20 67 65 6e 65 72 61 74 65 64 20 6b 65 79 20 69   generated key i
17050 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 6d  s NULL, then jum
17060 70 20 74 6f 20 50 32 20 61 66 74 65 72 20 74 68  p to P2 after th
17070 65 20 6e 65 77 20 6b 65 79 20 68 61 73 20 62 65  e new key has be
17080 65 6e 0a 2a 2a 20 70 75 73 68 65 64 20 6f 6e 20  en.** pushed on 
17090 74 68 65 20 73 74 61 63 6b 2e 20 20 49 6e 20 6f  the stack.  In o
170a0 74 68 65 72 20 77 6f 72 64 73 2c 20 6a 75 6d 70  ther words, jump
170b0 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 6b 65   to P2 if the ke
170c0 79 20 69 73 0a 2a 2a 20 67 75 61 72 61 6e 74 65  y is.** guarante
170d0 65 64 20 74 6f 20 62 65 20 75 6e 69 71 75 65 2e  ed to be unique.
170e0 20 20 54 68 69 73 20 6a 75 6d 70 20 63 61 6e 20    This jump can 
170f0 62 65 20 75 73 65 64 20 74 6f 20 73 6b 69 70 20  be used to skip 
17100 61 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  a subsequent.** 
17110 75 6e 69 71 75 65 6e 65 73 73 20 74 65 73 74 2e  uniqueness test.
17120 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 61 20 73  .**.** P3 is a s
17130 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 31  tring that is P1
17140 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
17150 2e 20 20 45 61 63 68 20 63 68 61 72 61 63 74 65  .  Each characte
17160 72 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 61  r is either.** a
17170 6e 20 27 6e 27 20 6f 72 20 61 20 27 74 27 20 74  n 'n' or a 't' t
17180 6f 20 69 6e 64 69 63 61 74 65 73 20 69 66 20 74  o indicates if t
17190 68 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  he argument shou
171a0 6c 64 20 62 65 20 6e 75 6d 65 72 69 63 20 6f 72  ld be numeric or
171b0 0a 2a 2a 20 74 65 78 74 2e 20 20 54 68 65 20 66  .** text.  The f
171c0 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 63  irst character c
171d0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
171e0 65 20 6c 6f 77 65 73 74 20 65 6c 65 6d 65 6e 74  e lowest element
171f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   on the.** stack
17200 2e 20 20 49 66 20 50 33 20 69 73 20 6e 75 6c 6c  .  If P3 is null
17210 20 74 68 65 6e 20 61 6c 6c 20 61 72 67 75 6d 65   then all argume
17220 6e 74 73 20 61 72 65 20 61 73 73 75 6d 65 64 20  nts are assumed 
17230 74 6f 20 62 65 20 6e 75 6d 65 72 69 63 2e 0a 2a  to be numeric..*
17240 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 20  *.** See also:  
17250 4d 61 6b 65 4b 65 79 2c 20 53 6f 72 74 4d 61 6b  MakeKey, SortMak
17260 65 4b 65 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  eKey.*/.case OP_
17270 4d 61 6b 65 49 64 78 4b 65 79 3a 0a 63 61 73 65  MakeIdxKey:.case
17280 20 4f 50 5f 4d 61 6b 65 4b 65 79 3a 20 7b 0a 20   OP_MakeKey: {. 
17290 20 63 68 61 72 20 2a 7a 4e 65 77 4b 65 79 3b 0a   char *zNewKey;.
172a0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
172b0 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
172c0 20 61 64 64 52 6f 77 69 64 3b 0a 20 20 69 6e 74   addRowid;.  int
172d0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 63 6f 6e   i, j;.  int con
172e0 74 61 69 6e 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20  tainsNull = 0;. 
172f0 20 63 68 61 72 20 7a 54 65 6d 70 5b 4e 42 46 53   char zTemp[NBFS
17300 5d 3b 0a 0a 20 20 61 64 64 52 6f 77 69 64 20 3d  ];..  addRowid =
17310 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
17320 5f 4d 61 6b 65 49 64 78 4b 65 79 3b 0a 20 20 6e  _MakeIdxKey;.  n
17330 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b  Field = pOp->p1;
17340 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70  .  VERIFY( if( p
17350 2d 3e 74 6f 73 2b 31 2b 61 64 64 52 6f 77 69 64  ->tos+1+addRowid
17360 3c 6e 46 69 65 6c 64 20 29 20 67 6f 74 6f 20 6e  <nField ) goto n
17370 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b  ot_enough_stack;
17380 20 29 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a   ).  nByte = 0;.
17390 20 20 66 6f 72 28 6a 3d 30 2c 20 69 3d 70 2d 3e    for(j=0, i=p->
173a0 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c  tos-nField+1; i<
173b0 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 2c 20 6a 2b  =p->tos; i++, j+
173c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  +){.    int flag
173d0 73 20 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c  s = aStack[i].fl
173e0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ags;.    int len
173f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ;.    char *z;. 
17400 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
17410 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  TK_Null ){.     
17420 20 6e 42 79 74 65 20 2b 3d 20 32 3b 0a 20 20 20   nByte += 2;.   
17430 20 20 20 63 6f 6e 74 61 69 6e 73 4e 75 6c 6c 20     containsNull 
17440 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
17450 66 28 20 70 4f 70 2d 3e 70 33 20 26 26 20 70 4f  f( pOp->p3 && pO
17460 70 2d 3e 70 33 5b 6a 5d 3d 3d 27 74 27 20 29 7b  p->p3[j]=='t' ){
17470 0a 20 20 20 20 20 20 53 74 72 69 6e 67 69 66 79  .      Stringify
17480 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 61 53  (p, i);.      aS
17490 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 3d  tack[i].flags &=
174a0 20 7e 28 53 54 4b 5f 49 6e 74 7c 53 54 4b 5f 52   ~(STK_Int|STK_R
174b0 65 61 6c 29 3b 0a 20 20 20 20 20 20 6e 42 79 74  eal);.      nByt
174c0 65 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e  e += aStack[i].n
174d0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
174e0 28 20 28 66 6c 61 67 73 20 26 20 28 53 54 4b 5f  ( (flags & (STK_
174f0 52 65 61 6c 7c 53 54 4b 5f 49 6e 74 29 29 21 3d  Real|STK_Int))!=
17500 30 20 7c 7c 20 73 71 6c 69 74 65 49 73 4e 75 6d  0 || sqliteIsNum
17510 62 65 72 28 7a 53 74 61 63 6b 5b 69 5d 29 20 29  ber(zStack[i]) )
17520 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  {.      if( (fla
17530 67 73 20 26 20 28 53 54 4b 5f 52 65 61 6c 7c 53  gs & (STK_Real|S
17540 54 4b 5f 49 6e 74 29 29 3d 3d 53 54 4b 5f 49 6e  TK_Int))==STK_In
17550 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 74  t ){.        aSt
17560 61 63 6b 5b 69 5d 2e 72 20 3d 20 61 53 74 61 63  ack[i].r = aStac
17570 6b 5b 69 5d 2e 69 3b 0a 20 20 20 20 20 20 7d 65  k[i].i;.      }e
17580 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
17590 20 28 53 54 4b 5f 52 65 61 6c 7c 53 54 4b 5f 49   (STK_Real|STK_I
175a0 6e 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt))==0 ){.     
175b0 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e 72 20 3d     aStack[i].r =
175c0 20 61 74 6f 66 28 7a 53 74 61 63 6b 5b 69 5d 29   atof(zStack[i])
175d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
175e0 52 65 6c 65 61 73 65 28 70 2c 20 69 29 3b 0a 20  Release(p, i);. 
175f0 20 20 20 20 20 7a 20 3d 20 61 53 74 61 63 6b 5b       z = aStack[
17600 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69  i].z;.      sqli
17610 74 65 52 65 61 6c 54 6f 53 6f 72 74 61 62 6c 65  teRealToSortable
17620 28 61 53 74 61 63 6b 5b 69 5d 2e 72 2c 20 7a 29  (aStack[i].r, z)
17630 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74  ;.      len = st
17640 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20 7a  rlen(z);.      z
17650 53 74 61 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20  Stack[i] = 0;.  
17660 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c      aStack[i].fl
17670 61 67 73 20 3d 20 53 54 4b 5f 52 65 61 6c 3b 0a  ags = STK_Real;.
17680 20 20 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e        aStack[i].
17690 6e 20 3d 20 6c 65 6e 2b 31 3b 0a 20 20 20 20 20  n = len+1;.     
176a0 20 6e 42 79 74 65 20 2b 3d 20 61 53 74 61 63 6b   nByte += aStack
176b0 5b 69 5d 2e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c  [i].n+1;.    }el
176c0 73 65 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  se{.      nByte 
176d0 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 2b 31  += aStack[i].n+1
176e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
176f0 28 20 6e 42 79 74 65 2b 73 69 7a 65 6f 66 28 75  ( nByte+sizeof(u
17700 33 32 29 3e 4d 41 58 5f 42 59 54 45 53 5f 50 45  32)>MAX_BYTES_PE
17710 52 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20  R_ROW ){.    rc 
17720 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b  = SQLITE_TOOBIG;
17730 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
17740 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
17750 7d 0a 20 20 69 66 28 20 61 64 64 52 6f 77 69 64  }.  if( addRowid
17760 20 29 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65   ) nByte += size
17770 6f 66 28 75 33 32 29 3b 0a 20 20 69 66 28 20 6e  of(u32);.  if( n
17780 42 79 74 65 3c 3d 4e 42 46 53 20 29 7b 0a 20 20  Byte<=NBFS ){.  
17790 20 20 7a 4e 65 77 4b 65 79 20 3d 20 7a 54 65 6d    zNewKey = zTem
177a0 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
177b0 7a 4e 65 77 4b 65 79 20 3d 20 73 71 6c 69 74 65  zNewKey = sqlite
177c0 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65  MallocRaw( nByte
177d0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77   );.    if( zNew
177e0 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  Key==0 ) goto no
177f0 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20  _mem;.  }.  j = 
17800 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 74 6f  0;.  for(i=p->to
17810 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69 3c 3d 70  s-nField+1; i<=p
17820 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->tos; i++){.   
17830 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66   if( aStack[i].f
17840 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20  lags & STK_Null 
17850 29 7b 0a 20 20 20 20 20 20 7a 4e 65 77 4b 65 79  ){.      zNewKey
17860 5b 6a 2b 2b 5d 20 3d 20 27 61 27 3b 0a 20 20 20  [j++] = 'a';.   
17870 20 20 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20     zNewKey[j++] 
17880 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17890 20 20 20 20 20 20 69 66 28 20 61 53 74 61 63 6b        if( aStack
178a0 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 53 54 4b  [i].flags & (STK
178b0 5f 49 6e 74 7c 53 54 4b 5f 52 65 61 6c 29 20 29  _Int|STK_Real) )
178c0 7b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4b 65  {.        zNewKe
178d0 79 5b 6a 2b 2b 5d 20 3d 20 27 62 27 3b 0a 20 20  y[j++] = 'b';.  
178e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
178f0 20 20 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20     zNewKey[j++] 
17900 3d 20 27 63 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = 'c';.      }. 
17910 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4e 65       memcpy(&zNe
17920 77 4b 65 79 5b 6a 5d 2c 20 7a 53 74 61 63 6b 5b  wKey[j], zStack[
17930 69 5d 20 3f 20 7a 53 74 61 63 6b 5b 69 5d 20 3a  i] ? zStack[i] :
17940 20 61 53 74 61 63 6b 5b 69 5d 2e 7a 2c 20 61 53   aStack[i].z, aS
17950 74 61 63 6b 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20  tack[i].n);.    
17960 20 20 6a 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d    j += aStack[i]
17970 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  .n;.    }.  }.  
17980 69 66 28 20 61 64 64 52 6f 77 69 64 20 29 7b 0a  if( addRowid ){.
17990 20 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20      u32 iKey;.  
179a0 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20    Integerify(p, 
179b0 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 29 3b 0a  p->tos-nField);.
179c0 20 20 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f      iKey = intTo
179d0 4b 65 79 28 61 53 74 61 63 6b 5b 70 2d 3e 74 6f  Key(aStack[p->to
179e0 73 2d 6e 46 69 65 6c 64 5d 2e 69 29 3b 0a 20 20  s-nField].i);.  
179f0 20 20 6d 65 6d 63 70 79 28 26 7a 4e 65 77 4b 65    memcpy(&zNewKe
17a00 79 5b 6a 5d 2c 20 26 69 4b 65 79 2c 20 73 69 7a  y[j], &iKey, siz
17a10 65 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 50  eof(u32));.    P
17a20 6f 70 53 74 61 63 6b 28 70 2c 20 6e 46 69 65 6c  opStack(p, nFiel
17a30 64 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  d+1);.    if( pO
17a40 70 2d 3e 70 32 20 26 26 20 63 6f 6e 74 61 69 6e  p->p2 && contain
17a50 73 4e 75 6c 6c 20 29 20 70 63 20 3d 20 70 4f 70  sNull ) pc = pOp
17a60 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  ->p2 - 1;.  }els
17a70 65 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e{.    if( pOp->
17a80 70 32 3d 3d 30 20 29 20 50 6f 70 53 74 61 63 6b  p2==0 ) PopStack
17a90 28 70 2c 20 6e 46 69 65 6c 64 2b 61 64 64 52 6f  (p, nField+addRo
17aa0 77 69 64 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 74  wid);.  }.  p->t
17ab0 6f 73 2b 2b 3b 0a 20 20 61 53 74 61 63 6b 5b 70  os++;.  aStack[p
17ac0 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 6e 42 79 74 65  ->tos].n = nByte
17ad0 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 4e  ;.  if( nByte<=N
17ae0 42 46 53 20 29 7b 0a 20 20 20 20 61 73 73 65 72  BFS ){.    asser
17af0 74 28 20 7a 4e 65 77 4b 65 79 3d 3d 7a 54 65 6d  t( zNewKey==zTem
17b00 70 20 29 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b  p );.    zStack[
17b10 70 2d 3e 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b  p->tos] = aStack
17b20 5b 70 2d 3e 74 6f 73 5d 2e 7a 3b 0a 20 20 20 20  [p->tos].z;.    
17b30 6d 65 6d 63 70 79 28 7a 53 74 61 63 6b 5b 70 2d  memcpy(zStack[p-
17b40 3e 74 6f 73 5d 2c 20 7a 54 65 6d 70 2c 20 6e 42  >tos], zTemp, nB
17b50 79 74 65 29 3b 0a 20 20 20 20 61 53 74 61 63 6b  yte);.    aStack
17b60 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  [p->tos].flags =
17b70 20 53 54 4b 5f 53 74 72 3b 0a 20 20 7d 65 6c 73   STK_Str;.  }els
17b80 65 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 70 2d  e{.    aStack[p-
17b90 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  >tos].flags = ST
17ba0 4b 5f 53 74 72 7c 53 54 4b 5f 44 79 6e 3b 0a 20  K_Str|STK_Dyn;. 
17bb0 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73     zStack[p->tos
17bc0 5d 20 3d 20 7a 4e 65 77 4b 65 79 3b 0a 20 20 7d  ] = zNewKey;.  }
17bd0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
17be0 4f 70 63 6f 64 65 3a 20 49 6e 63 72 4b 65 79 20  Opcode: IncrKey 
17bf0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
17c00 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
17c10 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20   should contain 
17c20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 67 65 6e  an index key gen
17c30 65 72 61 74 65 64 20 62 79 0a 2a 2a 20 54 68 65  erated by.** The
17c40 20 4d 61 6b 65 4b 65 79 20 6f 70 63 6f 64 65 2e   MakeKey opcode.
17c50 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
17c60 6e 63 72 65 61 73 65 73 20 74 68 65 20 6c 65 61  ncreases the lea
17c70 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a  st significant.*
17c80 2a 20 62 79 74 65 20 6f 66 20 74 68 61 74 20 6b  * byte of that k
17c90 65 79 20 62 79 20 6f 6e 65 2e 20 20 54 68 69 73  ey by one.  This
17ca0 20 69 73 20 75 73 65 64 20 73 6f 20 74 68 61 74   is used so that
17cb0 20 74 68 65 20 4d 6f 76 65 54 6f 20 6f 70 63 6f   the MoveTo opco
17cc0 64 65 0a 2a 2a 20 77 69 6c 6c 20 6d 6f 76 65 20  de.** will move 
17cd0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
17ce0 72 79 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ry greater than 
17cf0 74 68 65 20 6b 65 79 20 72 61 74 68 65 72 20 74  the key rather t
17d00 68 61 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 6b 65  han to.** the ke
17d10 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 63 61 73  y itself..*/.cas
17d20 65 20 4f 50 5f 49 6e 63 72 4b 65 79 3a 20 7b 0a  e OP_IncrKey: {.
17d30 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
17d40 6f 73 3b 0a 0a 20 20 56 45 52 49 46 59 28 20 69  os;..  VERIFY( i
17d50 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20  f( tos<0 ) goto 
17d60 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 20  bad_instruction 
17d70 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70  );.  Stringify(p
17d80 2c 20 74 6f 73 29 3b 0a 20 20 69 66 28 20 61 53  , tos);.  if( aS
17d90 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
17da0 26 20 28 53 54 4b 5f 53 74 61 74 69 63 7c 53 54  & (STK_Static|ST
17db0 4b 5f 45 70 68 65 6d 29 20 29 7b 0a 20 20 20 20  K_Ephem) ){.    
17dc0 2f 2a 20 43 41 4e 54 20 48 41 50 50 45 4e 2e 20  /* CANT HAPPEN. 
17dd0 20 54 68 65 20 49 6e 63 72 4b 65 79 20 6f 70 63   The IncrKey opc
17de0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 61 70 70 6c  ode is only appl
17df0 69 65 64 20 74 6f 20 6b 65 79 73 0a 20 20 20 20  ied to keys.    
17e00 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ** generated by 
17e10 4d 61 6b 65 4b 65 79 20 6f 72 20 4d 61 6b 65 49  MakeKey or MakeI
17e20 64 78 4b 65 79 20 61 6e 64 20 74 68 65 20 72 65  dxKey and the re
17e30 73 75 6c 74 73 20 6f 66 20 74 68 6f 73 65 0a 20  sults of those. 
17e40 20 20 20 2a 2a 20 6f 70 65 72 61 6e 64 73 20 61     ** operands a
17e50 72 65 20 61 6c 77 61 79 73 20 64 79 6e 61 6d 69  re always dynami
17e60 63 20 73 74 72 69 6e 67 73 2e 0a 20 20 20 20 2a  c strings..    *
17e70 2f 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  /.    goto abort
17e80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
17e90 20 7d 0a 20 20 7a 53 74 61 63 6b 5b 74 6f 73 5d   }.  zStack[tos]
17ea0 5b 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2d 31  [aStack[tos].n-1
17eb0 5d 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ]++;.  break;.}.
17ec0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65 63  ./* Opcode: Chec
17ed0 6b 70 6f 69 6e 74 20 50 31 20 2a 20 2a 0a 2a 2a  kpoint P1 * *.**
17ee0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 63 68 65 63  .** Begin a chec
17ef0 6b 70 6f 69 6e 74 2e 20 20 41 20 63 68 65 63 6b  kpoint.  A check
17f00 70 6f 69 6e 74 20 69 73 20 74 68 65 20 62 65 67  point is the beg
17f10 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6f 70 65 72  inning of a oper
17f20 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73  ation that.** is
17f30 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
17f40 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  r transaction bu
17f50 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6e 65  t which might ne
17f60 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
17f70 62 61 63 6b 0a 2a 2a 20 69 74 73 65 6c 66 20 77  back.** itself w
17f80 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
17f90 20 74 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20   the containing 
17fa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
17fb0 63 68 65 63 6b 70 6f 69 6e 74 20 77 69 6c 6c 0a  checkpoint will.
17fc0 2a 2a 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ** be automatica
17fd0 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72  lly committed or
17fe0 20 72 6f 6c 6c 62 61 63 6b 20 77 68 65 6e 20 74   rollback when t
17ff0 68 65 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a  he VDBE halts..*
18000 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 70 6f  *.** The checkpo
18010 69 6e 74 20 69 73 20 62 65 67 75 6e 20 6f 6e 20  int is begun on 
18020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18030 65 20 77 69 74 68 20 69 6e 64 65 78 20 50 31 2e  e with index P1.
18040 20 20 54 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61    The main.** da
18050 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
18060 61 6e 20 69 6e 64 65 78 20 6f 66 20 30 20 61 6e  an index of 0 an
18070 64 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20  d the file used 
18080 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
18090 62 6c 65 73 0a 2a 2a 20 68 61 73 20 61 6e 20 69  bles.** has an i
180a0 6e 64 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 63 61  ndex of 1..*/.ca
180b0 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
180c0 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f  : {.  int i = pO
180d0 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 69 3e 3d  p->p1;.  if( i>=
180e0 30 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 20 26  0 && i<db->nDb &
180f0 26 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  & db->aDb[i].pBt
18100 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69   && db->aDb[i].i
18110 6e 54 72 61 6e 73 3d 3d 31 20 29 7b 0a 20 20 20  nTrans==1 ){.   
18120 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
18130 65 42 65 67 69 6e 43 6b 70 74 28 64 62 2d 3e 61  eBeginCkpt(db->a
18140 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
18150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18160 4b 20 29 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69  K ) db->aDb[i].i
18170 6e 54 72 61 6e 73 20 3d 20 32 3b 0a 20 20 7d 0a  nTrans = 2;.  }.
18180 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
18190 70 63 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69  pcode: Transacti
181a0 6f 6e 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  on P1 * *.**.** 
181b0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
181c0 69 6f 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61  ion.  The transa
181d0 63 74 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20  ction ends when 
181e0 61 20 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c  a Commit or Roll
181f0 62 61 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69  back.** opcode i
18200 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20  s encountered.  
18210 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  Depending on the
18220 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74   ON CONFLICT set
18230 74 69 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61  ting, the.** tra
18240 6e 73 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61  nsaction might a
18250 6c 73 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  lso be rolled ba
18260 63 6b 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ck if an error i
18270 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
18280 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
18290 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
182a0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69  base file on whi
182b0 63 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ch the transacti
182c0 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64  on is.** started
182d0 2e 20 20 49 6e 64 65 78 20 30 20 69 73 20 74 68  .  Index 0 is th
182e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
182f0 66 69 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31  file and index 1
18300 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   is the.** file 
18310 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
18320 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
18330 20 41 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 73   A write lock is
18340 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
18350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18360 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
18370 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e  n is.** started.
18380 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65    No other proce
18390 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
183a0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 77 68  rite the file wh
183b0 69 6c 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ile the.** trans
183c0 61 63 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 77  action is underw
183d0 61 79 2e 20 20 53 74 61 72 74 69 6e 67 20 61 20  ay.  Starting a 
183e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 73 6f  transaction also
183f0 20 63 72 65 61 74 65 73 20 61 0a 2a 2a 20 72 6f   creates a.** ro
18400 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
18410 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
18420 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
18430 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
18440 73 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 61 64 65  s.** can be made
18450 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18460 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61  ..*/.case OP_Tra
18470 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e  nsaction: {.  in
18480 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 69 6e  t busy = 1;.  in
18490 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
184a0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
184b0 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20   i<db->nDb );.  
184c0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69  if( db->aDb[i].i
184d0 6e 54 72 61 6e 73 20 29 20 62 72 65 61 6b 3b 0a  nTrans ) break;.
184e0 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 61 44 62    while( db->aDb
184f0 5b 69 5d 2e 70 42 74 21 3d 30 20 26 26 20 62 75  [i].pBt!=0 && bu
18500 73 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  sy ){.    rc = s
18510 71 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54  qliteBtreeBeginT
18520 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  rans(db->aDb[i].
18530 70 42 74 29 3b 0a 20 20 20 20 73 77 69 74 63 68  pBt);.    switch
18540 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
18550 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
18560 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
18570 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b 3d  ->xBusyCallback=
18580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18590 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  p->pc = pc;.    
185a0 20 20 20 20 20 20 70 2d 3e 75 6e 64 6f 54 72 61        p->undoTra
185b0 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 31 3b 0a 20  nsOnError = 1;. 
185c0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
185d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
185e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
185f0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
18600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a      }else if( (*
18610 64 62 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63  db->xBusyCallbac
18620 6b 29 28 64 62 2d 3e 70 42 75 73 79 41 72 67 2c  k)(db->pBusyArg,
18630 20 22 22 2c 20 62 75 73 79 2b 2b 29 3d 3d 30 20   "", busy++)==0 
18640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
18650 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d  iteSetString(&p-
18660 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  >zErrMsg, sqlite
18670 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 63  _error_string(rc
18680 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ), 0);.         
18690 20 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20   busy = 0;.     
186a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
186b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
186c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
186d0 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20  ADONLY: {.      
186e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
186f0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  ;.        /* Fal
18700 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
18710 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
18720 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
18730 53 51 4c 49 54 45 5f 4f 4b 3a 20 7b 0a 20 20 20  SQLITE_OK: {.   
18740 20 20 20 20 20 70 2d 3e 69 6e 54 65 6d 70 54 72       p->inTempTr
18750 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ans = 0;.       
18760 20 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20   busy = 0;.     
18770 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18780 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
18790 20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   {.        goto 
187a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
187b0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
187c0 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  }.  }.  db->aDb[
187d0 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a  i].inTrans = 1;.
187e0 20 20 70 2d 3e 75 6e 64 6f 54 72 61 6e 73 4f 6e    p->undoTransOn
187f0 45 72 72 6f 72 20 3d 20 31 3b 0a 20 20 62 72 65  Error = 1;.  bre
18800 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
18810 3a 20 43 6f 6d 6d 69 74 20 2a 20 2a 20 2a 0a 2a  : Commit * * *.*
18820 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6c 6c 20 6d  *.** Cause all m
18830 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
18840 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
18850 74 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  t have been made
18860 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 6c 61   since the.** la
18870 73 74 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 74  st Transaction t
18880 6f 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20  o actually take 
18890 65 66 66 65 63 74 2e 20 20 4e 6f 20 61 64 64 69  effect.  No addi
188a0 74 69 6f 6e 61 6c 20 6d 6f 64 69 66 69 63 61 74  tional modificat
188b0 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f  ions.** are allo
188c0 77 65 64 20 75 6e 74 69 6c 20 61 6e 6f 74 68 65  wed until anothe
188d0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  r transaction is
188e0 20 73 74 61 72 74 65 64 2e 20 20 54 68 65 20 43   started.  The C
188f0 6f 6d 6d 69 74 20 69 6e 73 74 72 75 63 74 69 6f  ommit instructio
18900 6e 0a 2a 2a 20 64 65 6c 65 74 65 73 20 74 68 65  n.** deletes the
18910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
18920 64 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 77  d releases the w
18930 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
18940 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 41 20   database..** A 
18950 72 65 61 64 20 6c 6f 63 6b 20 63 6f 6e 74 69 6e  read lock contin
18960 75 65 73 20 74 6f 20 62 65 20 68 65 6c 64 20 69  ues to be held i
18970 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
18980 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 2e 0a  l cursors open..
18990 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 6d 69  */.case OP_Commi
189a0 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t: {.  int i;.  
189b0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
189c0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
189d0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
189e0 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e  f( db->aDb[i].in
189f0 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
18a00 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 43  c = sqliteBtreeC
18a10 6f 6d 6d 69 74 28 64 62 2d 3e 61 44 62 5b 69 5d  ommit(db->aDb[i]
18a20 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d  .pBt);.      db-
18a30 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20  >aDb[i].inTrans 
18a40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
18a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18a60 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
18a70 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
18a80 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 65 6c  anges(db);.  }el
18a90 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 6f  se{.    sqliteRo
18aa0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
18ab0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
18ac0 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 6c 6c 62 61  * Opcode: Rollba
18ad0 63 6b 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  ck P1 * *.**.** 
18ae0 43 61 75 73 65 20 61 6c 6c 20 6d 6f 64 69 66 69  Cause all modifi
18af0 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 64  cations to the d
18b00 61 74 61 62 61 73 65 20 74 68 61 74 20 68 61 76  atabase that hav
18b10 65 20 62 65 65 6e 20 6d 61 64 65 20 73 69 6e 63  e been made sinc
18b20 65 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 54 72  e the.** last Tr
18b30 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 62 65 20  ansaction to be 
18b40 75 6e 64 6f 6e 65 2e 20 54 68 65 20 64 61 74 61  undone. The data
18b50 62 61 73 65 20 69 73 20 72 65 73 74 6f 72 65 64  base is restored
18b60 20 74 6f 20 69 74 73 20 73 74 61 74 65 0a 2a 2a   to its state.**
18b70 20 62 65 66 6f 72 65 20 74 68 65 20 54 72 61 6e   before the Tran
18b80 73 61 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 77  saction opcode w
18b90 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 4e 6f  as executed.  No
18ba0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6d 6f 64 69   additional modi
18bb0 66 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  fications.** are
18bc0 20 61 6c 6c 6f 77 65 64 20 75 6e 74 69 6c 20 61   allowed until a
18bd0 6e 6f 74 68 65 72 20 74 72 61 6e 73 61 63 74 69  nother transacti
18be0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e 0a 2a  on is started..*
18bf0 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
18c00 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
18c10 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 69  base file that i
18c20 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 41 6e  s committed.  An
18c30 20 69 6e 64 65 78 20 6f 66 20 30 0a 2a 2a 20 69   index of 0.** i
18c40 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d  s used for the m
18c50 61 69 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  ain database and
18c60 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 31 20 69   an index of 1 i
18c70 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 66  s used for the f
18c80 69 6c 65 20 75 73 65 64 0a 2a 2a 20 74 6f 20 68  ile used.** to h
18c90 6f 6c 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61  old temporary ta
18ca0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
18cb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 75 74   instruction aut
18cc0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
18cd0 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 6e  s all cursors an
18ce0 64 20 72 65 6c 65 61 73 65 73 20 62 6f 74 68 0a  d releases both.
18cf0 2a 2a 20 74 68 65 20 72 65 61 64 20 61 6e 64 20  ** the read and 
18d00 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  write locks on t
18d10 68 65 20 69 6e 64 69 63 61 74 65 64 20 64 61 74  he indicated dat
18d20 61 62 61 73 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  abase..*/.case O
18d30 50 5f 52 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  P_Rollback: {.  
18d40 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 41 6c  sqliteRollbackAl
18d50 6c 28 64 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  l(db);.  break;.
18d60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
18d70 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 2a  adCookie P1 P2 *
18d80 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b  .**.** Read cook
18d90 69 65 20 6e 75 6d 62 65 72 20 50 32 20 66 72 6f  ie number P2 fro
18da0 6d 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e  m database P1 an
18db0 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74  d push it onto t
18dc0 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 50 32 3d  he stack..** P2=
18dd0 3d 30 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =0 is the schema
18de0 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 31   version.  P2==1
18df0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
18e00 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d   format..** P2==
18e10 32 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  2 is the recomme
18e20 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
18e30 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f   size, and so fo
18e40 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a  rth.  P1==0 is.*
18e50 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
18e60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
18e70 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =1 is the databa
18e80 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
18e90 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
18ea0 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
18eb0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
18ec0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
18ed0 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  e database (eith
18ee0 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  er a transaction
18ef0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61 72  .** must be star
18f00 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75 73  ted or there mus
18f10 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
18f20 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65  sor) before.** e
18f30 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69 6e  xecuting this in
18f40 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
18f50 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  se OP_ReadCookie
18f60 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2b 2b  : {.  int i = ++
18f70 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 61 4d  p->tos;.  int aM
18f80 65 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52  eta[SQLITE_N_BTR
18f90 45 45 5f 4d 45 54 41 5d 3b 0a 20 20 61 73 73 65  EE_META];.  asse
18fa0 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49  rt( pOp->p2<SQLI
18fb0 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20  TE_N_BTREE_META 
18fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
18fd0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
18fe0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
18ff0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
19000 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 21 3d 30 20  pOp->p1].pBt!=0 
19010 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19020 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d  BtreeGetMeta(db-
19030 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
19040 74 2c 20 61 4d 65 74 61 29 3b 0a 20 20 61 53 74  t, aMeta);.  aSt
19050 61 63 6b 5b 69 5d 2e 69 20 3d 20 61 4d 65 74 61  ack[i].i = aMeta
19060 5b 31 2b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  [1+pOp->p2];.  a
19070 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d  Stack[i].flags =
19080 20 53 54 4b 5f 49 6e 74 3b 0a 20 20 62 72 65 61   STK_Int;.  brea
19090 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
190a0 20 53 65 74 43 6f 6f 6b 69 65 20 50 31 20 50 32   SetCookie P1 P2
190b0 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
190c0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
190d0 61 63 6b 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20  ack into cookie 
190e0 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
190f0 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d  abase P1..** P2=
19100 3d 30 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =0 is the schema
19110 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 31   version.  P2==1
19120 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
19130 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d   format..** P2==
19140 32 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  2 is the recomme
19150 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
19160 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f   size, and so fo
19170 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a  rth.  P1==0 is.*
19180 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
19190 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
191a0 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =1 is the databa
191b0 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
191c0 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
191d0 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
191e0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
191f0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
19200 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20  efore executing 
19210 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  this opcode..*/.
19220 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  case OP_SetCooki
19230 65 3a 20 7b 0a 20 20 69 6e 74 20 61 4d 65 74 61  e: {.  int aMeta
19240 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  [SQLITE_N_BTREE_
19250 4d 45 54 41 5d 3b 0a 20 20 61 73 73 65 72 74 28  META];.  assert(
19260 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45 5f   pOp->p2<SQLITE_
19270 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
19280 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
19290 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
192a0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
192b0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70  ert( db->aDb[pOp
192c0 2d 3e 70 31 5d 2e 70 42 74 21 3d 30 20 29 3b 0a  ->p1].pBt!=0 );.
192d0 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70 2d    VERIFY( if( p-
192e0 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f  >tos<0 ) goto no
192f0 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20  t_enough_stack; 
19300 29 0a 20 20 49 6e 74 65 67 65 72 69 66 79 28 70  ).  Integerify(p
19310 2c 20 70 2d 3e 74 6f 73 29 0a 20 20 72 63 20 3d  , p->tos).  rc =
19320 20 73 71 6c 69 74 65 42 74 72 65 65 47 65 74 4d   sqliteBtreeGetM
19330 65 74 61 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  eta(db->aDb[pOp-
19340 3e 70 31 5d 2e 70 42 74 2c 20 61 4d 65 74 61 29  >p1].pBt, aMeta)
19350 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 4d 65  TE_OK ){.    aMe
19370 74 61 5b 31 2b 70 4f 70 2d 3e 70 32 5d 20 3d 20  ta[1+pOp->p2] = 
19380 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69  aStack[p->tos].i
19390 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
193a0 65 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  eBtreeUpdateMeta
193b0 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  (db->aDb[pOp->p1
193c0 5d 2e 70 42 74 2c 20 61 4d 65 74 61 29 3b 0a 20  ].pBt, aMeta);. 
193d0 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20   }.  POPSTACK;. 
193e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
193f0 63 6f 64 65 3a 20 56 65 72 69 66 79 43 6f 6f 6b  code: VerifyCook
19400 69 65 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a  ie P1 P2 *.**.**
19410 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
19420 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74 61 62   of global datab
19430 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75  ase parameter nu
19440 6d 62 65 72 20 30 20 28 74 68 65 0a 2a 2a 20 73  mber 0 (the.** s
19450 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 61  chema version) a
19460 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  nd make sure it 
19470 69 73 20 65 71 75 61 6c 20 74 6f 20 50 32 2e 20  is equal to P2. 
19480 20 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 64   .** P1 is the d
19490 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 77  atabase number w
194a0 68 69 63 68 20 69 73 20 30 20 66 6f 72 20 74 68  hich is 0 for th
194b0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
194c0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31 20 66 6f  file.** and 1 fo
194d0 72 20 74 68 65 20 66 69 6c 65 20 68 6f 6c 64 69  r the file holdi
194e0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
194f0 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20 68 69 67  les and some hig
19500 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 66 6f  her number.** fo
19510 72 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  r auxiliary data
19520 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bases..**.** The
19530 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 20   cookie changes 
19540 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65 76  its value whenev
19550 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
19560 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
19570 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
19580 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  n is used to det
19590 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74 68  ect when that th
195a0 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68 61  e cookie has cha
195b0 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61 74  nged.** and that
195c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
195d0 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72 65  cess needs to re
195e0 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 2e  read the schema.
195f0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61 20  .**.** Either a 
19600 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
19610 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 73  s to have been s
19620 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f 50 5f  tarted or an OP_
19630 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74 6f  Open needs.** to
19640 20 62 65 20 65 78 65 63 75 74 65 64 20 28 74 6f   be executed (to
19650 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65 61   establish a rea
19660 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20 74  d lock) before t
19670 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a  his opcode is.**
19680 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61 73   invoked..*/.cas
19690 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  e OP_VerifyCooki
196a0 65 3a 20 7b 0a 20 20 69 6e 74 20 61 4d 65 74 61  e: {.  int aMeta
196b0 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  [SQLITE_N_BTREE_
196c0 4d 45 54 41 5d 3b 0a 20 20 61 73 73 65 72 74 28  META];.  assert(
196d0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
196e0 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
196f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42  ;.  rc = sqliteB
19700 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e  treeGetMeta(db->
19710 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74  aDb[pOp->p1].pBt
19720 2c 20 61 4d 65 74 61 29 3b 0a 20 20 69 66 28 20  , aMeta);.  if( 
19730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19740 20 61 4d 65 74 61 5b 31 5d 21 3d 70 4f 70 2d 3e   aMeta[1]!=pOp->
19750 70 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p2 ){.    sqlite
19760 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
19770 72 72 4d 73 67 2c 20 22 64 61 74 61 62 61 73 65  rrMsg, "database
19780 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
19790 67 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63  ged", 0);.    rc
197a0 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41   = SQLITE_SCHEMA
197b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
197c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
197d0 6e 52 65 61 64 20 50 31 20 50 32 20 50 33 0a 2a  nRead P1 P2 P3.*
197e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
197f0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72  -only cursor for
19800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
19810 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
19820 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20  age is.** P2 in 
19830 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
19840 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
19850 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ile is determine
19860 64 20 62 79 20 61 6e 20 0a 2a 2a 20 69 6e 74 65  d by an .** inte
19870 67 65 72 20 66 72 6f 6d 20 74 68 65 20 74 6f 70  ger from the top
19880 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
19890 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  0 means the main
198a0 20 64 61 74 61 62 61 73 65 20 61 6e 64 0a 2a 2a   database and.**
198b0 20 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74   1 means the dat
198c0 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 74  abase used for t
198d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
198e0 20 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 0a    Give the new .
198f0 2a 2a 20 63 75 72 73 6f 72 20 61 6e 20 69 64 65  ** cursor an ide
19900 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20 20  ntifier of P1.  
19910 54 68 65 20 50 31 20 76 61 6c 75 65 73 20 6e 65  The P1 values ne
19920 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67  ed not be contig
19930 75 6f 75 73 0a 2a 2a 20 62 75 74 20 61 6c 6c 20  uous.** but all 
19940 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c 64  P1 values should
19950 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65   be small intege
19960 72 73 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  rs.  It is an er
19970 72 6f 72 20 66 6f 72 0a 2a 2a 20 50 31 20 74 6f  ror for.** P1 to
19980 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   be negative..**
19990 0a 2a 2a 20 49 66 20 50 32 3d 3d 30 20 74 68 65  .** If P2==0 the
199a0 6e 20 74 61 6b 65 20 74 68 65 20 72 6f 6f 74 20  n take the root 
199b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  page number from
199c0 20 74 68 65 20 6e 65 78 74 20 6f 66 20 74 68 65   the next of the
199d0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
199e0 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20 72 65  ere will be a re
199f0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
19a00 61 74 61 62 61 73 65 20 77 68 65 6e 65 76 65 72  atabase whenever
19a10 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
19a20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20 49 66  open cursor.  If
19a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
19a40 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69 6f 72  s unlocked prior
19a50 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72 75 63   to this instruc
19a60 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61 20 72  tion.** then a r
19a70 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63 71 75  ead lock is acqu
19a80 69 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ired as part of 
19a90 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
19aa0 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c 6f 63  .  A read.** loc
19ab0 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70  k allows other p
19ac0 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65 61 64  rocesses to read
19ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
19ae0 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a 20 61  t prohibits.** a
19af0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
19b00 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e 67 20   from modifying 
19b10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
19b20 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 0a  he read lock is.
19b30 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65 6e  ** released when
19b40 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
19b50 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74 68 69   closed.  If thi
19b60 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  s instruction at
19b70 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67 65 74  tempts.** to get
19b80 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62 75 74   a read lock but
19b90 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63 72 69   fails, the scri
19ba0 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20 77 69  pt terminates wi
19bb0 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
19bc0 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64 65 2e  BUSY error code.
19bd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61  .**.** The P3 va
19be0 6c 75 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  lue is the name 
19bf0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
19c00 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e  index being open
19c10 65 64 2e 0a 2a 2a 20 54 68 65 20 50 33 20 76 61  ed..** The P3 va
19c20 6c 75 65 20 69 73 20 6e 6f 74 20 61 63 74 75 61  lue is not actua
19c30 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68 69 73  lly used by this
19c40 20 6f 70 63 6f 64 65 20 61 6e 64 20 6d 61 79 20   opcode and may 
19c50 62 65 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 20 20  be.** omitted.  
19c60 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
19c70 65 72 61 74 6f 72 20 75 73 75 61 6c 6c 79 20 69  erator usually i
19c80 6e 73 65 72 74 73 20 74 68 65 20 69 6e 64 65 78  nserts the index
19c90 20 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d   or.** table nam
19ca0 65 20 69 6e 74 6f 20 50 33 20 74 6f 20 6d 61 6b  e into P3 to mak
19cb0 65 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  e the code easie
19cc0 72 20 74 6f 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  r to read..**.**
19cd0 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 57 72   See also OpenWr
19ce0 69 74 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ite..*/./* Opcod
19cf0 65 3a 20 4f 70 65 6e 57 72 69 74 65 20 50 31 20  e: OpenWrite P1 
19d00 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  P2 P3.**.** Open
19d10 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75   a read/write cu
19d20 72 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e  rsor named P1 on
19d30 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
19d40 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a  dex whose root.*
19d50 2a 20 70 61 67 65 20 69 73 20 50 32 2e 20 20 49  * page is P2.  I
19d60 66 20 50 32 3d 3d 30 20 74 68 65 6e 20 74 61 6b  f P2==0 then tak
19d70 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  e the root page 
19d80 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
19d90 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stack..**.** The
19da0 20 50 33 20 76 61 6c 75 65 20 69 73 20 74 68 65   P3 value is the
19db0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
19dc0 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
19dd0 67 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 54 68 65  g opened..** The
19de0 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 74   P3 value is not
19df0 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 62   actually used b
19e00 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 61 6e  y this opcode an
19e10 64 20 6d 61 79 20 62 65 0a 2a 2a 20 6f 6d 69 74  d may be.** omit
19e20 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  ted.  But the co
19e30 64 65 20 67 65 6e 65 72 61 74 6f 72 20 75 73 75  de generator usu
19e40 61 6c 6c 79 20 69 6e 73 65 72 74 73 20 74 68 65  ally inserts the
19e50 20 69 6e 64 65 78 20 6f 72 0a 2a 2a 20 74 61 62   index or.** tab
19e60 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 50 33 20  le name into P3 
19e70 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65  to make the code
19e80 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 2e   easier to read.
19e90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
19ea0 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75  ruction works ju
19eb0 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  st like OpenRead
19ec0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
19ed0 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
19ee0 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
19ef0 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20 67  e mode.  For a g
19f00 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65 72  iven table, ther
19f10 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20  e can be one or 
19f20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  more read-only.*
19f30 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20 73  * cursors or a s
19f40 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74 65  ingle read/write
19f50 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74 20   cursor but not 
19f60 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  both..**.** See 
19f70 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a  also OpenRead..*
19f80 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65  /.case OP_OpenRe
19f90 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  ad:.case OP_Open
19fa0 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20 62  Write: {.  int b
19fb0 75 73 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  usy = 0;.  int i
19fc0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e   = pOp->p1;.  in
19fd0 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a  t tos = p->tos;.
19fe0 20 20 69 6e 74 20 70 32 20 3d 20 70 4f 70 2d 3e    int p2 = pOp->
19ff0 70 32 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67  p2;.  int wrFlag
1a000 3b 0a 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20  ;.  Btree *pX;. 
1a010 20 69 6e 74 20 69 44 62 3b 0a 20 20 0a 20 20 56   int iDb;.  .  V
1a020 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30  ERIFY( if( tos<0
1a030 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
1a040 67 68 5f 73 74 61 63 6b 3b 20 29 3b 0a 20 20 49  gh_stack; );.  I
1a050 6e 74 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73  ntegerify(p, tos
1a060 29 3b 0a 20 20 69 44 62 20 3d 20 70 2d 3e 61 53  );.  iDb = p->aS
1a070 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b 0a 20 20 74  tack[tos].i;.  t
1a080 6f 73 2d 2d 3b 0a 20 20 56 45 52 49 46 59 28 20  os--;.  VERIFY( 
1a090 69 66 28 20 69 44 62 3c 30 20 7c 7c 20 69 44 62  if( iDb<0 || iDb
1a0a0 3e 3d 64 62 2d 3e 6e 44 62 20 29 20 67 6f 74 6f  >=db->nDb ) goto
1a0b0 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e   bad_instruction
1a0c0 3b 20 29 3b 0a 20 20 56 45 52 49 46 59 28 20 69  ; );.  VERIFY( i
1a0d0 66 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  f( db->aDb[iDb].
1a0e0 70 42 74 3d 3d 30 20 29 20 67 6f 74 6f 20 62 61  pBt==0 ) goto ba
1a0f0 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
1a100 3b 0a 20 20 70 58 20 3d 20 64 62 2d 3e 61 44 62  ;.  pX = db->aDb
1a110 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 77 72 46  [iDb].pBt;.  wrF
1a120 6c 61 67 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  lag = pOp->opcod
1a130 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b  e==OP_OpenWrite;
1a140 0a 20 20 69 66 28 20 70 32 3c 3d 30 20 29 7b 0a  .  if( p2<=0 ){.
1a150 20 20 20 20 56 45 52 49 46 59 28 20 69 66 28 20      VERIFY( if( 
1a160 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74  tos<0 ) goto not
1a170 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29  _enough_stack; )
1a180 3b 0a 20 20 20 20 49 6e 74 65 67 65 72 69 66 79  ;.    Integerify
1a190 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 70 32  (p, tos);.    p2
1a1a0 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 74 6f 73   = p->aStack[tos
1a1b0 5d 2e 69 3b 0a 20 20 20 20 50 4f 50 53 54 41 43  ].i;.    POPSTAC
1a1c0 4b 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 32 20  K;.    if( p2<2 
1a1d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
1a1e0 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
1a1f0 72 4d 73 67 2c 20 22 72 6f 6f 74 20 70 61 67 65  rMsg, "root page
1a200 20 6e 75 6d 62 65 72 20 6c 65 73 73 20 74 68 61   number less tha
1a210 6e 20 32 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  n 2", 0);.      
1a220 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
1a230 52 4e 41 4c 3b 0a 20 20 20 20 20 20 62 72 65 61  RNAL;.      brea
1a240 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 56  k;.    }.  }.  V
1a250 45 52 49 46 59 28 20 69 66 28 20 69 3c 30 20 29  ERIFY( if( i<0 )
1a260 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75   goto bad_instru
1a270 63 74 69 6f 6e 3b 20 29 0a 20 20 69 66 28 20 65  ction; ).  if( e
1a280 78 70 61 6e 64 43 75 72 73 6f 72 41 72 72 61 79  xpandCursorArray
1a290 53 69 7a 65 28 70 2c 20 69 29 20 29 20 67 6f 74  Size(p, i) ) got
1a2a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 63 6c 65 61  o no_mem;.  clea
1a2b0 6e 75 70 43 75 72 73 6f 72 28 26 70 2d 3e 61 43  nupCursor(&p->aC
1a2c0 73 72 5b 69 5d 29 3b 0a 20 20 6d 65 6d 73 65 74  sr[i]);.  memset
1a2d0 28 26 70 2d 3e 61 43 73 72 5b 69 5d 2c 20 30 2c  (&p->aCsr[i], 0,
1a2e0 20 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29   sizeof(Cursor))
1a2f0 3b 0a 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e  ;.  p->aCsr[i].n
1a300 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 69 66  ullRow = 1;.  if
1a310 28 20 70 58 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( pX==0 ) break;
1a320 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
1a330 73 71 6c 69 74 65 42 74 72 65 65 43 75 72 73 6f  sqliteBtreeCurso
1a340 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67  r(pX, p2, wrFlag
1a350 2c 20 26 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43  , &p->aCsr[i].pC
1a360 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 77 69 74  ursor);.    swit
1a370 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  ch( rc ){.      
1a380 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
1a390 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
1a3a0 64 62 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63  db->xBusyCallbac
1a3b0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1a3c0 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20    p->pc = pc;.  
1a3d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a3e0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1a3f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1a400 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 64     }else if( (*d
1a420 62 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b  b->xBusyCallback
1a430 29 28 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 20  )(db->pBusyArg, 
1a440 70 4f 70 2d 3e 70 33 2c 20 2b 2b 62 75 73 79 29  pOp->p3, ++busy)
1a450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a460 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1a470 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71  (&p->zErrMsg, sq
1a480 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e  lite_error_strin
1a490 67 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  g(rc), 0);.     
1a4a0 20 20 20 20 20 62 75 73 79 20 3d 20 30 3b 0a 20       busy = 0;. 
1a4b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a4c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a4d0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1a4e0 45 5f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20  E_OK: {.        
1a4f0 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  busy = 0;.      
1a500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a510 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
1a520 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
1a530 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1a540 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
1a550 0a 20 20 7d 77 68 69 6c 65 28 20 62 75 73 79 20  .  }while( busy 
1a560 29 3b 0a 20 20 69 66 28 20 70 32 3c 3d 30 20 29  );.  if( p2<=0 )
1a570 7b 0a 20 20 20 20 50 4f 50 53 54 41 43 4b 3b 0a  {.    POPSTACK;.
1a580 20 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a    }.  POPSTACK;.
1a590 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1a5a0 70 63 6f 64 65 3a 20 4f 70 65 6e 54 65 6d 70 20  pcode: OpenTemp 
1a5b0 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70  P1 P2 *.**.** Op
1a5c0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1a5d0 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  to a transient t
1a5e0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 74 72 61  able..** The tra
1a5f0 6e 73 69 65 6e 74 20 63 75 72 73 6f 72 20 69 73  nsient cursor is
1a600 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72   always opened r
1a610 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69  ead/write even i
1a620 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  f .** the main d
1a630 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1a640 6f 6e 6c 79 2e 20 20 54 68 65 20 74 72 61 6e 73  only.  The trans
1a650 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20 64 65  ient table is de
1a660 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
1a670 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20  ically when the 
1a680 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1a690 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ..**.** The curs
1a6a0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42  or points to a B
1a6b0 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 32  Tree table if P2
1a6c0 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72  ==0 and to a BTr
1a6d0 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50  ee index.** if P
1a6e0 32 3d 3d 31 2e 20 20 41 20 42 54 72 65 65 20 74  2==1.  A BTree t
1a6f0 61 62 6c 65 20 6d 75 73 74 20 68 61 76 65 20 61  able must have a
1a700 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e  n integer key an
1a710 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69 74  d can have arbit
1a720 72 61 72 79 0a 2a 2a 20 64 61 74 61 2e 20 20 41  rary.** data.  A
1a730 20 42 54 72 65 65 20 69 6e 64 65 78 20 68 61 73   BTree index has
1a740 20 6e 6f 20 64 61 74 61 20 62 75 74 20 63 61 6e   no data but can
1a750 20 68 61 76 65 20 61 6e 20 61 72 62 69 74 72 61   have an arbitra
1a760 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ry key..**.** Th
1a770 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
1a780 64 20 66 6f 72 20 74 61 62 6c 65 73 20 74 68 61  d for tables tha
1a790 74 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  t exist for the 
1a7a0 64 75 72 61 74 69 6f 6e 20 6f 66 20 61 20 73 69  duration of a si
1a7b0 6e 67 6c 65 0a 2a 2a 20 53 51 4c 20 73 74 61 74  ngle.** SQL stat
1a7c0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 20 20 54 61 62  ement only.  Tab
1a7d0 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
1a7e0 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
1a7f0 52 59 20 54 41 42 4c 45 0a 2a 2a 20 61 72 65 20  RY TABLE.** are 
1a800 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 4f 50 5f  opened using OP_
1a810 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1a820 70 65 6e 57 72 69 74 65 2e 20 20 22 54 65 6d 70  penWrite.  "Temp
1a830 6f 72 61 72 79 22 20 69 6e 20 74 68 65 0a 2a 2a  orary" in the.**
1a840 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 69 73   context of this
1a850 20 6f 70 63 6f 64 65 20 6d 65 61 6e 73 20 66 6f   opcode means fo
1a860 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f  r the duration o
1a870 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73  f a single SQL s
1a880 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 77 68 65 72  tatement.** wher
1a890 65 61 73 20 22 54 65 6d 70 6f 72 61 72 79 22 20  eas "Temporary" 
1a8a0 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
1a8b0 66 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d  f CREATE TABLE m
1a8c0 65 61 6e 73 20 66 6f 72 20 74 68 65 20 64 75 72  eans for the dur
1a8d0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
1a8e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
1a8f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 61 6d  e database.  Sam
1a900 65 20 77 6f 72 64 3b 20 64 69 66 66 65 72 65 6e  e word; differen
1a910 74 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2f 0a 63  t meanings..*/.c
1a920 61 73 65 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 3a  ase OP_OpenTemp:
1a930 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
1a940 2d 3e 70 31 3b 0a 20 20 43 75 72 73 6f 72 20 2a  ->p1;.  Cursor *
1a950 70 43 78 3b 0a 20 20 56 45 52 49 46 59 28 20 69  pCx;.  VERIFY( i
1a960 66 28 20 69 3c 30 20 29 20 67 6f 74 6f 20 62 61  f( i<0 ) goto ba
1a970 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
1a980 0a 20 20 69 66 28 20 65 78 70 61 6e 64 43 75 72  .  if( expandCur
1a990 73 6f 72 41 72 72 61 79 53 69 7a 65 28 70 2c 20  sorArraySize(p, 
1a9a0 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  i) ) goto no_mem
1a9b0 3b 0a 20 20 70 43 78 20 3d 20 26 70 2d 3e 61 43  ;.  pCx = &p->aC
1a9c0 73 72 5b 69 5d 3b 0a 20 20 63 6c 65 61 6e 75 70  sr[i];.  cleanup
1a9d0 43 75 72 73 6f 72 28 70 43 78 29 3b 0a 20 20 6d  Cursor(pCx);.  m
1a9e0 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69  emset(pCx, 0, si
1a9f0 7a 65 6f 66 28 2a 70 43 78 29 29 3b 0a 20 20 70  zeof(*pCx));.  p
1aa00 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
1aa10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74  .  rc = sqliteBt
1aa20 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
1aa30 2c 20 31 2c 20 54 45 4d 50 5f 50 41 47 45 53 2c  , 1, TEMP_PAGES,
1aa40 20 26 70 43 78 2d 3e 70 42 74 29 3b 0a 0a 20 20   &pCx->pBt);..  
1aa50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aa60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1aa70 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
1aa80 61 6e 73 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ans(pCx->pBt);. 
1aa90 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1aaa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1aab0 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20  ( pOp->p2 ){.   
1aac0 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
1aad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74     rc = sqliteBt
1aae0 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 70  reeCreateIndex(p
1aaf0 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 29 3b  Cx->pBt, &pgno);
1ab00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ab10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42      rc = sqliteB
1ab30 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  treeCursor(pCx->
1ab40 70 42 74 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70  pBt, pgno, 1, &p
1ab50 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
1ab60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1ab70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ab80 74 65 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  teBtreeCursor(pC
1ab90 78 2d 3e 70 42 74 2c 20 32 2c 20 31 2c 20 26 70  x->pBt, 2, 1, &p
1aba0 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
1abb0 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
1abc0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
1abd0 70 65 6e 50 73 65 75 64 6f 20 50 31 20 2a 20 2a  penPseudo P1 * *
1abe0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
1abf0 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f  w cursor that po
1ac00 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74  ints to a fake t
1ac10 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
1ac20 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  ns a single.** r
1ac30 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 41 6e 79  ow of data.  Any
1ac40 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
1ac50 65 20 61 20 73 65 63 6f 6e 64 20 72 6f 77 20 6f  e a second row o
1ac60 66 20 64 61 74 61 20 63 61 75 73 65 73 20 74 68  f data causes th
1ac70 65 0a 2a 2a 20 66 69 72 73 74 20 72 6f 77 20 74  e.** first row t
1ac80 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 41  o be deleted.  A
1ac90 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
1aca0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ed when the curs
1acb0 6f 72 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  or is.** closed.
1acc0 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d  .**.** A pseudo-
1acd0 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62 79  table created by
1ace0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
1acf0 75 73 65 66 75 6c 20 66 6f 72 20 68 6f 6c 64 69  useful for holdi
1ad00 6e 67 20 74 68 65 0a 2a 2a 20 4e 45 57 20 6f 72  ng the.** NEW or
1ad10 20 4f 4c 44 20 74 61 62 6c 65 73 20 69 6e 20 61   OLD tables in a
1ad20 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 63 61 73   trigger..*/.cas
1ad30 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a  e OP_OpenPseudo:
1ad40 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
1ad50 2d 3e 70 31 3b 0a 20 20 43 75 72 73 6f 72 20 2a  ->p1;.  Cursor *
1ad60 70 43 78 3b 0a 20 20 56 45 52 49 46 59 28 20 69  pCx;.  VERIFY( i
1ad70 66 28 20 69 3c 30 20 29 20 67 6f 74 6f 20 62 61  f( i<0 ) goto ba
1ad80 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
1ad90 0a 20 20 69 66 28 20 65 78 70 61 6e 64 43 75 72  .  if( expandCur
1ada0 73 6f 72 41 72 72 61 79 53 69 7a 65 28 70 2c 20  sorArraySize(p, 
1adb0 69 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  i) ) goto no_mem
1adc0 3b 0a 20 20 70 43 78 20 3d 20 26 70 2d 3e 61 43  ;.  pCx = &p->aC
1add0 73 72 5b 69 5d 3b 0a 20 20 63 6c 65 61 6e 75 70  sr[i];.  cleanup
1ade0 43 75 72 73 6f 72 28 70 43 78 29 3b 0a 20 20 6d  Cursor(pCx);.  m
1adf0 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69  emset(pCx, 0, si
1ae00 7a 65 6f 66 28 2a 70 43 78 29 29 3b 0a 20 20 70  zeof(*pCx));.  p
1ae10 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
1ae20 0a 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54 61  .  pCx->pseudoTa
1ae30 62 6c 65 20 3d 20 31 3b 0a 20 20 62 72 65 61 6b  ble = 1;.  break
1ae40 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1ae50 43 6c 6f 73 65 20 50 31 20 2a 20 2a 0a 2a 2a 0a  Close P1 * *.**.
1ae60 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1ae70 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  r previously ope
1ae80 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20 50  ned as P1.  If P
1ae90 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72  1 is not.** curr
1aea0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73  ently open, this
1aeb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1aec0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
1aed0 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 69   OP_Close: {.  i
1aee0 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
1aef0 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c    if( i>=0 && i<
1af00 70 2d 3e 6e 43 75 72 73 6f 72 20 29 7b 0a 20 20  p->nCursor ){.  
1af10 20 20 63 6c 65 61 6e 75 70 43 75 72 73 6f 72 28    cleanupCursor(
1af20 26 70 2d 3e 61 43 73 72 5b 69 5d 29 3b 0a 20 20  &p->aCsr[i]);.  
1af30 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
1af40 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 54 6f 20   Opcode: MoveTo 
1af50 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f  P1 P2 *.**.** Po
1af60 70 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  p the top of the
1af70 20 73 74 61 63 6b 20 61 6e 64 20 75 73 65 20 69   stack and use i
1af80 74 73 20 76 61 6c 75 65 20 61 73 20 61 20 6b 65  ts value as a ke
1af90 79 2e 20 20 52 65 70 6f 73 69 74 69 6f 6e 0a 2a  y.  Reposition.*
1afa0 2a 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  * cursor P1 so t
1afb0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1afc0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
1afd0 20 6d 61 74 63 68 69 6e 67 20 6b 65 79 2e 20 20   matching key.  
1afe0 49 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  If.** the table 
1aff0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 63 6f  contains no reco
1b000 72 64 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  rd with a matchi
1b010 6e 67 20 6b 65 79 2c 20 74 68 65 6e 20 74 68 65  ng key, then the
1b020 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
1b030 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
1b040 68 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  he first record 
1b050 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
1b060 74 68 61 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  than the key..**
1b070 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1b080 20 72 65 63 6f 72 64 73 20 67 72 65 61 74 65 72   records greater
1b090 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 61 6e   than the key an
1b0a0 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
1b0b0 2c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6d 6d  ,.** then an imm
1b0c0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 50  ediate jump to P
1b0d0 32 20 69 73 20 6d 61 64 65 2e 0a 2a 2a 0a 2a 2a  2 is made..**.**
1b0e0 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1b0f0 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
1b100 69 6e 63 74 2c 20 4d 6f 76 65 4c 74 0a 2a 2f 0a  inct, MoveLt.*/.
1b110 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 4c  /* Opcode: MoveL
1b120 74 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  t P1 P2 *.**.** 
1b130 50 6f 70 20 74 68 65 20 74 6f 70 20 6f 66 20 74  Pop the top of t
1b140 68 65 20 73 74 61 63 6b 20 61 6e 64 20 75 73 65  he stack and use
1b150 20 69 74 73 20 76 61 6c 75 65 20 61 73 20 61 20   its value as a 
1b160 6b 65 79 2e 20 20 52 65 70 6f 73 69 74 69 6f 6e  key.  Reposition
1b170 0a 2a 2a 20 63 75 72 73 6f 72 20 50 31 20 73 6f  .** cursor P1 so
1b180 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1b190 74 6f 20 74 68 65 20 65 6e 74 72 79 20 77 69 74  to the entry wit
1b1a0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
1b1b0 79 20 74 68 61 74 20 69 73 0a 2a 2a 20 6c 65 73  y that is.** les
1b1c0 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 70  s than the key p
1b1d0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
1b1e0 74 61 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 65 72  tack..** If ther
1b1f0 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1b200 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61 6e 20   less than than 
1b210 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 0a 2a  the key and P2.*
1b220 2a 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  * is not zero th
1b230 65 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  en an immediate 
1b240 6a 75 6d 70 20 74 6f 20 50 32 20 69 73 20 6d 61  jump to P2 is ma
1b250 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
1b260 73 6f 3a 20 4d 6f 76 65 54 6f 0a 2a 2f 0a 63 61  so: MoveTo.*/.ca
1b270 73 65 20 4f 50 5f 4d 6f 76 65 4c 74 3a 0a 63 61  se OP_MoveLt:.ca
1b280 73 65 20 4f 50 5f 4d 6f 76 65 54 6f 3a 20 7b 0a  se OP_MoveTo: {.
1b290 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
1b2a0 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70  1;.  int tos = p
1b2b0 2d 3e 74 6f 73 3b 0a 20 20 43 75 72 73 6f 72 20  ->tos;.  Cursor 
1b2c0 2a 70 43 3b 0a 0a 20 20 56 45 52 49 46 59 28 20  *pC;..  VERIFY( 
1b2d0 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74 6f  if( tos<0 ) goto
1b2e0 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63   not_enough_stac
1b2f0 6b 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 69  k; ).  assert( i
1b300 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
1b310 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 26 70  sor );.  pC = &p
1b320 2d 3e 61 43 73 72 5b 69 5d 3b 0a 20 20 69 66 28  ->aCsr[i];.  if(
1b330 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20   pC->pCursor!=0 
1b340 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
1b350 6f 63 3b 0a 20 20 20 20 69 66 28 20 61 53 74 61  oc;.    if( aSta
1b360 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 26 20  ck[tos].flags & 
1b370 53 54 4b 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  STK_Int ){.     
1b380 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 6e 74 54   int iKey = intT
1b390 6f 4b 65 79 28 61 53 74 61 63 6b 5b 74 6f 73 5d  oKey(aStack[tos]
1b3a0 2e 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .i);.      sqlit
1b3b0 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 2d  eBtreeMoveto(pC-
1b3c0 3e 70 43 75 72 73 6f 72 2c 20 28 63 68 61 72 2a  >pCursor, (char*
1b3d0 29 26 69 4b 65 79 2c 20 73 69 7a 65 6f 66 28 69  )&iKey, sizeof(i
1b3e0 6e 74 29 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  nt), &res);.    
1b3f0 20 20 70 43 2d 3e 6c 61 73 74 52 65 63 6e 6f 20    pC->lastRecno 
1b400 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 3b  = aStack[tos].i;
1b410 0a 20 20 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f  .      pC->recno
1b420 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
1b430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b440 20 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20     Stringify(p, 
1b450 74 6f 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tos);.      sqli
1b460 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  teBtreeMoveto(pC
1b470 2d 3e 70 43 75 72 73 6f 72 2c 20 7a 53 74 61 63  ->pCursor, zStac
1b480 6b 5b 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74  k[tos], aStack[t
1b490 6f 73 5d 2e 6e 2c 20 26 72 65 73 29 3b 0a 20 20  os].n, &res);.  
1b4a0 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f 49 73 56      pC->recnoIsV
1b4b0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  alid = 0;.    }.
1b4c0 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
1b4d0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f  = 0;.    sqlite_
1b4e0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
1b4f0 20 20 20 20 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70      oc = pOp->op
1b500 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 63  code;.    if( oc
1b510 3d 3d 4f 50 5f 4d 6f 76 65 54 6f 20 26 26 20 72  ==OP_MoveTo && r
1b520 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  es<0 ){.      sq
1b530 6c 69 74 65 42 74 72 65 65 4e 65 78 74 28 70 43  liteBtreeNext(pC
1b540 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
1b550 3b 0a 20 20 20 20 20 20 70 43 2d 3e 72 65 63 6e  ;.      pC->recn
1b560 6f 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  oIsValid = 0;.  
1b570 20 20 20 20 69 66 28 20 72 65 73 20 26 26 20 70      if( res && p
1b580 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20  Op->p2>0 ){.    
1b590 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1b5a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   - 1;.      }.  
1b5b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 63 3d 3d    }else if( oc==
1b5c0 4f 50 5f 4d 6f 76 65 4c 74 20 29 7b 0a 20 20 20  OP_MoveLt ){.   
1b5d0 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 7b     if( res>=0 ){
1b5e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 42  .        sqliteB
1b5f0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 2d  treePrevious(pC-
1b600 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
1b610 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 65 63  .        pC->rec
1b620 6e 6f 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  noIsValid = 0;. 
1b630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b640 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74      /* res might
1b650 20 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63   be negative bec
1b660 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  ause the table i
1b670 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20  s empty.  Check 
1b680 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  to.        ** se
1b690 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
1b6a0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 2a   case..        *
1b6b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 65  /.        int ke
1b6c0 79 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 72  ysize;.        r
1b6d0 65 73 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  es = sqliteBtree
1b6e0 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72  KeySize(pC->pCur
1b6f0 73 6f 72 2c 26 6b 65 79 73 69 7a 65 29 21 3d 30  sor,&keysize)!=0
1b700 20 7c 7c 20 6b 65 79 73 69 7a 65 3d 3d 30 3b 0a   || keysize==0;.
1b710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b720 28 20 72 65 73 20 26 26 20 70 4f 70 2d 3e 70 32  ( res && pOp->p2
1b730 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  >0 ){.        pc
1b740 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1b750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b760 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20  }.  POPSTACK;.  
1b770 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1b780 6f 64 65 3a 20 44 69 73 74 69 6e 63 74 20 50 31  ode: Distinct P1
1b790 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20   P2 *.**.** Use 
1b7a0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
1b7b0 74 61 63 6b 20 61 73 20 61 20 73 74 72 69 6e 67  tack as a string
1b7c0 20 6b 65 79 2e 20 20 49 66 20 61 20 72 65 63 6f   key.  If a reco
1b7d0 72 64 20 77 69 74 68 20 74 68 61 74 20 6b 65 79  rd with that key
1b7e0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
1b7f0 73 74 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  st in the table 
1b800 6f 66 20 63 75 72 73 6f 72 20 50 31 2c 20 74 68  of cursor P1, th
1b810 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
1b820 49 66 20 74 68 65 20 72 65 63 6f 72 64 0a 2a 2a  If the record.**
1b830 20 64 6f 65 73 20 61 6c 72 65 61 64 79 20 65 78   does already ex
1b840 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  ist, then fall t
1b850 68 72 75 2e 20 20 54 68 65 20 63 75 72 73 6f 72  hru.  The cursor
1b860 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1b870 67 0a 2a 2a 20 61 74 20 74 68 65 20 72 65 63 6f  g.** at the reco
1b880 72 64 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  rd if it exists.
1b890 20 54 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   The key is not 
1b8a0 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
1b8b0 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stack..**.** Thi
1b8c0 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  s operation is s
1b8d0 69 6d 69 6c 61 72 20 74 6f 20 4e 6f 74 46 6f 75  imilar to NotFou
1b8e0 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 20 74  nd except that t
1b8f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
1b900 20 64 6f 65 73 20 6e 6f 74 20 70 6f 70 20 74 68   does not pop th
1b910 65 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 73  e key from the s
1b920 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tack..**.** See 
1b930 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1b940 46 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f 2c 20 49  Found, MoveTo, I
1b950 73 55 6e 69 71 75 65 2c 20 4e 6f 74 45 78 69 73  sUnique, NotExis
1b960 74 73 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ts.*/./* Opcode:
1b970 20 46 6f 75 6e 64 20 50 31 20 50 32 20 2a 0a 2a   Found P1 P2 *.*
1b980 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 74 6f 70  *.** Use the top
1b990 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 73   of the stack as
1b9a0 20 61 20 73 74 72 69 6e 67 20 6b 65 79 2e 20 20   a string key.  
1b9b0 49 66 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  If a record with
1b9c0 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 64 6f 65   that key.** doe
1b9d0 73 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65  s exist in table
1b9e0 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d   of P1, then jum
1b9f0 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  p to P2.  If the
1ba00 20 72 65 63 6f 72 64 0a 2a 2a 20 64 6f 65 73 20   record.** does 
1ba10 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
1ba20 66 61 6c 6c 20 74 68 72 75 2e 20 20 54 68 65 20  fall thru.  The 
1ba30 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1ba40 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  ointing.** to th
1ba50 65 20 72 65 63 6f 72 64 20 69 66 20 69 74 20 65  e record if it e
1ba60 78 69 73 74 73 2e 20 20 54 68 65 20 6b 65 79 20  xists.  The key 
1ba70 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  is popped from t
1ba80 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
1ba90 53 65 65 20 61 6c 73 6f 3a 20 44 69 73 74 69 6e  See also: Distin
1baa0 63 74 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4d 6f  ct, NotFound, Mo
1bab0 76 65 54 6f 2c 20 49 73 55 6e 69 71 75 65 2c 20  veTo, IsUnique, 
1bac0 4e 6f 74 45 78 69 73 74 73 0a 2a 2f 0a 2f 2a 20  NotExists.*/./* 
1bad0 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64  Opcode: NotFound
1bae0 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 55   P1 P2 *.**.** U
1baf0 73 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  se the top of th
1bb00 65 20 73 74 61 63 6b 20 61 73 20 61 20 73 74 72  e stack as a str
1bb10 69 6e 67 20 6b 65 79 2e 20 20 49 66 20 61 20 72  ing key.  If a r
1bb20 65 63 6f 72 64 20 77 69 74 68 20 74 68 61 74 20  ecord with that 
1bb30 6b 65 79 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  key.** does not 
1bb40 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65 20 6f  exist in table o
1bb50 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20  f P1, then jump 
1bb60 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20 72  to P2.  If the r
1bb70 65 63 6f 72 64 0a 2a 2a 20 64 6f 65 73 20 65 78  ecord.** does ex
1bb80 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  ist, then fall t
1bb90 68 72 75 2e 20 20 54 68 65 20 63 75 72 73 6f 72  hru.  The cursor
1bba0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1bbb0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 72 65 63 6f  g to the.** reco
1bbc0 72 64 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  rd if it exists.
1bbd0 20 20 54 68 65 20 6b 65 79 20 69 73 20 70 6f 70    The key is pop
1bbe0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
1bbf0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ck..**.** The di
1bc00 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1bc10 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
1bc20 61 6e 64 20 44 69 73 74 69 6e 63 74 20 69 73 20  and Distinct is 
1bc30 74 68 61 74 0a 2a 2a 20 44 69 73 74 69 6e 63 74  that.** Distinct
1bc40 20 64 6f 65 73 20 6e 6f 74 20 70 6f 70 20 74 68   does not pop th
1bc50 65 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 73  e key from the s
1bc60 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tack..**.** See 
1bc70 61 6c 73 6f 3a 20 44 69 73 74 69 6e 63 74 2c 20  also: Distinct, 
1bc80 46 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f 2c 20 4e  Found, MoveTo, N
1bc90 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e 69 71  otExists, IsUniq
1bca0 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69  ue.*/.case OP_Di
1bcb0 73 74 69 6e 63 74 3a 0a 63 61 73 65 20 4f 50 5f  stinct:.case OP_
1bcc0 4e 6f 74 46 6f 75 6e 64 3a 0a 63 61 73 65 20 4f  NotFound:.case O
1bcd0 50 5f 46 6f 75 6e 64 3a 20 7b 0a 20 20 69 6e 74  P_Found: {.  int
1bce0 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
1bcf0 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73  int tos = p->tos
1bd00 3b 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45  ;.  int alreadyE
1bd10 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 43 75 72  xists = 0;.  Cur
1bd20 73 6f 72 20 2a 70 43 3b 0a 20 20 56 45 52 49 46  sor *pC;.  VERIF
1bd30 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67  Y( if( tos<0 ) g
1bd40 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73  oto not_enough_s
1bd50 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 56 45  tack; ).  if( VE
1bd60 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69 3c  RIFY( i>=0 && i<
1bd70 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29 20  p->nCursor && ) 
1bd80 28 70 43 20 3d 20 26 70 2d 3e 61 43 73 72 5b 69  (pC = &p->aCsr[i
1bd90 5d 29 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  ])->pCursor!=0 )
1bda0 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
1bdb0 78 3b 0a 20 20 20 20 53 74 72 69 6e 67 69 66 79  x;.    Stringify
1bdc0 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20 20 72 78  (p, tos);.    rx
1bdd0 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4d 6f   = sqliteBtreeMo
1bde0 76 65 74 6f 28 70 43 2d 3e 70 43 75 72 73 6f 72  veto(pC->pCursor
1bdf0 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 61  , zStack[tos], a
1be00 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 2c 20 26 72  Stack[tos].n, &r
1be10 65 73 29 3b 0a 20 20 20 20 61 6c 72 65 61 64 79  es);.    already
1be20 45 78 69 73 74 73 20 3d 20 72 78 3d 3d 53 51 4c  Exists = rx==SQL
1be30 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30  ITE_OK && res==0
1be40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1be50 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e  >opcode==OP_Foun
1be60 64 20 29 7b 0a 20 20 20 20 69 66 28 20 61 6c 72  d ){.    if( alr
1be70 65 61 64 79 45 78 69 73 74 73 20 29 20 70 63 20  eadyExists ) pc 
1be80 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1be90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1bea0 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29  !alreadyExists )
1beb0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1bec0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  1;.  }.  if( pOp
1bed0 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 44 69 73  ->opcode!=OP_Dis
1bee0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 50 4f 50  tinct ){.    POP
1bef0 53 54 41 43 4b 3b 0a 20 20 7d 0a 20 20 62 72 65  STACK;.  }.  bre
1bf00 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1bf10 3a 20 49 73 55 6e 69 71 75 65 20 50 31 20 50 32  : IsUnique P1 P2
1bf20 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 70   *.**.** The top
1bf30 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
1bf40 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 63 6f   an integer reco
1bf50 72 64 20 6e 75 6d 62 65 72 2e 20 20 43 61 6c 6c  rd number.  Call
1bf60 20 74 68 69 73 0a 2a 2a 20 72 65 63 6f 72 64 20   this.** record 
1bf70 6e 75 6d 62 65 72 20 52 2e 20 20 54 68 65 20 6e  number R.  The n
1bf80 65 78 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ext on the stack
1bf90 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6b 65 79   is an index key
1bfa0 20 63 72 65 61 74 65 64 0a 2a 2a 20 75 73 69 6e   created.** usin
1bfb0 67 20 4d 61 6b 65 49 64 78 4b 65 79 2e 20 20 43  g MakeIdxKey.  C
1bfc0 61 6c 6c 20 69 74 20 4b 2e 20 20 54 68 69 73 20  all it K.  This 
1bfd0 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 6f 70 73  instruction pops
1bfe0 20 52 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73   R from the.** s
1bff0 74 61 63 6b 20 62 75 74 20 69 74 20 6c 65 61 76  tack but it leav
1c000 65 73 20 4b 20 75 6e 63 68 61 6e 67 65 64 2e 0a  es K unchanged..
1c010 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 69  **.** P1 is an i
1c020 6e 64 65 78 2e 20 20 53 6f 20 61 6c 6c 20 62 75  ndex.  So all bu
1c030 74 20 74 68 65 20 6c 61 73 74 20 66 6f 75 72 20  t the last four 
1c040 62 79 74 65 73 20 6f 66 20 4b 20 61 72 65 20 61  bytes of K are a
1c050 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 74 72 69 6e  n.** index strin
1c060 67 2e 20 20 54 68 65 20 6c 61 73 74 20 66 6f 75  g.  The last fou
1c070 72 20 62 79 74 65 73 20 6f 66 20 4b 20 61 72 65  r bytes of K are
1c080 20 61 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72   a record number
1c090 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
1c0a0 74 72 75 63 74 69 6f 6e 20 61 73 6b 73 20 69 66  truction asks if
1c0b0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 6e 74   there is an ent
1c0c0 72 79 20 69 6e 20 50 31 20 77 68 65 72 65 20 74  ry in P1 where t
1c0d0 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73 74 72 69  he.** index stri
1c0e0 6e 67 20 6d 61 74 63 68 65 73 20 4b 20 62 75 74  ng matches K but
1c0f0 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
1c100 65 72 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  er is different.
1c110 2a 2a 20 66 72 6f 6d 20 52 2e 20 20 49 66 20 74  ** from R.  If t
1c120 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
1c130 65 6e 74 72 79 2c 20 74 68 65 6e 20 74 68 65 72  entry, then ther
1c140 65 20 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  e is an immediat
1c150 65 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 50 32 2e  e.** jump to P2.
1c160 20 20 49 66 20 61 6e 79 20 65 6e 74 72 79 20 64    If any entry d
1c170 6f 65 73 20 65 78 69 73 74 20 77 68 65 72 65 20  oes exist where 
1c180 74 68 65 20 69 6e 64 65 78 20 73 74 72 69 6e 67  the index string
1c190 0a 2a 2a 20 6d 61 74 63 68 65 73 20 4b 20 62 75  .** matches K bu
1c1a0 74 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  t the record num
1c1b0 62 65 72 20 69 73 20 6e 6f 74 20 52 2c 20 74 68  ber is not R, th
1c1c0 65 6e 20 74 68 65 20 72 65 63 6f 72 64 0a 2a 2a  en the record.**
1c1d0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 61 74   number for that
1c1e0 20 65 6e 74 72 79 20 69 73 20 70 75 73 68 65 64   entry is pushed
1c1f0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
1c200 61 6e 64 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  and control.** f
1c210 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
1c220 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1c230 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
1c240 61 6c 73 6f 3a 20 44 69 73 74 69 6e 63 74 2c 20  also: Distinct, 
1c250 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  NotFound, NotExi
1c260 73 74 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63 61  sts, Found.*/.ca
1c270 73 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a 20  se OP_IsUnique: 
1c280 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  {.  int i = pOp-
1c290 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d  >p1;.  int tos =
1c2a0 20 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 6e   p->tos;.  int n
1c2b0 6f 73 20 3d 20 74 6f 73 2d 31 3b 0a 20 20 42 74  os = tos-1;.  Bt
1c2c0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
1c2d0 20 69 6e 74 20 52 3b 0a 0a 20 20 2f 2a 20 50 6f   int R;..  /* Po
1c2e0 70 20 74 68 65 20 76 61 6c 75 65 20 52 20 6f 66  p the value R of
1c2f0 66 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  f the top of the
1c300 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 56 45   stack.  */.  VE
1c310 52 49 46 59 28 20 69 66 28 20 6e 6f 73 3c 30 20  RIFY( if( nos<0 
1c320 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
1c330 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 49 6e 74  h_stack; ).  Int
1c340 65 67 65 72 69 66 79 28 70 2c 20 74 6f 73 29 3b  egerify(p, tos);
1c350 0a 20 20 52 20 3d 20 61 53 74 61 63 6b 5b 74 6f  .  R = aStack[to
1c360 73 5d 2e 69 3b 20 20 20 0a 20 20 50 4f 50 53 54  s].i;   .  POPST
1c370 41 43 4b 3b 0a 20 20 69 66 28 20 56 45 52 49 46  ACK;.  if( VERIF
1c380 59 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  Y( i>=0 && i<p->
1c390 6e 43 75 72 73 6f 72 20 26 26 20 29 20 28 70 43  nCursor && ) (pC
1c3a0 72 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69 5d  rsr = p->aCsr[i]
1c3b0 2e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a  .pCursor)!=0 ){.
1c3c0 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
1c3d0 0a 20 20 20 20 69 6e 74 20 76 3b 20 20 20 20 20  .    int v;     
1c3e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
1c3f0 64 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20  d number on the 
1c400 50 31 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  P1 entry that ma
1c410 74 63 68 65 73 20 4b 20 2a 2f 0a 20 20 20 20 63  tches K */.    c
1c420 68 61 72 20 2a 7a 4b 65 79 3b 20 20 20 20 2f 2a  har *zKey;    /*
1c430 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4b 20   The value of K 
1c440 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  */.    int nKey;
1c450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c460 6f 66 20 62 79 74 65 73 20 69 6e 20 4b 20 2a 2f  of bytes in K */
1c470 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
1c480 72 65 20 4b 20 69 73 20 61 20 73 74 72 69 6e 67  re K is a string
1c490 20 61 6e 64 20 6d 61 6b 65 20 7a 4b 65 79 20 70   and make zKey p
1c4a0 6f 69 6e 74 20 74 6f 20 4b 0a 20 20 20 20 2a 2f  oint to K.    */
1c4b0 0a 20 20 20 20 53 74 72 69 6e 67 69 66 79 28 70  .    Stringify(p
1c4c0 2c 20 6e 6f 73 29 3b 0a 20 20 20 20 7a 4b 65 79  , nos);.    zKey
1c4d0 20 3d 20 7a 53 74 61 63 6b 5b 6e 6f 73 5d 3b 0a   = zStack[nos];.
1c4e0 20 20 20 20 6e 4b 65 79 20 3d 20 61 53 74 61 63      nKey = aStac
1c4f0 6b 5b 6e 6f 73 5d 2e 6e 3b 0a 20 20 20 20 61 73  k[nos].n;.    as
1c500 73 65 72 74 28 20 6e 4b 65 79 20 3e 3d 20 34 20  sert( nKey >= 4 
1c510 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  );..    /* Searc
1c520 68 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 69  h for an entry i
1c530 6e 20 50 31 20 77 68 65 72 65 20 61 6c 6c 20 62  n P1 where all b
1c540 75 74 20 74 68 65 20 6c 61 73 74 20 66 6f 75 72  ut the last four
1c550 20 62 79 74 65 73 20 6d 61 74 63 68 20 4b 2e 0a   bytes match K..
1c560 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1c570 69 73 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79  is no such entry
1c580 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
1c590 6c 79 20 74 6f 20 50 32 2e 0a 20 20 20 20 2a 2f  ly to P2..    */
1c5a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c5b0 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 72 73  BtreeMoveto(pCrs
1c5c0 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2d 34 2c  r, zKey, nKey-4,
1c5d0 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
1c5e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c5f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1c600 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  o_error;.    if(
1c610 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
1c620 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
1c630 4e 65 78 74 28 70 43 72 73 72 2c 20 26 72 65 73  Next(pCrsr, &res
1c640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
1c650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d   ){.        pc =
1c660 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1c670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1c690 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4b  c = sqliteBtreeK
1c6a0 65 79 43 6f 6d 70 61 72 65 28 70 43 72 73 72 2c  eyCompare(pCrsr,
1c6b0 20 7a 4b 65 79 2c 20 6e 4b 65 79 2d 34 2c 20 34   zKey, nKey-4, 4
1c6c0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
1c6d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c6e0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1c6f0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to_error;.    if
1c700 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
1c710 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1c720 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1c730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
1c740 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 43 72   this point, pCr
1c750 73 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  sr is pointing t
1c760 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 50 31  o an entry in P1
1c770 20 77 68 65 72 65 20 61 6c 6c 20 62 75 74 0a 20   where all but. 
1c780 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 66     ** the last f
1c790 6f 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  or bytes of the 
1c7a0 6b 65 79 20 6d 61 74 63 68 20 4b 2e 20 20 43 68  key match K.  Ch
1c7b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1c7c0 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 66 6f  e last.    ** fo
1c7d0 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
1c7e0 6b 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e  key are differen
1c7f0 74 20 66 72 6f 6d 20 52 2e 20 20 49 66 20 74 68  t from R.  If th
1c800 65 20 6c 61 73 74 20 66 6f 75 72 0a 20 20 20 20  e last four.    
1c810 2a 2a 20 62 79 74 65 73 20 65 71 75 61 6c 20 52  ** bytes equal R
1c820 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64   then jump immed
1c830 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 20 20  iately to P2..  
1c840 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 42    */.    sqliteB
1c850 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c 20 6e  treeKey(pCrsr, n
1c860 4b 65 79 20 2d 20 34 2c 20 34 2c 20 28 63 68 61  Key - 4, 4, (cha
1c870 72 2a 29 26 76 29 3b 0a 20 20 20 20 76 20 3d 20  r*)&v);.    v = 
1c880 6b 65 79 54 6f 49 6e 74 28 76 29 3b 0a 20 20 20  keyToInt(v);.   
1c890 20 69 66 28 20 76 3d 3d 52 20 29 7b 0a 20 20 20   if( v==R ){.   
1c8a0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1c8b0 2d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  - 1;.      break
1c8c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c8d0 54 68 65 20 6c 61 73 74 20 66 6f 75 72 20 62 79  The last four by
1c8e0 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 61  tes of the key a
1c8f0 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  re different fro
1c900 6d 20 52 2e 20 20 43 6f 6e 76 65 72 74 20 74 68  m R.  Convert th
1c910 65 0a 20 20 20 20 2a 2a 20 6c 61 73 74 20 66 6f  e.    ** last fo
1c920 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
1c930 6b 65 79 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65  key into an inte
1c940 67 65 72 20 61 6e 64 20 70 75 73 68 20 69 74 20  ger and push it 
1c950 6f 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  onto the.    ** 
1c960 73 74 61 63 6b 2e 20 20 28 54 68 65 73 65 20 62  stack.  (These b
1c970 79 74 65 73 20 61 72 65 20 74 68 65 20 72 65 63  ytes are the rec
1c980 6f 72 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  ord number of an
1c990 20 65 6e 74 72 79 20 74 68 61 74 0a 20 20 20 20   entry that.    
1c9a0 2a 2a 20 76 69 6f 6c 61 74 65 73 20 61 20 55 4e  ** violates a UN
1c9b0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
1c9c0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ).    */.    p->
1c9d0 74 6f 73 2b 2b 3b 0a 20 20 20 20 61 53 74 61 63  tos++;.    aStac
1c9e0 6b 5b 74 6f 73 5d 2e 69 20 3d 20 76 3b 0a 20 20  k[tos].i = v;.  
1c9f0 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c    aStack[tos].fl
1ca00 61 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20  ags = STK_Int;. 
1ca10 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1ca20 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69  * Opcode: NotExi
1ca30 73 74 73 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a  sts P1 P2 *.**.*
1ca40 2a 20 55 73 65 20 74 68 65 20 74 6f 70 20 6f 66  * Use the top of
1ca50 20 74 68 65 20 73 74 61 63 6b 20 61 73 20 61 20   the stack as a 
1ca60 69 6e 74 65 67 65 72 20 6b 65 79 2e 20 20 49 66  integer key.  If
1ca70 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 74   a record with t
1ca80 68 61 74 20 6b 65 79 0a 2a 2a 20 64 6f 65 73 20  hat key.** does 
1ca90 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 61 62  not exist in tab
1caa0 6c 65 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a  le of P1, then j
1cab0 75 6d 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74  ump to P2.  If t
1cac0 68 65 20 72 65 63 6f 72 64 0a 2a 2a 20 64 6f 65  he record.** doe
1cad0 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 66 61  s exist, then fa
1cae0 6c 6c 20 74 68 72 75 2e 20 20 54 68 65 20 63 75  ll thru.  The cu
1caf0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1cb00 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  nting to the.** 
1cb10 72 65 63 6f 72 64 20 69 66 20 69 74 20 65 78 69  record if it exi
1cb20 73 74 73 2e 20 20 54 68 65 20 69 6e 74 65 67 65  sts.  The intege
1cb30 72 20 6b 65 79 20 69 73 20 70 6f 70 70 65 64 20  r key is popped 
1cb40 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
1cb50 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1cb60 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1cb70 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20  s operation and 
1cb80 4e 6f 74 46 6f 75 6e 64 20 69 73 20 74 68 61 74  NotFound is that
1cb90 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69   this.** operati
1cba0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 6b  on assumes the k
1cbb0 65 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ey is an integer
1cbc0 20 61 6e 64 20 4e 6f 74 46 6f 75 6e 64 20 61 73   and NotFound as
1cbd0 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 61  sumes it.** is a
1cbe0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53   string..**.** S
1cbf0 65 65 20 61 6c 73 6f 3a 20 44 69 73 74 69 6e 63  ee also: Distinc
1cc00 74 2c 20 46 6f 75 6e 64 2c 20 4d 6f 76 65 54 6f  t, Found, MoveTo
1cc10 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73 55 6e  , NotFound, IsUn
1cc20 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
1cc30 4e 6f 74 45 78 69 73 74 73 3a 20 7b 0a 20 20 69  NotExists: {.  i
1cc40 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
1cc50 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
1cc60 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  os;.  BtCursor *
1cc70 70 43 72 73 72 3b 0a 20 20 56 45 52 49 46 59 28  pCrsr;.  VERIFY(
1cc80 20 69 66 28 20 74 6f 73 3c 30 20 29 20 67 6f 74   if( tos<0 ) got
1cc90 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
1cca0 63 6b 3b 20 29 0a 20 20 69 66 28 20 56 45 52 49  ck; ).  if( VERI
1ccb0 46 59 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  FY( i>=0 && i<p-
1ccc0 3e 6e 43 75 72 73 6f 72 20 26 26 20 29 20 28 70  >nCursor && ) (p
1ccd0 43 72 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b 69  Crsr = p->aCsr[i
1cce0 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b  ].pCursor)!=0 ){
1ccf0 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 78  .    int res, rx
1cd00 2c 20 69 4b 65 79 3b 0a 20 20 20 20 61 73 73 65  , iKey;.    asse
1cd10 72 74 28 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  rt( aStack[tos].
1cd20 66 6c 61 67 73 20 26 20 53 54 4b 5f 49 6e 74 20  flags & STK_Int 
1cd30 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 69 6e  );.    iKey = in
1cd40 74 54 6f 4b 65 79 28 61 53 74 61 63 6b 5b 74 6f  tToKey(aStack[to
1cd50 73 5d 2e 69 29 3b 0a 20 20 20 20 72 78 20 3d 20  s].i);.    rx = 
1cd60 73 71 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74  sqliteBtreeMovet
1cd70 6f 28 70 43 72 73 72 2c 20 28 63 68 61 72 2a 29  o(pCrsr, (char*)
1cd80 26 69 4b 65 79 2c 20 73 69 7a 65 6f 66 28 69 6e  &iKey, sizeof(in
1cd90 74 29 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70  t), &res);.    p
1cda0 2d 3e 61 43 73 72 5b 69 5d 2e 6c 61 73 74 52 65  ->aCsr[i].lastRe
1cdb0 63 6e 6f 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73  cno = aStack[tos
1cdc0 5d 2e 69 3b 0a 20 20 20 20 70 2d 3e 61 43 73 72  ].i;.    p->aCsr
1cdd0 5b 69 5d 2e 72 65 63 6e 6f 49 73 56 61 6c 69 64  [i].recnoIsValid
1cde0 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 70   = res==0;.    p
1cdf0 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c 6c 52 6f  ->aCsr[i].nullRo
1ce00 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  w = 0;.    if( r
1ce10 78 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  x!=SQLITE_OK || 
1ce20 72 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  res!=0 ){.      
1ce30 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1ce40 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 73 72 5b  ;.      p->aCsr[
1ce50 69 5d 2e 72 65 63 6e 6f 49 73 56 61 6c 69 64 20  i].recnoIsValid 
1ce60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1ce70 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72 65   POPSTACK;.  bre
1ce80 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1ce90 3a 20 4e 65 77 52 65 63 6e 6f 20 50 31 20 2a 20  : NewRecno P1 * 
1cea0 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65  *.**.** Get a ne
1ceb0 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64  w integer record
1cec0 20 6e 75 6d 62 65 72 20 75 73 65 64 20 61 73 20   number used as 
1ced0 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62  the key to a tab
1cee0 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72  le..** The recor
1cef0 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  d number is not 
1cf00 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20  previously used 
1cf10 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20  as a key in the 
1cf20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1cf30 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31  e that cursor P1
1cf40 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65   points to.  The
1cf50 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
1cf60 65 72 20 69 73 20 70 75 73 68 65 64 20 0a 2a 2a  er is pushed .**
1cf70 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
1cf80 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52  .*/.case OP_NewR
1cf90 65 63 6e 6f 3a 20 7b 0a 20 20 69 6e 74 20 69 20  ecno: {.  int i 
1cfa0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74  = pOp->p1;.  int
1cfb0 20 76 20 3d 20 30 3b 0a 20 20 43 75 72 73 6f 72   v = 0;.  Cursor
1cfc0 20 2a 70 43 3b 0a 20 20 69 66 28 20 56 45 52 49   *pC;.  if( VERI
1cfd0 46 59 28 20 69 3c 30 20 7c 7c 20 69 3e 3d 70 2d  FY( i<0 || i>=p-
1cfe0 3e 6e 43 75 72 73 6f 72 20 7c 7c 20 29 20 28 70  >nCursor || ) (p
1cff0 43 20 3d 20 26 70 2d 3e 61 43 73 72 5b 69 5d 29  C = &p->aCsr[i])
1d000 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 29 7b 0a  ->pCursor==0 ){.
1d010 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 7d 65 6c      v = 0;.  }el
1d020 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  se{.    /* The n
1d030 65 78 74 20 72 6f 77 69 64 20 6f 72 20 72 65 63  ext rowid or rec
1d040 6f 72 64 20 6e 75 6d 62 65 72 20 28 64 69 66 66  ord number (diff
1d050 65 72 65 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  erent terms for 
1d060 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1d070 74 68 69 6e 67 29 20 69 73 20 6f 62 74 61 69 6e  thing) is obtain
1d080 65 64 20 69 6e 20 61 20 74 77 6f 2d 73 74 65 70  ed in a two-step
1d090 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
1d0a0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1d0b0 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20 66 69  we attempt to fi
1d0c0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  nd the largest e
1d0d0 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 61 6e  xisting rowid an
1d0e0 64 20 61 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a  d add one.    **
1d0f0 20 74 6f 20 74 68 61 74 2e 20 20 42 75 74 20 69   to that.  But i
1d100 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1d110 69 73 74 69 6e 67 20 72 6f 77 69 64 20 69 73 20  isting rowid is 
1d120 61 6c 72 65 61 64 79 20 74 68 65 20 6d 61 78 69  already the maxi
1d130 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74  mum.    ** posit
1d140 69 76 65 20 69 6e 74 65 67 65 72 2c 20 77 65 20  ive integer, we 
1d150 68 61 76 65 20 74 6f 20 66 61 6c 6c 20 74 68 72  have to fall thr
1d160 6f 75 67 68 20 74 6f 20 74 68 65 20 73 65 63 6f  ough to the seco
1d170 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  nd.    ** probab
1d180 69 6c 69 73 74 69 63 20 61 6c 67 6f 72 69 74 68  ilistic algorith
1d190 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  m.    **.    ** 
1d1a0 54 68 65 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72  The second algor
1d1b0 69 74 68 6d 20 69 73 20 74 6f 20 73 65 6c 65 63  ithm is to selec
1d1c0 74 20 61 20 72 6f 77 69 64 20 61 74 20 72 61 6e  t a rowid at ran
1d1d0 64 6f 6d 20 61 6e 64 20 73 65 65 20 69 66 0a 20  dom and see if. 
1d1e0 20 20 20 2a 2a 20 69 74 20 61 6c 72 65 61 64 79     ** it already
1d1f0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 74   exists in the t
1d200 61 62 6c 65 2e 20 20 49 66 20 69 74 20 64 6f 65  able.  If it doe
1d210 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20  s not exist, we 
1d220 68 61 76 65 0a 20 20 20 20 2a 2a 20 73 75 63 63  have.    ** succ
1d230 65 65 64 65 64 2e 20 20 49 66 20 74 68 65 20 72  eeded.  If the r
1d240 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73  andom rowid does
1d250 20 65 78 69 73 74 2c 20 77 65 20 73 65 6c 65 63   exist, we selec
1d260 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20  t a new one.    
1d270 2a 2a 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ** and try again
1d280 2c 20 75 70 20 74 6f 20 31 30 30 30 20 74 69 6d  , up to 1000 tim
1d290 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1d2a0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1d2b0 74 68 20 6c 65 73 73 20 74 68 61 6e 20 32 20 62  th less than 2 b
1d2c0 69 6c 6c 69 6f 6e 20 65 6e 74 72 69 65 73 2c 20  illion entries, 
1d2d0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 0a  the probability.
1d2e0 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 20 66 69      ** of not fi
1d2f0 6e 64 69 6e 67 20 61 20 75 6e 75 73 65 64 20 72  nding a unused r
1d300 6f 77 69 64 20 69 73 20 61 62 6f 75 74 20 31 2e  owid is about 1.
1d310 30 65 2d 33 30 30 2e 20 20 54 68 69 73 20 69 73  0e-300.  This is
1d320 20 61 20 0a 20 20 20 20 2a 2a 20 6e 6f 6e 2d 7a   a .    ** non-z
1d330 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 2c  ero probability,
1d340 20 62 75 74 20 69 74 20 69 73 20 73 74 69 6c 6c   but it is still
1d350 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1d360 6c 6c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ll and should.  
1d370 20 20 2a 2a 20 6e 65 76 65 72 20 63 61 75 73 65    ** never cause
1d380 20 61 20 70 72 6f 62 6c 65 6d 2e 20 20 59 6f 75   a problem.  You
1d390 20 61 72 65 20 6d 75 63 68 2c 20 6d 75 63 68 20   are much, much 
1d3a0 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 68  more likely to h
1d3b0 61 76 65 20 61 0a 20 20 20 20 2a 2a 20 68 61 72  ave a.    ** har
1d3c0 64 77 61 72 65 20 66 61 69 6c 75 72 65 20 74 68  dware failure th
1d3d0 61 6e 20 66 6f 72 20 74 68 69 73 20 61 6c 67 6f  an for this algo
1d3e0 72 69 74 68 6d 20 74 6f 20 66 61 69 6c 2e 0a 20  rithm to fail.. 
1d3f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1d400 20 61 6e 61 6c 79 73 69 73 20 69 6e 20 74 68 65   analysis in the
1d410 20 70 72 65 76 69 6f 75 73 20 70 61 72 61 67 72   previous paragr
1d420 61 70 68 20 61 73 73 75 6d 65 73 20 74 68 61 74  aph assumes that
1d430 20 79 6f 75 20 68 61 76 65 20 61 20 67 6f 6f 64   you have a good
1d440 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 20 6f  .    ** source o
1d450 66 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 73  f random numbers
1d460 2e 20 20 49 73 20 61 20 6c 69 62 72 61 72 79 20  .  Is a library 
1d470 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 6c 72  function like lr
1d480 61 6e 64 34 38 28 29 0a 20 20 20 20 2a 2a 20 67  and48().    ** g
1d490 6f 6f 64 20 65 6e 6f 75 67 68 3f 20 20 4d 61 79  ood enough?  May
1d4a0 62 65 2e 20 4d 61 79 62 65 20 6e 6f 74 2e 20 49  be. Maybe not. I
1d4b0 74 27 73 20 68 61 72 64 20 74 6f 20 6b 6e 6f 77  t's hard to know
1d4c0 20 77 68 65 74 68 65 72 20 74 68 65 72 65 0a 20   whether there. 
1d4d0 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1d4e0 75 62 74 6c 65 20 62 75 67 73 20 69 73 20 73 6f  ubtle bugs is so
1d4f0 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  me implementatio
1d500 6e 73 20 6f 66 20 6c 72 61 6e 64 34 38 28 29 20  ns of lrand48() 
1d510 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 75 6c  that.    ** coul
1d520 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
1d530 2e 20 54 6f 20 61 76 6f 69 64 20 75 6e 63 65 72  . To avoid uncer
1d540 74 61 69 6e 74 79 2c 20 53 51 4c 69 74 65 20 75  tainty, SQLite u
1d550 73 65 73 20 69 74 73 20 6f 77 6e 20 0a 20 20 20  ses its own .   
1d560 20 2a 2a 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65   ** random numbe
1d570 72 20 67 65 6e 65 72 61 74 6f 72 20 62 61 73 65  r generator base
1d580 64 20 6f 6e 20 74 68 65 20 52 43 34 20 61 6c 67  d on the RC4 alg
1d590 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20  orithm..    **. 
1d5a0 20 20 20 2a 2a 20 54 6f 20 70 72 6f 6d 6f 74 65     ** To promote
1d5b0 20 6c 6f 63 61 6c 69 74 79 20 6f 66 20 72 65 66   locality of ref
1d5c0 65 72 65 6e 63 65 20 66 6f 72 20 72 65 70 65 74  erence for repet
1d5d0 69 74 69 76 65 20 69 6e 73 65 72 74 73 2c 20 74  itive inserts, t
1d5e0 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
1d5f0 66 65 77 20 61 74 74 65 6d 70 74 73 20 61 74 20  few attempts at 
1d600 63 68 6f 73 69 6e 67 20 61 20 72 61 6e 64 6f 6d  chosing a random
1d610 20 72 6f 77 69 64 20 70 69 63 6b 20 76 61 6c 75   rowid pick valu
1d620 65 73 20 6a 75 73 74 20 61 20 6c 69 74 74 6c 65  es just a little
1d630 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  .    ** larger t
1d640 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
1d650 20 72 6f 77 69 64 2e 20 20 54 68 69 73 20 68 61   rowid.  This ha
1d660 73 20 62 65 65 6e 20 73 68 6f 77 6e 20 65 78 70  s been shown exp
1d670 65 72 69 6d 65 6e 74 61 6c 6c 79 0a 20 20 20 20  erimentally.    
1d680 2a 2a 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65  ** to double the
1d690 20 73 70 65 65 64 20 6f 66 20 74 68 65 20 43 4f   speed of the CO
1d6a0 50 59 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  PY operation..  
1d6b0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 73    */.    int res
1d6c0 2c 20 72 78 2c 20 63 6e 74 2c 20 78 3b 0a 20 20  , rx, cnt, x;.  
1d6d0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69    cnt = 0;.    i
1d6e0 66 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f  f( !pC->useRando
1d6f0 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
1d700 69 66 28 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69  if( pC->nextRowi
1d710 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
1d720 20 20 76 20 3d 20 70 43 2d 3e 6e 65 78 74 52 6f    v = pC->nextRo
1d730 77 69 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  wid;.      }else
1d740 7b 0a 20 20 20 20 20 20 20 20 72 78 20 3d 20 73  {.        rx = s
1d750 71 6c 69 74 65 42 74 72 65 65 4c 61 73 74 28 70  qliteBtreeLast(p
1d760 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
1d770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d780 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1d790 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  v = 1;.        }
1d7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d7b0 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79 28 70  sqliteBtreeKey(p
1d7c0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 73  C->pCursor, 0, s
1d7d0 69 7a 65 6f 66 28 76 29 2c 20 28 76 6f 69 64 2a  izeof(v), (void*
1d7e0 29 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )&v);.          
1d7f0 76 20 3d 20 6b 65 79 54 6f 49 6e 74 28 76 29 3b  v = keyToInt(v);
1d800 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
1d810 3d 3d 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  ==0x7fffffff ){.
1d820 20 20 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e              pC->
1d830 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d  useRandomRowid =
1d840 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
1d850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1d860 20 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   v++;.          
1d870 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1d880 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 76 3c    }.      if( v<
1d890 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
1d8a0 20 20 20 20 20 20 70 43 2d 3e 6e 65 78 74 52 6f        pC->nextRo
1d8b0 77 69 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  widValid = 1;.  
1d8c0 20 20 20 20 20 20 70 43 2d 3e 6e 65 78 74 52 6f        pC->nextRo
1d8d0 77 69 64 20 3d 20 76 2b 31 3b 0a 20 20 20 20 20  wid = v+1;.     
1d8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d8f0 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c  pC->nextRowidVal
1d900 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  id = 0;.      }.
1d910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1d920 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
1d930 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 64 62   ){.      v = db
1d940 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 3b  ->priorNewRowid;
1d950 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  .      cnt = 0;.
1d960 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1d970 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 63 6e    if( v==0 || cn
1d980 74 3e 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t>2 ){.         
1d990 20 76 20 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f   v = sqliteRando
1d9a0 6d 49 6e 74 65 67 65 72 28 29 3b 0a 20 20 20 20  mInteger();.    
1d9b0 20 20 20 20 20 20 69 66 28 20 63 6e 74 3c 35 20        if( cnt<5 
1d9c0 29 20 76 20 26 3d 20 30 78 66 66 66 66 66 66 3b  ) v &= 0xffffff;
1d9d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d9e0 20 20 20 20 20 20 20 20 20 20 76 20 2b 3d 20 73            v += s
1d9f0 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28  qliteRandomByte(
1da00 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  ) + 1;.        }
1da10 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d  .        if( v==
1da20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1da30 20 20 20 20 20 20 78 20 3d 20 69 6e 74 54 6f 4b        x = intToK
1da40 65 79 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  ey(v);.        r
1da50 78 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4d  x = sqliteBtreeM
1da60 6f 76 65 74 6f 28 70 43 2d 3e 70 43 75 72 73 6f  oveto(pC->pCurso
1da70 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 69 6e  r, &x, sizeof(in
1da80 74 29 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  t), &res);.     
1da90 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
1daa0 7d 77 68 69 6c 65 28 20 63 6e 74 3c 31 30 30 30  }while( cnt<1000
1dab0 20 26 26 20 72 78 3d 3d 53 51 4c 49 54 45 5f 4f   && rx==SQLITE_O
1dac0 4b 20 26 26 20 72 65 73 3d 3d 30 20 29 3b 0a 20  K && res==0 );. 
1dad0 20 20 20 20 20 64 62 2d 3e 70 72 69 6f 72 4e 65       db->priorNe
1dae0 77 52 6f 77 69 64 20 3d 20 76 3b 0a 20 20 20 20  wRowid = v;.    
1daf0 20 20 69 66 28 20 72 78 3d 3d 53 51 4c 49 54 45    if( rx==SQLITE
1db00 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29 7b  _OK && res==0 ){
1db10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1db20 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1db30 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1db40 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1db50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
1db60 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69 64 20 3d  ->recnoIsValid =
1db70 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 74 6f 73   0;.  }.  p->tos
1db80 2b 2b 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e  ++;.  aStack[p->
1db90 74 6f 73 5d 2e 69 20 3d 20 76 3b 0a 20 20 61 53  tos].i = v;.  aS
1dba0 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61  tack[p->tos].fla
1dbb0 67 73 20 3d 20 53 54 4b 5f 49 6e 74 3b 0a 20 20  gs = STK_Int;.  
1dbc0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1dbd0 6f 64 65 3a 20 50 75 74 49 6e 74 4b 65 79 20 50  ode: PutIntKey P
1dbe0 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69  1 P2 *.**.** Wri
1dbf0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
1dc00 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75   the table of cu
1dc10 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20  rsor P1.  A new 
1dc20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61  entry is.** crea
1dc30 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ted if it doesn'
1dc40 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
1dc50 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  or the data for 
1dc60 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65  an existing.** e
1dc70 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74  ntry is overwrit
1dc80 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69  ten.  The data i
1dc90 73 20 74 68 65 20 76 61 6c 75 65 20 6f 6e 20 74  s the value on t
1dca0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
1dcb0 20 73 74 61 63 6b 2e 20 20 54 68 65 20 6b 65 79   stack.  The key
1dcc0 20 69 73 20 74 68 65 20 6e 65 78 74 20 76 61 6c   is the next val
1dcd0 75 65 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73  ue down on the s
1dce0 74 61 63 6b 2e 20 20 54 68 65 20 6b 65 79 20 6d  tack.  The key m
1dcf0 75 73 74 0a 2a 2a 20 62 65 20 61 6e 20 69 6e 74  ust.** be an int
1dd00 65 67 65 72 2e 20 20 54 68 65 20 73 74 61 63 6b  eger.  The stack
1dd10 20 69 73 20 70 6f 70 70 65 64 20 74 77 69 63 65   is popped twice
1dd20 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63   by this instruc
1dd30 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
1dd40 32 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 72 6f  2==1 then the ro
1dd50 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69  w change count i
1dd60 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 20 20  s incremented.  
1dd70 49 66 20 50 32 3d 3d 30 20 74 68 65 0a 2a 2a 20  If P2==0 the.** 
1dd80 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
1dd90 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20   is unmodified. 
1dda0 20 54 68 65 20 72 6f 77 69 64 20 69 73 20 73 74   The rowid is st
1ddb0 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
1ddc0 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e 20 62 79  ent.** return by
1ddd0 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 61 73 74   the sqlite_last
1dde0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
1ddf0 66 75 6e 63 74 69 6f 6e 20 69 66 20 50 32 20 69  function if P2 i
1de00 73 20 31 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  s 1..*/./* Opcod
1de10 65 3a 20 50 75 74 53 74 72 4b 65 79 20 50 31 20  e: PutStrKey P1 
1de20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
1de30 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
1de40 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f  e table of curso
1de50 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74  r P1.  A new ent
1de60 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64  ry is.** created
1de70 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61   if it doesn't a
1de80 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20  lready exist or 
1de90 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20  the data for an 
1dea0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72  existing.** entr
1deb0 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  y is overwritten
1dec0 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74  .  The data is t
1ded0 68 65 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  he value on the 
1dee0 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
1def0 61 63 6b 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ack.  The key is
1df00 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
1df10 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61 63  down on the stac
1df20 6b 2e 20 20 54 68 65 20 6b 65 79 20 6d 75 73 74  k.  The key must
1df30 0a 2a 2a 20 62 65 20 61 20 73 74 72 69 6e 67 2e  .** be a string.
1df40 20 20 54 68 65 20 73 74 61 63 6b 20 69 73 20 70    The stack is p
1df50 6f 70 70 65 64 20 74 77 69 63 65 20 62 79 20 74  opped twice by t
1df60 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
1df70 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 61 79 20 6e 6f  .**.** P1 may no
1df80 74 20 62 65 20 61 20 70 73 65 75 64 6f 2d 74 61  t be a pseudo-ta
1df90 62 6c 65 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  ble opened using
1dfa0 20 74 68 65 20 4f 70 65 6e 50 73 65 75 64 6f 20   the OpenPseudo 
1dfb0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20  opcode..*/.case 
1dfc0 4f 50 5f 50 75 74 49 6e 74 4b 65 79 3a 0a 63 61  OP_PutIntKey:.ca
1dfd0 73 65 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 3a  se OP_PutStrKey:
1dfe0 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70   {.  int tos = p
1dff0 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 6e 6f 73  ->tos;.  int nos
1e000 20 3d 20 70 2d 3e 74 6f 73 2d 31 3b 0a 20 20 69   = p->tos-1;.  i
1e010 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
1e020 20 20 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20    Cursor *pC;.  
1e030 56 45 52 49 46 59 28 20 69 66 28 20 6e 6f 73 3c  VERIFY( if( nos<
1e040 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  0 ) goto not_eno
1e050 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69  ugh_stack; ).  i
1e060 66 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20  f( VERIFY( i>=0 
1e070 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
1e080 26 26 20 29 0a 20 20 20 20 20 20 28 28 70 43 20  && ).      ((pC 
1e090 3d 20 26 70 2d 3e 61 43 73 72 5b 69 5d 29 2d 3e  = &p->aCsr[i])->
1e0a0 70 43 75 72 73 6f 72 21 3d 30 20 7c 7c 20 70 43  pCursor!=0 || pC
1e0b0 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 29 20 29  ->pseudoTable) )
1e0c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79  {.    char *zKey
1e0d0 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ;.    int nKey, 
1e0e0 69 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 70 4f  iKey;.    if( pO
1e0f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75  p->opcode==OP_Pu
1e100 74 53 74 72 4b 65 79 20 29 7b 0a 20 20 20 20 20  tStrKey ){.     
1e110 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 6e 6f   Stringify(p, no
1e120 73 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d  s);.      nKey =
1e130 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b 0a   aStack[nos].n;.
1e140 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 53 74        zKey = zSt
1e150 61 63 6b 5b 6e 6f 73 5d 3b 0a 20 20 20 20 7d 65  ack[nos];.    }e
1e160 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1e170 74 28 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66  t( aStack[nos].f
1e180 6c 61 67 73 20 26 20 53 54 4b 5f 49 6e 74 20 29  lags & STK_Int )
1e190 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 73  ;.      nKey = s
1e1a0 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20  izeof(int);.    
1e1b0 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f 4b 65    iKey = intToKe
1e1c0 79 28 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 29  y(aStack[nos].i)
1e1d0 3b 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 28  ;.      zKey = (
1e1e0 63 68 61 72 2a 29 26 69 4b 65 79 3b 0a 20 20 20  char*)&iKey;.   
1e1f0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29     if( pOp->p2 )
1e200 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 43  {.        db->nC
1e210 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 20 20 20  hange++;.       
1e220 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
1e230 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 69 3b 0a   aStack[nos].i;.
1e240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e250 28 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56  ( pC->nextRowidV
1e260 61 6c 69 64 20 26 26 20 61 53 74 61 63 6b 5b 6e  alid && aStack[n
1e270 6f 73 5d 2e 69 3e 3d 70 43 2d 3e 6e 65 78 74 52  os].i>=pC->nextR
1e280 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
1e290 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c  pC->nextRowidVal
1e2a0 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  id = 0;.      }.
1e2b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1e2c0 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 7b  ->pseudoTable ){
1e2d0 0a 20 20 20 20 20 20 2f 2a 20 50 75 74 53 74 72  .      /* PutStr
1e2e0 4b 65 79 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  Key does not wor
1e2f0 6b 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61 62  k for pseudo-tab
1e300 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  les..      ** Th
1e310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1e320 72 74 20 6d 61 6b 65 73 20 73 75 72 65 20 77 65  rt makes sure we
1e330 20 61 72 65 20 6e 6f 74 20 74 72 79 69 6e 67 20   are not trying 
1e340 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
1e350 50 75 74 53 74 72 4b 65 79 20 6f 6e 20 61 20 70  PutStrKey on a p
1e360 73 65 75 64 6f 2d 74 61 62 6c 65 0a 20 20 20 20  seudo-table.    
1e370 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
1e380 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
1e390 4f 50 5f 50 75 74 49 6e 74 4b 65 79 20 29 3b 0a  OP_PutIntKey );.
1e3a0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1e3b0 28 70 43 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  (pC->pData);.   
1e3c0 20 20 20 70 43 2d 3e 69 4b 65 79 20 3d 20 69 4b     pC->iKey = iK
1e3d0 65 79 3b 0a 20 20 20 20 20 20 70 43 2d 3e 6e 44  ey;.      pC->nD
1e3e0 61 74 61 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73  ata = aStack[tos
1e3f0 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ].n;.      if( a
1e400 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
1e410 20 26 20 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20   & STK_Dyn ){.  
1e420 20 20 20 20 20 20 70 43 2d 3e 70 44 61 74 61 20        pC->pData 
1e430 3d 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b 0a 20  = zStack[tos];. 
1e440 20 20 20 20 20 20 20 7a 53 74 61 63 6b 5b 74 6f         zStack[to
1e450 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
1e460 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
1e470 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20  s = STK_Null;.  
1e480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e490 20 20 20 70 43 2d 3e 70 44 61 74 61 20 3d 20 73     pC->pData = s
1e4a0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1e4b0 70 43 2d 3e 6e 44 61 74 61 20 29 3b 0a 20 20 20  pC->nData );.   
1e4c0 20 20 20 20 20 69 66 28 20 70 43 2d 3e 70 44 61       if( pC->pDa
1e4d0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
1e4e0 6d 65 6d 63 70 79 28 70 43 2d 3e 70 44 61 74 61  memcpy(pC->pData
1e4f0 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 70  , zStack[tos], p
1e500 43 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  C->nData);.     
1e510 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e520 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
1e530 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1e540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e550 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e  BtreeInsert(pC->
1e560 70 43 75 72 73 6f 72 2c 20 7a 4b 65 79 2c 20 6e  pCursor, zKey, n
1e570 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1e590 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 61 53 74 61  Stack[tos], aSta
1e5a0 63 6b 5b 74 6f 73 5d 2e 6e 29 3b 0a 20 20 20 20  ck[tos].n);.    
1e5b0 7d 0a 20 20 20 20 70 43 2d 3e 72 65 63 6e 6f 49  }.    pC->recnoI
1e5c0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  sValid = 0;.  }.
1e5d0 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 50 4f    POPSTACK;.  PO
1e5e0 50 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b 3b  PSTACK;.  break;
1e5f0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
1e600 65 6c 65 74 65 20 50 31 20 50 32 20 2a 0a 2a 2a  elete P1 P2 *.**
1e610 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72  .** Delete the r
1e620 65 63 6f 72 64 20 61 74 20 77 68 69 63 68 20 74  ecord at which t
1e630 68 65 20 50 31 20 63 75 72 73 6f 72 20 69 73 20  he P1 cursor is 
1e640 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1e650 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  ng..**.** The cu
1e660 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66  rsor will be lef
1e670 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 69  t pointing at ei
1e680 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f 72  ther the next or
1e690 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
1e6a0 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74   record in the t
1e6b0 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20 6c  able. If it is l
1e6c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1e6d0 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2c  the next record,
1e6e0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78   then.** the nex
1e6f0 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  t Next instructi
1e700 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  on will be a no-
1e710 6f 70 2e 20 20 48 65 6e 63 65 20 69 74 20 69 73  op.  Hence it is
1e720 20 4f 4b 20 74 6f 20 64 65 6c 65 74 65 0a 2a 2a   OK to delete.**
1e730 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 77   a record from w
1e740 69 74 68 69 6e 20 61 6e 20 4e 65 78 74 20 6c 6f  ithin an Next lo
1e750 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f  op..**.** The ro
1e760 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  w change counter
1e770 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
1e780 69 66 20 50 32 3d 3d 31 20 61 6e 64 20 69 73 20  if P2==1 and is 
1e790 75 6e 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 69 66  unmodified.** if
1e7a0 20 50 32 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 49 66   P2==0..**.** If
1e7b0 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d   P1 is a pseudo-
1e7c0 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73  table, then this
1e7d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1e7e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
1e7f0 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20   OP_Delete: {.  
1e800 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  int i = pOp->p1;
1e810 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  .  Cursor *pC;. 
1e820 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
1e830 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b   i<p->nCursor );
1e840 0a 20 20 70 43 20 3d 20 26 70 2d 3e 61 43 73 72  .  pC = &p->aCsr
1e850 5b 69 5d 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70  [i];.  if( pC->p
1e860 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20  Cursor!=0 ){.   
1e870 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
1e880 65 44 65 6c 65 74 65 28 70 43 2d 3e 70 43 75 72  eDelete(pC->pCur
1e890 73 6f 72 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 65  sor);.    pC->ne
1e8a0 78 74 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 30  xtRowidValid = 0
1e8b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1e8c0 3e 70 32 20 29 20 64 62 2d 3e 6e 43 68 61 6e 67  >p2 ) db->nChang
1e8d0 65 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  e++;.  break;.}.
1e8e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4b 65 79 41  ./* Opcode: KeyA
1e8f0 73 44 61 74 61 20 50 31 20 50 32 20 2a 0a 2a 2a  sData P1 P2 *.**
1e900 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20 6b 65 79  .** Turn the key
1e910 2d 61 73 2d 64 61 74 61 20 6d 6f 64 65 20 66 6f  -as-data mode fo
1e920 72 20 63 75 72 73 6f 72 20 50 31 20 65 69 74 68  r cursor P1 eith
1e930 65 72 20 6f 6e 20 28 69 66 20 50 32 3d 3d 31 29  er on (if P2==1)
1e940 20 6f 72 0a 2a 2a 20 6f 66 66 20 28 69 66 20 50   or.** off (if P
1e950 32 3d 3d 30 29 2e 20 20 49 6e 20 6b 65 79 2d 61  2==0).  In key-a
1e960 73 2d 64 61 74 61 20 6d 6f 64 65 2c 20 74 68 65  s-data mode, the
1e970 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1e980 65 20 70 75 6c 6c 73 0a 2a 2a 20 64 61 74 61 20  e pulls.** data 
1e990 6f 66 66 20 6f 66 20 74 68 65 20 6b 65 79 20 72  off of the key r
1e9a0 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  ather than the d
1e9b0 61 74 61 2e 20 20 54 68 69 73 20 69 73 20 75 73  ata.  This is us
1e9c0 65 64 20 66 6f 72 0a 2a 2a 20 70 72 6f 63 65 73  ed for.** proces
1e9d0 73 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 20 73 65  sing compound se
1e9e0 6c 65 63 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  lects..*/.case O
1e9f0 50 5f 4b 65 79 41 73 44 61 74 61 3a 20 7b 0a 20  P_KeyAsData: {. 
1ea00 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
1ea10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
1ea20 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72   && i<p->nCursor
1ea30 20 29 3b 0a 20 20 70 2d 3e 61 43 73 72 5b 69 5d   );.  p->aCsr[i]
1ea40 2e 6b 65 79 41 73 44 61 74 61 20 3d 20 70 4f 70  .keyAsData = pOp
1ea50 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p2;.  break;.}
1ea60 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
1ea70 44 61 74 61 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a  Data P1 * *.**.*
1ea80 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 65 20  * Push onto the 
1ea90 73 74 61 63 6b 20 74 68 65 20 63 6f 6d 70 6c 65  stack the comple
1eaa0 74 65 20 72 6f 77 20 64 61 74 61 20 66 6f 72 20  te row data for 
1eab0 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68  cursor P1..** Th
1eac0 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70  ere is no interp
1ead0 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  retation of the 
1eae0 64 61 74 61 2e 20 20 49 74 20 69 73 20 6a 75 73  data.  It is jus
1eaf0 74 20 63 6f 70 69 65 64 0a 2a 2a 20 6f 6e 74 6f  t copied.** onto
1eb00 20 74 68 65 20 73 74 61 63 6b 20 65 78 61 63 74   the stack exact
1eb10 6c 79 20 61 73 20 69 74 20 69 73 20 66 6f 75 6e  ly as it is foun
1eb20 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
1eb30 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1eb40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1eb50 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
1eb60 20 76 61 6c 69 64 20 72 6f 77 2c 20 61 20 4e 55   valid row, a NU
1eb70 4c 4c 20 69 73 20 70 75 73 68 65 64 0a 2a 2a 20  LL is pushed.** 
1eb80 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
1eb90 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61  */.case OP_RowDa
1eba0 74 61 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ta: {.  int i = 
1ebb0 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74  pOp->p1;.  int t
1ebc0 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20  os = ++p->tos;. 
1ebd0 20 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69   Cursor *pC;.  i
1ebe0 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt n;..  assert(
1ebf0 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43   i>=0 && i<p->nC
1ec00 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
1ec10 26 70 2d 3e 61 43 73 72 5b 69 5d 3b 0a 20 20 69  &p->aCsr[i];.  i
1ec20 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  f( pC->nullRow )
1ec30 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73  {.    aStack[tos
1ec40 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75  ].flags = STK_Nu
1ec50 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ll;.  }else if( 
1ec60 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
1ec70 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
1ec80 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
1ec90 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d  sor;.    if( pC-
1eca0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
1ecb0 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c    aStack[tos].fl
1ecc0 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a  ags = STK_Null;.
1ecd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ece0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 6b   }else if( pC->k
1ecf0 65 79 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20  eyAsData ){.    
1ed00 20 20 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79    sqliteBtreeKey
1ed10 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29 3b  Size(pCrsr, &n);
1ed20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ed30 20 20 73 71 6c 69 74 65 42 74 72 65 65 44 61 74    sqliteBtreeDat
1ed40 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29  aSize(pCrsr, &n)
1ed50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
1ed60 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 6e 3b 0a 20  ck[tos].n = n;. 
1ed70 20 20 20 69 66 28 20 6e 3c 3d 4e 42 46 53 20 29     if( n<=NBFS )
1ed80 7b 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b 74  {.      aStack[t
1ed90 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f  os].flags = STK_
1eda0 53 74 72 3b 0a 20 20 20 20 20 20 7a 53 74 61 63  Str;.      zStac
1edb0 6b 5b 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b 5b  k[tos] = aStack[
1edc0 74 6f 73 5d 2e 7a 3b 0a 20 20 20 20 7d 65 6c 73  tos].z;.    }els
1edd0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
1ede0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1edf0 61 77 28 20 6e 20 29 3b 0a 20 20 20 20 20 20 69  aw( n );.      i
1ee00 66 28 20 7a 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  f( z==0 ) goto n
1ee10 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 61 53 74  o_mem;.      aSt
1ee20 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
1ee30 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 44   STK_Str | STK_D
1ee40 79 6e 3b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b  yn;.      zStack
1ee50 5b 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20 7d  [tos] = z;.    }
1ee60 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6b 65 79  .    if( pC->key
1ee70 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  AsData ){.      
1ee80 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79 28 70  sqliteBtreeKey(p
1ee90 43 72 73 72 2c 20 30 2c 20 6e 2c 20 7a 53 74 61  Crsr, 0, n, zSta
1eea0 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 20 20 7d 65  ck[tos]);.    }e
1eeb0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1eec0 65 42 74 72 65 65 44 61 74 61 28 70 43 72 73 72  eBtreeData(pCrsr
1eed0 2c 20 30 2c 20 6e 2c 20 7a 53 74 61 63 6b 5b 74  , 0, n, zStack[t
1eee0 6f 73 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  os]);.    }.  }e
1eef0 6c 73 65 20 69 66 28 20 70 43 2d 3e 70 73 65 75  lse if( pC->pseu
1ef00 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61  doTable ){.    a
1ef10 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 70  Stack[tos].n = p
1ef20 43 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 7a 53  C->nData;.    zS
1ef30 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 70 43 2d 3e  tack[tos] = pC->
1ef40 70 44 61 74 61 3b 0a 20 20 20 20 61 53 74 61 63  pData;.    aStac
1ef50 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[tos].flags = S
1ef60 54 4b 5f 53 74 72 7c 53 54 4b 5f 45 70 68 65 6d  TK_Str|STK_Ephem
1ef70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1ef80 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
1ef90 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 7d   = STK_Null;.  }
1efa0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1efb0 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50  Opcode: Column P
1efc0 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74  1 P2 *.**.** Int
1efd0 65 72 70 72 65 74 20 74 68 65 20 64 61 74 61 20  erpret the data 
1efe0 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70  that cursor P1 p
1eff0 6f 69 6e 74 73 20 74 6f 20 61 73 0a 2a 2a 20 61  oints to as.** a
1f000 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c 74   structure built
1f010 20 75 73 69 6e 67 20 74 68 65 20 4d 61 6b 65 52   using the MakeR
1f020 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
1f030 6e 2e 0a 2a 2a 20 28 53 65 65 20 74 68 65 20 4d  n..** (See the M
1f040 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1f050 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1f060 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1f070 74 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 61 74 20  t.** the format 
1f080 6f 66 20 74 68 65 20 64 61 74 61 2e 29 0a 2a 2a  of the data.).**
1f090 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 65 20 73   Push onto the s
1f0a0 74 61 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  tack the value o
1f0b0 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75  f the P2-th colu
1f0c0 6d 6e 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  mn contained.** 
1f0d0 69 6e 20 74 68 65 20 64 61 74 61 2e 0a 2a 2a 0a  in the data..**.
1f0e0 2a 2a 20 49 66 20 74 68 65 20 4b 65 79 41 73 44  ** If the KeyAsD
1f0f0 61 74 61 20 6f 70 63 6f 64 65 20 68 61 73 20 70  ata opcode has p
1f100 72 65 76 69 6f 75 73 6c 79 20 65 78 65 63 75 74  reviously execut
1f110 65 64 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ed on this curso
1f120 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 66  r,.** then the f
1f130 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 65 78  ield might be ex
1f140 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
1f150 20 6b 65 79 20 72 61 74 68 65 72 20 74 68 61 6e   key rather than
1f160 20 74 68 65 0a 2a 2a 20 64 61 74 61 2e 0a 2a 2a   the.** data..**
1f170 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 65 67  .** If P1 is neg
1f180 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
1f190 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65 64  record is stored
1f1a0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 72 61   on the stack ra
1f1b0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 69 6e 20  ther.** than in 
1f1c0 61 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 50 31  a table.  For P1
1f1d0 3d 3d 2d 31 2c 20 74 68 65 20 74 6f 70 20 6f 66  ==-1, the top of
1f1e0 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 75 73   the stack is us
1f1f0 65 64 2e 0a 2a 2a 20 46 6f 72 20 50 31 3d 3d 2d  ed..** For P1==-
1f200 32 2c 20 74 68 65 20 6e 65 78 74 20 6f 6e 20 74  2, the next on t
1f210 68 65 20 73 74 61 63 6b 20 69 73 20 75 73 65 64  he stack is used
1f220 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1f230 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70    The.** value p
1f240 75 73 68 65 64 20 69 73 20 61 6c 77 61 79 73 20  ushed is always 
1f250 6a 75 73 74 20 61 20 70 6f 69 6e 74 65 72 20 69  just a pointer i
1f260 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 77  nto the record w
1f270 68 69 63 68 20 69 73 0a 2a 2a 20 73 74 6f 72 65  hich is.** store
1f280 64 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 6f  d further down o
1f290 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
1f2a0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1f2b0 73 20 6e 6f 74 20 63 6f 70 69 65 64 2e 0a 2a 2f  s not copied..*/
1f2c0 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a  .case OP_Column:
1f2d0 20 7b 0a 20 20 69 6e 74 20 61 6d 74 2c 20 6f 66   {.  int amt, of
1f2e0 66 73 65 74 2c 20 65 6e 64 2c 20 70 61 79 6c 6f  fset, end, paylo
1f2f0 61 64 53 69 7a 65 3b 0a 20 20 69 6e 74 20 69 20  adSize;.  int i 
1f300 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74  = pOp->p1;.  int
1f310 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p2 = pOp->p2;. 
1f320 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74 6f   int tos = p->to
1f330 73 2b 31 3b 0a 20 20 43 75 72 73 6f 72 20 2a 70  s+1;.  Cursor *p
1f340 43 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 63 3b  C;.  char *zRec;
1f350 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
1f360 73 72 3b 0a 20 20 69 6e 74 20 69 64 78 57 69 64  sr;.  int idxWid
1f370 74 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  th;.  unsigned c
1f380 68 61 72 20 61 48 64 72 5b 31 30 5d 3b 0a 0a 20  har aHdr[10];.. 
1f390 20 61 73 73 65 72 74 28 20 69 3c 70 2d 3e 6e 43   assert( i<p->nC
1f3a0 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 69  ursor );.  if( i
1f3b0 3c 30 20 29 7b 0a 20 20 20 20 56 45 52 49 46 59  <0 ){.    VERIFY
1f3c0 28 20 69 66 28 20 74 6f 73 2b 69 3c 30 20 29 20  ( if( tos+i<0 ) 
1f3d0 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63  goto bad_instruc
1f3e0 74 69 6f 6e 3b 20 29 0a 20 20 20 20 56 45 52 49  tion; ).    VERI
1f3f0 46 59 28 20 69 66 28 20 28 61 53 74 61 63 6b 5b  FY( if( (aStack[
1f400 74 6f 73 2b 69 5d 2e 66 6c 61 67 73 20 26 20 53  tos+i].flags & S
1f410 54 4b 5f 53 74 72 29 3d 3d 30 20 29 20 67 6f 74  TK_Str)==0 ) got
1f420 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f  o bad_instructio
1f430 6e 3b 20 29 0a 20 20 20 20 7a 52 65 63 20 3d 20  n; ).    zRec = 
1f440 7a 53 74 61 63 6b 5b 74 6f 73 2b 69 5d 3b 0a 20  zStack[tos+i];. 
1f450 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d     payloadSize =
1f460 20 61 53 74 61 63 6b 5b 74 6f 73 2b 69 5d 2e 6e   aStack[tos+i].n
1f470 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
1f480 43 20 3d 20 26 70 2d 3e 61 43 73 72 5b 69 5d 29  C = &p->aCsr[i])
1f490 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a  ->pCursor!=0 ){.
1f4a0 20 20 20 20 7a 52 65 63 20 3d 20 30 3b 0a 20 20      zRec = 0;.  
1f4b0 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
1f4c0 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  ursor;.    if( p
1f4d0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
1f4e0 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20      payloadSize 
1f4f0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1f500 66 28 20 70 43 2d 3e 6b 65 79 41 73 44 61 74 61  f( pC->keyAsData
1f510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f520 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72  BtreeKeySize(pCr
1f530 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65  sr, &payloadSize
1f540 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f550 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 44      sqliteBtreeD
1f560 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26  ataSize(pCrsr, &
1f570 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20  payloadSize);.  
1f580 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1f590 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20  pC->pseudoTable 
1f5a0 29 7b 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69  ){.    payloadSi
1f5b0 7a 65 20 3d 20 70 43 2d 3e 6e 44 61 74 61 3b 0a  ze = pC->nData;.
1f5c0 20 20 20 20 7a 52 65 63 20 3d 20 70 43 2d 3e 70      zRec = pC->p
1f5d0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
1f5e0 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d 30  ( payloadSize==0
1f5f0 20 7c 7c 20 7a 52 65 63 21 3d 30 20 29 3b 0a 20   || zRec!=0 );. 
1f600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 79 6c   }else{.    payl
1f610 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  oadSize = 0;.  }
1f620 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1f630 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
1f640 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64   in the column d
1f650 61 74 61 20 61 6e 64 20 77 68 65 72 65 20 74 68  ata and where th
1f660 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 64 61  e column.  ** da
1f670 74 61 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a  ta begins..  */.
1f680 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a    if( payloadSiz
1f690 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61  e==0 ){.    aSta
1f6a0 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[tos].flags = 
1f6b0 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d  STK_Null;.    p-
1f6c0 3e 74 6f 73 20 3d 20 74 6f 73 3b 0a 20 20 20 20  >tos = tos;.    
1f6d0 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  break;.  }else i
1f6e0 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3c 32  f( payloadSize<2
1f6f0 35 36 20 29 7b 0a 20 20 20 20 69 64 78 57 69 64  56 ){.    idxWid
1f700 74 68 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  th = 1;.  }else 
1f710 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3c  if( payloadSize<
1f720 36 35 35 33 36 20 29 7b 0a 20 20 20 20 69 64 78  65536 ){.    idx
1f730 57 69 64 74 68 20 3d 20 32 3b 0a 20 20 7d 65 6c  Width = 2;.  }el
1f740 73 65 7b 0a 20 20 20 20 69 64 78 57 69 64 74 68  se{.    idxWidth
1f750 20 3d 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 3;.  }..  /* 
1f760 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
1f770 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
1f780 6f 6c 75 6d 6e 20 69 73 20 73 74 6f 72 65 64 20  olumn is stored 
1f790 61 6e 64 20 68 6f 77 20 62 69 67 20 69 74 20 69  and how big it i
1f7a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  s..  */.  if( pa
1f7b0 79 6c 6f 61 64 53 69 7a 65 20 3c 20 69 64 78 57  yloadSize < idxW
1f7c0 69 64 74 68 2a 28 70 32 2b 31 29 20 29 7b 0a 20  idth*(p2+1) ){. 
1f7d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1f7e0 4f 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f  ORRUPT;.    goto
1f7f0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1f800 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ror;.  }.  if( z
1f810 52 65 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  Rec ){.    memcp
1f820 79 28 61 48 64 72 2c 20 26 7a 52 65 63 5b 69 64  y(aHdr, &zRec[id
1f830 78 57 69 64 74 68 2a 70 32 5d 2c 20 69 64 78 57  xWidth*p2], idxW
1f840 69 64 74 68 2a 32 29 3b 0a 20 20 7d 65 6c 73 65  idth*2);.  }else
1f850 20 69 66 28 20 70 43 2d 3e 6b 65 79 41 73 44 61   if( pC->keyAsDa
1f860 74 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ta ){.    sqlite
1f870 42 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c 20  BtreeKey(pCrsr, 
1f880 69 64 78 57 69 64 74 68 2a 70 32 2c 20 69 64 78  idxWidth*p2, idx
1f890 57 69 64 74 68 2a 32 2c 20 28 63 68 61 72 2a 29  Width*2, (char*)
1f8a0 61 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  aHdr);.  }else{.
1f8b0 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 44      sqliteBtreeD
1f8c0 61 74 61 28 70 43 72 73 72 2c 20 69 64 78 57 69  ata(pCrsr, idxWi
1f8d0 64 74 68 2a 70 32 2c 20 69 64 78 57 69 64 74 68  dth*p2, idxWidth
1f8e0 2a 32 2c 20 28 63 68 61 72 2a 29 61 48 64 72 29  *2, (char*)aHdr)
1f8f0 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
1f900 20 61 48 64 72 5b 30 5d 3b 0a 20 20 65 6e 64 20   aHdr[0];.  end 
1f910 3d 20 61 48 64 72 5b 69 64 78 57 69 64 74 68 5d  = aHdr[idxWidth]
1f920 3b 0a 20 20 69 66 28 20 69 64 78 57 69 64 74 68  ;.  if( idxWidth
1f930 3e 31 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  >1 ){.    offset
1f940 20 7c 3d 20 61 48 64 72 5b 31 5d 3c 3c 38 3b 0a   |= aHdr[1]<<8;.
1f950 20 20 20 20 65 6e 64 20 7c 3d 20 61 48 64 72 5b      end |= aHdr[
1f960 69 64 78 57 69 64 74 68 2b 31 5d 3c 3c 38 3b 0a  idxWidth+1]<<8;.
1f970 20 20 20 20 69 66 28 20 69 64 78 57 69 64 74 68      if( idxWidth
1f980 3e 32 20 29 7b 0a 20 20 20 20 20 20 6f 66 66 73  >2 ){.      offs
1f990 65 74 20 7c 3d 20 61 48 64 72 5b 32 5d 3c 3c 31  et |= aHdr[2]<<1
1f9a0 36 3b 0a 20 20 20 20 20 20 65 6e 64 20 7c 3d 20  6;.      end |= 
1f9b0 61 48 64 72 5b 69 64 78 57 69 64 74 68 2b 32 5d  aHdr[idxWidth+2]
1f9c0 3c 3c 31 36 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  <<16;.    }.  }.
1f9d0 20 20 61 6d 74 20 3d 20 65 6e 64 20 2d 20 6f 66    amt = end - of
1f9e0 66 73 65 74 3b 0a 20 20 69 66 28 20 61 6d 74 3c  fset;.  if( amt<
1f9f0 30 20 7c 7c 20 6f 66 66 73 65 74 3c 30 20 7c 7c  0 || offset<0 ||
1fa00 20 65 6e 64 3e 70 61 79 6c 6f 61 64 53 69 7a 65   end>payloadSize
1fa10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1fa20 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
1fa30 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1fa40 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  to_error;.  }.. 
1fa50 20 2f 2a 20 61 6d 74 20 61 6e 64 20 6f 66 66 73   /* amt and offs
1fa60 65 74 20 6e 6f 77 20 68 6f 6c 64 20 74 68 65 20  et now hold the 
1fa70 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
1fa80 61 72 74 20 6f 66 20 64 61 74 61 20 61 6e 64 20  art of data and 
1fa90 74 68 65 0a 20 20 2a 2a 20 61 6d 6f 75 6e 74 20  the.  ** amount 
1faa0 6f 66 20 64 61 74 61 2e 20 20 47 6f 20 67 65 74  of data.  Go get
1fab0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 70 75   the data and pu
1fac0 74 20 69 74 20 6f 6e 20 74 68 65 20 73 74 61 63  t it on the stac
1fad0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 6d  k..  */.  if( am
1fae0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61  t==0 ){.    aSta
1faf0 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[tos].flags = 
1fb00 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73  STK_Null;.  }els
1fb10 65 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20  e if( zRec ){.  
1fb20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c    aStack[tos].fl
1fb30 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 20 7c 20  ags = STK_Str | 
1fb40 53 54 4b 5f 45 70 68 65 6d 3b 0a 20 20 20 20 61  STK_Ephem;.    a
1fb50 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 61  Stack[tos].n = a
1fb60 6d 74 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 74  mt;.    zStack[t
1fb70 6f 73 5d 20 3d 20 26 7a 52 65 63 5b 6f 66 66 73  os] = &zRec[offs
1fb80 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et];.  }else{.  
1fb90 20 20 69 66 28 20 61 6d 74 3c 3d 4e 42 46 53 20    if( amt<=NBFS 
1fba0 29 7b 0a 20 20 20 20 20 20 61 53 74 61 63 6b 5b  ){.      aStack[
1fbb0 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  tos].flags = STK
1fbc0 5f 53 74 72 3b 0a 20 20 20 20 20 20 7a 53 74 61  _Str;.      zSta
1fbd0 63 6b 5b 74 6f 73 5d 20 3d 20 61 53 74 61 63 6b  ck[tos] = aStack
1fbe0 5b 74 6f 73 5d 2e 7a 3b 0a 20 20 20 20 20 20 61  [tos].z;.      a
1fbf0 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 61  Stack[tos].n = a
1fc00 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  mt;.    }else{. 
1fc10 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
1fc20 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1fc30 61 6d 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  amt );.      if(
1fc40 20 7a 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f   z==0 ) goto no_
1fc50 6d 65 6d 3b 0a 20 20 20 20 20 20 61 53 74 61 63  mem;.      aStac
1fc60 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[tos].flags = S
1fc70 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 44 79 6e  TK_Str | STK_Dyn
1fc80 3b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b 5b 74  ;.      zStack[t
1fc90 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20 20 20 61  os] = z;.      a
1fca0 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 61  Stack[tos].n = a
1fcb0 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mt;.    }.    if
1fcc0 28 20 70 43 2d 3e 6b 65 79 41 73 44 61 74 61 20  ( pC->keyAsData 
1fcd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
1fce0 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c 20 6f  treeKey(pCrsr, o
1fcf0 66 66 73 65 74 2c 20 61 6d 74 2c 20 7a 53 74 61  ffset, amt, zSta
1fd00 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 20 20 7d 65  ck[tos]);.    }e
1fd10 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1fd20 65 42 74 72 65 65 44 61 74 61 28 70 43 72 73 72  eBtreeData(pCrsr
1fd30 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 7a  , offset, amt, z
1fd40 53 74 61 63 6b 5b 74 6f 73 5d 29 3b 0a 20 20 20  Stack[tos]);.   
1fd50 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 74 6f 73 20   }.  }.  p->tos 
1fd60 3d 20 74 6f 73 3b 0a 20 20 62 72 65 61 6b 3b 0a  = tos;.  break;.
1fd70 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
1fd80 63 6e 6f 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a  cno P1 * *.**.**
1fd90 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 65 20 73   Push onto the s
1fda0 74 61 63 6b 20 61 6e 20 69 6e 74 65 67 65 72 20  tack an integer 
1fdb0 77 68 69 63 68 20 69 73 20 74 68 65 20 66 69 72  which is the fir
1fdc0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1fdd0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 20 74 6f 20  e.** the key to 
1fde0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1fdf0 79 20 69 6e 20 61 20 73 65 71 75 65 6e 74 69 61  y in a sequentia
1fe00 6c 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  l scan of the da
1fe10 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 50  tabase.** file P
1fe20 31 2e 20 20 54 68 65 20 73 65 71 75 65 6e 74 69  1.  The sequenti
1fe30 61 6c 20 73 63 61 6e 20 73 68 6f 75 6c 64 20 68  al scan should h
1fe40 61 76 65 20 62 65 65 6e 20 73 74 61 72 74 65 64  ave been started
1fe50 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 4e   using the .** N
1fe60 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  ext opcode..*/.c
1fe70 61 73 65 20 4f 50 5f 52 65 63 6e 6f 3a 20 7b 0a  ase OP_Recno: {.
1fe80 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
1fe90 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 2b  1;.  int tos = +
1fea0 2b 70 2d 3e 74 6f 73 3b 0a 20 20 43 75 72 73 6f  +p->tos;.  Curso
1feb0 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 76 3b 0a  r *pC;.  int v;.
1fec0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
1fed0 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
1fee0 29 3b 0a 20 20 69 66 28 20 28 70 43 20 3d 20 26  );.  if( (pC = &
1fef0 70 2d 3e 61 43 73 72 5b 69 5d 29 2d 3e 72 65 63  p->aCsr[i])->rec
1ff00 6e 6f 49 73 56 61 6c 69 64 20 29 7b 0a 20 20 20  noIsValid ){.   
1ff10 20 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52 65 63   v = pC->lastRec
1ff20 6e 6f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  no;.  }else if( 
1ff30 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20  pC->pseudoTable 
1ff40 29 7b 0a 20 20 20 20 76 20 3d 20 6b 65 79 54 6f  ){.    v = keyTo
1ff50 49 6e 74 28 70 43 2d 3e 69 4b 65 79 29 3b 0a 20  Int(pC->iKey);. 
1ff60 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 6e   }else if( pC->n
1ff70 75 6c 6c 52 6f 77 20 7c 7c 20 70 43 2d 3e 70 43  ullRow || pC->pC
1ff80 75 72 73 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ursor==0 ){.    
1ff90 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
1ffa0 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a 20 20  s = STK_Null;.  
1ffb0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65    break;.  }else
1ffc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1ffd0 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
1ffe0 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 4b      sqliteBtreeK
1fff0 65 79 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ey(pC->pCursor, 
20000 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2c 20  0, sizeof(u32), 
20010 28 63 68 61 72 2a 29 26 76 29 3b 0a 20 20 20 20  (char*)&v);.    
20020 76 20 3d 20 6b 65 79 54 6f 49 6e 74 28 76 29 3b  v = keyToInt(v);
20030 0a 20 20 7d 0a 20 20 61 53 74 61 63 6b 5b 74 6f  .  }.  aStack[to
20040 73 5d 2e 69 20 3d 20 76 3b 0a 20 20 61 53 74 61  s].i = v;.  aSta
20050 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  ck[tos].flags = 
20060 53 54 4b 5f 49 6e 74 3b 0a 20 20 62 72 65 61 6b  STK_Int;.  break
20070 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
20080 46 75 6c 6c 4b 65 79 20 50 31 20 2a 20 2a 0a 2a  FullKey P1 * *.*
20090 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65  *.** Extract the
200a0 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20 66 72   complete key fr
200b0 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 74 68  om the record th
200c0 61 74 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  at cursor P1 is 
200d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
200e0 6e 74 69 6e 67 20 74 6f 20 61 6e 64 20 70 75 73  nting to and pus
200f0 68 20 74 68 65 20 6b 65 79 20 6f 6e 74 6f 20 74  h the key onto t
20100 68 65 20 73 74 61 63 6b 20 61 73 20 61 20 73 74  he stack as a st
20110 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ring..**.** Comp
20120 61 72 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  are this opcode 
20130 74 6f 20 52 65 63 6e 6f 2e 20 20 54 68 65 20 52  to Recno.  The R
20140 65 63 6e 6f 20 6f 70 63 6f 64 65 20 65 78 74 72  ecno opcode extr
20150 61 63 74 73 20 74 68 65 20 66 69 72 73 74 0a 2a  acts the first.*
20160 2a 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 4 bytes of the
20170 20 6b 65 79 20 61 6e 64 20 70 75 73 68 65 73 20   key and pushes 
20180 74 68 6f 73 65 20 62 79 74 65 73 20 6f 6e 74 6f  those bytes onto
20190 20 74 68 65 20 73 74 61 63 6b 20 61 73 20 61 6e   the stack as an
201a0 0a 2a 2a 20 69 6e 74 65 67 65 72 2e 20 20 54 68  .** integer.  Th
201b0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70  is instruction p
201c0 75 73 68 65 73 20 74 68 65 20 65 6e 74 69 72 65  ushes the entire
201d0 20 6b 65 79 20 61 73 20 61 20 73 74 72 69 6e 67   key as a string
201e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
201f0 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  ode may not be u
20200 73 65 64 20 6f 6e 20 61 20 70 73 65 75 64 6f 2d  sed on a pseudo-
20210 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
20220 50 5f 46 75 6c 6c 4b 65 79 3a 20 7b 0a 20 20 69  P_FullKey: {.  i
20230 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
20240 20 20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b 70 2d    int tos = ++p-
20250 3e 74 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f 72  >tos;.  BtCursor
20260 20 2a 70 43 72 73 72 3b 0a 0a 20 20 56 45 52 49   *pCrsr;..  VERI
20270 46 59 28 20 69 66 28 20 21 70 2d 3e 61 43 73 72  FY( if( !p->aCsr
20280 5b 69 5d 2e 6b 65 79 41 73 44 61 74 61 20 29 20  [i].keyAsData ) 
20290 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63  goto bad_instruc
202a0 74 69 6f 6e 3b 20 29 0a 20 20 56 45 52 49 46 59  tion; ).  VERIFY
202b0 28 20 69 66 28 20 70 2d 3e 61 43 73 72 5b 69 5d  ( if( p->aCsr[i]
202c0 2e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 20 67  .pseudoTable ) g
202d0 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74  oto bad_instruct
202e0 69 6f 6e 3b 20 29 0a 20 20 69 66 28 20 56 45 52  ion; ).  if( VER
202f0 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  IFY( i>=0 && i<p
20300 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29 20 28  ->nCursor && ) (
20310 70 43 72 73 72 20 3d 20 70 2d 3e 61 43 73 72 5b  pCrsr = p->aCsr[
20320 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30 20 29  i].pCursor)!=0 )
20330 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 3b 0a 20  {.    int amt;. 
20340 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20     char *z;..   
20350 20 73 71 6c 69 74 65 42 74 72 65 65 4b 65 79 53   sqliteBtreeKeyS
20360 69 7a 65 28 70 43 72 73 72 2c 20 26 61 6d 74 29  ize(pCrsr, &amt)
20370 3b 0a 20 20 20 20 69 66 28 20 61 6d 74 3c 3d 30  ;.    if( amt<=0
20380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
20390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
203a0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
203b0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
203c0 20 20 7d 0a 20 20 20 20 69 66 28 20 61 6d 74 3e    }.    if( amt>
203d0 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20 7a 20  NBFS ){.      z 
203e0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
203f0 77 28 20 61 6d 74 20 29 3b 0a 20 20 20 20 20 20  w( amt );.      
20400 69 66 28 20 7a 3d 3d 30 20 29 20 67 6f 74 6f 20  if( z==0 ) goto 
20410 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 61 53  no_mem;.      aS
20420 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20  tack[tos].flags 
20430 3d 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f  = STK_Str | STK_
20440 44 79 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Dyn;.    }else{.
20450 20 20 20 20 20 20 7a 20 3d 20 61 53 74 61 63 6b        z = aStack
20460 5b 74 6f 73 5d 2e 7a 3b 0a 20 20 20 20 20 20 61  [tos].z;.      a
20470 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
20480 20 3d 20 53 54 4b 5f 53 74 72 3b 0a 20 20 20 20   = STK_Str;.    
20490 7d 0a 20 20 20 20 73 71 6c 69 74 65 42 74 72 65  }.    sqliteBtre
204a0 65 4b 65 79 28 70 43 72 73 72 2c 20 30 2c 20 61  eKey(pCrsr, 0, a
204b0 6d 74 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 74 61  mt, z);.    zSta
204c0 63 6b 5b 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20  ck[tos] = z;.   
204d0 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3d   aStack[tos].n =
204e0 20 61 6d 74 3b 0a 20 20 7d 0a 20 20 62 72 65 61   amt;.  }.  brea
204f0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
20500 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 0a   NullRow P1 * *.
20510 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
20520 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75  ursor P1 to a nu
20530 6c 6c 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f  ll row.  Any OP_
20540 43 6f 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e  Column operation
20550 73 0a 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20  s.** that occur 
20560 77 68 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72  while the cursor
20570 20 69 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20   is on the null 
20580 72 6f 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  row will always 
20590 70 75 73 68 20 0a 2a 2a 20 61 20 4e 55 4c 4c 20  push .** a NULL 
205a0 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
205b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52  */.case OP_NullR
205c0 6f 77 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ow: {.  int i = 
205d0 70 4f 70 2d 3e 70 31 3b 0a 0a 20 20 61 73 73 65  pOp->p1;..  asse
205e0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
205f0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 2d  >nCursor );.  p-
20600 3e 61 43 73 72 5b 69 5d 2e 6e 75 6c 6c 52 6f 77  >aCsr[i].nullRow
20610 20 3d 20 31 3b 0a 20 20 70 2d 3e 61 43 73 72 5b   = 1;.  p->aCsr[
20620 69 5d 2e 72 65 63 6e 6f 49 73 56 61 6c 69 64 20  i].recnoIsValid 
20630 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
20640 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74  ./* Opcode: Last
20650 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 54   P1 P2 *.**.** T
20660 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74  he next use of t
20670 68 65 20 52 65 63 6e 6f 20 6f 72 20 43 6f 6c 75  he Recno or Colu
20680 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72  mn or Next instr
20690 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a  uction for P1 .*
206a0 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20  * will refer to 
206b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
206c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
206d0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
206e0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f  * If the table o
206f0 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  r index is empty
20700 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20   and P2>0, then 
20710 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
20720 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32   to P2..** If P2
20730 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20   is 0 or if the 
20740 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
20750 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c  s not empty, fal
20760 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20  l through.** to 
20770 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
20780 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
20790 73 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 0a 20 20  se OP_Last: {.  
207a0 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  int i = pOp->p1;
207b0 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  .  Cursor *pC;. 
207c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
207d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
207e0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
207f0 72 20 29 3b 0a 20 20 70 43 20 3d 20 26 70 2d 3e  r );.  pC = &p->
20800 61 43 73 72 5b 69 5d 3b 0a 20 20 69 66 28 20 28  aCsr[i];.  if( (
20810 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
20820 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  sor)!=0 ){.    i
20830 6e 74 20 72 65 73 3b 0a 20 20 20 20 72 63 20 3d  nt res;.    rc =
20840 20 73 71 6c 69 74 65 42 74 72 65 65 4c 61 73 74   sqliteBtreeLast
20850 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20  (pCrsr, &res);. 
20860 20 20 20 70 2d 3e 61 43 73 72 5b 69 5d 2e 6e 75     p->aCsr[i].nu
20870 6c 6c 52 6f 77 20 3d 20 72 65 73 3b 0a 20 20 20  llRow = res;.   
20880 20 69 66 28 20 72 65 73 20 26 26 20 70 4f 70 2d   if( res && pOp-
20890 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
208a0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
208b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
208c0 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
208d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
208e0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
208f0 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 0a 2a  Rewind P1 P2 *.*
20900 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
20910 65 20 6f 66 20 74 68 65 20 52 65 63 6e 6f 20 6f  e of the Recno o
20920 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
20930 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
20940 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
20950 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
20960 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
20970 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
20980 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
20990 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
209a0 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30  s empty and P2>0
209b0 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
209c0 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
209d0 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72 20  * If P2 is 0 or 
209e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  if the table or 
209f0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70  index is not emp
20a00 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ty, fall through
20a10 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
20a20 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
20a30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77  ..*/.case OP_Rew
20a40 69 6e 64 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d  ind: {.  int i =
20a50 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 43 75 72 73   pOp->p1;.  Curs
20a60 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73  or *pC;.  BtCurs
20a70 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 61 73  or *pCrsr;..  as
20a80 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
20a90 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
20aa0 70 43 20 3d 20 26 70 2d 3e 61 43 73 72 5b 69 5d  pC = &p->aCsr[i]
20ab0 3b 0a 20 20 69 66 28 20 28 70 43 72 73 72 20 3d  ;.  if( (pCrsr =
20ac0 20 70 43 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30   pC->pCursor)!=0
20ad0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   ){.    int res;
20ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20af0 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73 72  BtreeFirst(pCrsr
20b00 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d  , &res);.    pC-
20b10 3e 61 74 46 69 72 73 74 20 3d 20 72 65 73 3d 3d  >atFirst = res==
20b20 30 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  0;.    pC->nullR
20b30 6f 77 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ow = res;.    if
20b40 28 20 72 65 73 20 26 26 20 70 4f 70 2d 3e 70 32  ( res && pOp->p2
20b50 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  >0 ){.      pc =
20b60 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
20b70 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20b80 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
20b90 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
20ba0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78  ../* Opcode: Nex
20bb0 74 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  t P1 P2 *.**.** 
20bc0 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20 50  Advance cursor P
20bd0 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  1 so that it poi
20be0 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nts to the next 
20bf0 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e  key/data pair in
20c00 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   its.** table or
20c10 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72   index.  If ther
20c20 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65  e are no more ke
20c30 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68  y/value pairs th
20c40 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  en fall through.
20c50 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ** to the follow
20c60 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ing instruction.
20c70 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72    But if the cur
20c80 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73 20  sor advance was 
20c90 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a  successful,.** j
20ca0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
20cb0 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  to P2..**.** See
20cc0 20 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f   also: Prev.*/./
20cd0 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50  * Opcode: Prev P
20ce0 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 42 61 63  1 P2 *.**.** Bac
20cf0 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73  k up cursor P1 s
20d00 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
20d10 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
20d20 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69   key/data pair i
20d30 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f  n its.** table o
20d40 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  r index.  If the
20d50 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75  re is no previou
20d60 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  s key/value pair
20d70 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
20d80 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
20d90 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
20da0 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
20db0 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77   cursor backup w
20dc0 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  as successful,.*
20dd0 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  * jump immediate
20de0 6c 79 20 74 6f 20 50 32 2e 0a 2a 2f 0a 63 61 73  ly to P2..*/.cas
20df0 65 20 4f 50 5f 50 72 65 76 3a 0a 63 61 73 65 20  e OP_Prev:.case 
20e00 4f 50 5f 4e 65 78 74 3a 20 7b 0a 20 20 43 75 72  OP_Next: {.  Cur
20e10 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
20e20 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 43  sor *pCrsr;..  C
20e30 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55  HECK_FOR_INTERRU
20e40 50 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  PT;.  assert( pO
20e50 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
20e60 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
20e70 3b 0a 20 20 70 43 20 3d 20 26 70 2d 3e 61 43 73  ;.  pC = &p->aCs
20e80 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  r[pOp->p1];.  if
20e90 28 20 28 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  ( (pCrsr = pC->p
20ea0 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20  Cursor)!=0 ){.  
20eb0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
20ec0 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  f( pC->nullRow )
20ed0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b  {.      res = 1;
20ee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ef0 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f    rc = pOp->opco
20f00 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f 20 73 71  de==OP_Next ? sq
20f10 6c 69 74 65 42 74 72 65 65 4e 65 78 74 28 70 43  liteBtreeNext(pC
20f20 72 73 72 2c 20 26 72 65 73 29 20 3a 0a 20 20 20  rsr, &res) :.   
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20f50 71 6c 69 74 65 42 74 72 65 65 50 72 65 76 69 6f  qliteBtreePrevio
20f60 75 73 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  us(pCrsr, &res);
20f70 0a 20 20 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  .      pC->nullR
20f80 6f 77 20 3d 20 72 65 73 3b 0a 20 20 20 20 7d 0a  ow = res;.    }.
20f90 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
20fa0 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
20fb0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20  ->p2 - 1;.      
20fc0 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
20fd0 75 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  unt++;.    }.  }
20fe0 65 6c 73 65 7b 0a 20 20 20 20 70 43 2d 3e 6e 75  else{.    pC->nu
20ff0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 0a 20  llRow = 1;.  }. 
21000 20 70 43 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69   pC->recnoIsVali
21010 64 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  d = 0;.  break;.
21020 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  }../* Opcode: Id
21030 78 50 75 74 20 50 31 20 50 32 20 50 33 0a 2a 2a  xPut P1 P2 P3.**
21040 0a 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74  .** The top of t
21050 68 65 20 73 74 61 63 6b 20 68 6f 6c 64 73 20 61  he stack holds a
21060 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d   SQL index key m
21070 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ade using the.**
21080 20 4d 61 6b 65 49 64 78 4b 65 79 20 69 6e 73 74   MakeIdxKey inst
21090 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 6f  ruction.  This o
210a0 70 63 6f 64 65 20 77 72 69 74 65 73 20 74 68 61  pcode writes tha
210b0 74 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 0a 2a  t key into the.*
210c0 2a 20 69 6e 64 65 78 20 50 31 2e 20 20 44 61 74  * index P1.  Dat
210d0 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  a for the entry 
210e0 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  is nil..**.** If
210f0 20 50 32 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65   P2==1, then the
21100 20 6b 65 79 20 6d 75 73 74 20 62 65 20 75 6e 69   key must be uni
21110 71 75 65 2e 20 20 49 66 20 74 68 65 20 6b 65 79  que.  If the key
21120 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
21130 2a 2a 20 74 68 65 20 70 72 6f 67 72 61 6d 20 61  ** the program a
21140 62 6f 72 74 73 20 77 69 74 68 20 61 20 53 51 4c  borts with a SQL
21150 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
21160 72 72 6f 72 20 61 6e 64 20 74 68 65 20 64 61 74  rror and the dat
21170 61 62 61 73 65 0a 2a 2a 20 69 73 20 72 6f 6c 6c  abase.** is roll
21180 65 64 20 62 61 63 6b 2e 20 20 49 66 20 50 33 20  ed back.  If P3 
21190 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65  is not null, the
211a0 6e 20 69 74 20 62 65 63 6f 6d 65 73 20 70 61 72  n it becomes par
211b0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  t of the.** erro
211c0 72 20 6d 65 73 73 61 67 65 20 72 65 74 75 72 6e  r message return
211d0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
211e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a  TE_CONSTRAINT..*
211f0 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 50 75 74  /.case OP_IdxPut
21200 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f  : {.  int i = pO
21210 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73  p->p1;.  int tos
21220 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 42 74 43   = p->tos;.  BtC
21230 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
21240 56 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c  VERIFY( if( tos<
21250 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  0 ) goto not_eno
21260 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69  ugh_stack; ).  i
21270 66 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20  f( VERIFY( i>=0 
21280 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
21290 26 26 20 29 20 28 70 43 72 73 72 20 3d 20 70 2d  && ) (pCrsr = p-
212a0 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73 6f 72  >aCsr[i].pCursor
212b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
212c0 6e 4b 65 79 20 3d 20 61 53 74 61 63 6b 5b 74 6f  nKey = aStack[to
212d0 73 5d 2e 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  s].n;.    const 
212e0 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 7a 53 74  char *zKey = zSt
212f0 61 63 6b 5b 74 6f 73 5d 3b 0a 20 20 20 20 69 66  ack[tos];.    if
21300 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20  ( pOp->p2 ){.   
21310 20 20 20 69 6e 74 20 72 65 73 2c 20 6e 3b 0a 20     int res, n;. 
21320 20 20 20 20 20 61 73 73 65 72 74 28 20 61 53 74       assert( aSt
21330 61 63 6b 5b 74 6f 73 5d 2e 6e 20 3e 3d 20 34 20  ack[tos].n >= 4 
21340 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
21350 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28  liteBtreeMoveto(
21360 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65  pCrsr, zKey, nKe
21370 79 2d 34 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  y-4, &res);.    
21380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21390 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
213a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
213b0 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 73 21       while( res!
213c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
213d0 74 20 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  t c;.        sql
213e0 69 74 65 42 74 72 65 65 4b 65 79 53 69 7a 65 28  iteBtreeKeySize(
213f0 70 43 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20  pCrsr, &n);.    
21400 20 20 20 20 69 66 28 20 6e 3d 3d 6e 4b 65 79 0a      if( n==nKey.
21410 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
21420 6c 69 74 65 42 74 72 65 65 4b 65 79 43 6f 6d 70  liteBtreeKeyComp
21430 61 72 65 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c  are(pCrsr, zKey,
21440 20 6e 4b 65 79 2d 34 2c 20 34 2c 20 26 63 29 3d   nKey-4, 4, &c)=
21450 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
21460 20 20 20 20 20 20 26 26 20 63 3d 3d 30 0a 20 20        && c==0.  
21470 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
21490 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
214a0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33       if( pOp->p3
214b0 20 26 26 20 70 4f 70 2d 3e 70 33 5b 30 5d 20 29   && pOp->p3[0] )
214c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
214d0 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
214e0 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e  ->zErrMsg, pOp->
214f0 70 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  p3, 0);.        
21500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
21510 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
21520 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d  error;.        }
21530 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
21540 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
21550 73 71 6c 69 74 65 42 74 72 65 65 4e 65 78 74 28  sqliteBtreeNext(
21560 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
21570 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31          res = +1
21580 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21590 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
215a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
215b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
215c0 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 49 6e   = sqliteBtreeIn
215d0 73 65 72 74 28 70 43 72 73 72 2c 20 7a 4b 65 79  sert(pCrsr, zKey
215e0 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30 29 3b 0a  , nKey, "", 0);.
215f0 20 20 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a    }.  POPSTACK;.
21600 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
21610 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65  pcode: IdxDelete
21620 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   P1 * *.**.** Th
21630 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
21640 63 6b 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6b  ck is an index k
21650 65 79 20 62 75 69 6c 74 20 75 73 69 6e 67 20 74  ey built using t
21660 68 65 20 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70  he MakeIdxKey op
21670 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  code..** This op
21680 63 6f 64 65 20 72 65 6d 6f 76 65 73 20 74 68 61  code removes tha
21690 74 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  t entry from the
216a0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 61 73 65 20   index..*/.case 
216b0 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a  OP_IdxDelete: {.
216c0 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
216d0 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20 70  1;.  int tos = p
216e0 2d 3e 74 6f 73 3b 0a 20 20 42 74 43 75 72 73 6f  ->tos;.  BtCurso
216f0 72 20 2a 70 43 72 73 72 3b 0a 20 20 56 45 52 49  r *pCrsr;.  VERI
21700 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20 29 20  FY( if( tos<0 ) 
21710 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f  goto not_enough_
21720 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 56  stack; ).  if( V
21730 45 52 49 46 59 28 20 69 3e 3d 30 20 26 26 20 69  ERIFY( i>=0 && i
21740 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 29  <p->nCursor && )
21750 20 28 70 43 72 73 72 20 3d 20 70 2d 3e 61 43 73   (pCrsr = p->aCs
21760 72 5b 69 5d 2e 70 43 75 72 73 6f 72 29 21 3d 30  r[i].pCursor)!=0
21770 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 78 2c 20   ){.    int rx, 
21780 72 65 73 3b 0a 20 20 20 20 72 78 20 3d 20 73 71  res;.    rx = sq
21790 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74 6f 28  liteBtreeMoveto(
217a0 70 43 72 73 72 2c 20 7a 53 74 61 63 6b 5b 74 6f  pCrsr, zStack[to
217b0 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e  s], aStack[tos].
217c0 6e 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  n, &res);.    if
217d0 28 20 72 78 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rx==SQLITE_OK 
217e0 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
217f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74     rc = sqliteBt
21800 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72 29  reeDelete(pCrsr)
21810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 50 4f  ;.    }.  }.  PO
21820 50 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b 3b  PSTACK;.  break;
21830 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
21840 64 78 52 65 63 6e 6f 20 50 31 20 2a 20 2a 0a 2a  dxRecno P1 * *.*
21850 2a 0a 2a 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74  *.** Push onto t
21860 68 65 20 73 74 61 63 6b 20 61 6e 20 69 6e 74 65  he stack an inte
21870 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
21880 20 6c 61 73 74 20 34 20 62 79 74 65 73 20 6f 66   last 4 bytes of
21890 20 74 68 65 0a 2a 2a 20 74 68 65 20 6b 65 79 20   the.** the key 
218a0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  to the current e
218b0 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20 50 31  ntry in index P1
218c0 2e 20 20 54 68 65 73 65 20 34 20 62 79 74 65 73  .  These 4 bytes
218d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68   should.** be th
218e0 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
218f0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  of the table ent
21900 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  ry to which this
21910 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
21920 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  points..**.** Se
21930 65 20 61 6c 73 6f 3a 20 52 65 63 6e 6f 2c 20 4d  e also: Recno, M
21940 61 6b 65 49 64 78 4b 65 79 2e 0a 2a 2f 0a 63 61  akeIdxKey..*/.ca
21950 73 65 20 4f 50 5f 49 64 78 52 65 63 6e 6f 3a 20  se OP_IdxRecno: 
21960 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  {.  int i = pOp-
21970 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73 20 3d  >p1;.  int tos =
21980 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 42 74 43   ++p->tos;.  BtC
21990 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
219a0 20 69 66 28 20 56 45 52 49 46 59 28 20 69 3e 3d   if( VERIFY( i>=
219b0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
219c0 72 20 26 26 20 29 20 28 70 43 72 73 72 20 3d 20  r && ) (pCrsr = 
219d0 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73  p->aCsr[i].pCurs
219e0 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  or)!=0 ){.    in
219f0 74 20 76 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  t v;.    int sz;
21a00 0a 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65  .    sqliteBtree
21a10 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26  KeySize(pCrsr, &
21a20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3c  sz);.    if( sz<
21a30 73 69 7a 65 6f 66 28 75 33 32 29 20 29 7b 0a 20  sizeof(u32) ){. 
21a40 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d       aStack[tos]
21a50 2e 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c  .flags = STK_Nul
21a60 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
21a70 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 4b      sqliteBtreeK
21a80 65 79 28 70 43 72 73 72 2c 20 73 7a 20 2d 20 73  ey(pCrsr, sz - s
21a90 69 7a 65 6f 66 28 75 33 32 29 2c 20 73 69 7a 65  izeof(u32), size
21aa0 6f 66 28 75 33 32 29 2c 20 28 63 68 61 72 2a 29  of(u32), (char*)
21ab0 26 76 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 6b  &v);.      v = k
21ac0 65 79 54 6f 49 6e 74 28 76 29 3b 0a 20 20 20 20  eyToInt(v);.    
21ad0 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 69 20    aStack[tos].i 
21ae0 3d 20 76 3b 0a 20 20 20 20 20 20 61 53 74 61 63  = v;.      aStac
21af0 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53  k[tos].flags = S
21b00 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  TK_Int;.    }.  
21b10 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
21b20 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50   Opcode: IdxGT P
21b30 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d  1 P2 *.**.** Com
21b40 70 61 72 65 20 74 68 65 20 74 6f 70 20 6f 66 20  pare the top of 
21b50 74 68 65 20 73 74 61 63 6b 20 61 67 61 69 6e 73  the stack agains
21b60 74 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65  t the key on the
21b70 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
21b80 74 0a 2a 2a 20 63 75 72 73 6f 72 20 50 31 20 69  t.** cursor P1 i
21b90 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
21ba0 74 69 6e 67 20 74 6f 2e 20 20 49 67 6e 6f 72 65  ting to.  Ignore
21bb0 20 74 68 65 20 6c 61 73 74 20 34 20 62 79 74 65   the last 4 byte
21bc0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 64 65  s of the.** inde
21bd0 78 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  x entry.  If the
21be0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20   index entry is 
21bf0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21c00 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
21c10 6b 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74  k.** then jump t
21c20 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
21c30 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
21c40 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
21c50 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 65 69 74  ction..** In eit
21c60 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 73 74  her case, the st
21c70 61 63 6b 20 69 73 20 70 6f 70 70 65 64 20 6f 6e  ack is popped on
21c80 63 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ce..*/./* Opcode
21c90 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 2a 0a  : IdxGE P1 P2 *.
21ca0 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  **.** Compare th
21cb0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
21cc0 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 6b  ck against the k
21cd0 65 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  ey on the index 
21ce0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 63 75  entry that.** cu
21cf0 72 73 6f 72 20 50 31 20 69 73 20 63 75 72 72 65  rsor P1 is curre
21d00 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
21d10 2e 20 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 61  .  Ignore the la
21d20 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
21d30 65 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72 79  e.** index entry
21d40 2e 20 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  .  If the index 
21d50 65 6e 74 72 79 20 69 73 20 67 72 65 61 74 65 72  entry is greater
21d60 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
21d70 6f 20 0a 2a 2a 20 74 68 65 20 74 6f 70 20 6f 66  o .** the top of
21d80 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 74 68   the stack.** th
21d90 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
21da0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
21db0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
21dc0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
21dd0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
21de0 65 2c 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  e, the stack is 
21df0 70 6f 70 70 65 64 20 6f 6e 63 65 2e 0a 2a 2f 0a  popped once..*/.
21e00 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54  /* Opcode: IdxLT
21e10 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43   P1 P2 *.**.** C
21e20 6f 6d 70 61 72 65 20 74 68 65 20 74 6f 70 20 6f  ompare the top o
21e30 66 20 74 68 65 20 73 74 61 63 6b 20 61 67 61 69  f the stack agai
21e40 6e 73 74 20 74 68 65 20 6b 65 79 20 6f 6e 20 74  nst the key on t
21e50 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
21e60 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20 50 31  hat.** cursor P1
21e70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
21e80 69 6e 74 69 6e 67 20 74 6f 2e 20 20 49 67 6e 6f  inting to.  Igno
21e90 72 65 20 74 68 65 20 6c 61 73 74 20 34 20 62 79  re the last 4 by
21ea0 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  tes of the.** in
21eb0 64 65 78 20 65 6e 74 72 79 2e 20 20 49 66 20 74  dex entry.  If t
21ec0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  he index entry i
21ed0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
21ee0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
21ef0 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  .** then jump to
21f00 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20   P2.  Otherwise 
21f10 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
21f20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
21f30 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 65 69 74 68  tion..** In eith
21f40 65 72 20 63 61 73 65 2c 20 74 68 65 20 73 74 61  er case, the sta
21f50 63 6b 20 69 73 20 70 6f 70 70 65 64 20 6f 6e 63  ck is popped onc
21f60 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  e..*/.case OP_Id
21f70 78 4c 54 3a 0a 63 61 73 65 20 4f 50 5f 49 64 78  xLT:.case OP_Idx
21f80 47 54 3a 0a 63 61 73 65 20 4f 50 5f 49 64 78 47  GT:.case OP_IdxG
21f90 45 3a 20 7b 0a 20 20 69 6e 74 20 69 3d 20 70 4f  E: {.  int i= pO
21fa0 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f 73  p->p1;.  int tos
21fb0 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 42 74 43   = p->tos;.  BtC
21fc0 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
21fd0 20 69 66 28 20 56 45 52 49 46 59 28 20 69 3e 3d   if( VERIFY( i>=
21fe0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
21ff0 72 20 26 26 20 29 20 28 70 43 72 73 72 20 3d 20  r && ) (pCrsr = 
22000 70 2d 3e 61 43 73 72 5b 69 5d 2e 70 43 75 72 73  p->aCsr[i].pCurs
22010 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  or)!=0 ){.    in
22020 74 20 72 65 73 2c 20 72 63 3b 0a 20 0a 20 20 20  t res, rc;. .   
22030 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74 6f   Stringify(p, to
22040 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  s);.    rc = sql
22050 69 74 65 42 74 72 65 65 4b 65 79 43 6f 6d 70 61  iteBtreeKeyCompa
22060 72 65 28 70 43 72 73 72 2c 20 7a 53 74 61 63 6b  re(pCrsr, zStack
22070 5b 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f  [tos], aStack[to
22080 73 5d 2e 6e 2c 20 34 2c 20 26 72 65 73 29 3b 0a  s].n, 4, &res);.
22090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
220a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62  TE_OK ){.      b
220b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
220c0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
220d0 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  =OP_IdxLT ){.   
220e0 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
220f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
22100 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
22110 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 73 2b  GE ){.      res+
22120 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
22130 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
22140 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
22150 20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 50   ;.    }.  }.  P
22160 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b  OPSTACK;.  break
22170 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
22180 44 65 73 74 72 6f 79 20 50 31 20 50 32 20 2a 0a  Destroy P1 P2 *.
22190 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  **.** Delete an 
221a0 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20  entire database 
221b0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77  table or index w
221c0 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
221d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
221e0 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  * file is given 
221f0 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  by P1..**.** The
22200 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73   table being des
22210 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65  troyed is in the
22220 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
22230 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49  ile if P2==0.  I
22240 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20  f.** P2==1 then 
22250 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
22260 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
22270 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
22280 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20  se file.** that 
22290 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
222a0 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75   tables create u
222b0 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50  sing CREATE TEMP
222c0 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a  ORARY TABLE..**.
222d0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65  ** See also: Cle
222e0 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  ar.*/.case OP_De
222f0 73 74 72 6f 79 3a 20 7b 0a 20 20 72 63 20 3d 20  stroy: {.  rc = 
22300 73 71 6c 69 74 65 42 74 72 65 65 44 72 6f 70 54  sqliteBtreeDropT
22310 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70  able(db->aDb[pOp
22320 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e  ->p2].pBt, pOp->
22330 70 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  p1);.  break;.}.
22340 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61  ./* Opcode: Clea
22350 72 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20  r P1 P2 *.**.** 
22360 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65  Delete all conte
22370 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
22380 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
22390 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
223a0 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ge.** in the dat
223b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69  abase file is gi
223c0 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c  ven by P1.  But,
223d0 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c   unlike Destroy,
223e0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76   do not.** remov
223f0 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  e the table or i
22400 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61  ndex from the da
22410 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22420 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  ** The table bei
22430 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  ng clear is in t
22440 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
22450 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20   file if P2==0. 
22460 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65   If.** P2==1 the
22470 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
22480 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
22490 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
224a0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
224b0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
224c0 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
224d0 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
224e0 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
224f0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44  *.** See also: D
22500 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f  estroy.*/.case O
22510 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 72 63 20  P_Clear: {.  rc 
22520 3d 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 65  = sqliteBtreeCle
22530 61 72 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b  arTable(db->aDb[
22540 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f  pOp->p2].pBt, pO
22550 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61 6b 3b  p->p1);.  break;
22560 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
22570 72 65 61 74 65 54 61 62 6c 65 20 2a 20 50 32 20  reateTable * P2 
22580 50 33 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  P3.**.** Allocat
22590 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e  e a new table in
225a0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
225b0 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30  se file if P2==0
225c0 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75   or in the.** au
225d0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
225e0 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 31 2e 20   file if P2==1. 
225f0 20 50 75 73 68 20 74 68 65 20 70 61 67 65 20 6e   Push the page n
22600 75 6d 62 65 72 0a 2a 2a 20 66 6f 72 20 74 68 65  umber.** for the
22610 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
22620 65 20 6e 65 77 20 74 61 62 6c 65 20 6f 6e 74 6f  e new table onto
22630 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
22640 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
22650 6e 75 6d 62 65 72 20 69 73 20 61 6c 73 6f 20 77  number is also w
22660 72 69 74 74 65 6e 20 74 6f 20 61 20 6d 65 6d 6f  ritten to a memo
22670 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74  ry location that
22680 20 50 33 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   P3.** points to
22690 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  .  This is the m
226a0 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64  echanism is used
226b0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 6f   to write the ro
226c0 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  ot page.** numbe
226d0 72 20 69 6e 74 6f 20 74 68 65 20 70 61 72 73 65  r into the parse
226e0 72 27 73 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  r's internal dat
226f0 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  a structures tha
22700 74 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 2a  t describe the.*
22710 2a 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * new table..**.
22720 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
22730 65 20 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c  e between a tabl
22740 65 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69  e and an index i
22750 73 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65  s this:  A table
22760 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20   must.** have a 
22770 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b  4-byte integer k
22780 65 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20  ey and can have 
22790 61 72 62 69 74 72 61 72 79 20 64 61 74 61 2e 20  arbitrary data. 
227a0 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73   An index.** has
227b0 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65   an arbitrary ke
227c0 79 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a  y but no data..*
227d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
227e0 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a  reateIndex.*/./*
227f0 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49   Opcode: CreateI
22800 6e 64 65 78 20 2a 20 50 32 20 50 33 0a 2a 2a 0a  ndex * P2 P3.**.
22810 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
22820 77 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d  w index in the m
22830 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
22840 65 20 69 66 20 50 32 3d 3d 30 20 6f 72 20 69 6e  e if P2==0 or in
22850 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72   the.** auxiliar
22860 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
22870 69 66 20 50 32 3d 3d 31 2e 20 20 50 75 73 68 20  if P2==1.  Push 
22880 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
22890 6f 66 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  of the.** root p
228a0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 69  age of the new i
228b0 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65 20 73 74  ndex onto the st
228c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64  ack..**.** See d
228d0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20  ocumentation on 
228e0 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 66  OP_CreateTable f
228f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
22900 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  formation..*/.ca
22910 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  se OP_CreateInde
22920 78 3a 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74  x:.case OP_Creat
22930 65 54 61 62 6c 65 3a 20 7b 0a 20 20 69 6e 74 20  eTable: {.  int 
22940 69 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20  i = ++p->tos;.  
22950 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 61 73 73 65  int pgno;.  asse
22960 72 74 28 20 70 4f 70 2d 3e 70 33 21 3d 30 20 26  rt( pOp->p3!=0 &
22970 26 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  & pOp->p3type==P
22980 33 5f 50 4f 49 4e 54 45 52 20 29 3b 0a 20 20 61  3_POINTER );.  a
22990 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
229a0 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 64 62 2d  0 && pOp->p2<db-
229b0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
229c0 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  ( db->aDb[pOp->p
229d0 32 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69  2].pBt!=0 );.  i
229e0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
229f0 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29  OP_CreateTable )
22a00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
22a10 65 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  eBtreeCreateTabl
22a20 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  e(db->aDb[pOp->p
22a30 32 5d 2e 70 42 74 2c 20 26 70 67 6e 6f 29 3b 0a  2].pBt, &pgno);.
22a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
22a50 3d 20 73 71 6c 69 74 65 42 74 72 65 65 43 72 65  = sqliteBtreeCre
22a60 61 74 65 49 6e 64 65 78 28 64 62 2d 3e 61 44 62  ateIndex(db->aDb
22a70 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 26  [pOp->p2].pBt, &
22a80 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
22a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22aa0 7b 0a 20 20 20 20 61 53 74 61 63 6b 5b 69 5d 2e  {.    aStack[i].
22ab0 69 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 53  i = pgno;.    aS
22ac0 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20  tack[i].flags = 
22ad0 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 2a 28 75  STK_Int;.    *(u
22ae0 33 32 2a 29 70 4f 70 2d 3e 70 33 20 3d 20 70 67  32*)pOp->p3 = pg
22af0 6e 6f 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  no;.    pOp->p3 
22b00 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
22b10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
22b20 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20 50  IntegrityCk P1 P
22b30 32 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20  2 *.**.** Do an 
22b40 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20  analysis of the 
22b50 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
22b60 61 74 61 62 61 73 65 2e 20 20 50 75 73 68 20 6f  atabase.  Push o
22b70 6e 74 6f 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  nto the.** stack
22b80 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
22b90 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65  error message de
22ba0 73 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f  scribing any pro
22bb0 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 74 68 65  blems..** If the
22bc0 72 65 20 61 72 65 20 6e 6f 20 65 72 72 6f 72 73  re are no errors
22bd0 2c 20 70 75 73 68 20 61 20 22 6f 6b 22 20 6f 6e  , push a "ok" on
22be0 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
22bf0 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
22c00 64 65 78 20 6f 66 20 61 20 73 65 74 20 74 68 61  dex of a set tha
22c10 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
22c20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73  oot page numbers
22c30 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  .** for all tabl
22c40 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69  es and indices i
22c50 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
22c60 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 73  ase file.  The s
22c70 65 74 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  et.** is cleared
22c80 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
22c90 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
22ca0 2c 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 63  , after this opc
22cb0 6f 64 65 0a 2a 2a 20 68 61 73 20 65 78 65 63 75  ode.** has execu
22cc0 74 65 64 2c 20 74 68 65 20 73 65 74 20 77 69 6c  ted, the set wil
22cd0 6c 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  l be empty..**.*
22ce0 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20 7a  * If P2 is not z
22cf0 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
22d00 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
22d10 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
22d20 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
22d30 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
22d40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
22d50 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
22d60 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
22d70 6f 73 65 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 61  oses only..*/.ca
22d80 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  se OP_IntegrityC
22d90 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  k: {.  int nRoot
22da0 3b 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a  ;.  int *aRoot;.
22db0 20 20 69 6e 74 20 74 6f 73 20 3d 20 2b 2b 70 2d    int tos = ++p-
22dc0 3e 74 6f 73 3b 0a 20 20 69 6e 74 20 69 53 65 74  >tos;.  int iSet
22dd0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 53 65   = pOp->p1;.  Se
22de0 74 20 2a 70 53 65 74 3b 0a 20 20 69 6e 74 20 6a  t *pSet;.  int j
22df0 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  ;.  HashElem *i;
22e00 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 56  .  char *z;..  V
22e10 45 52 49 46 59 28 20 69 66 28 20 69 53 65 74 3c  ERIFY( if( iSet<
22e20 30 20 7c 7c 20 69 53 65 74 3e 3d 70 2d 3e 6e 53  0 || iSet>=p->nS
22e30 65 74 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e  et ) goto bad_in
22e40 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20 20 70  struction; ).  p
22e50 53 65 74 20 3d 20 26 70 2d 3e 61 53 65 74 5b 69  Set = &p->aSet[i
22e60 53 65 74 5d 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20  Set];.  nRoot = 
22e70 73 71 6c 69 74 65 48 61 73 68 43 6f 75 6e 74 28  sqliteHashCount(
22e80 26 70 53 65 74 2d 3e 68 61 73 68 29 3b 0a 20 20  &pSet->hash);.  
22e90 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 4d 61  aRoot = sqliteMa
22ea0 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
22eb0 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29 20 29  int)*(nRoot+1) )
22ec0 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30  ;.  if( aRoot==0
22ed0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
22ee0 20 20 66 6f 72 28 6a 3d 30 2c 20 69 3d 73 71 6c    for(j=0, i=sql
22ef0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
22f00 65 74 2d 3e 68 61 73 68 29 3b 20 69 3b 20 69 3d  et->hash); i; i=
22f10 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
22f20 29 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 74 6f 49  ), j++){.    toI
22f30 6e 74 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  nt((char*)sqlite
22f40 48 61 73 68 4b 65 79 28 69 29 2c 20 26 61 52 6f  HashKey(i), &aRo
22f50 6f 74 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 61 52  ot[j]);.  }.  aR
22f60 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71  oot[j] = 0;.  sq
22f70 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
22f80 53 65 74 2d 3e 68 61 73 68 29 3b 0a 20 20 70 53  Set->hash);.  pS
22f90 65 74 2d 3e 70 72 65 76 20 3d 20 30 3b 0a 20 20  et->prev = 0;.  
22fa0 7a 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 49  z = sqliteBtreeI
22fb0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 64 62  ntegrityCheck(db
22fc0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70  ->aDb[pOp->p2].p
22fd0 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74  Bt, aRoot, nRoot
22fe0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 7c 7c  );.  if( z==0 ||
22ff0 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[0]==0 ){.    
23000 69 66 28 20 7a 20 29 20 73 71 6c 69 74 65 46 72  if( z ) sqliteFr
23010 65 65 28 7a 29 3b 0a 20 20 20 20 7a 53 74 61 63  ee(z);.    zStac
23020 6b 5b 74 6f 73 5d 20 3d 20 22 6f 6b 22 3b 0a 20  k[tos] = "ok";. 
23030 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e     aStack[tos].n
23040 20 3d 20 33 3b 0a 20 20 20 20 61 53 74 61 63 6b   = 3;.    aStack
23050 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54  [tos].flags = ST
23060 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 53 74 61 74  K_Str | STK_Stat
23070 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
23080 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 7a   zStack[tos] = z
23090 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73  ;.    aStack[tos
230a0 5d 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 20  ].n = strlen(z) 
230b0 2b 20 31 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  + 1;.    aStack[
230c0 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20 53 54 4b  tos].flags = STK
230d0 5f 53 74 72 20 7c 20 53 54 4b 5f 44 79 6e 3b 0a  _Str | STK_Dyn;.
230e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
230f0 28 61 52 6f 6f 74 29 3b 0a 20 20 62 72 65 61 6b  (aRoot);.  break
23100 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
23110 4c 69 73 74 57 72 69 74 65 20 2a 20 2a 20 2a 0a  ListWrite * * *.
23120 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
23130 69 6e 74 65 67 65 72 20 6f 6e 20 74 68 65 20 74  integer on the t
23140 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a  op of the stack.
23150 2a 2a 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ** into the temp
23160 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6c 69  orary storage li
23170 73 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  st..*/.case OP_L
23180 69 73 74 57 72 69 74 65 3a 20 7b 0a 20 20 4b 65  istWrite: {.  Ke
23190 79 6c 69 73 74 20 2a 70 4b 65 79 6c 69 73 74 3b  ylist *pKeylist;
231a0 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70  .  VERIFY( if( p
231b0 2d 3e 74 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e  ->tos<0 ) goto n
231c0 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b  ot_enough_stack;
231d0 20 29 0a 20 20 70 4b 65 79 6c 69 73 74 20 3d 20   ).  pKeylist = 
231e0 70 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  p->pList;.  if( 
231f0 70 4b 65 79 6c 69 73 74 3d 3d 30 20 7c 7c 20 70  pKeylist==0 || p
23200 4b 65 79 6c 69 73 74 2d 3e 6e 55 73 65 64 3e 3d  Keylist->nUsed>=
23210 70 4b 65 79 6c 69 73 74 2d 3e 6e 4b 65 79 20 29  pKeylist->nKey )
23220 7b 0a 20 20 20 20 70 4b 65 79 6c 69 73 74 20 3d  {.    pKeylist =
23230 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
23240 28 20 73 69 7a 65 6f 66 28 4b 65 79 6c 69 73 74  ( sizeof(Keylist
23250 29 2b 39 39 39 2a 73 69 7a 65 6f 66 28 70 4b 65  )+999*sizeof(pKe
23260 79 6c 69 73 74 2d 3e 61 4b 65 79 5b 30 5d 29 20  ylist->aKey[0]) 
23270 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 6c  );.    if( pKeyl
23280 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ist==0 ) goto no
23290 5f 6d 65 6d 3b 0a 20 20 20 20 70 4b 65 79 6c 69  _mem;.    pKeyli
232a0 73 74 2d 3e 6e 4b 65 79 20 3d 20 31 30 30 30 3b  st->nKey = 1000;
232b0 0a 20 20 20 20 70 4b 65 79 6c 69 73 74 2d 3e 6e  .    pKeylist->n
232c0 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 4b  Read = 0;.    pK
232d0 65 79 6c 69 73 74 2d 3e 6e 55 73 65 64 20 3d 20  eylist->nUsed = 
232e0 30 3b 0a 20 20 20 20 70 4b 65 79 6c 69 73 74 2d  0;.    pKeylist-
232f0 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4c 69 73  >pNext = p->pLis
23300 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20  t;.    p->pList 
23310 3d 20 70 4b 65 79 6c 69 73 74 3b 0a 20 20 7d 0a  = pKeylist;.  }.
23320 20 20 49 6e 74 65 67 65 72 69 66 79 28 70 2c 20    Integerify(p, 
23330 70 2d 3e 74 6f 73 29 3b 0a 20 20 70 4b 65 79 6c  p->tos);.  pKeyl
23340 69 73 74 2d 3e 61 4b 65 79 5b 70 4b 65 79 6c 69  ist->aKey[pKeyli
23350 73 74 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 61  st->nUsed++] = a
23360 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69 3b  Stack[p->tos].i;
23370 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62  .  POPSTACK;.  b
23380 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23390 64 65 3a 20 4c 69 73 74 52 65 77 69 6e 64 20 2a  de: ListRewind *
233a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 77 69 6e   * *.**.** Rewin
233b0 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  d the temporary 
233c0 62 75 66 66 65 72 20 62 61 63 6b 20 74 6f 20 74  buffer back to t
233d0 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54  he beginning.  T
233e0 68 69 73 20 69 73 20 0a 2a 2a 20 6e 6f 77 20 61  his is .** now a
233f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20   no-op..*/.case 
23400 4f 50 5f 4c 69 73 74 52 65 77 69 6e 64 3a 20 7b  OP_ListRewind: {
23410 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f  .  /* This is no
23420 77 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 62  w a no-op */.  b
23430 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23440 64 65 3a 20 4c 69 73 74 52 65 61 64 20 2a 20 50  de: ListRead * P
23450 32 20 2a 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  2 *.**.** Attemp
23460 74 20 74 6f 20 72 65 61 64 20 61 6e 20 69 6e 74  t to read an int
23470 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 74 65  eger from the te
23480 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
23490 62 75 66 66 65 72 0a 2a 2a 20 61 6e 64 20 70 75  buffer.** and pu
234a0 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73  sh it onto the s
234b0 74 61 63 6b 2e 20 20 49 66 20 74 68 65 20 73 74  tack.  If the st
234c0 6f 72 61 67 65 20 62 75 66 66 65 72 20 69 73 20  orage buffer is 
234d0 65 6d 70 74 79 2c 20 0a 2a 2a 20 70 75 73 68 20  empty, .** push 
234e0 6e 6f 74 68 69 6e 67 20 62 75 74 20 69 6e 73 74  nothing but inst
234f0 65 61 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  ead jump to P2..
23500 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69 73 74 52  */.case OP_ListR
23510 65 61 64 3a 20 7b 0a 20 20 4b 65 79 6c 69 73 74  ead: {.  Keylist
23520 20 2a 70 4b 65 79 6c 69 73 74 3b 0a 20 20 43 48   *pKeylist;.  CH
23530 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50  ECK_FOR_INTERRUP
23540 54 3b 0a 20 20 70 4b 65 79 6c 69 73 74 20 3d 20  T;.  pKeylist = 
23550 70 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  p->pList;.  if( 
23560 70 4b 65 79 6c 69 73 74 21 3d 30 20 29 7b 0a 20  pKeylist!=0 ){. 
23570 20 20 20 56 45 52 49 46 59 28 0a 20 20 20 20 20     VERIFY(.     
23580 20 69 66 28 20 70 4b 65 79 6c 69 73 74 2d 3e 6e   if( pKeylist->n
23590 52 65 61 64 3c 30 20 0a 20 20 20 20 20 20 20 20  Read<0 .        
235a0 7c 7c 20 70 4b 65 79 6c 69 73 74 2d 3e 6e 52 65  || pKeylist->nRe
235b0 61 64 3e 3d 70 4b 65 79 6c 69 73 74 2d 3e 6e 55  ad>=pKeylist->nU
235c0 73 65 64 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  sed.        || p
235d0 4b 65 79 6c 69 73 74 2d 3e 6e 52 65 61 64 3e 3d  Keylist->nRead>=
235e0 70 4b 65 79 6c 69 73 74 2d 3e 6e 4b 65 79 20 29  pKeylist->nKey )
235f0 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75   goto bad_instru
23600 63 74 69 6f 6e 3b 0a 20 20 20 20 29 0a 20 20 20  ction;.    ).   
23610 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20 20 20 20 61   p->tos++;.    a
23620 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 69 20  Stack[p->tos].i 
23630 3d 20 70 4b 65 79 6c 69 73 74 2d 3e 61 4b 65 79  = pKeylist->aKey
23640 5b 70 4b 65 79 6c 69 73 74 2d 3e 6e 52 65 61 64  [pKeylist->nRead
23650 2b 2b 5d 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b  ++];.    aStack[
23660 70 2d 3e 74 6f 73 5d 2e 66 6c 61 67 73 20 3d 20  p->tos].flags = 
23670 53 54 4b 5f 49 6e 74 3b 0a 20 20 20 20 7a 53 74  STK_Int;.    zSt
23680 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 30 3b  ack[p->tos] = 0;
23690 0a 20 20 20 20 69 66 28 20 70 4b 65 79 6c 69 73  .    if( pKeylis
236a0 74 2d 3e 6e 52 65 61 64 3e 3d 70 4b 65 79 6c 69  t->nRead>=pKeyli
236b0 73 74 2d 3e 6e 55 73 65 64 20 29 7b 0a 20 20 20  st->nUsed ){.   
236c0 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20 70 4b     p->pList = pK
236d0 65 79 6c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  eylist->pNext;. 
236e0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
236f0 70 4b 65 79 6c 69 73 74 29 3b 0a 20 20 20 20 7d  pKeylist);.    }
23700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
23710 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
23720 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
23730 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 69 73 74 52  /* Opcode: ListR
23740 65 73 65 74 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  eset * * *.**.**
23750 20 52 65 73 65 74 20 74 68 65 20 74 65 6d 70 6f   Reset the tempo
23760 72 61 72 79 20 73 74 6f 72 61 67 65 20 62 75 66  rary storage buf
23770 66 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 68  fer so that it h
23780 6f 6c 64 73 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  olds nothing..*/
23790 0a 63 61 73 65 20 4f 50 5f 4c 69 73 74 52 65 73  .case OP_ListRes
237a0 65 74 3a 20 7b 0a 20 20 69 66 28 20 70 2d 3e 70  et: {.  if( p->p
237b0 4c 69 73 74 20 29 7b 0a 20 20 20 20 4b 65 79 6c  List ){.    Keyl
237c0 69 73 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74  istFree(p->pList
237d0 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20  );.    p->pList 
237e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
237f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
23800 4c 69 73 74 50 75 73 68 20 2a 20 2a 20 2a 20 0a  ListPush * * * .
23810 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63  **.** Save the c
23820 75 72 72 65 6e 74 20 56 64 62 65 20 6c 69 73 74  urrent Vdbe list
23830 20 73 75 63 68 20 74 68 61 74 20 69 74 20 63 61   such that it ca
23840 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 79  n be restored by
23850 20 61 20 4c 69 73 74 50 6f 70 0a 2a 2a 20 6f 70   a ListPop.** op
23860 63 6f 64 65 2e 20 54 68 65 20 6c 69 73 74 20 69  code. The list i
23870 73 20 65 6d 70 74 79 20 61 66 74 65 72 20 74 68  s empty after th
23880 69 73 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  is is executed..
23890 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 69 73 74 50  */.case OP_ListP
238a0 75 73 68 3a 20 7b 0a 20 20 70 2d 3e 6b 65 79 6c  ush: {.  p->keyl
238b0 69 73 74 53 74 61 63 6b 44 65 70 74 68 2b 2b 3b  istStackDepth++;
238c0 0a 20 20 61 73 73 65 72 74 28 70 2d 3e 6b 65 79  .  assert(p->key
238d0 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20 3e  listStackDepth >
238e0 20 30 29 3b 0a 20 20 70 2d 3e 6b 65 79 6c 69 73   0);.  p->keylis
238f0 74 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 52  tStack = sqliteR
23900 65 61 6c 6c 6f 63 28 70 2d 3e 6b 65 79 6c 69 73  ealloc(p->keylis
23910 74 53 74 61 63 6b 2c 20 0a 20 20 20 20 20 20 20  tStack, .       
23920 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 6c 69 73     sizeof(Keylis
23930 74 20 2a 29 20 2a 20 70 2d 3e 6b 65 79 6c 69 73  t *) * p->keylis
23940 74 53 74 61 63 6b 44 65 70 74 68 29 3b 0a 20 20  tStackDepth);.  
23950 69 66 28 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74  if( p->keylistSt
23960 61 63 6b 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ack==0 ) goto no
23970 5f 6d 65 6d 3b 0a 20 20 70 2d 3e 6b 65 79 6c 69  _mem;.  p->keyli
23980 73 74 53 74 61 63 6b 5b 70 2d 3e 6b 65 79 6c 69  stStack[p->keyli
23990 73 74 53 74 61 63 6b 44 65 70 74 68 20 2d 20 31  stStackDepth - 1
239a0 5d 20 3d 20 70 2d 3e 70 4c 69 73 74 3b 0a 20 20  ] = p->pList;.  
239b0 70 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  p->pList = 0;.  
239c0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
239d0 6f 64 65 3a 20 4c 69 73 74 50 6f 70 20 2a 20 2a  ode: ListPop * *
239e0 20 2a 20 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72   * .**.** Restor
239f0 65 20 74 68 65 20 56 64 62 65 20 6c 69 73 74 20  e the Vdbe list 
23a00 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
23a10 77 61 73 20 69 6e 20 77 68 65 6e 20 4c 69 73 74  was in when List
23a20 50 75 73 68 20 77 61 73 20 6c 61 73 74 0a 2a 2a  Push was last.**
23a30 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 63 61   executed..*/.ca
23a40 73 65 20 4f 50 5f 4c 69 73 74 50 6f 70 3a 20 7b  se OP_ListPop: {
23a50 0a 20 20 61 73 73 65 72 74 28 70 2d 3e 6b 65 79  .  assert(p->key
23a60 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20 3e  listStackDepth >
23a70 20 30 29 3b 0a 20 20 70 2d 3e 6b 65 79 6c 69 73   0);.  p->keylis
23a80 74 53 74 61 63 6b 44 65 70 74 68 2d 2d 3b 0a 20  tStackDepth--;. 
23a90 20 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e   KeylistFree(p->
23aa0 70 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  pList);.  p->pLi
23ab0 73 74 20 3d 20 70 2d 3e 6b 65 79 6c 69 73 74 53  st = p->keylistS
23ac0 74 61 63 6b 5b 70 2d 3e 6b 65 79 6c 69 73 74 53  tack[p->keylistS
23ad0 74 61 63 6b 44 65 70 74 68 5d 3b 0a 20 20 70 2d  tackDepth];.  p-
23ae0 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 5b 70 2d  >keylistStack[p-
23af0 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70  >keylistStackDep
23b00 74 68 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  th] = 0;.  if( p
23b10 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65  ->keylistStackDe
23b20 70 74 68 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  pth == 0 ){.    
23b30 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 6b 65  sqliteFree(p->ke
23b40 79 6c 69 73 74 53 74 61 63 6b 29 3b 0a 20 20 20  ylistStack);.   
23b50 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b   p->keylistStack
23b60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
23b70 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
23b80 20 53 6f 72 74 50 75 74 20 2a 20 2a 20 2a 0a 2a   SortPut * * *.*
23b90 2a 0a 2a 2a 20 54 68 65 20 54 4f 53 20 69 73 20  *.** The TOS is 
23ba0 74 68 65 20 6b 65 79 20 61 6e 64 20 74 68 65 20  the key and the 
23bb0 4e 4f 53 20 69 73 20 74 68 65 20 64 61 74 61 2e  NOS is the data.
23bc0 20 20 50 6f 70 20 62 6f 74 68 20 66 72 6f 6d 20    Pop both from 
23bd0 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 61 6e 64  the stack.** and
23be0 20 70 75 74 20 74 68 65 6d 20 6f 6e 20 74 68 65   put them on the
23bf0 20 73 6f 72 74 65 72 2e 20 20 54 68 65 20 6b 65   sorter.  The ke
23c00 79 20 61 6e 64 20 64 61 74 61 20 73 68 6f 75 6c  y and data shoul
23c10 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6d  d have been.** m
23c20 61 64 65 20 75 73 69 6e 67 20 53 6f 72 74 4d 61  ade using SortMa
23c30 6b 65 4b 65 79 20 61 6e 64 20 53 6f 72 74 4d 61  keKey and SortMa
23c40 6b 65 52 65 63 2c 20 72 65 73 70 65 63 74 69 76  keRec, respectiv
23c50 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ely..*/.case OP_
23c60 53 6f 72 74 50 75 74 3a 20 7b 0a 20 20 69 6e 74  SortPut: {.  int
23c70 20 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20   tos = p->tos;. 
23c80 20 69 6e 74 20 6e 6f 73 20 3d 20 74 6f 73 20 2d   int nos = tos -
23c90 20 31 3b 0a 20 20 53 6f 72 74 65 72 20 2a 70 53   1;.  Sorter *pS
23ca0 6f 72 74 65 72 3b 0a 20 20 56 45 52 49 46 59 28  orter;.  VERIFY(
23cb0 20 69 66 28 20 74 6f 73 3c 31 20 29 20 67 6f 74   if( tos<1 ) got
23cc0 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61  o not_enough_sta
23cd0 63 6b 3b 20 29 0a 20 20 69 66 28 20 44 79 6e 61  ck; ).  if( Dyna
23ce0 6d 69 63 69 66 79 28 70 2c 20 74 6f 73 29 20 7c  micify(p, tos) |
23cf0 7c 20 44 79 6e 61 6d 69 63 69 66 79 28 70 2c 20  | Dynamicify(p, 
23d00 6e 6f 73 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  nos) ) goto no_m
23d10 65 6d 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d 20  em;.  pSorter = 
23d20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
23d30 20 73 69 7a 65 6f 66 28 53 6f 72 74 65 72 29 20   sizeof(Sorter) 
23d40 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72  );.  if( pSorter
23d50 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
23d60 6d 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70 4e  m;.  pSorter->pN
23d70 65 78 74 20 3d 20 70 2d 3e 70 53 6f 72 74 3b 0a  ext = p->pSort;.
23d80 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f    p->pSort = pSo
23d90 72 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rter;.  assert( 
23da0 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67  aStack[tos].flag
23db0 73 20 26 20 53 54 4b 5f 44 79 6e 20 29 3b 0a 20  s & STK_Dyn );. 
23dc0 20 70 53 6f 72 74 65 72 2d 3e 6e 4b 65 79 20 3d   pSorter->nKey =
23dd0 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 3b 0a   aStack[tos].n;.
23de0 20 20 70 53 6f 72 74 65 72 2d 3e 7a 4b 65 79 20    pSorter->zKey 
23df0 3d 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 3b 0a 20  = zStack[tos];. 
23e00 20 70 53 6f 72 74 65 72 2d 3e 6e 44 61 74 61 20   pSorter->nData 
23e10 3d 20 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 6e 3b  = aStack[nos].n;
23e20 0a 20 20 69 66 28 20 61 53 74 61 63 6b 5b 6e 6f  .  if( aStack[no
23e30 73 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 44  s].flags & STK_D
23e40 79 6e 20 29 7b 0a 20 20 20 20 70 53 6f 72 74 65  yn ){.    pSorte
23e50 72 2d 3e 70 44 61 74 61 20 3d 20 7a 53 74 61 63  r->pData = zStac
23e60 6b 5b 6e 6f 73 5d 3b 0a 20 20 7d 65 6c 73 65 7b  k[nos];.  }else{
23e70 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70 44  .    pSorter->pD
23e80 61 74 61 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ata = sqliteStrD
23e90 75 70 28 7a 53 74 61 63 6b 5b 6e 6f 73 5d 29 3b  up(zStack[nos]);
23ea0 0a 20 20 7d 0a 20 20 61 53 74 61 63 6b 5b 74 6f  .  }.  aStack[to
23eb0 73 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  s].flags = 0;.  
23ec0 61 53 74 61 63 6b 5b 6e 6f 73 5d 2e 66 6c 61 67  aStack[nos].flag
23ed0 73 20 3d 20 30 3b 0a 20 20 7a 53 74 61 63 6b 5b  s = 0;.  zStack[
23ee0 74 6f 73 5d 20 3d 20 30 3b 0a 20 20 7a 53 74 61  tos] = 0;.  zSta
23ef0 63 6b 5b 6e 6f 73 5d 20 3d 20 30 3b 0a 20 20 70  ck[nos] = 0;.  p
23f00 2d 3e 74 6f 73 20 2d 3d 20 32 3b 0a 20 20 62 72  ->tos -= 2;.  br
23f10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
23f20 65 3a 20 53 6f 72 74 4d 61 6b 65 52 65 63 20 50  e: SortMakeRec P
23f30 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1 * *.**.** The 
23f40 74 6f 70 20 50 31 20 65 6c 65 6d 65 6e 74 73 20  top P1 elements 
23f50 61 72 65 20 74 68 65 20 61 72 67 75 6d 65 6e 74  are the argument
23f60 73 20 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b 2e  s to a callback.
23f70 20 20 46 6f 72 6d 20 74 68 65 73 65 0a 2a 2a 20    Form these.** 
23f80 65 6c 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  elements into a 
23f90 73 69 6e 67 6c 65 20 64 61 74 61 20 65 6e 74 72  single data entr
23fa0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 74  y that can be st
23fb0 6f 72 65 64 20 6f 6e 20 61 20 73 6f 72 74 65 72  ored on a sorter
23fc0 0a 2a 2a 20 75 73 69 6e 67 20 53 6f 72 74 50 75  .** using SortPu
23fd0 74 20 61 6e 64 20 6c 61 74 65 72 20 66 65 64 20  t and later fed 
23fe0 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b 20 75 73  to a callback us
23ff0 69 6e 67 20 53 6f 72 74 43 61 6c 6c 62 61 63 6b  ing SortCallback
24000 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
24010 74 4d 61 6b 65 52 65 63 3a 20 7b 0a 20 20 63 68  tMakeRec: {.  ch
24020 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 2a  ar *z;.  char **
24030 61 7a 41 72 67 3b 0a 20 20 69 6e 74 20 6e 42 79  azArg;.  int nBy
24040 74 65 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  te;.  int nField
24050 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ;.  int i, j;.. 
24060 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
24070 31 3b 0a 20 20 56 45 52 49 46 59 28 20 69 66 28  1;.  VERIFY( if(
24080 20 70 2d 3e 74 6f 73 2b 31 3c 6e 46 69 65 6c 64   p->tos+1<nField
24090 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
240a0 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 6e 42  gh_stack; ).  nB
240b0 79 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  yte = 0;.  for(i
240c0 3d 70 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31  =p->tos-nField+1
240d0 3b 20 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b  ; i<=p->tos; i++
240e0 29 7b 0a 20 20 20 20 69 66 28 20 28 61 53 74 61  ){.    if( (aSta
240f0 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54  ck[i].flags & ST
24100 4b 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  K_Null)==0 ){.  
24110 20 20 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c      Stringify(p,
24120 20 69 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65   i);.      nByte
24130 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e 3b   += aStack[i].n;
24140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 42 79  .    }.  }.  nBy
24150 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61  te += sizeof(cha
24160 72 2a 29 2a 28 6e 46 69 65 6c 64 2b 31 29 3b 0a  r*)*(nField+1);.
24170 20 20 61 7a 41 72 67 20 3d 20 73 71 6c 69 74 65    azArg = sqlite
24180 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65  MallocRaw( nByte
24190 20 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d   );.  if( azArg=
241a0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
241b0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
241c0 61 7a 41 72 67 5b 6e 46 69 65 6c 64 2b 31 5d 3b  azArg[nField+1];
241d0 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 69 3d 70 2d  .  for(j=0, i=p-
241e0 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20 69  >tos-nField+1; i
241f0 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 2c 20 6a  <=p->tos; i++, j
24200 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 74  ++){.    if( aSt
24210 61 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53  ack[i].flags & S
24220 54 4b 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  TK_Null ){.     
24230 20 61 7a 41 72 67 5b 6a 5d 20 3d 20 30 3b 0a 20   azArg[j] = 0;. 
24240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24250 61 7a 41 72 67 5b 6a 5d 20 3d 20 7a 3b 0a 20 20  azArg[j] = z;.  
24260 20 20 20 20 73 74 72 63 70 79 28 7a 2c 20 7a 53      strcpy(z, zS
24270 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20  tack[i]);.      
24280 7a 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e 6e  z += aStack[i].n
24290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 50 6f  ;.    }.  }.  Po
242a0 70 53 74 61 63 6b 28 70 2c 20 6e 46 69 65 6c 64  pStack(p, nField
242b0 29 3b 0a 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20  );.  p->tos++;. 
242c0 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e   aStack[p->tos].
242d0 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7a 53 74  n = nByte;.  zSt
242e0 61 63 6b 5b 70 2d 3e 74 6f 73 5d 20 3d 20 28 63  ack[p->tos] = (c
242f0 68 61 72 2a 29 61 7a 41 72 67 3b 0a 20 20 61 53  har*)azArg;.  aS
24300 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c 61  tack[p->tos].fla
24310 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53 54 4b  gs = STK_Str|STK
24320 5f 44 79 6e 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  _Dyn;.  break;.}
24330 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  ../* Opcode: Sor
24340 74 4d 61 6b 65 4b 65 79 20 2a 20 2a 20 50 33 0a  tMakeKey * * P3.
24350 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  **.** Convert th
24360 65 20 74 6f 70 20 66 65 77 20 65 6e 74 72 69 65  e top few entrie
24370 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  s of the stack i
24380 6e 74 6f 20 61 20 73 6f 72 74 20 6b 65 79 2e 20  nto a sort key. 
24390 20 54 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   The.** number o
243a0 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20  f stack entries 
243b0 63 6f 6e 73 75 6d 65 64 20 69 73 20 74 68 65 20  consumed is the 
243c0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
243d0 74 65 72 73 20 69 6e 20 0a 2a 2a 20 74 68 65 20  ters in .** the 
243e0 73 74 72 69 6e 67 20 50 33 2e 20 20 4f 6e 65 20  string P3.  One 
243f0 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 50  character from P
24400 33 20 69 73 20 70 72 65 70 65 6e 64 65 64 20 74  3 is prepended t
24410 6f 20 65 61 63 68 20 65 6e 74 72 79 2e 0a 2a 2a  o each entry..**
24420 20 54 68 65 20 66 69 72 73 74 20 63 68 61 72 61   The first chara
24430 63 74 65 72 20 6f 66 20 50 33 20 69 73 20 70 72  cter of P3 is pr
24440 65 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65  epended to the e
24450 6c 65 6d 65 6e 74 20 6c 6f 77 65 73 74 20 69 6e  lement lowest in
24460 0a 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 61 6e  .** the stack an
24470 64 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  d the last chara
24480 63 74 65 72 20 6f 66 20 50 33 20 69 73 20 70 72  cter of P3 is pr
24490 65 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 74  epended to the t
244a0 6f 70 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 61  op of.** the sta
244b0 63 6b 2e 20 20 41 6c 6c 20 73 74 61 63 6b 20 65  ck.  All stack e
244c0 6e 74 72 69 65 73 20 61 72 65 20 73 65 70 61 72  ntries are separ
244d0 61 74 65 64 20 62 79 20 61 20 5c 30 30 30 20 63  ated by a \000 c
244e0 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
244f0 68 65 20 72 65 73 75 6c 74 2e 20 20 54 68 65 20  he result.  The 
24500 77 68 6f 6c 65 20 6b 65 79 20 69 73 20 74 65 72  whole key is ter
24510 6d 69 6e 61 74 65 64 20 62 79 20 74 77 6f 20 5c  minated by two \
24520 30 30 30 20 63 68 61 72 61 63 74 65 72 73 0a 2a  000 characters.*
24530 2a 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 0a 2a  * in a row..**.*
24540 2a 20 22 4e 22 20 69 73 20 73 75 62 73 74 69 74  * "N" is substit
24550 75 74 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  uted in place of
24560 20 74 68 65 20 50 33 20 63 68 61 72 61 63 74 65   the P3 characte
24570 72 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  r for NULL value
24580 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
24590 6f 20 74 68 65 20 4d 61 6b 65 4b 65 79 20 61 6e  o the MakeKey an
245a0 64 20 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63  d MakeIdxKey opc
245b0 6f 64 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  odes..*/.case OP
245c0 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 3a 20 7b 0a  _SortMakeKey: {.
245d0 20 20 63 68 61 72 20 2a 7a 4e 65 77 4b 65 79 3b    char *zNewKey;
245e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
245f0 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e  int nField;.  in
24600 74 20 69 2c 20 6a 2c 20 6b 3b 0a 0a 20 20 6e 46  t i, j, k;..  nF
24610 69 65 6c 64 20 3d 20 73 74 72 6c 65 6e 28 70 4f  ield = strlen(pO
24620 70 2d 3e 70 33 29 3b 0a 20 20 56 45 52 49 46 59  p->p3);.  VERIFY
24630 28 20 69 66 28 20 70 2d 3e 74 6f 73 2b 31 3c 6e  ( if( p->tos+1<n
24640 46 69 65 6c 64 20 29 20 67 6f 74 6f 20 6e 6f 74  Field ) goto not
24650 5f 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29  _enough_stack; )
24660 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20  .  nByte = 1;.  
24670 66 6f 72 28 69 3d 70 2d 3e 74 6f 73 2d 6e 46 69  for(i=p->tos-nFi
24680 65 6c 64 2b 31 3b 20 69 3c 3d 70 2d 3e 74 6f 73  eld+1; i<=p->tos
24690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
246a0 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73  (aStack[i].flags
246b0 20 26 20 53 54 4b 5f 4e 75 6c 6c 29 21 3d 30 20   & STK_Null)!=0 
246c0 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
246d0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 2;.    }else{.
246e0 20 20 20 20 20 20 53 74 72 69 6e 67 69 66 79 28        Stringify(
246f0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 6e 42 79  p, i);.      nBy
24700 74 65 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d 2e  te += aStack[i].
24710 6e 2b 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+2;.    }.  }. 
24720 20 7a 4e 65 77 4b 65 79 20 3d 20 73 71 6c 69 74   zNewKey = sqlit
24730 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
24740 65 20 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4b  e );.  if( zNewK
24750 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  ey==0 ) goto no_
24760 6d 65 6d 3b 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  mem;.  j = 0;.  
24770 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70  k = 0;.  for(i=p
24780 2d 3e 74 6f 73 2d 6e 46 69 65 6c 64 2b 31 3b 20  ->tos-nField+1; 
24790 69 3c 3d 70 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b  i<=p->tos; i++){
247a0 0a 20 20 20 20 69 66 28 20 28 61 53 74 61 63 6b  .    if( (aStack
247b0 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [i].flags & STK_
247c0 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Null)!=0 ){.    
247d0 20 20 7a 4e 65 77 4b 65 79 5b 6a 2b 2b 5d 20 3d    zNewKey[j++] =
247e0 20 27 4e 27 3b 0a 20 20 20 20 20 20 7a 4e 65 77   'N';.      zNew
247f0 4b 65 79 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20  Key[j++] = 0;.  
24800 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c      k++;.    }el
24810 73 65 7b 0a 20 20 20 20 20 20 7a 4e 65 77 4b 65  se{.      zNewKe
24820 79 5b 6a 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 33  y[j++] = pOp->p3
24830 5b 6b 2b 2b 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  [k++];.      mem
24840 63 70 79 28 26 7a 4e 65 77 4b 65 79 5b 6a 5d 2c  cpy(&zNewKey[j],
24850 20 7a 53 74 61 63 6b 5b 69 5d 2c 20 61 53 74 61   zStack[i], aSta
24860 63 6b 5b 69 5d 2e 6e 2d 31 29 3b 0a 20 20 20 20  ck[i].n-1);.    
24870 20 20 6a 20 2b 3d 20 61 53 74 61 63 6b 5b 69 5d    j += aStack[i]
24880 2e 6e 2d 31 3b 0a 20 20 20 20 20 20 7a 4e 65 77  .n-1;.      zNew
24890 4b 65 79 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20  Key[j++] = 0;.  
248a0 20 20 7d 0a 20 20 7d 0a 20 20 7a 4e 65 77 4b 65    }.  }.  zNewKe
248b0 79 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65  y[j] = 0;.  asse
248c0 72 74 28 20 6a 3c 6e 42 79 74 65 20 29 3b 0a 20  rt( j<nByte );. 
248d0 20 50 6f 70 53 74 61 63 6b 28 70 2c 20 6e 46 69   PopStack(p, nFi
248e0 65 6c 64 29 3b 0a 20 20 70 2d 3e 74 6f 73 2b 2b  eld);.  p->tos++
248f0 3b 0a 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f  ;.  aStack[p->to
24900 73 5d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  s].n = nByte;.  
24910 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66  aStack[p->tos].f
24920 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53  lags = STK_Str|S
24930 54 4b 5f 44 79 6e 3b 0a 20 20 7a 53 74 61 63 6b  TK_Dyn;.  zStack
24940 5b 70 2d 3e 74 6f 73 5d 20 3d 20 7a 4e 65 77 4b  [p->tos] = zNewK
24950 65 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ey;.  break;.}..
24960 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20  /* Opcode: Sort 
24970 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 6f 72 74  * * *.**.** Sort
24980 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 6e   all elements on
24990 20 74 68 65 20 73 6f 72 74 65 72 2e 20 20 54 68   the sorter.  Th
249a0 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 61  e algorithm is a
249b0 0a 2a 2a 20 6d 65 72 67 65 73 6f 72 74 2e 0a 2a  .** mergesort..*
249c0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20  /.case OP_Sort: 
249d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 6f 72  {.  int i;.  Sor
249e0 74 65 72 20 2a 70 45 6c 65 6d 3b 0a 20 20 53 6f  ter *pElem;.  So
249f0 72 74 65 72 20 2a 61 70 53 6f 72 74 65 72 5b 4e  rter *apSorter[N
24a00 53 4f 52 54 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  SORT];.  for(i=0
24a10 3b 20 69 3c 4e 53 4f 52 54 3b 20 69 2b 2b 29 7b  ; i<NSORT; i++){
24a20 0a 20 20 20 20 61 70 53 6f 72 74 65 72 5b 69 5d  .    apSorter[i]
24a30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 0;.  }.  whil
24a40 65 28 20 70 2d 3e 70 53 6f 72 74 20 29 7b 0a 20  e( p->pSort ){. 
24a50 20 20 20 70 45 6c 65 6d 20 3d 20 70 2d 3e 70 53     pElem = p->pS
24a60 6f 72 74 3b 0a 20 20 20 20 70 2d 3e 70 53 6f 72  ort;.    p->pSor
24a70 74 20 3d 20 70 45 6c 65 6d 2d 3e 70 4e 65 78 74  t = pElem->pNext
24a80 3b 0a 20 20 20 20 70 45 6c 65 6d 2d 3e 70 4e 65  ;.    pElem->pNe
24a90 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  xt = 0;.    for(
24aa0 69 3d 30 3b 20 69 3c 4e 53 4f 52 54 2d 31 3b 20  i=0; i<NSORT-1; 
24ab0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 70  i++){.    if( ap
24ac0 53 6f 72 74 65 72 5b 69 5d 3d 3d 30 20 29 7b 0a  Sorter[i]==0 ){.
24ad0 20 20 20 20 20 20 20 20 61 70 53 6f 72 74 65 72          apSorter
24ae0 5b 69 5d 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 20  [i] = pElem;.   
24af0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24b10 20 70 45 6c 65 6d 20 3d 20 4d 65 72 67 65 28 61   pElem = Merge(a
24b20 70 53 6f 72 74 65 72 5b 69 5d 2c 20 70 45 6c 65  pSorter[i], pEle
24b30 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 70 53 6f  m);.        apSo
24b40 72 74 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rter[i] = 0;.   
24b50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
24b60 66 28 20 69 3e 3d 4e 53 4f 52 54 2d 31 20 29 7b  f( i>=NSORT-1 ){
24b70 0a 20 20 20 20 20 20 61 70 53 6f 72 74 65 72 5b  .      apSorter[
24b80 4e 53 4f 52 54 2d 31 5d 20 3d 20 4d 65 72 67 65  NSORT-1] = Merge
24b90 28 61 70 53 6f 72 74 65 72 5b 4e 53 4f 52 54 2d  (apSorter[NSORT-
24ba0 31 5d 2c 70 45 6c 65 6d 29 3b 0a 20 20 20 20 7d  1],pElem);.    }
24bb0 0a 20 20 7d 0a 20 20 70 45 6c 65 6d 20 3d 20 30  .  }.  pElem = 0
24bc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  ;.  for(i=0; i<N
24bd0 53 4f 52 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  SORT; i++){.    
24be0 70 45 6c 65 6d 20 3d 20 4d 65 72 67 65 28 61 70  pElem = Merge(ap
24bf0 53 6f 72 74 65 72 5b 69 5d 2c 20 70 45 6c 65 6d  Sorter[i], pElem
24c00 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 53 6f 72  );.  }.  p->pSor
24c10 74 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 62 72 65  t = pElem;.  bre
24c20 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
24c30 3a 20 53 6f 72 74 4e 65 78 74 20 2a 20 50 32 20  : SortNext * P2 
24c40 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 74 68 65  *.**.** Push the
24c50 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 74 6f   data for the to
24c60 70 6d 6f 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e  pmost element in
24c70 20 74 68 65 20 73 6f 72 74 65 72 20 6f 6e 74 6f   the sorter onto
24c80 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2c 20 74   the.** stack, t
24c90 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 65  hen remove the e
24ca0 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  lement from the 
24cb0 73 6f 72 74 65 72 2e 20 20 49 66 20 74 68 65 20  sorter.  If the 
24cc0 73 6f 72 74 65 72 0a 2a 2a 20 69 73 20 65 6d 70  sorter.** is emp
24cd0 74 79 2c 20 70 75 73 68 20 6e 6f 74 68 69 6e 67  ty, push nothing
24ce0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 61 6e   on the stack an
24cf0 64 20 69 6e 73 74 65 61 64 20 6a 75 6d 70 20 69  d instead jump i
24d00 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 74  mmediately .** t
24d10 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
24d20 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
24d30 74 4e 65 78 74 3a 20 7b 0a 20 20 53 6f 72 74 65  tNext: {.  Sorte
24d40 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e  r *pSorter = p->
24d50 70 53 6f 72 74 3b 0a 20 20 43 48 45 43 4b 5f 46  pSort;.  CHECK_F
24d60 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
24d70 69 66 28 20 70 53 6f 72 74 65 72 21 3d 30 20 29  if( pSorter!=0 )
24d80 7b 0a 20 20 20 20 70 2d 3e 70 53 6f 72 74 20 3d  {.    p->pSort =
24d90 20 70 53 6f 72 74 65 72 2d 3e 70 4e 65 78 74 3b   pSorter->pNext;
24da0 0a 20 20 20 20 70 2d 3e 74 6f 73 2b 2b 3b 0a 20  .    p->tos++;. 
24db0 20 20 20 7a 53 74 61 63 6b 5b 70 2d 3e 74 6f 73     zStack[p->tos
24dc0 5d 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 44 61  ] = pSorter->pDa
24dd0 74 61 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 70  ta;.    aStack[p
24de0 2d 3e 74 6f 73 5d 2e 6e 20 3d 20 70 53 6f 72 74  ->tos].n = pSort
24df0 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61  er->nData;.    a
24e00 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
24e10 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 7c 53 54  ags = STK_Str|ST
24e20 4b 5f 44 79 6e 3b 0a 20 20 20 20 73 71 6c 69 74  K_Dyn;.    sqlit
24e30 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a  eFree(pSorter->z
24e40 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
24e50 46 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20  Free(pSorter);. 
24e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63 20 3d   }else{.    pc =
24e70 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
24e80 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
24e90 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 43 61 6c   Opcode: SortCal
24ea0 6c 62 61 63 6b 20 50 31 20 2a 20 2a 0a 2a 2a 0a  lback P1 * *.**.
24eb0 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
24ec0 65 20 73 74 61 63 6b 20 63 6f 6e 74 61 69 6e 73  e stack contains
24ed0 20 61 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f   a callback reco
24ee0 72 64 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a  rd built using.*
24ef0 2a 20 74 68 65 20 53 6f 72 74 4d 61 6b 65 52 65  * the SortMakeRe
24f00 63 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68  c operation with
24f10 20 74 68 65 20 73 61 6d 65 20 50 31 20 76 61 6c   the same P1 val
24f20 75 65 20 61 73 20 74 68 69 73 0a 2a 2a 20 69 6e  ue as this.** in
24f30 73 74 72 75 63 74 69 6f 6e 2e 20 20 50 6f 70 20  struction.  Pop 
24f40 74 68 69 73 20 72 65 63 6f 72 64 20 66 72 6f 6d  this record from
24f50 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 69   the stack and i
24f60 6e 76 6f 6b 65 20 74 68 65 0a 2a 2a 20 63 61 6c  nvoke the.** cal
24f70 6c 62 61 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  lback on it..*/.
24f80 63 61 73 65 20 4f 50 5f 53 6f 72 74 43 61 6c 6c  case OP_SortCall
24f90 62 61 63 6b 3a 20 7b 0a 20 20 69 6e 74 20 69 20  back: {.  int i 
24fa0 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56 45 52 49  = p->tos;.  VERI
24fb0 46 59 28 20 69 66 28 20 69 3c 30 20 29 20 67 6f  FY( if( i<0 ) go
24fc0 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74  to not_enough_st
24fd0 61 63 6b 3b 20 29 0a 20 20 69 66 28 20 70 2d 3e  ack; ).  if( p->
24fe0 78 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  xCallback==0 ){.
24ff0 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 2b 31      p->pc = pc+1
25000 3b 0a 20 20 20 20 70 2d 3e 61 7a 52 65 73 43 6f  ;.    p->azResCo
25010 6c 75 6d 6e 20 3d 20 28 63 68 61 72 2a 2a 29 7a  lumn = (char**)z
25020 53 74 61 63 6b 5b 69 5d 3b 0a 20 20 20 20 70 2d  Stack[i];.    p-
25030 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70 4f  >nResColumn = pO
25040 70 2d 3e 70 31 3b 0a 20 20 20 20 70 2d 3e 70 6f  p->p1;.    p->po
25050 70 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  pStack = 1;.    
25060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f  return SQLITE_RO
25070 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  W;.  }else{.    
25080 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74 79  if( sqliteSafety
25090 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61  Off(db) ) goto a
250a0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75  bort_due_to_misu
250b0 73 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 78  se;.    if( p->x
250c0 43 61 6c 6c 62 61 63 6b 28 70 2d 3e 70 43 62 41  Callback(p->pCbA
250d0 72 67 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 63 68  rg, pOp->p1, (ch
250e0 61 72 2a 2a 29 7a 53 74 61 63 6b 5b 69 5d 2c 20  ar**)zStack[i], 
250f0 70 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 29 21 3d 30  p->azColName)!=0
25100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25110 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20  QLITE_ABORT;.   
25120 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
25130 65 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20  eSafetyOn(db) ) 
25140 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
25150 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 20 20 70 2d  o_misuse;.    p-
25160 3e 6e 43 61 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20  >nCallback++;.  
25170 7d 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20  }.  POPSTACK;.  
25180 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
25190 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
251a0 6e 6f 5f 6d 65 6d 3b 0a 20 20 62 72 65 61 6b 3b  no_mem;.  break;
251b0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
251c0 6f 72 74 52 65 73 65 74 20 2a 20 2a 20 2a 0a 2a  ortReset * * *.*
251d0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20  *.** Remove any 
251e0 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65  elements that re
251f0 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73 6f 72 74  main on the sort
25200 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  er..*/.case OP_S
25210 6f 72 74 52 65 73 65 74 3a 20 7b 0a 20 20 53 6f  ortReset: {.  So
25220 72 74 65 72 52 65 73 65 74 28 70 29 3b 0a 20 20  rterReset(p);.  
25230 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
25240 6f 64 65 3a 20 46 69 6c 65 4f 70 65 6e 20 2a 20  ode: FileOpen * 
25250 2a 20 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  * P3.**.** Open 
25260 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 62  the file named b
25270 79 20 50 33 20 66 6f 72 20 72 65 61 64 69 6e 67  y P3 for reading
25280 20 75 73 69 6e 67 20 74 68 65 20 46 69 6c 65 52   using the FileR
25290 65 61 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 49  ead opcode..** I
252a0 66 20 50 33 20 69 73 20 22 73 74 64 69 6e 22 20  f P3 is "stdin" 
252b0 74 68 65 6e 20 6f 70 65 6e 20 73 74 61 6e 64 61  then open standa
252c0 72 64 20 69 6e 70 75 74 20 66 6f 72 20 72 65 61  rd input for rea
252d0 64 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ding..*/.case OP
252e0 5f 46 69 6c 65 4f 70 65 6e 3a 20 7b 0a 20 20 56  _FileOpen: {.  V
252f0 45 52 49 46 59 28 20 69 66 28 20 70 4f 70 2d 3e  ERIFY( if( pOp->
25300 70 33 3d 3d 30 20 29 20 67 6f 74 6f 20 62 61 64  p3==0 ) goto bad
25310 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a  _instruction; ).
25320 20 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 20 29    if( p->pFile )
25330 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69  {.    if( p->pFi
25340 6c 65 21 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f  le!=stdin ) fclo
25350 73 65 28 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20  se(p->pFile);.  
25360 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a    p->pFile = 0;.
25370 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
25380 53 74 72 49 43 6d 70 28 70 4f 70 2d 3e 70 33 2c  StrICmp(pOp->p3,
25390 22 73 74 64 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  "stdin")==0 ){. 
253a0 20 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 73 74     p->pFile = st
253b0 64 69 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  din;.  }else{.  
253c0 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 66 6f 70    p->pFile = fop
253d0 65 6e 28 70 4f 70 2d 3e 70 33 2c 20 22 72 22 29  en(pOp->p3, "r")
253e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
253f0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
25400 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
25410 70 2d 3e 7a 45 72 72 4d 73 67 2c 22 75 6e 61 62  p->zErrMsg,"unab
25420 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 3a  le to open file:
25430 20 22 2c 20 70 4f 70 2d 3e 70 33 2c 20 30 29 3b   ", pOp->p3, 0);
25440 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
25450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72  _ERROR;.  }.  br
25460 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
25470 65 3a 20 46 69 6c 65 52 65 61 64 20 50 31 20 50  e: FileRead P1 P
25480 32 20 50 33 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20  2 P3.**.** Read 
25490 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
254a0 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
254b0 6f 70 65 6e 20 66 69 6c 65 20 28 74 68 65 20 66  open file (the f
254c0 69 6c 65 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  ile opened using
254d0 0a 2a 2a 20 46 69 6c 65 4f 70 65 6e 29 2e 20 20  .** FileOpen).  
254e0 49 66 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  If we reach end-
254f0 6f 66 2d 66 69 6c 65 2c 20 6a 75 6d 70 20 69 6d  of-file, jump im
25500 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
25510 20 20 49 66 0a 2a 2a 20 77 65 20 61 72 65 20 61    If.** we are a
25520 62 6c 65 20 74 6f 20 67 65 74 20 61 6e 6f 74 68  ble to get anoth
25530 65 72 20 6c 69 6e 65 2c 20 73 70 6c 69 74 20 74  er line, split t
25540 68 65 20 6c 69 6e 65 20 61 70 61 72 74 20 75 73  he line apart us
25550 69 6e 67 20 50 33 20 61 73 0a 2a 2a 20 61 20 64  ing P3 as.** a d
25560 65 6c 69 6d 69 74 65 72 2e 20 20 54 68 65 72 65  elimiter.  There
25570 20 73 68 6f 75 6c 64 20 62 65 20 50 31 20 66 69   should be P1 fi
25580 65 6c 64 73 2e 20 20 49 66 20 74 68 65 20 69 6e  elds.  If the in
25590 70 75 74 20 6c 69 6e 65 20 63 6f 6e 74 61 69 6e  put line contain
255a0 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 50  s.** more than P
255b0 31 20 66 69 65 6c 64 73 2c 20 69 67 6e 6f 72 65  1 fields, ignore
255c0 20 74 68 65 20 65 78 63 65 73 73 2e 20 20 49 66   the excess.  If
255d0 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
255e0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 66 65 77 65  contains.** fewe
255f0 72 20 74 68 61 6e 20 50 31 20 66 69 65 6c 64 73  r than P1 fields
25600 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 65 6d  , assume the rem
25610 61 69 6e 69 6e 67 20 66 69 65 6c 64 73 20 63 6f  aining fields co
25620 6e 74 61 69 6e 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a  ntain NULLs..**.
25630 2a 2a 20 49 6e 70 75 74 20 65 6e 64 73 20 69 66  ** Input ends if
25640 20 61 20 6c 69 6e 65 20 63 6f 6e 73 69 73 74 73   a line consists
25650 20 6f 66 20 6a 75 73 74 20 22 5c 2e 22 2e 20 20   of just "\.".  
25660 41 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 69  A field containi
25670 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 22 5c 4e 22 20  ng only.** "\N" 
25680 69 73 20 61 20 6e 75 6c 6c 20 66 69 65 6c 64 2e  is a null field.
25690 20 20 54 68 65 20 62 61 63 6b 73 6c 61 73 68 20    The backslash 
256a0 5c 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20  \ character can 
256b0 62 65 20 75 73 65 64 20 62 65 20 75 73 65 64 0a  be used be used.
256c0 2a 2a 20 74 6f 20 65 73 63 61 70 65 20 6e 65 77  ** to escape new
256d0 6c 69 6e 65 73 20 6f 72 20 74 68 65 20 64 65 6c  lines or the del
256e0 69 6d 69 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20  imiter..*/.case 
256f0 4f 50 5f 46 69 6c 65 52 65 61 64 3a 20 7b 0a 20  OP_FileRead: {. 
25700 20 69 6e 74 20 6e 2c 20 65 6f 6c 2c 20 6e 46 69   int n, eol, nFi
25710 65 6c 64 2c 20 69 2c 20 63 2c 20 6e 44 65 6c 69  eld, i, c, nDeli
25720 6d 3b 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 69  m;.  char *zDeli
25730 6d 2c 20 2a 7a 3b 0a 20 20 43 48 45 43 4b 5f 46  m, *z;.  CHECK_F
25740 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
25750 69 66 28 20 70 2d 3e 70 46 69 6c 65 3d 3d 30 20  if( p->pFile==0 
25760 29 20 67 6f 74 6f 20 66 69 6c 65 72 65 61 64 5f  ) goto fileread_
25770 6a 75 6d 70 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  jump;.  nField =
25780 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20   pOp->p1;.  if( 
25790 6e 46 69 65 6c 64 3c 3d 30 20 29 20 67 6f 74 6f  nField<=0 ) goto
257a0 20 66 69 6c 65 72 65 61 64 5f 6a 75 6d 70 3b 0a   fileread_jump;.
257b0 20 20 69 66 28 20 6e 46 69 65 6c 64 21 3d 70 2d    if( nField!=p-
257c0 3e 6e 46 69 65 6c 64 20 7c 7c 20 70 2d 3e 61 7a  >nField || p->az
257d0 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Field==0 ){.    
257e0 63 68 61 72 20 2a 2a 61 7a 46 69 65 6c 64 20 3d  char **azField =
257f0 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
25800 2d 3e 61 7a 46 69 65 6c 64 2c 20 73 69 7a 65 6f  ->azField, sizeo
25810 66 28 63 68 61 72 2a 29 2a 6e 46 69 65 6c 64 2b  f(char*)*nField+
25820 31 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 46 69  1);.    if( azFi
25830 65 6c 64 3d 3d 30 20 29 7b 20 67 6f 74 6f 20 6e  eld==0 ){ goto n
25840 6f 5f 6d 65 6d 3b 20 7d 0a 20 20 20 20 70 2d 3e  o_mem; }.    p->
25850 61 7a 46 69 65 6c 64 20 3d 20 61 7a 46 69 65 6c  azField = azFiel
25860 64 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  d;.    p->nField
25870 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 7d 0a 20   = nField;.  }. 
25880 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20   n = 0;.  eol = 
25890 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 6f 6c 3d  0;.  while( eol=
258a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
258b0 3e 7a 4c 69 6e 65 3d 3d 30 20 7c 7c 20 6e 2b 32  >zLine==0 || n+2
258c0 30 30 3e 70 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f 63  00>p->nLineAlloc
258d0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
258e0 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 70 2d 3e  zLine;.      p->
258f0 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d 20 70 2d 3e  nLineAlloc = p->
25900 6e 4c 69 6e 65 41 6c 6c 6f 63 2a 32 20 2b 20 33  nLineAlloc*2 + 3
25910 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
25920 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
25930 70 2d 3e 7a 4c 69 6e 65 2c 20 70 2d 3e 6e 4c 69  p->zLine, p->nLi
25940 6e 65 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  neAlloc);.      
25950 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a  if( zLine==0 ){.
25960 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65          p->nLine
25970 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  Alloc = 0;.     
25980 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
25990 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  >zLine);.       
259a0 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20   p->zLine = 0;. 
259b0 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d         goto no_m
259c0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
259d0 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 7a 4c 69    p->zLine = zLi
259e0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
259f0 28 20 76 64 62 65 5f 66 67 65 74 73 28 26 70 2d  ( vdbe_fgets(&p-
25a00 3e 7a 4c 69 6e 65 5b 6e 5d 2c 20 70 2d 3e 6e 4c  >zLine[n], p->nL
25a10 69 6e 65 41 6c 6c 6f 63 2d 6e 2c 20 70 2d 3e 70  ineAlloc-n, p->p
25a20 46 69 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  File)==0 ){.    
25a30 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
25a40 20 70 2d 3e 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30   p->zLine[n] = 0
25a50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25a60 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
25a70 77 68 69 6c 65 28 20 28 63 20 3d 20 70 2d 3e 7a  while( (c = p->z
25a80 4c 69 6e 65 5b 6e 5d 29 21 3d 30 20 29 7b 0a 20  Line[n])!=0 ){. 
25a90 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
25aa0 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  \' ){.          
25ab0 69 66 28 20 70 2d 3e 7a 4c 69 6e 65 5b 6e 2b 31  if( p->zLine[n+1
25ac0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
25ad0 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 32 3b 0a          n += 2;.
25ae0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
25af0 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
25b00 20 20 20 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 5b         p->zLine[
25b10 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
25b20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
25b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25b50 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
25b60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25b70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30  }.  }.  if( n==0
25b80 20 29 20 67 6f 74 6f 20 66 69 6c 65 72 65 61 64   ) goto fileread
25b90 5f 6a 75 6d 70 3b 0a 20 20 7a 20 3d 20 70 2d 3e  _jump;.  z = p->
25ba0 7a 4c 69 6e 65 3b 0a 20 20 69 66 28 20 7a 5b 30  zLine;.  if( z[0
25bb0 5d 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 31 5d 3d  ]=='\\' && z[1]=
25bc0 3d 27 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 30 20  ='.' && z[2]==0 
25bd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c 65  ){.    goto file
25be0 72 65 61 64 5f 6a 75 6d 70 3b 0a 20 20 7d 0a 20  read_jump;.  }. 
25bf0 20 7a 44 65 6c 69 6d 20 3d 20 70 4f 70 2d 3e 70   zDelim = pOp->p
25c00 33 3b 0a 20 20 69 66 28 20 7a 44 65 6c 69 6d 3d  3;.  if( zDelim=
25c10 3d 30 20 29 20 7a 44 65 6c 69 6d 20 3d 20 22 5c  =0 ) zDelim = "\
25c20 74 22 3b 0a 20 20 63 20 3d 20 7a 44 65 6c 69 6d  t";.  c = zDelim
25c30 5b 30 5d 3b 0a 20 20 6e 44 65 6c 69 6d 20 3d 20  [0];.  nDelim = 
25c40 73 74 72 6c 65 6e 28 7a 44 65 6c 69 6d 29 3b 0a  strlen(zDelim);.
25c50 20 20 70 2d 3e 61 7a 46 69 65 6c 64 5b 30 5d 20    p->azField[0] 
25c60 3d 20 7a 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  = z;.  for(i=1; 
25c70 2a 7a 21 3d 30 20 26 26 20 69 3c 3d 6e 46 69 65  *z!=0 && i<=nFie
25c80 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ld; i++){.    in
25c90 74 20 66 72 6f 6d 2c 20 74 6f 3b 0a 20 20 20 20  t from, to;.    
25ca0 66 72 6f 6d 20 3d 20 74 6f 20 3d 20 30 3b 0a 20  from = to = 0;. 
25cb0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 5c     if( z[0]=='\\
25cc0 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 4e 27 20 0a  ' && z[1]=='N' .
25cd0 20 20 20 20 20 20 20 26 26 20 28 7a 5b 32 5d 3d         && (z[2]=
25ce0 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 26 7a  =0 || strncmp(&z
25cf0 5b 32 5d 2c 7a 44 65 6c 69 6d 2c 6e 44 65 6c 69  [2],zDelim,nDeli
25d00 6d 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  m)==0) ){.      
25d10 69 66 28 20 69 3c 3d 6e 46 69 65 6c 64 20 29 20  if( i<=nField ) 
25d20 70 2d 3e 61 7a 46 69 65 6c 64 5b 69 2d 31 5d 20  p->azField[i-1] 
25d30 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
25d40 32 20 2b 20 6e 44 65 6c 69 6d 3b 0a 20 20 20 20  2 + nDelim;.    
25d50 20 20 69 66 28 20 69 3c 6e 46 69 65 6c 64 20 29    if( i<nField )
25d60 20 70 2d 3e 61 7a 46 69 65 6c 64 5b 69 5d 20 3d   p->azField[i] =
25d70 20 7a 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   z;.      contin
25d80 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ue;.    }.    wh
25d90 69 6c 65 28 20 7a 5b 66 72 6f 6d 5d 20 29 7b 0a  ile( z[from] ){.
25da0 20 20 20 20 20 20 69 66 28 20 7a 5b 66 72 6f 6d        if( z[from
25db0 5d 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 66 72 6f  ]=='\\' && z[fro
25dc0 6d 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  m+1]!=0 ){.     
25dd0 20 20 20 7a 5b 74 6f 2b 2b 5d 20 3d 20 7a 5b 66     z[to++] = z[f
25de0 72 6f 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  rom+1];.        
25df0 66 72 6f 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  from += 2;.     
25e00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
25e10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
25e20 5b 66 72 6f 6d 5d 3d 3d 63 20 26 26 20 73 74 72  [from]==c && str
25e30 6e 63 6d 70 28 26 7a 5b 66 72 6f 6d 5d 2c 7a 44  ncmp(&z[from],zD
25e40 65 6c 69 6d 2c 6e 44 65 6c 69 6d 29 3d 3d 30 20  elim,nDelim)==0 
25e50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a  ) break;.      z
25e60 5b 74 6f 2b 2b 5d 20 3d 20 7a 5b 66 72 6f 6d 2b  [to++] = z[from+
25e70 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  +];.    }.    if
25e80 28 20 7a 5b 66 72 6f 6d 5d 20 29 7b 0a 20 20 20  ( z[from] ){.   
25e90 20 20 20 7a 5b 74 6f 5d 20 3d 20 30 3b 0a 20 20     z[to] = 0;.  
25ea0 20 20 20 20 7a 20 2b 3d 20 66 72 6f 6d 20 2b 20      z += from + 
25eb0 6e 44 65 6c 69 6d 3b 0a 20 20 20 20 20 20 69 66  nDelim;.      if
25ec0 28 20 69 3c 6e 46 69 65 6c 64 20 29 20 70 2d 3e  ( i<nField ) p->
25ed0 61 7a 46 69 65 6c 64 5b 69 5d 20 3d 20 7a 3b 0a  azField[i] = z;.
25ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ef0 20 7a 5b 74 6f 5d 20 3d 20 30 3b 0a 20 20 20 20   z[to] = 0;.    
25f00 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a    z = "";.    }.
25f10 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e    }.  while( i<n
25f20 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 70 2d 3e  Field ){.    p->
25f30 61 7a 46 69 65 6c 64 5b 69 2b 2b 5d 20 3d 20 30  azField[i++] = 0
25f40 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  ;.  }.  break;..
25f50 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
25f60 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2c 20 6f 72   end-of-file, or
25f70 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
25f80 73 20 77 72 6f 6e 67 2c 20 6a 75 6d 70 20 68 65  s wrong, jump he
25f90 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f  re..  ** This co
25fa0 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 20  de will cause a 
25fb0 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 66 69  jump to P2 */.fi
25fc0 6c 65 72 65 61 64 5f 6a 75 6d 70 3a 0a 20 20 70  leread_jump:.  p
25fd0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
25fe0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
25ff0 4f 70 63 6f 64 65 3a 20 46 69 6c 65 43 6f 6c 75  Opcode: FileColu
26000 6d 6e 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  mn P1 * *.**.** 
26010 50 75 73 68 20 6f 6e 74 6f 20 74 68 65 20 73 74  Push onto the st
26020 61 63 6b 20 74 68 65 20 50 31 2d 74 68 20 63 6f  ack the P1-th co
26030 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  lumn of the most
26040 20 72 65 63 65 6e 74 6c 79 20 72 65 61 64 20 6c   recently read l
26050 69 6e 65 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ine.** from the 
26060 69 6e 70 75 74 20 66 69 6c 65 2e 0a 2a 2f 0a 63  input file..*/.c
26070 61 73 65 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  ase OP_FileColum
26080 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  n: {.  int i = p
26090 4f 70 2d 3e 70 31 3b 0a 20 20 63 68 61 72 20 2a  Op->p1;.  char *
260a0 7a 3b 0a 20 20 69 66 28 20 56 45 52 49 46 59 28  z;.  if( VERIFY(
260b0 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 46   i>=0 && i<p->nF
260c0 69 65 6c 64 20 26 26 20 29 20 70 2d 3e 61 7a 46  ield && ) p->azF
260d0 69 65 6c 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  ield ){.    z = 
260e0 70 2d 3e 61 7a 46 69 65 6c 64 5b 69 5d 3b 0a 20  p->azField[i];. 
260f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
26100 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 74 6f 73 2b  0;.  }.  p->tos+
26110 2b 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  +;.  if( z ){.  
26120 20 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d    aStack[p->tos]
26130 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 20 2b  .n = strlen(z) +
26140 20 31 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70   1;.    zStack[p
26150 2d 3e 74 6f 73 5d 20 3d 20 7a 3b 0a 20 20 20 20  ->tos] = z;.    
26160 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66  aStack[p->tos].f
26170 6c 61 67 73 20 3d 20 53 54 4b 5f 53 74 72 3b 0a  lags = STK_Str;.
26180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 53 74    }else{.    aSt
26190 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 6e 20 3d 20  ack[p->tos].n = 
261a0 30 3b 0a 20 20 20 20 7a 53 74 61 63 6b 5b 70 2d  0;.    zStack[p-
261b0 3e 74 6f 73 5d 20 3d 20 30 3b 0a 20 20 20 20 61  >tos] = 0;.    a
261c0 53 74 61 63 6b 5b 70 2d 3e 74 6f 73 5d 2e 66 6c  Stack[p->tos].fl
261d0 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c 3b 0a  ags = STK_Null;.
261e0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
261f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d 53 74  /* Opcode: MemSt
26200 6f 72 65 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a  ore P1 P2 *.**.*
26210 2a 20 57 72 69 74 65 20 74 68 65 20 74 6f 70 20  * Write the top 
26220 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 6e 74  of the stack int
26230 6f 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  o memory locatio
26240 6e 20 50 31 2e 0a 2a 2a 20 50 31 20 73 68 6f 75  n P1..** P1 shou
26250 6c 64 20 62 65 20 61 20 73 6d 61 6c 6c 20 69 6e  ld be a small in
26260 74 65 67 65 72 20 73 69 6e 63 65 20 73 70 61 63  teger since spac
26270 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  e is allocated.*
26280 2a 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 6f 72 79  * for all memory
26290 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 74 77 65   locations betwe
262a0 65 6e 20 30 20 61 6e 64 20 50 31 20 69 6e 63 6c  en 0 and P1 incl
262b0 75 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  usive..**.** Aft
262c0 65 72 20 74 68 65 20 64 61 74 61 20 69 73 20 73  er the data is s
262d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6d 65 6d  tored in the mem
262e0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 74 68  ory location, th
262f0 65 0a 2a 2a 20 73 74 61 63 6b 20 69 73 20 70 6f  e.** stack is po
26300 70 70 65 64 20 6f 6e 63 65 20 69 66 20 50 32 20  pped once if P2 
26310 69 73 20 31 2e 20 20 49 66 20 50 32 20 69 73 20  is 1.  If P2 is 
26320 7a 65 72 6f 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  zero, then.** th
26330 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  e original data 
26340 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 73  remains on the s
26350 74 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tack..*/.case OP
26360 5f 4d 65 6d 53 74 6f 72 65 3a 20 7b 0a 20 20 69  _MemStore: {.  i
26370 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
26380 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
26390 6f 73 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64  os;.  char *zOld
263a0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
263b0 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 56 45   int flags;.  VE
263c0 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20  RIFY( if( tos<0 
263d0 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
263e0 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69 66 28  h_stack; ).  if(
263f0 20 69 3e 3d 70 2d 3e 6e 4d 65 6d 20 29 7b 0a 20   i>=p->nMem ){. 
26400 20 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 70 2d     int nOld = p-
26410 3e 6e 4d 65 6d 3b 0a 20 20 20 20 4d 65 6d 20 2a  >nMem;.    Mem *
26420 61 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65  aMem;.    p->nMe
26430 6d 20 3d 20 69 20 2b 20 35 3b 0a 20 20 20 20 61  m = i + 5;.    a
26440 4d 65 6d 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Mem = sqliteReal
26450 6c 6f 63 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e  loc(p->aMem, p->
26460 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  nMem*sizeof(p->a
26470 4d 65 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Mem[0]));.    if
26480 28 20 61 4d 65 6d 3d 3d 30 20 29 20 67 6f 74 6f  ( aMem==0 ) goto
26490 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 69 66 28   no_mem;.    if(
264a0 20 61 4d 65 6d 21 3d 70 2d 3e 61 4d 65 6d 20 29   aMem!=p->aMem )
264b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
264c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
264d0 6e 4f 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nOld; j++){.    
264e0 20 20 20 20 69 66 28 20 61 4d 65 6d 5b 6a 5d 2e      if( aMem[j].
264f0 7a 3d 3d 70 2d 3e 61 4d 65 6d 5b 6a 5d 2e 73 2e  z==p->aMem[j].s.
26500 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  z ){.          a
26510 4d 65 6d 5b 6a 5d 2e 7a 20 3d 20 61 4d 65 6d 5b  Mem[j].z = aMem[
26520 6a 5d 2e 73 2e 7a 3b 0a 20 20 20 20 20 20 20 20  j].s.z;.        
26530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26540 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d      p->aMem = aM
26550 65 6d 3b 0a 20 20 20 20 69 66 28 20 6e 4f 6c 64  em;.    if( nOld
26560 3c 70 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  <p->nMem ){.    
26570 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4d 65    memset(&p->aMe
26580 6d 5b 6e 4f 6c 64 5d 2c 20 30 2c 20 73 69 7a 65  m[nOld], 0, size
26590 6f 66 28 70 2d 3e 61 4d 65 6d 5b 30 5d 29 2a 28  of(p->aMem[0])*(
265a0 70 2d 3e 6e 4d 65 6d 2d 6e 4f 6c 64 29 29 3b 0a  p->nMem-nOld));.
265b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4d 65 6d      }.  }.  pMem
265c0 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a   = &p->aMem[i];.
265d0 20 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e    flags = pMem->
265e0 73 2e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 66  s.flags;.  if( f
265f0 6c 61 67 73 20 26 20 53 54 4b 5f 44 79 6e 20 29  lags & STK_Dyn )
26600 7b 0a 20 20 20 20 7a 4f 6c 64 20 3d 20 70 4d 65  {.    zOld = pMe
26610 6d 2d 3e 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  m->z;.  }else{. 
26620 20 20 20 7a 4f 6c 64 20 3d 20 30 3b 0a 20 20 7d     zOld = 0;.  }
26630 0a 20 20 70 4d 65 6d 2d 3e 73 20 3d 20 61 53 74  .  pMem->s = aSt
26640 61 63 6b 5b 74 6f 73 5d 3b 0a 20 20 66 6c 61 67  ack[tos];.  flag
26650 73 20 3d 20 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67  s = pMem->s.flag
26660 73 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  s;.  if( flags &
26670 20 28 53 54 4b 5f 53 74 61 74 69 63 7c 53 54 4b   (STK_Static|STK
26680 5f 44 79 6e 7c 53 54 4b 5f 45 70 68 65 6d 29 20  _Dyn|STK_Ephem) 
26690 29 7b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  ){.    if( (flag
266a0 73 20 26 20 53 54 4b 5f 53 74 61 74 69 63 29 21  s & STK_Static)!
266b0 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 20 26  =0 || (pOp->p2 &
266c0 26 20 28 66 6c 61 67 73 20 26 20 53 54 4b 5f 44  & (flags & STK_D
266d0 79 6e 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  yn)!=0) ){.     
266e0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 7a 53 74 61 63   pMem->z = zStac
266f0 6b 5b 74 6f 73 5d 3b 0a 20 20 20 20 7d 65 6c 73  k[tos];.    }els
26700 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 54  e if( flags & ST
26710 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 70  K_Str ){.      p
26720 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d  Mem->z = sqliteM
26730 61 6c 6c 6f 63 52 61 77 28 20 70 4d 65 6d 2d 3e  allocRaw( pMem->
26740 73 2e 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  s.n );.      if(
26750 20 70 4d 65 6d 2d 3e 7a 3d 3d 30 20 29 20 67 6f   pMem->z==0 ) go
26760 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
26770 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c   memcpy(pMem->z,
26780 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 70 4d   zStack[tos], pM
26790 65 6d 2d 3e 73 2e 6e 29 3b 0a 20 20 20 20 20 20  em->s.n);.      
267a0 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 7c 3d  pMem->s.flags |=
267b0 20 53 54 4b 5f 44 79 6e 3b 0a 20 20 20 20 20 20   STK_Dyn;.      
267c0 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 3d  pMem->s.flags &=
267d0 20 7e 28 53 54 4b 5f 53 74 61 74 69 63 7c 53 54   ~(STK_Static|ST
267e0 4b 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 7d 0a  K_Ephem);.    }.
267f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65    }else{.    pMe
26800 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 73 2e 7a  m->z = pMem->s.z
26810 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 6c 64  ;.  }.  if( zOld
26820 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f   ) sqliteFree(zO
26830 6c 64 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ld);.  if( pOp->
26840 70 32 20 29 7b 0a 20 20 20 20 7a 53 74 61 63 6b  p2 ){.    zStack
26850 5b 74 6f 73 5d 20 3d 20 30 3b 0a 20 20 20 20 61  [tos] = 0;.    a
26860 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
26870 20 3d 20 30 3b 0a 20 20 20 20 50 4f 50 53 54 41   = 0;.    POPSTA
26880 43 4b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  CK;.  }.  break;
26890 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
268a0 65 6d 4c 6f 61 64 20 50 31 20 2a 20 2a 0a 2a 2a  emLoad P1 * *.**
268b0 0a 2a 2a 20 50 75 73 68 20 61 20 63 6f 70 79 20  .** Push a copy 
268c0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  of the value in 
268d0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
268e0 50 31 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  P1 onto the stac
268f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
26900 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
26910 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
26920 65 20 70 75 73 68 65 64 20 69 73 20 61 20 70 6f  e pushed is a po
26930 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20  inter to.** the 
26940 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 73  string that is s
26950 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6d 65 6d  tored in the mem
26960 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 49  ory location.  I
26970 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  f the memory.** 
26980 6c 6f 63 61 74 69 6f 6e 20 69 73 20 73 75 62 73  location is subs
26990 65 71 75 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  equently changed
269a0 20 28 75 73 69 6e 67 20 4f 50 5f 4d 65 6d 53 74   (using OP_MemSt
269b0 6f 72 65 29 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ore) then the.**
269c0 20 76 61 6c 75 65 20 70 75 73 68 65 64 20 6f 6e   value pushed on
269d0 74 6f 20 74 68 65 20 73 74 61 63 6b 20 77 69 6c  to the stack wil
269e0 6c 20 63 68 61 6e 67 65 20 74 6f 6f 2e 0a 2a 2f  l change too..*/
269f0 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4c 6f 61 64  .case OP_MemLoad
26a00 3a 20 7b 0a 20 20 69 6e 74 20 74 6f 73 20 3d 20  : {.  int tos = 
26a10 2b 2b 70 2d 3e 74 6f 73 3b 0a 20 20 69 6e 74 20  ++p->tos;.  int 
26a20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56  i = pOp->p1;.  V
26a30 45 52 49 46 59 28 20 69 66 28 20 69 3c 30 20 7c  ERIFY( if( i<0 |
26a40 7c 20 69 3e 3d 70 2d 3e 6e 4d 65 6d 20 29 20 67  | i>=p->nMem ) g
26a50 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74  oto bad_instruct
26a60 69 6f 6e 3b 20 29 0a 20 20 6d 65 6d 63 70 79 28  ion; ).  memcpy(
26a70 26 61 53 74 61 63 6b 5b 74 6f 73 5d 2c 20 26 70  &aStack[tos], &p
26a80 2d 3e 61 4d 65 6d 5b 69 5d 2e 73 2c 20 73 69 7a  ->aMem[i].s, siz
26a90 65 6f 66 28 61 53 74 61 63 6b 5b 74 6f 73 5d 29  eof(aStack[tos])
26aa0 2d 4e 42 46 53 29 3b 3b 0a 20 20 69 66 28 20 61  -NBFS);;.  if( a
26ab0 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73  Stack[tos].flags
26ac0 20 26 20 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20   & STK_Str ){.  
26ad0 20 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20    zStack[tos] = 
26ae0 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 7a 3b 0a 20 20  p->aMem[i].z;.  
26af0 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 66 6c    aStack[tos].fl
26b00 61 67 73 20 7c 3d 20 53 54 4b 5f 45 70 68 65 6d  ags |= STK_Ephem
26b10 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73  ;.    aStack[tos
26b20 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 28 53 54 4b  ].flags &= ~(STK
26b30 5f 44 79 6e 7c 53 54 4b 5f 53 74 61 74 69 63 29  _Dyn|STK_Static)
26b40 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
26b50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d  ../* Opcode: Mem
26b60 49 6e 63 72 20 50 31 20 50 32 20 2a 0a 2a 2a 0a  Incr P1 P2 *.**.
26b70 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
26b80 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 64 20   integer valued 
26b90 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 20 62  memory cell P1 b
26ba0 79 20 31 2e 20 20 49 66 20 50 32 20 69 73 20 6e  y 1.  If P2 is n
26bb0 6f 74 20 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 74  ot zero.** and t
26bc0 68 65 20 72 65 73 75 6c 74 20 61 66 74 65 72 20  he result after 
26bd0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 20 69 73  the increment is
26be0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
26bf0 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a  ro, then jump.**
26c00 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
26c10 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
26c20 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
26c30 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
26c40 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
26c50 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
26c60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
26c70 49 6e 63 72 3a 20 7b 0a 20 20 69 6e 74 20 69 20  Incr: {.  int i 
26c80 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 4d 65 6d  = pOp->p1;.  Mem
26c90 20 2a 70 4d 65 6d 3b 0a 20 20 56 45 52 49 46 59   *pMem;.  VERIFY
26ca0 28 20 69 66 28 20 69 3c 30 20 7c 7c 20 69 3e 3d  ( if( i<0 || i>=
26cb0 70 2d 3e 6e 4d 65 6d 20 29 20 67 6f 74 6f 20 62  p->nMem ) goto b
26cc0 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20  ad_instruction; 
26cd0 29 0a 20 20 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  ).  pMem = &p->a
26ce0 4d 65 6d 5b 69 5d 3b 0a 20 20 56 45 52 49 46 59  Mem[i];.  VERIFY
26cf0 28 20 69 66 28 20 70 4d 65 6d 2d 3e 73 2e 66 6c  ( if( pMem->s.fl
26d00 61 67 73 20 21 3d 20 53 54 4b 5f 49 6e 74 20 29  ags != STK_Int )
26d10 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75   goto bad_instru
26d20 63 74 69 6f 6e 3b 20 29 0a 20 20 70 4d 65 6d 2d  ction; ).  pMem-
26d30 3e 73 2e 69 2b 2b 3b 0a 20 20 69 66 28 20 70 4f  >s.i++;.  if( pO
26d40 70 2d 3e 70 32 3e 30 20 26 26 20 70 4d 65 6d 2d  p->p2>0 && pMem-
26d50 3e 73 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 70  >s.i>0 ){.     p
26d60 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
26d70 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
26d80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 52  ./* Opcode: AggR
26d90 65 73 65 74 20 2a 20 50 32 20 2a 0a 2a 2a 0a 2a  eset * P2 *.**.*
26da0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
26db0 65 67 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  egator so that i
26dc0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74  t no longer cont
26dd0 61 69 6e 73 20 61 6e 79 20 64 61 74 61 2e 0a 2a  ains any data..*
26de0 2a 20 46 75 74 75 72 65 20 61 67 67 72 65 67 61  * Future aggrega
26df0 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 77 69 6c  tor elements wil
26e00 6c 20 63 6f 6e 74 61 69 6e 20 50 32 20 76 61 6c  l contain P2 val
26e10 75 65 73 20 65 61 63 68 2e 0a 2a 2f 0a 63 61 73  ues each..*/.cas
26e20 65 20 4f 50 5f 41 67 67 52 65 73 65 74 3a 20 7b  e OP_AggReset: {
26e30 0a 20 20 41 67 67 52 65 73 65 74 28 26 70 2d 3e  .  AggReset(&p->
26e40 61 67 67 29 3b 0a 20 20 70 2d 3e 61 67 67 2e 6e  agg);.  p->agg.n
26e50 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  Mem = pOp->p2;. 
26e60 20 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 20 3d   p->agg.apFunc =
26e70 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
26e80 2d 3e 61 67 67 2e 6e 4d 65 6d 2a 73 69 7a 65 6f  ->agg.nMem*sizeo
26e90 66 28 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b  f(p->agg.apFunc[
26ea0 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  0]) );.  if( p->
26eb0 61 67 67 2e 61 70 46 75 6e 63 3d 3d 30 20 29 20  agg.apFunc==0 ) 
26ec0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 62  goto no_mem;.  b
26ed0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
26ee0 64 65 3a 20 41 67 67 49 6e 69 74 20 2a 20 50 32  de: AggInit * P2
26ef0 20 50 33 0a 2a 2a 0a 2a 2a 20 49 6e 69 74 69 61   P3.**.** Initia
26f00 6c 69 7a 65 20 74 68 65 20 66 75 6e 63 74 69 6f  lize the functio
26f10 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  n parameters for
26f20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
26f30 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61  nction..** The a
26f40 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20 6f 70  ggregate will op
26f50 65 72 61 74 65 20 6f 75 74 20 6f 66 20 61 67 67  erate out of agg
26f60 72 65 67 61 74 65 20 63 6f 6c 75 6d 6e 20 50 32  regate column P2
26f70 2e 0a 2a 2a 20 50 33 20 69 73 20 61 20 70 6f 69  ..** P3 is a poi
26f80 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
26f90 44 65 66 20 73 74 72 75 63 74 75 72 65 20 66 6f  Def structure fo
26fa0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  r the function..
26fb0 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 49 6e  */.case OP_AggIn
26fc0 69 74 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  it: {.  int i = 
26fd0 70 4f 70 2d 3e 70 32 3b 0a 20 20 56 45 52 49 46  pOp->p2;.  VERIF
26fe0 59 28 20 69 66 28 20 69 3c 30 20 7c 7c 20 69 3e  Y( if( i<0 || i>
26ff0 3d 70 2d 3e 61 67 67 2e 6e 4d 65 6d 20 29 20 67  =p->agg.nMem ) g
27000 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72 75 63 74  oto bad_instruct
27010 69 6f 6e 3b 20 29 0a 20 20 70 2d 3e 61 67 67 2e  ion; ).  p->agg.
27020 61 70 46 75 6e 63 5b 69 5d 20 3d 20 28 46 75 6e  apFunc[i] = (Fun
27030 63 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  cDef*)pOp->p3;. 
27040 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
27050 63 6f 64 65 3a 20 41 67 67 46 75 6e 63 20 2a 20  code: AggFunc * 
27060 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 45 78 65 63  P2 P3.**.** Exec
27070 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
27080 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
27090 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
270a0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 32 20  function has P2 
270b0 61 72 67 75 6d 65 6e 74 73 2e 20 20 50 33 20 69  arguments.  P3 i
270c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
270d0 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74  he FuncDef.** st
270e0 72 75 63 74 75 72 65 20 74 68 61 74 20 73 70 65  ructure that spe
270f0 63 69 66 69 65 73 20 74 68 65 20 66 75 6e 63 74  cifies the funct
27100 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ion..**.** The t
27110 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
27120 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
27130 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
27140 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
27150 61 67 67 72 65 67 61 74 65 20 63 6f 6c 75 6d 6e  aggregate column
27160 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
27170 73 20 74 6f 20 74 68 69 73 20 61 67 67 72 65 67  s to this aggreg
27180 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ate function..**
27190 20 49 64 65 61 6c 6c 79 2c 20 74 68 69 73 20 69   Ideally, this i
271a0 6e 64 65 78 20 77 6f 75 6c 64 20 62 65 20 61 6e  ndex would be an
271b0 6f 74 68 65 72 20 70 61 72 61 6d 65 74 65 72 2c  other parameter,
271c0 20 62 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a   but there are.*
271d0 2a 20 6e 6f 20 66 72 65 65 20 70 61 72 61 6d 65  * no free parame
271e0 74 65 72 73 20 6c 65 66 74 2e 20 20 54 68 65 20  ters left.  The 
271f0 69 6e 74 65 67 65 72 20 69 73 20 70 6f 70 70 65  integer is poppe
27200 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
27210 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
27220 46 75 6e 63 3a 20 7b 0a 20 20 69 6e 74 20 6e 20  Func: {.  int n 
27230 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 6e 74  = pOp->p2;.  int
27240 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   i;.  Mem *pMem;
27250 0a 20 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 63  .  sqlite_func c
27260 74 78 3b 0a 0a 20 20 56 45 52 49 46 59 28 20 69  tx;..  VERIFY( i
27270 66 28 20 6e 3c 30 20 29 20 67 6f 74 6f 20 62 61  f( n<0 ) goto ba
27280 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e 3b 20 29  d_instruction; )
27290 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 70  .  VERIFY( if( p
272a0 2d 3e 74 6f 73 2b 31 3c 6e 20 29 20 67 6f 74 6f  ->tos+1<n ) goto
272b0 20 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63   not_enough_stac
272c0 6b 3b 20 29 0a 20 20 56 45 52 49 46 59 28 20 69  k; ).  VERIFY( i
272d0 66 28 20 61 53 74 61 63 6b 5b 70 2d 3e 74 6f 73  f( aStack[p->tos
272e0 5d 2e 66 6c 61 67 73 21 3d 53 54 4b 5f 49 6e 74  ].flags!=STK_Int
272f0 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74   ) goto bad_inst
27300 72 75 63 74 69 6f 6e 3b 20 29 0a 20 20 66 6f 72  ruction; ).  for
27310 28 69 3d 70 2d 3e 74 6f 73 2d 6e 3b 20 69 3c 70  (i=p->tos-n; i<p
27320 2d 3e 74 6f 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->tos; i++){.   
27330 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66   if( aStack[i].f
27340 6c 61 67 73 20 26 20 53 54 4b 5f 4e 75 6c 6c 20  lags & STK_Null 
27350 29 7b 0a 20 20 20 20 20 20 7a 53 74 61 63 6b 5b  ){.      zStack[
27360 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  i] = 0;.    }els
27370 65 7b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 69  e{.      Stringi
27380 66 79 28 70 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  fy(p, i);.    }.
27390 20 20 7d 0a 20 20 69 20 3d 20 61 53 74 61 63 6b    }.  i = aStack
273a0 5b 70 2d 3e 74 6f 73 5d 2e 69 3b 0a 20 20 56 45  [p->tos].i;.  VE
273b0 52 49 46 59 28 20 69 66 28 20 69 3c 30 20 7c 7c  RIFY( if( i<0 ||
273c0 20 69 3e 3d 70 2d 3e 61 67 67 2e 6e 4d 65 6d 20   i>=p->agg.nMem 
273d0 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e 73 74 72  ) goto bad_instr
273e0 75 63 74 69 6f 6e 3b 20 29 0a 20 20 63 74 78 2e  uction; ).  ctx.
273f0 70 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66  pFunc = (FuncDef
27400 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 4d 65  *)pOp->p3;.  pMe
27410 6d 20 3d 20 26 70 2d 3e 61 67 67 2e 70 43 75 72  m = &p->agg.pCur
27420 72 65 6e 74 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  rent->aMem[i];. 
27430 20 63 74 78 2e 7a 20 3d 20 70 4d 65 6d 2d 3e 73   ctx.z = pMem->s
27440 2e 7a 3b 0a 20 20 63 74 78 2e 70 41 67 67 20 3d  .z;.  ctx.pAgg =
27450 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 63 74 78 2e   pMem->z;.  ctx.
27460 63 6e 74 20 3d 20 2b 2b 70 4d 65 6d 2d 3e 73 2e  cnt = ++pMem->s.
27470 69 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72  i;.  ctx.isError
27480 20 3d 20 30 3b 0a 20 20 63 74 78 2e 69 73 53 74   = 0;.  ctx.isSt
27490 65 70 20 3d 20 31 3b 0a 20 20 28 63 74 78 2e 70  ep = 1;.  (ctx.p
274a0 46 75 6e 63 2d 3e 78 53 74 65 70 29 28 26 63 74  Func->xStep)(&ct
274b0 78 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61  x, n, (const cha
274c0 72 2a 2a 29 26 7a 53 74 61 63 6b 5b 70 2d 3e 74  r**)&zStack[p->t
274d0 6f 73 2d 6e 5d 29 3b 0a 20 20 70 4d 65 6d 2d 3e  os-n]);.  pMem->
274e0 7a 20 3d 20 63 74 78 2e 70 41 67 67 3b 0a 20 20  z = ctx.pAgg;.  
274f0 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 3d 20  pMem->s.flags = 
27500 53 54 4b 5f 41 67 67 43 74 78 3b 0a 20 20 50 6f  STK_AggCtx;.  Po
27510 70 53 74 61 63 6b 28 70 2c 20 6e 2b 31 29 3b 0a  pStack(p, n+1);.
27520 20 20 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f    if( ctx.isErro
27530 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
27540 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
27550 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27560 70 63 6f 64 65 3a 20 41 67 67 46 6f 63 75 73 20  pcode: AggFocus 
27570 2a 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70  * P2 *.**.** Pop
27580 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
27590 73 74 61 63 6b 20 61 6e 64 20 75 73 65 20 74 68  stack and use th
275a0 61 74 20 61 73 20 61 6e 20 61 67 67 72 65 67 61  at as an aggrega
275b0 74 6f 72 20 6b 65 79 2e 20 20 49 66 0a 2a 2a 20  tor key.  If.** 
275c0 61 6e 20 61 67 67 72 65 67 61 74 6f 72 20 77 69  an aggregator wi
275d0 74 68 20 74 68 61 74 20 73 61 6d 65 20 6b 65 79  th that same key
275e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
275f0 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 0a 2a   then make the.*
27600 2a 20 61 67 67 72 65 67 61 74 6f 72 20 74 68 65  * aggregator the
27610 20 63 75 72 72 65 6e 74 20 61 67 67 72 65 67 61   current aggrega
27620 74 6f 72 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  tor and jump to 
27630 50 32 2e 20 20 49 66 20 6e 6f 20 61 67 67 72 65  P2.  If no aggre
27640 67 61 74 6f 72 0a 2a 2a 20 77 69 74 68 20 74 68  gator.** with th
27650 65 20 67 69 76 65 6e 20 6b 65 79 20 65 78 69 73  e given key exis
27660 74 73 2c 20 63 72 65 61 74 65 20 6f 6e 65 20 61  ts, create one a
27670 6e 64 20 6d 61 6b 65 20 69 74 20 63 75 72 72 65  nd make it curre
27680 6e 74 20 62 75 74 0a 2a 2a 20 64 6f 20 6e 6f 74  nt but.** do not
27690 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   jump..**.** The
276a0 20 6f 72 64 65 72 20 6f 66 20 61 67 67 72 65 67   order of aggreg
276b0 61 74 6f 72 20 6f 70 63 6f 64 65 73 20 69 73 20  ator opcodes is 
276c0 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20  important.  The 
276d0 6f 72 64 65 72 20 69 73 3a 0a 2a 2a 20 41 67 67  order is:.** Agg
276e0 52 65 73 65 74 20 41 67 67 46 6f 63 75 73 20 41  Reset AggFocus A
276f0 67 67 4e 65 78 74 2e 20 20 49 6e 20 6f 74 68 65  ggNext.  In othe
27700 72 20 77 6f 72 64 73 2c 20 79 6f 75 20 6d 75 73  r words, you mus
27710 74 20 65 78 65 63 75 74 65 0a 2a 2a 20 41 67 67  t execute.** Agg
27720 52 65 73 65 74 20 66 69 72 73 74 2c 20 74 68 65  Reset first, the
27730 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41  n zero or more A
27740 67 67 46 6f 63 75 73 20 6f 70 65 72 61 74 69 6f  ggFocus operatio
27750 6e 73 2c 20 74 68 65 6e 0a 2a 2a 20 7a 65 72 6f  ns, then.** zero
27760 20 6f 72 20 6d 6f 72 65 20 41 67 67 4e 65 78 74   or more AggNext
27770 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 59 6f   operations.  Yo
27780 75 20 6d 75 73 74 20 6e 6f 74 20 65 78 65 63 75  u must not execu
27790 74 65 20 61 6e 20 41 67 67 46 6f 63 75 73 0a 2a  te an AggFocus.*
277a0 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 61 6e 20  * in between an 
277b0 41 67 67 4e 65 78 74 20 61 6e 64 20 61 6e 20 41  AggNext and an A
277c0 67 67 52 65 73 65 74 2e 0a 2a 2f 0a 63 61 73 65  ggReset..*/.case
277d0 20 4f 50 5f 41 67 67 46 6f 63 75 73 3a 20 7b 0a   OP_AggFocus: {.
277e0 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e 74    int tos = p->t
277f0 6f 73 3b 0a 20 20 41 67 67 45 6c 65 6d 20 2a 70  os;.  AggElem *p
27800 45 6c 65 6d 3b 0a 20 20 63 68 61 72 20 2a 7a 4b  Elem;.  char *zK
27810 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  ey;.  int nKey;.
27820 0a 20 20 56 45 52 49 46 59 28 20 69 66 28 20 74  .  VERIFY( if( t
27830 6f 73 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f  os<0 ) goto not_
27840 65 6e 6f 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a  enough_stack; ).
27850 20 20 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74    Stringify(p, t
27860 6f 73 29 3b 0a 20 20 7a 4b 65 79 20 3d 20 7a 53  os);.  zKey = zS
27870 74 61 63 6b 5b 74 6f 73 5d 3b 20 0a 20 20 6e 4b  tack[tos]; .  nK
27880 65 79 20 3d 20 61 53 74 61 63 6b 5b 74 6f 73 5d  ey = aStack[tos]
27890 2e 6e 3b 0a 20 20 70 45 6c 65 6d 20 3d 20 73 71  .n;.  pElem = sq
278a0 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 70 2d  liteHashFind(&p-
278b0 3e 61 67 67 2e 68 61 73 68 2c 20 7a 4b 65 79 2c  >agg.hash, zKey,
278c0 20 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 70 45   nKey);.  if( pE
278d0 6c 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 67  lem ){.    p->ag
278e0 67 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 45 6c  g.pCurrent = pEl
278f0 65 6d 3b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70  em;.    pc = pOp
27900 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  ->p2 - 1;.  }els
27910 65 7b 0a 20 20 20 20 41 67 67 49 6e 73 65 72 74  e{.    AggInsert
27920 28 26 70 2d 3e 61 67 67 2c 20 7a 4b 65 79 2c 20  (&p->agg, zKey, 
27930 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 73  nKey);.    if( s
27940 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
27950 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
27960 6d 3b 0a 20 20 7d 0a 20 20 50 4f 50 53 54 41 43  m;.  }.  POPSTAC
27970 4b 3b 0a 20 20 62 72 65 61 6b 3b 20 0a 7d 0a 0a  K;.  break; .}..
27980 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 65  /* Opcode: AggSe
27990 74 20 2a 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 4d  t * P2 *.**.** M
279a0 6f 76 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ove the top of t
279b0 68 65 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  he stack into th
279c0 65 20 50 32 2d 74 68 20 66 69 65 6c 64 20 6f 66  e P2-th field of
279d0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
279e0 61 67 67 72 65 67 61 74 65 2e 20 20 53 74 72 69  aggregate.  Stri
279f0 6e 67 20 76 61 6c 75 65 73 20 61 72 65 20 64 75  ng values are du
27a00 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 6e 65  plicated into ne
27a10 77 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 63 61 73  w memory..*/.cas
27a20 65 20 4f 50 5f 41 67 67 53 65 74 3a 20 7b 0a 20  e OP_AggSet: {. 
27a30 20 41 67 67 45 6c 65 6d 20 2a 70 46 6f 63 75 73   AggElem *pFocus
27a40 20 3d 20 41 67 67 49 6e 46 6f 63 75 73 28 70 2d   = AggInFocus(p-
27a50 3e 61 67 67 29 3b 0a 20 20 69 6e 74 20 69 20 3d  >agg);.  int i =
27a60 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 6e 74 20   pOp->p2;.  int 
27a70 74 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20  tos = p->tos;.  
27a80 56 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c  VERIFY( if( tos<
27a90 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f  0 ) goto not_eno
27aa0 75 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 69  ugh_stack; ).  i
27ab0 66 28 20 70 46 6f 63 75 73 3d 3d 30 20 29 20 67  f( pFocus==0 ) g
27ac0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 69 66  oto no_mem;.  if
27ad0 28 20 56 45 52 49 46 59 28 20 69 3e 3d 30 20 26  ( VERIFY( i>=0 &
27ae0 26 20 29 20 69 3c 70 2d 3e 61 67 67 2e 6e 4d 65  & ) i<p->agg.nMe
27af0 6d 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  m ){.    Mem *pM
27b00 65 6d 20 3d 20 26 70 46 6f 63 75 73 2d 3e 61 4d  em = &pFocus->aM
27b10 65 6d 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20  em[i];.    char 
27b20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 69 66 28 20 70  *zOld;.    if( p
27b30 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20 53  Mem->s.flags & S
27b40 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  TK_Dyn ){.      
27b50 7a 4f 6c 64 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a  zOld = pMem->z;.
27b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b70 20 7a 4f 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d   zOld = 0;.    }
27b80 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
27b90 69 7a 65 28 70 2c 20 74 6f 73 29 3b 0a 20 20 20  ize(p, tos);.   
27ba0 20 70 4d 65 6d 2d 3e 73 20 3d 20 61 53 74 61 63   pMem->s = aStac
27bb0 6b 5b 74 6f 73 5d 3b 0a 20 20 20 20 69 66 28 20  k[tos];.    if( 
27bc0 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20  pMem->s.flags & 
27bd0 53 54 4b 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  STK_Dyn ){.     
27be0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 7a 53 74 61 63   pMem->z = zStac
27bf0 6b 5b 74 6f 73 5d 3b 0a 20 20 20 20 20 20 7a 53  k[tos];.      zS
27c00 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 30 3b 0a 20  tack[tos] = 0;. 
27c10 20 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d       aStack[tos]
27c20 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  .flags = 0;.    
27c30 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
27c40 73 2e 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 53  s.flags & (STK_S
27c50 74 61 74 69 63 7c 53 54 4b 5f 41 67 67 43 74 78  tatic|STK_AggCtx
27c60 29 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ) ){.      pMem-
27c70 3e 7a 20 3d 20 7a 53 74 61 63 6b 5b 74 6f 73 5d  >z = zStack[tos]
27c80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27c90 70 4d 65 6d 2d 3e 73 2e 66 6c 61 67 73 20 26 20  pMem->s.flags & 
27ca0 53 54 4b 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  STK_Str ){.     
27cb0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d   pMem->z = pMem-
27cc0 3e 73 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >s.z;.    }.    
27cd0 69 66 28 20 7a 4f 6c 64 20 29 20 73 71 6c 69 74  if( zOld ) sqlit
27ce0 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d  eFree(zOld);.  }
27cf0 0a 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62  .  POPSTACK;.  b
27d00 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
27d10 64 65 3a 20 41 67 67 47 65 74 20 2a 20 50 32 20  de: AggGet * P2 
27d20 2a 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 61 20 6e  *.**.** Push a n
27d30 65 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20 74 68  ew entry onto th
27d40 65 20 73 74 61 63 6b 20 77 68 69 63 68 20 69 73  e stack which is
27d50 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 50   a copy of the P
27d60 32 2d 74 68 20 66 69 65 6c 64 0a 2a 2a 20 6f 66  2-th field.** of
27d70 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 67 67   the current agg
27d80 72 65 67 61 74 65 2e 20 20 53 74 72 69 6e 67 73  regate.  Strings
27d90 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
27da0 74 65 64 20 73 6f 0a 2a 2a 20 73 74 72 69 6e 67  ted so.** string
27db0 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20   values will be 
27dc0 65 70 68 65 6d 65 72 61 6c 2e 0a 2a 2f 0a 63 61  ephemeral..*/.ca
27dd0 73 65 20 4f 50 5f 41 67 67 47 65 74 3a 20 7b 0a  se OP_AggGet: {.
27de0 20 20 41 67 67 45 6c 65 6d 20 2a 70 46 6f 63 75    AggElem *pFocu
27df0 73 20 3d 20 41 67 67 49 6e 46 6f 63 75 73 28 70  s = AggInFocus(p
27e00 2d 3e 61 67 67 29 3b 0a 20 20 69 6e 74 20 69 20  ->agg);.  int i 
27e10 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 6e 74  = pOp->p2;.  int
27e20 20 74 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b   tos = ++p->tos;
27e30 0a 20 20 69 66 28 20 70 46 6f 63 75 73 3d 3d 30  .  if( pFocus==0
27e40 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
27e50 20 20 69 66 28 20 56 45 52 49 46 59 28 20 69 3e    if( VERIFY( i>
27e60 3d 30 20 26 26 20 29 20 69 3c 70 2d 3e 61 67 67  =0 && ) i<p->agg
27e70 2e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 4d 65 6d  .nMem ){.    Mem
27e80 20 2a 70 4d 65 6d 20 3d 20 26 70 46 6f 63 75 73   *pMem = &pFocus
27e90 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 61  ->aMem[i];.    a
27ea0 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 70 4d 65  Stack[tos] = pMe
27eb0 6d 2d 3e 73 3b 0a 20 20 20 20 7a 53 74 61 63 6b  m->s;.    zStack
27ec0 5b 74 6f 73 5d 20 3d 20 70 4d 65 6d 2d 3e 7a 3b  [tos] = pMem->z;
27ed0 0a 20 20 20 20 61 53 74 61 63 6b 5b 74 6f 73 5d  .    aStack[tos]
27ee0 2e 66 6c 61 67 73 20 26 3d 20 7e 53 54 4b 5f 44  .flags &= ~STK_D
27ef0 79 6e 3b 0a 20 20 20 20 61 53 74 61 63 6b 5b 74  yn;.    aStack[t
27f00 6f 73 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 54 4b  os].flags |= STK
27f10 5f 45 70 68 65 6d 3b 0a 20 20 7d 0a 20 20 62 72  _Ephem;.  }.  br
27f20 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
27f30 65 3a 20 41 67 67 4e 65 78 74 20 2a 20 50 32 20  e: AggNext * P2 
27f40 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65  *.**.** Make the
27f50 20 6e 65 78 74 20 61 67 67 72 65 67 61 74 65 20   next aggregate 
27f60 76 61 6c 75 65 20 74 68 65 20 63 75 72 72 65 6e  value the curren
27f70 74 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  t aggregate.  Th
27f80 65 20 70 72 69 6f 72 0a 2a 2a 20 61 67 67 72 65  e prior.** aggre
27f90 67 61 74 65 20 69 73 20 64 65 6c 65 74 65 64 2e  gate is deleted.
27fa0 20 20 49 66 20 61 6c 6c 20 61 67 67 72 65 67 61    If all aggrega
27fb0 74 65 20 76 61 6c 75 65 73 20 68 61 76 65 20 62  te values have b
27fc0 65 65 6e 20 63 6f 6e 73 75 6d 65 64 2c 0a 2a 2a  een consumed,.**
27fd0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
27fe0 2a 2a 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20  ** The order of 
27ff0 61 67 67 72 65 67 61 74 6f 72 20 6f 70 63 6f 64  aggregator opcod
28000 65 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  es is important.
28010 20 20 54 68 65 20 6f 72 64 65 72 20 69 73 3a 0a    The order is:.
28020 2a 2a 20 41 67 67 52 65 73 65 74 20 41 67 67 46  ** AggReset AggF
28030 6f 63 75 73 20 41 67 67 4e 65 78 74 2e 20 20 49  ocus AggNext.  I
28040 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 79  n other words, y
28050 6f 75 20 6d 75 73 74 20 65 78 65 63 75 74 65 0a  ou must execute.
28060 2a 2a 20 41 67 67 52 65 73 65 74 20 66 69 72 73  ** AggReset firs
28070 74 2c 20 74 68 65 6e 20 7a 65 72 6f 20 6f 72 20  t, then zero or 
28080 6d 6f 72 65 20 41 67 67 46 6f 63 75 73 20 6f 70  more AggFocus op
28090 65 72 61 74 69 6f 6e 73 2c 20 74 68 65 6e 0a 2a  erations, then.*
280a0 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 41  * zero or more A
280b0 67 67 4e 65 78 74 20 6f 70 65 72 61 74 69 6f 6e  ggNext operation
280c0 73 2e 20 20 59 6f 75 20 6d 75 73 74 20 6e 6f 74  s.  You must not
280d0 20 65 78 65 63 75 74 65 20 61 6e 20 41 67 67 46   execute an AggF
280e0 6f 63 75 73 0a 2a 2a 20 69 6e 20 62 65 74 77 65  ocus.** in betwe
280f0 65 6e 20 61 6e 20 41 67 67 4e 65 78 74 20 61 6e  en an AggNext an
28100 64 20 61 6e 20 41 67 67 52 65 73 65 74 2e 0a 2a  d an AggReset..*
28110 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 4e 65 78  /.case OP_AggNex
28120 74 3a 20 7b 0a 20 20 43 48 45 43 4b 5f 46 4f 52  t: {.  CHECK_FOR
28130 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 69 66  _INTERRUPT;.  if
28140 28 20 70 2d 3e 61 67 67 2e 70 53 65 61 72 63 68  ( p->agg.pSearch
28150 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 67  ==0 ){.    p->ag
28160 67 2e 70 53 65 61 72 63 68 20 3d 20 73 71 6c 69  g.pSearch = sqli
28170 74 65 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e  teHashFirst(&p->
28180 61 67 67 2e 68 61 73 68 29 3b 0a 20 20 7d 65 6c  agg.hash);.  }el
28190 73 65 7b 0a 20 20 20 20 70 2d 3e 61 67 67 2e 70  se{.    p->agg.p
281a0 53 65 61 72 63 68 20 3d 20 73 71 6c 69 74 65 48  Search = sqliteH
281b0 61 73 68 4e 65 78 74 28 70 2d 3e 61 67 67 2e 70  ashNext(p->agg.p
281c0 53 65 61 72 63 68 29 3b 0a 20 20 7d 0a 20 20 69  Search);.  }.  i
281d0 66 28 20 70 2d 3e 61 67 67 2e 70 53 65 61 72 63  f( p->agg.pSearc
281e0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d  h==0 ){.    pc =
281f0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
28200 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 6e 74  } else {.    int
28210 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 66   i;.    sqlite_f
28220 75 6e 63 20 63 74 78 3b 0a 20 20 20 20 4d 65 6d  unc ctx;.    Mem
28230 20 2a 61 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 61   *aMem;.    p->a
28240 67 67 2e 70 43 75 72 72 65 6e 74 20 3d 20 73 71  gg.pCurrent = sq
28250 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 2d 3e  liteHashData(p->
28260 61 67 67 2e 70 53 65 61 72 63 68 29 3b 0a 20 20  agg.pSearch);.  
28270 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 67 67 2e    aMem = p->agg.
28280 70 43 75 72 72 65 6e 74 2d 3e 61 4d 65 6d 3b 0a  pCurrent->aMem;.
28290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
282a0 2d 3e 61 67 67 2e 6e 4d 65 6d 3b 20 69 2b 2b 29  ->agg.nMem; i++)
282b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 65 65  {.      int free
282c0 43 74 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Ctx;.      if( p
282d0 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 69 5d 3d  ->agg.apFunc[i]=
282e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
282f0 20 20 20 20 20 69 66 28 20 70 2d 3e 61 67 67 2e       if( p->agg.
28300 61 70 46 75 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61  apFunc[i]->xFina
28310 6c 69 7a 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lize==0 ) contin
28320 75 65 3b 0a 20 20 20 20 20 20 63 74 78 2e 73 2e  ue;.      ctx.s.
28330 66 6c 61 67 73 20 3d 20 53 54 4b 5f 4e 75 6c 6c  flags = STK_Null
28340 3b 0a 20 20 20 20 20 20 63 74 78 2e 7a 20 3d 20  ;.      ctx.z = 
28350 30 3b 0a 20 20 20 20 20 20 63 74 78 2e 70 41 67  0;.      ctx.pAg
28360 67 20 3d 20 28 76 6f 69 64 2a 29 61 4d 65 6d 5b  g = (void*)aMem[
28370 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 66 72 65 65  i].z;.      free
28380 43 74 78 20 3d 20 61 4d 65 6d 5b 69 5d 2e 7a 20  Ctx = aMem[i].z 
28390 26 26 20 61 4d 65 6d 5b 69 5d 2e 7a 21 3d 61 4d  && aMem[i].z!=aM
283a0 65 6d 5b 69 5d 2e 73 2e 7a 3b 0a 20 20 20 20 20  em[i].s.z;.     
283b0 20 63 74 78 2e 63 6e 74 20 3d 20 61 4d 65 6d 5b   ctx.cnt = aMem[
283c0 69 5d 2e 73 2e 69 3b 0a 20 20 20 20 20 20 63 74  i].s.i;.      ct
283d0 78 2e 69 73 53 74 65 70 20 3d 20 30 3b 0a 20 20  x.isStep = 0;.  
283e0 20 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20      ctx.pFunc = 
283f0 70 2d 3e 61 67 67 2e 61 70 46 75 6e 63 5b 69 5d  p->agg.apFunc[i]
28400 3b 0a 20 20 20 20 20 20 28 2a 70 2d 3e 61 67 67  ;.      (*p->agg
28410 2e 61 70 46 75 6e 63 5b 69 5d 2d 3e 78 46 69 6e  .apFunc[i]->xFin
28420 61 6c 69 7a 65 29 28 26 63 74 78 29 3b 0a 20 20  alize)(&ctx);.  
28430 20 20 20 20 69 66 28 20 66 72 65 65 43 74 78 20      if( freeCtx 
28440 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28450 65 46 72 65 65 28 20 61 4d 65 6d 5b 69 5d 2e 7a  eFree( aMem[i].z
28460 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
28470 20 20 61 4d 65 6d 5b 69 5d 2e 73 20 3d 20 63 74    aMem[i].s = ct
28480 78 2e 73 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b  x.s;.      aMem[
28490 69 5d 2e 7a 20 3d 20 63 74 78 2e 7a 3b 0a 20 20  i].z = ctx.z;.  
284a0 20 20 20 20 69 66 28 20 28 61 4d 65 6d 5b 69 5d      if( (aMem[i]
284b0 2e 73 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53  .s.flags & STK_S
284c0 74 72 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  tr) &&.         
284d0 20 20 20 20 20 28 61 4d 65 6d 5b 69 5d 2e 73 2e       (aMem[i].s.
284e0 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 44 79 6e  flags & (STK_Dyn
284f0 7c 53 54 4b 5f 53 74 61 74 69 63 7c 53 54 4b 5f  |STK_Static|STK_
28500 45 70 68 65 6d 29 29 3d 3d 30 20 29 7b 0a 20 20  Ephem))==0 ){.  
28510 20 20 20 20 20 20 61 4d 65 6d 5b 69 5d 2e 7a 20        aMem[i].z 
28520 3d 20 61 4d 65 6d 5b 69 5d 2e 73 2e 7a 3b 0a 20  = aMem[i].s.z;. 
28530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28540 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
28550 4f 70 63 6f 64 65 3a 20 53 65 74 49 6e 73 65 72  Opcode: SetInser
28560 74 20 50 31 20 2a 20 50 33 0a 2a 2a 0a 2a 2a 20  t P1 * P3.**.** 
28570 49 66 20 53 65 74 20 50 31 20 64 6f 65 73 20 6e  If Set P1 does n
28580 6f 74 20 65 78 69 73 74 20 74 68 65 6e 20 63 72  ot exist then cr
28590 65 61 74 65 20 69 74 2e 20 20 54 68 65 6e 20 69  eate it.  Then i
285a0 6e 73 65 72 74 20 76 61 6c 75 65 0a 2a 2a 20 50  nsert value.** P
285b0 33 20 69 6e 74 6f 20 74 68 61 74 20 73 65 74 2e  3 into that set.
285c0 20 20 49 66 20 50 33 20 69 73 20 4e 55 4c 4c 2c    If P3 is NULL,
285d0 20 74 68 65 6e 20 69 6e 73 65 72 74 20 74 68 65   then insert the
285e0 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
285f0 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 65  tack into the se
28600 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  t..*/.case OP_Se
28610 74 49 6e 73 65 72 74 3a 20 7b 0a 20 20 69 6e 74  tInsert: {.  int
28620 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
28630 69 66 28 20 70 2d 3e 6e 53 65 74 3c 3d 69 20 29  if( p->nSet<=i )
28640 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
28650 20 53 65 74 20 2a 61 53 65 74 20 3d 20 73 71 6c   Set *aSet = sql
28660 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 53  iteRealloc(p->aS
28670 65 74 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66  et, (i+1)*sizeof
28680 28 70 2d 3e 61 53 65 74 5b 30 5d 29 20 29 3b 0a  (p->aSet[0]) );.
28690 20 20 20 20 69 66 28 20 61 53 65 74 3d 3d 30 20      if( aSet==0 
286a0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
286b0 20 20 20 70 2d 3e 61 53 65 74 20 3d 20 61 53 65     p->aSet = aSe
286c0 74 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  t;.    for(k=p->
286d0 6e 53 65 74 3b 20 6b 3c 3d 69 3b 20 6b 2b 2b 29  nSet; k<=i; k++)
286e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
286f0 73 68 49 6e 69 74 28 26 70 2d 3e 61 53 65 74 5b  shInit(&p->aSet[
28700 6b 5d 2e 68 61 73 68 2c 20 53 51 4c 49 54 45 5f  k].hash, SQLITE_
28710 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 31 29 3b  HASH_BINARY, 1);
28720 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53  .    }.    p->nS
28730 65 74 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20  et = i+1;.  }.  
28740 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20  if( pOp->p3 ){. 
28750 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
28760 65 72 74 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e  ert(&p->aSet[i].
28770 68 61 73 68 2c 20 70 4f 70 2d 3e 70 33 2c 20 73  hash, pOp->p3, s
28780 74 72 6c 65 6e 28 70 4f 70 2d 3e 70 33 29 2b 31  trlen(pOp->p3)+1
28790 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , p);.  }else{. 
287a0 20 20 20 69 6e 74 20 74 6f 73 20 3d 20 70 2d 3e     int tos = p->
287b0 74 6f 73 3b 0a 20 20 20 20 69 66 28 20 74 6f 73  tos;.    if( tos
287c0 3c 30 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e  <0 ) goto not_en
287d0 6f 75 67 68 5f 73 74 61 63 6b 3b 0a 20 20 20 20  ough_stack;.    
287e0 53 74 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73  Stringify(p, tos
287f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
28800 68 49 6e 73 65 72 74 28 26 70 2d 3e 61 53 65 74  hInsert(&p->aSet
28810 5b 69 5d 2e 68 61 73 68 2c 20 7a 53 74 61 63 6b  [i].hash, zStack
28820 5b 74 6f 73 5d 2c 20 61 53 74 61 63 6b 5b 74 6f  [tos], aStack[to
28830 73 5d 2e 6e 2c 20 70 29 3b 0a 20 20 20 20 50 4f  s].n, p);.    PO
28840 50 53 54 41 43 4b 3b 0a 20 20 7d 0a 20 20 69 66  PSTACK;.  }.  if
28850 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
28860 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  failed ) goto no
28870 5f 6d 65 6d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  _mem;.  break;.}
28880 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74  ../* Opcode: Set
28890 46 6f 75 6e 64 20 50 31 20 50 32 20 2a 0a 2a 2a  Found P1 P2 *.**
288a0 0a 2a 2a 20 50 6f 70 20 74 68 65 20 73 74 61 63  .** Pop the stac
288b0 6b 20 6f 6e 63 65 20 61 6e 64 20 63 6f 6d 70 61  k once and compa
288c0 72 65 20 74 68 65 20 76 61 6c 75 65 20 70 6f 70  re the value pop
288d0 70 65 64 20 6f 66 66 20 77 69 74 68 20 74 68 65  ped off with the
288e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
288f0 73 65 74 20 50 31 2e 20 20 49 66 20 74 68 65 20  set P1.  If the 
28900 65 6c 65 6d 65 6e 74 20 70 6f 70 70 65 64 20 65  element popped e
28910 78 69 73 74 73 20 69 6e 20 73 65 74 20 50 31 2c  xists in set P1,
28920 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  .** then jump to
28930 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20   P2.  Otherwise 
28940 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
28950 0a 63 61 73 65 20 4f 50 5f 53 65 74 46 6f 75 6e  .case OP_SetFoun
28960 64 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  d: {.  int i = p
28970 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74 6f  Op->p1;.  int to
28980 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56 45  s = p->tos;.  VE
28990 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30 20  RIFY( if( tos<0 
289a0 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75 67  ) goto not_enoug
289b0 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 53 74 72  h_stack; ).  Str
289c0 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b 0a  ingify(p, tos);.
289d0 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c    if( i>=0 && i<
289e0 70 2d 3e 6e 53 65 74 20 26 26 0a 20 20 20 20 20  p->nSet &&.     
289f0 20 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64    sqliteHashFind
28a00 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61 73  (&p->aSet[i].has
28a10 68 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c 20  h, zStack[tos], 
28a20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 29 29 7b  aStack[tos].n)){
28a30 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
28a40 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 50 4f 50  2 - 1;.  }.  POP
28a50 53 54 41 43 4b 3b 0a 20 20 62 72 65 61 6b 3b 0a  STACK;.  break;.
28a60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
28a70 74 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32 20  tNotFound P1 P2 
28a80 2a 0a 2a 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  *.**.** Pop the 
28a90 73 74 61 63 6b 20 6f 6e 63 65 20 61 6e 64 20 63  stack once and c
28aa0 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
28ab0 20 70 6f 70 70 65 64 20 6f 66 66 20 77 69 74 68   popped off with
28ac0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
28ad0 20 6f 66 20 73 65 74 20 50 31 2e 20 20 49 66 20   of set P1.  If 
28ae0 74 68 65 20 65 6c 65 6d 65 6e 74 20 70 6f 70 70  the element popp
28af0 65 64 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ed does not exis
28b00 74 73 20 69 6e 20 0a 2a 2a 20 73 65 74 20 50 31  ts in .** set P1
28b10 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
28b20 32 2e 20 20 4f 74 68 65 72 77 69 73 65 20 66 61  2.  Otherwise fa
28b30 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63  ll through..*/.c
28b40 61 73 65 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75  ase OP_SetNotFou
28b50 6e 64 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  nd: {.  int i = 
28b60 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20 74  pOp->p1;.  int t
28b70 6f 73 20 3d 20 70 2d 3e 74 6f 73 3b 0a 20 20 56  os = p->tos;.  V
28b80 45 52 49 46 59 28 20 69 66 28 20 74 6f 73 3c 30  ERIFY( if( tos<0
28b90 20 29 20 67 6f 74 6f 20 6e 6f 74 5f 65 6e 6f 75   ) goto not_enou
28ba0 67 68 5f 73 74 61 63 6b 3b 20 29 0a 20 20 53 74  gh_stack; ).  St
28bb0 72 69 6e 67 69 66 79 28 70 2c 20 74 6f 73 29 3b  ringify(p, tos);
28bc0 0a 20 20 69 66 28 20 69 3c 30 20 7c 7c 20 69 3e  .  if( i<0 || i>
28bd0 3d 70 2d 3e 6e 53 65 74 20 7c 7c 0a 20 20 20 20  =p->nSet ||.    
28be0 20 20 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e     sqliteHashFin
28bf0 64 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61  d(&p->aSet[i].ha
28c00 73 68 2c 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 2c  sh, zStack[tos],
28c10 20 61 53 74 61 63 6b 5b 74 6f 73 5d 2e 6e 29 3d   aStack[tos].n)=
28c20 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  =0 ){.    pc = p
28c30 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
28c40 20 20 50 4f 50 53 54 41 43 4b 3b 0a 20 20 62 72    POPSTACK;.  br
28c50 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
28c60 65 3a 20 53 65 74 46 69 72 73 74 20 50 31 20 50  e: SetFirst P1 P
28c70 32 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74  2 *.**.** Read t
28c80 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
28c90 20 66 72 6f 6d 20 73 65 74 20 50 31 20 61 6e 64   from set P1 and
28ca0 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
28cb0 65 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65  e stack.  If the
28cc0 0a 2a 2a 20 73 65 74 20 69 73 20 65 6d 70 74 79  .** set is empty
28cd0 2c 20 70 75 73 68 20 6e 6f 74 68 69 6e 67 20 61  , push nothing a
28ce0 6e 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  nd jump immediat
28cf0 65 6c 79 20 74 6f 20 50 32 2e 20 20 54 68 69 73  ely to P2.  This
28d00 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 75 73   opcode is.** us
28d10 65 64 20 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f  ed in combinatio
28d20 6e 20 77 69 74 68 20 4f 50 5f 53 65 74 4e 65 78  n with OP_SetNex
28d30 74 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  t to loop over a
28d40 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 61  ll elements of a
28d50 20 73 65 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f   set..*/./* Opco
28d60 64 65 3a 20 53 65 74 4e 65 78 74 20 50 31 20 50  de: SetNext P1 P
28d70 32 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74  2 *.**.** Read t
28d80 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
28d90 66 72 6f 6d 20 73 65 74 20 50 31 20 61 6e 64 20  from set P1 and 
28da0 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
28db0 20 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 72   stack.  If ther
28dc0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 6d 6f 72 65  e.** are no more
28dd0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
28de0 20 73 65 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   set, do not do 
28df0 74 68 65 20 70 75 73 68 20 61 6e 64 20 66 61 6c  the push and fal
28e00 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 20 4f 74  l through..** Ot
28e10 68 65 72 77 69 73 65 2c 20 6a 75 6d 70 20 74 6f  herwise, jump to
28e20 20 50 32 20 61 66 74 65 72 20 70 75 73 68 69 6e   P2 after pushin
28e30 67 20 74 68 65 20 6e 65 78 74 20 73 65 74 20 65  g the next set e
28e40 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20  lement..*/.case 
28e50 4f 50 5f 53 65 74 46 69 72 73 74 3a 20 0a 63 61  OP_SetFirst: .ca
28e60 73 65 20 4f 50 5f 53 65 74 4e 65 78 74 3a 20 7b  se OP_SetNext: {
28e70 0a 20 20 53 65 74 20 2a 70 53 65 74 3b 0a 20 20  .  Set *pSet;.  
28e80 69 6e 74 20 74 6f 73 3b 0a 20 20 43 48 45 43 4b  int tos;.  CHECK
28e90 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a  _FOR_INTERRUPT;.
28ea0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3c 30 20    if( pOp->p1<0 
28eb0 7c 7c 20 70 4f 70 2d 3e 70 31 3e 3d 70 2d 3e 6e  || pOp->p1>=p->n
28ec0 53 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Set ){.    if( p
28ed0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
28ee0 65 74 46 69 72 73 74 20 29 20 70 63 20 3d 20 70  etFirst ) pc = p
28ef0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
28f00 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 53 65  break;.  }.  pSe
28f10 74 20 3d 20 26 70 2d 3e 61 53 65 74 5b 70 4f 70  t = &p->aSet[pOp
28f20 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  ->p1];.  if( pOp
28f30 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 74  ->opcode==OP_Set
28f40 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 53 65  First ){.    pSe
28f50 74 2d 3e 70 72 65 76 20 3d 20 73 71 6c 69 74 65  t->prev = sqlite
28f60 48 61 73 68 46 69 72 73 74 28 26 70 53 65 74 2d  HashFirst(&pSet-
28f70 3e 68 61 73 68 29 3b 0a 20 20 20 20 69 66 28 20  >hash);.    if( 
28f80 70 53 65 74 2d 3e 70 72 65 76 3d 3d 30 20 29 7b  pSet->prev==0 ){
28f90 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
28fa0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
28fb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  reak;.    }.  }e
28fc0 6c 73 65 7b 0a 20 20 20 20 56 45 52 49 46 59 28  lse{.    VERIFY(
28fd0 20 69 66 28 20 70 53 65 74 2d 3e 70 72 65 76 3d   if( pSet->prev=
28fe0 3d 30 20 29 20 67 6f 74 6f 20 62 61 64 5f 69 6e  =0 ) goto bad_in
28ff0 73 74 72 75 63 74 69 6f 6e 3b 20 29 0a 20 20 20  struction; ).   
29000 20 70 53 65 74 2d 3e 70 72 65 76 20 3d 20 73 71   pSet->prev = sq
29010 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 53 65  liteHashNext(pSe
29020 74 2d 3e 70 72 65 76 29 3b 0a 20 20 20 20 69 66  t->prev);.    if
29030 28 20 70 53 65 74 2d 3e 70 72 65 76 3d 3d 30 20  ( pSet->prev==0 
29040 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
29050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29060 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
29070 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74  1;.    }.  }.  t
29080 6f 73 20 3d 20 2b 2b 70 2d 3e 74 6f 73 3b 0a 20  os = ++p->tos;. 
29090 20 7a 53 74 61 63 6b 5b 74 6f 73 5d 20 3d 20 73   zStack[tos] = s
290a0 71 6c 69 74 65 48 61 73 68 4b 65 79 28 70 53 65  qliteHashKey(pSe
290b0 74 2d 3e 70 72 65 76 29 3b 0a 20 20 61 53 74 61  t->prev);.  aSta
290c0 63 6b 5b 74 6f 73 5d 2e 6e 20 3d 20 73 71 6c 69  ck[tos].n = sqli
290d0 74 65 48 61 73 68 4b 65 79 73 69 7a 65 28 70 53  teHashKeysize(pS
290e0 65 74 2d 3e 70 72 65 76 29 3b 0a 20 20 61 53 74  et->prev);.  aSt
290f0 61 63 6b 5b 74 6f 73 5d 2e 66 6c 61 67 73 20 3d  ack[tos].flags =
29100 20 53 54 4b 5f 53 74 72 20 7c 20 53 54 4b 5f 45   STK_Str | STK_E
29110 70 68 65 6d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  phem;.  break;.}
29120 0a 0a 2f 2a 20 41 6e 20 6f 74 68 65 72 20 6f 70  ../* An other op
29130 63 6f 64 65 20 69 73 20 69 6c 6c 65 67 61 6c 2e  code is illegal.
29140 2e 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a 20 7b  ...*/.default: {
29150 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
29160 22 25 64 22 2c 70 4f 70 2d 3e 6f 70 63 6f 64 65  "%d",pOp->opcode
29170 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 53 74  );.  sqliteSetSt
29180 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
29190 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 63 6f 64  , "unknown opcod
291a0 65 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  e ", zBuf, 0);. 
291b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
291c0 45 52 4e 41 4c 3b 0a 20 20 62 72 65 61 6b 3b 0a  ERNAL;.  break;.
291d0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
291e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29220 2a 0a 2a 2a 20 54 68 65 20 63 61 73 65 73 20 6f  *.** The cases o
29230 66 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61  f the switch sta
29240 74 65 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 69  tement above thi
29250 73 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61 6c  s line should al
29260 6c 20 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a 2a  l be indented.**
29270 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20 42   by 6 spaces.  B
29280 75 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ut the left-most
29290 20 36 20 73 70 61 63 65 73 20 68 61 76 65 20 62   6 spaces have b
292a0 65 65 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20 69  een removed to i
292b0 6d 70 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72 65  mprove the.** re
292c0 61 64 61 62 69 6c 69 74 79 2e 20 20 46 72 6f 6d  adability.  From
292d0 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 64   this point on d
292e0 6f 77 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c 20  own, the normal 
292f0 69 6e 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c 65  indentation rule
29300 73 20 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72 65  s are.** restore
29310 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  d..*************
29320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29360 2f 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  /.    }..#ifdef 
29370 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
29380 20 7b 0a 20 20 20 20 20 20 6c 6f 6e 67 20 6c 6f   {.      long lo
29390 6e 67 20 65 6c 61 70 73 65 20 3d 20 68 77 74 69  ng elapse = hwti
293a0 6d 65 28 29 20 2d 20 73 74 61 72 74 3b 0a 20 20  me() - start;.  
293b0 20 20 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20      pOp->cycles 
293c0 2b 3d 20 65 6c 61 70 73 65 3b 0a 20 20 20 20 20  += elapse;.     
293d0 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66   pOp->cnt++;.#if
293e0 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   0.        fprin
293f0 74 66 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c  tf(stdout, "%10l
29400 6c 64 20 22 2c 20 65 6c 61 70 73 65 29 3b 0a 20  ld ", elapse);. 
29410 20 20 20 20 20 20 20 76 64 62 65 50 72 69 6e 74         vdbePrint
29420 4f 70 28 73 74 64 6f 75 74 2c 20 6f 72 69 67 50  Op(stdout, origP
29430 63 2c 20 26 70 2d 3e 61 4f 70 5b 6f 72 69 67 50  c, &p->aOp[origP
29440 63 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  c]);.#endif.    
29450 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
29460 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
29470 6f 64 65 20 61 64 64 73 20 6e 6f 74 68 69 6e 67  ode adds nothing
29480 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66   to the actual f
29490 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
294a0 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
294b0 61 6d 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  am.  It is only 
294c0 68 65 72 65 20 66 6f 72 20 74 65 73 74 69 6e 67  here for testing
294d0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a   and debugging..
294e0 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
294f0 68 65 72 20 68 61 6e 64 2c 20 69 74 20 64 6f 65  her hand, it doe
29500 73 20 62 75 72 6e 20 43 50 55 20 63 79 63 6c 65  s burn CPU cycle
29510 73 20 65 76 65 72 79 20 74 69 6d 65 20 74 68 72  s every time thr
29520 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  ough.    ** the 
29530 65 76 61 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20  evaluator loop. 
29540 20 53 6f 20 77 65 20 63 61 6e 20 6c 65 61 76 65   So we can leave
29550 20 69 74 20 6f 75 74 20 77 68 65 6e 20 4e 44 45   it out when NDE
29560 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
29570 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e      */.#ifndef N
29580 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 63  DEBUG.    if( pc
29590 3c 2d 31 20 7c 7c 20 70 63 3e 3d 70 2d 3e 6e 4f  <-1 || pc>=p->nO
295a0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
295b0 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  eSetString(&p->z
295c0 45 72 72 4d 73 67 2c 20 22 6a 75 6d 70 20 64 65  ErrMsg, "jump de
295d0 73 74 69 6e 61 74 69 6f 6e 20 6f 75 74 20 6f 66  stination out of
295e0 20 72 61 6e 67 65 22 2c 20 30 29 3b 0a 20 20 20   range", 0);.   
295f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
29600 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20  NTERNAL;.    }. 
29610 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20     if( p->trace 
29620 26 26 20 70 2d 3e 74 6f 73 3e 3d 30 20 29 7b 0a  && p->tos>=0 ){.
29630 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29640 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72     fprintf(p->tr
29650 61 63 65 2c 20 22 53 74 61 63 6b 3a 22 29 3b 0a  ace, "Stack:");.
29660 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 74        for(i=p->t
29670 6f 73 3b 20 69 3e 3d 30 20 26 26 20 69 3e 70 2d  os; i>=0 && i>p-
29680 3e 74 6f 73 2d 35 3b 20 69 2d 2d 29 7b 0a 20 20  >tos-5; i--){.  
29690 20 20 20 20 20 20 69 66 28 20 61 53 74 61 63 6b        if( aStack
296a0 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [i].flags & STK_
296b0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
296c0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72 61    fprintf(p->tra
296d0 63 65 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20  ce, " NULL");.  
296e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
296f0 28 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67 73  (aStack[i].flags
29700 20 26 20 28 53 54 4b 5f 49 6e 74 7c 53 54 4b 5f   & (STK_Int|STK_
29710 53 74 72 29 29 3d 3d 28 53 54 4b 5f 49 6e 74 7c  Str))==(STK_Int|
29720 53 54 4b 5f 53 74 72 29 20 29 7b 0a 20 20 20 20  STK_Str) ){.    
29730 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
29740 3e 74 72 61 63 65 2c 20 22 20 73 69 3a 25 64 22  >trace, " si:%d"
29750 2c 20 61 53 74 61 63 6b 5b 69 5d 2e 69 29 3b 0a  , aStack[i].i);.
29760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29770 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c 61 67  ( aStack[i].flag
29780 73 20 26 20 53 54 4b 5f 49 6e 74 20 29 7b 0a 20  s & STK_Int ){. 
29790 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
297a0 28 70 2d 3e 74 72 61 63 65 2c 20 22 20 69 3a 25  (p->trace, " i:%
297b0 64 22 2c 20 61 53 74 61 63 6b 5b 69 5d 2e 69 29  d", aStack[i].i)
297c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
297d0 69 66 28 20 61 53 74 61 63 6b 5b 69 5d 2e 66 6c  if( aStack[i].fl
297e0 61 67 73 20 26 20 53 54 4b 5f 52 65 61 6c 20 29  ags & STK_Real )
297f0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
29800 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 20  ntf(p->trace, " 
29810 72 3a 25 67 22 2c 20 61 53 74 61 63 6b 5b 69 5d  r:%g", aStack[i]
29820 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  .r);.        }el
29830 73 65 20 69 66 28 20 61 53 74 61 63 6b 5b 69 5d  se if( aStack[i]
29840 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 53 74 72  .flags & STK_Str
29850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
29860 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20  t j, k;.        
29870 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
29880 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
29890 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  [0] = ' ';.     
298a0 20 20 20 20 20 69 66 28 20 61 53 74 61 63 6b 5b       if( aStack[
298b0 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f 44  i].flags & STK_D
298c0 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  yn ){.          
298d0 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b    zBuf[1] = 'z';
298e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
298f0 65 72 74 28 20 28 61 53 74 61 63 6b 5b 69 5d 2e  ert( (aStack[i].
29900 66 6c 61 67 73 20 26 20 28 53 54 4b 5f 53 74 61  flags & (STK_Sta
29910 74 69 63 7c 53 54 4b 5f 45 70 68 65 6d 29 29 3d  tic|STK_Ephem))=
29920 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
29930 7d 65 6c 73 65 20 69 66 28 20 61 53 74 61 63 6b  }else if( aStack
29940 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b 5f  [i].flags & STK_
29950 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
29960 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
29970 27 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  't';.           
29980 20 61 73 73 65 72 74 28 20 28 61 53 74 61 63 6b   assert( (aStack
29990 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 53 54 4b  [i].flags & (STK
299a0 5f 44 79 6e 7c 53 54 4b 5f 45 70 68 65 6d 29 29  _Dyn|STK_Ephem))
299b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
299c0 20 7d 65 6c 73 65 20 69 66 28 20 61 53 74 61 63   }else if( aStac
299d0 6b 5b 69 5d 2e 66 6c 61 67 73 20 26 20 53 54 4b  k[i].flags & STK
299e0 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
299f0 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
29a00 27 65 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'e';.           
29a10 20 61 73 73 65 72 74 28 20 28 61 53 74 61 63 6b   assert( (aStack
29a20 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 53 54 4b  [i].flags & (STK
29a30 5f 53 74 61 74 69 63 7c 53 54 4b 5f 44 79 6e 29  _Static|STK_Dyn)
29a40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
29a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29a60 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
29a70 73 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  s';.          }.
29a80 20 20 20 20 20 20 20 20 20 20 7a 42 75 66 5b 32            zBuf[2
29a90 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 20  ] = '[';.       
29aa0 20 20 20 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20     k = 3;.      
29ab0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
29ac0 30 20 26 26 20 6a 3c 61 53 74 61 63 6b 5b 69 5d  0 && j<aStack[i]
29ad0 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
29ae0 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 53        int c = zS
29af0 74 61 63 6b 5b 69 5d 5b 6a 5d 3b 0a 20 20 20 20  tack[i][j];.    
29b00 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
29b10 20 26 26 20 6a 3d 3d 61 53 74 61 63 6b 5b 69 5d   && j==aStack[i]
29b20 2e 6e 2d 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  .n-1 ) break;.  
29b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
29b40 70 72 69 6e 74 28 63 29 20 26 26 20 21 69 73 73  print(c) && !iss
29b50 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
29b60 20 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b           zBuf[k+
29b70 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
29b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29b90 20 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b           zBuf[k+
29ba0 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  +] = '.';.      
29bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 42    }.          zB
29bd0 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20  uf[k++] = ']';. 
29be0 20 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b           zBuf[k+
29bf0 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  +] = 0;.        
29c00 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72 61    fprintf(p->tra
29c10 63 65 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  ce, "%s", zBuf);
29c20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29c30 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
29c40 66 28 70 2d 3e 74 72 61 63 65 2c 20 22 20 3f 3f  f(p->trace, " ??
29c50 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ?");.        }. 
29c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29c70 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66   rc!=0 ) fprintf
29c80 28 70 2d 3e 74 72 61 63 65 2c 22 20 72 63 3d 25  (p->trace," rc=%
29c90 64 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 66 70  d",rc);.      fp
29ca0 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 22  rintf(p->trace,"
29cb0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  \n");.    }.#end
29cc0 69 66 0a 20 20 7d 20 20 2f 2a 20 54 68 65 20 65  if.  }  /* The e
29cd0 6e 64 20 6f 66 20 74 68 65 20 66 6f 72 28 3b 3b  nd of the for(;;
29ce0 29 20 6c 6f 6f 70 20 74 68 65 20 6c 6f 6f 70 73  ) loop the loops
29cf0 20 74 68 72 6f 75 67 68 20 6f 70 63 6f 64 65 73   through opcodes
29d00 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   */..  /* If we 
29d10 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
29d20 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
29d30 65 78 65 63 75 74 69 6f 6e 20 69 73 20 66 69 6e  execution is fin
29d40 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 76 64 62 65  ished..  */.vdbe
29d50 5f 68 61 6c 74 3a 0a 20 20 69 66 28 20 72 63 20  _halt:.  if( rc 
29d60 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  ){.    p->rc = r
29d70 63 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  c;.    rc = SQLI
29d80 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
29d90 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
29da0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 70  TE_DONE;.  }.  p
29db0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
29dc0 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 72 65 74  AGIC_HALT;.  ret
29dd0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
29de0 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20  mp to here if a 
29df0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 20  malloc() fails. 
29e00 20 49 74 27 73 20 68 61 72 64 20 74 6f 20 67 65   It's hard to ge
29e10 74 20 61 20 6d 61 6c 6c 6f 63 28 29 0a 20 20 2a  t a malloc().  *
29e20 2a 20 74 6f 20 66 61 69 6c 20 6f 6e 20 61 20 6d  * to fail on a m
29e30 6f 64 65 72 6e 20 56 4d 20 63 6f 6d 70 75 74 65  odern VM compute
29e40 72 2c 20 73 6f 20 74 68 69 73 20 63 6f 64 65 20  r, so this code 
29e50 69 73 20 75 6e 74 65 73 74 65 64 2e 0a 20 20 2a  is untested..  *
29e60 2f 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 73 71 6c 69  /.no_mem:.  sqli
29e70 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  teSetString(&p->
29e80 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66  zErrMsg, "out of
29e90 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20   memory", 0);.  
29ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29eb0 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 68  M;.  goto vdbe_h
29ec0 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  alt;..  /* Jump 
29ed0 74 6f 20 68 65 72 65 20 66 6f 72 20 61 6e 20 53  to here for an S
29ee0 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72  QLITE_MISUSE err
29ef0 6f 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64  or..  */.abort_d
29f00 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3a 0a 20 20  ue_to_misuse:.  
29f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
29f20 53 45 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  SE;.  /* Fall th
29f30 72 75 20 69 6e 74 6f 20 61 62 6f 72 74 5f 64 75  ru into abort_du
29f40 65 5f 74 6f 5f 65 72 72 6f 72 20 2a 2f 0a 0a 20  e_to_error */.. 
29f50 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
29f60 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b   for any other k
29f70 69 6e 64 20 6f 66 20 66 61 74 61 6c 20 65 72 72  ind of fatal err
29f80 6f 72 2e 20 20 54 68 65 20 22 72 63 22 20 76 61  or.  The "rc" va
29f90 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f 75  riable.  ** shou
29fa0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 72 72 6f  ld hold the erro
29fb0 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 61  r number..  */.a
29fc0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
29fd0 72 3a 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  r:.  if( p->zErr
29fe0 4d 73 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Msg==0 ){.    sq
29ff0 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
2a000 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  ->zErrMsg, sqlit
2a010 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  e_error_string(r
2a020 63 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 67 6f  c), 0);.  }.  go
2a030 74 6f 20 76 64 62 65 5f 68 61 6c 74 3b 0a 0a 20  to vdbe_halt;.. 
2a040 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
2a050 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f 69   if the sqlite_i
2a060 6e 74 65 72 72 75 70 74 28 29 20 41 50 49 20 73  nterrupt() API s
2a070 65 74 73 20 74 68 65 20 69 6e 74 65 72 72 75 70  ets the interrup
2a080 74 0a 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a  t.  ** flag..  *
2a090 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69  /.abort_due_to_i
2a0a0 6e 74 65 72 72 75 70 74 3a 0a 20 20 61 73 73 65  nterrupt:.  asse
2a0b0 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  rt( db->flags & 
2a0c0 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
2a0d0 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
2a0e0 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2a0f0 72 75 70 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rupt;.  if( db->
2a100 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
2a110 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  GIC_BUSY ){.    
2a120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
2a130 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SE;.  }else{.   
2a140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
2a150 45 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 73 71  ERRUPT;.  }.  sq
2a160 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
2a170 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  ->zErrMsg, sqlit
2a180 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  e_error_string(r
2a190 63 29 2c 20 30 29 3b 0a 20 20 67 6f 74 6f 20 76  c), 0);.  goto v
2a1a0 64 62 65 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20  dbe_halt;..  /* 
2a1b0 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
2a1c0 61 20 6f 70 65 72 61 74 6f 72 20 69 73 20 65 6e  a operator is en
2a1d0 63 6f 75 6e 74 65 72 65 64 20 74 68 61 74 20 72  countered that r
2a1e0 65 71 75 69 72 65 73 20 6d 6f 72 65 20 73 74 61  equires more sta
2a1f0 63 6b 0a 20 20 2a 2a 20 6f 70 65 72 61 6e 64 73  ck.  ** operands
2a200 20 74 68 61 6e 20 61 72 65 20 63 75 72 72 65 6e   than are curren
2a210 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  tly available on
2a220 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2f   the stack..  */
2a230 0a 6e 6f 74 5f 65 6e 6f 75 67 68 5f 73 74 61 63  .not_enough_stac
2a240 6b 3a 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  k:.  sprintf(zBu
2a250 66 2c 22 25 64 22 2c 70 63 29 3b 0a 20 20 73 71  f,"%d",pc);.  sq
2a260 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
2a270 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20  ->zErrMsg, "too 
2a280 66 65 77 20 6f 70 65 72 61 6e 64 73 20 6f 6e 20  few operands on 
2a290 73 74 61 63 6b 20 61 74 20 22 2c 20 7a 42 75 66  stack at ", zBuf
2a2a0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  , 0);.  rc = SQL
2a2b0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
2a2c0 67 6f 74 6f 20 76 64 62 65 5f 68 61 6c 74 3b 0a  goto vdbe_halt;.
2a2d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
2a2e0 69 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  if an illegal or
2a2f0 20 69 6c 6c 66 6f 72 6d 65 64 20 69 6e 73 74 72   illformed instr
2a300 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
2a310 65 64 2e 0a 20 20 2a 2f 0a 56 45 52 49 46 59 28  ed..  */.VERIFY(
2a320 0a 62 61 64 5f 69 6e 73 74 72 75 63 74 69 6f 6e  .bad_instruction
2a330 3a 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  :.  sprintf(zBuf
2a340 2c 22 25 64 22 2c 70 63 29 3b 0a 20 20 73 71 6c  ,"%d",pc);.  sql
2a350 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d  iteSetString(&p-
2a360 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6c 6c 65 67  >zErrMsg, "illeg
2a370 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 61 74 20  al operation at 
2a380 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  ", zBuf, 0);.  r
2a390 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
2a3a0 4e 41 4c 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  NAL;.  goto vdbe
2a3b0 5f 68 61 6c 74 3b 0a 29 0a 7d 0a 0a 0a 2f 2a 0a  _halt;.).}.../*.
2a3c0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
2a3d0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
2a3e0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
2a3f0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
2a400 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  s the.** result 
2a410 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
2a420 69 74 65 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  iteVdbeFinalize(
2a430 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a  Vdbe *p, char **
2a440 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c  pzErrMsg){.  sql
2a450 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  ite *db = p->db;
2a460 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 0a 20  .  int i, rc;.. 
2a470 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
2a480 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
2a490 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
2a4a0 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
2a4b0 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
2a4c0 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  g(pzErrMsg, sqli
2a4d0 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  te_error_string(
2a4e0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c 20  SQLITE_MISUSE), 
2a4f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0);.    return S
2a500 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
2a510 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  }.  if( p->zErrM
2a520 73 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 7a  sg ){.    if( pz
2a530 45 72 72 4d 73 67 20 26 26 20 2a 70 7a 45 72 72  ErrMsg && *pzErr
2a540 4d 73 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg==0 ){.      
2a550 2a 70 7a 45 72 72 4d 73 67 20 3d 20 70 2d 3e 7a  *pzErrMsg = p->z
2a560 45 72 72 4d 73 67 3b 0a 20 20 20 20 7d 65 6c 73  ErrMsg;.    }els
2a570 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  e{.      sqliteF
2a580 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
2a590 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 45  .    }.    p->zE
2a5a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  rrMsg = 0;.  }. 
2a5b0 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69   Cleanup(p);.  i
2a5c0 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
2a5d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69 74 63  _OK ){.    switc
2a5e0 68 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  h( p->errorActio
2a5f0 6e 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  n ){.      case 
2a600 4f 45 5f 41 62 6f 72 74 3a 20 7b 0a 20 20 20 20  OE_Abort: {.    
2a610 20 20 20 20 69 66 28 20 21 70 2d 3e 75 6e 64 6f      if( !p->undo
2a620 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a  TransOnError ){.
2a630 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2a640 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
2a650 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2a660 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
2a670 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
2a680 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 52      sqliteBtreeR
2a690 6f 6c 6c 62 61 63 6b 43 6b 70 74 28 64 62 2d 3e  ollbackCkpt(db->
2a6a0 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
2a6b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a6d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a6e0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  }.        /* Fal
2a6f0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 52 4f 4c  l through to ROL
2a700 4c 42 41 43 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  LBACK */.      }
2a710 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
2a720 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  ollback: {.     
2a730 20 20 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63     sqliteRollbac
2a740 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
2a750 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2a760 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
2a770 20 20 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45 72          db->onEr
2a780 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
2a790 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2a7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
2a7b0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
2a7c0 20 20 69 66 28 20 70 2d 3e 75 6e 64 6f 54 72 61    if( p->undoTra
2a7d0 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  nsOnError ){.   
2a7e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 6f 6c         sqliteRol
2a7f0 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
2a800 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
2a810 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
2a820 72 61 6e 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rans;.          
2a830 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
2a840 5f 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  _Default;.      
2a850 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
2a860 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2a870 0a 20 20 20 20 73 71 6c 69 74 65 52 6f 6c 6c 62  .    sqliteRollb
2a880 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  ackInternalChang
2a890 65 73 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  es(db);.  }.  fo
2a8a0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2a8b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2a8c0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 26  db->aDb[i].pBt &
2a8d0 26 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54  & db->aDb[i].inT
2a8e0 72 61 6e 73 3d 3d 32 20 29 7b 0a 20 20 20 20 20  rans==2 ){.     
2a8f0 20 73 71 6c 69 74 65 42 74 72 65 65 43 6f 6d 6d   sqliteBtreeComm
2a900 69 74 43 6b 70 74 28 64 62 2d 3e 61 44 62 5b 69  itCkpt(db->aDb[i
2a910 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62  ].pBt);.      db
2a920 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73  ->aDb[i].inTrans
2a930 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2a940 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 6f 73    assert( p->tos
2a950 3c 70 2d 3e 70 63 20 7c 7c 20 73 71 6c 69 74 65  <p->pc || sqlite
2a960 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d 3d  _malloc_failed==
2a970 31 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45  1 );.#ifdef VDBE
2a980 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
2a990 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
2a9a0 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
2a9b0 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
2a9c0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
2a9d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
2a9e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
2a9f0 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
2aa00 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
2aa10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
2aa20 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
2aa30 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
2aa40 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
2aa50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
2aa60 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
2aa70 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
2aa80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
2aa90 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
2aaa0 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
2aab0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
2aac0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
2aad0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
2aae0 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
2aaf0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
2ab00 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
2ab10 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
2ab20 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
2ab30 3b 0a 20 20 20 20 20 20 20 20 76 64 62 65 50 72  ;.        vdbePr
2ab40 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
2ab50 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
2ab60 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
2ab70 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
2ab80 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 70 2d  #endif.  rc = p-
2ab90 3e 72 63 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  >rc;.  sqliteVdb
2aba0 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 69 66  eDelete(p);.  if
2abb0 28 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c  ( db->want_to_cl
2abc0 6f 73 65 20 26 26 20 64 62 2d 3e 70 56 64 62 65  ose && db->pVdbe
2abd0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2abe0 65 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 7d  e_close(db);.  }
2abf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ac00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2ac10 6e 65 77 20 56 64 62 65 20 69 6e 20 2a 70 4f 75  new Vdbe in *pOu
2ac20 74 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 69  t and populate i
2ac30 74 20 77 69 74 68 20 74 68 65 20 70 72 6f 67 72  t with the progr
2ac40 61 6d 20 66 72 6f 6d 20 70 2e 20 54 68 65 6e 0a  am from p. Then.
2ac50 2a 2a 20 70 61 73 73 20 70 20 74 6f 20 73 71 6c  ** pass p to sql
2ac60 69 74 65 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  iteVdbeFinalize(
2ac70 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2ac80 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
2ac90 70 2c 20 63 68 61 72 20 2a 2a 20 70 45 72 72 4d  p, char ** pErrM
2aca0 73 67 2c 20 56 64 62 65 2a 2a 20 70 4f 75 74 29  sg, Vdbe** pOut)
2acb0 0a 7b 0a 20 20 69 66 28 20 70 4f 75 74 20 26 26  .{.  if( pOut &&
2acc0 20 70 2d 3e 72 63 20 21 3d 20 53 51 4c 49 54 45   p->rc != SQLITE
2acd0 5f 53 43 48 45 4d 41 20 29 7b 0a 0a 20 20 20 20  _SCHEMA ){..    
2ace0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
2acf0 56 44 42 45 20 61 6e 64 20 70 6f 70 75 6c 61 74  VDBE and populat
2ad00 65 20 69 74 20 77 69 74 68 20 74 68 65 20 70 72  e it with the pr
2ad10 6f 67 72 61 6d 20 75 73 65 64 20 62 79 20 74 68  ogram used by th
2ad20 65 20 6f 6c 64 0a 20 20 20 20 2a 2a 20 56 44 42  e old.    ** VDB
2ad30 45 2e 20 44 6f 6e 27 74 20 63 6f 70 79 20 74 68  E. Don't copy th
2ad40 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69  e last instructi
2ad50 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  on of the progra
2ad60 6d 2c 20 61 73 20 74 68 69 73 20 69 73 20 61 6e  m, as this is an
2ad70 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c 74   .    ** OP_Halt
2ad80 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
2ad90 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 2e  VdbeMakeReady().
2ada0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2a 70 4f   .    */.    *pO
2adb0 75 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  ut = sqliteVdbeC
2adc0 72 65 61 74 65 28 20 70 2d 3e 64 62 20 29 3b 0a  reate( p->db );.
2add0 20 20 20 20 28 2a 70 4f 75 74 29 2d 3e 61 4f 70      (*pOut)->aOp
2ade0 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 28   = p->aOp;.    (
2adf0 2a 70 4f 75 74 29 2d 3e 6e 4f 70 20 3d 20 70 2d  *pOut)->nOp = p-
2ae00 3e 6e 4f 70 2d 31 3b 0a 20 20 20 20 28 2a 70 4f  >nOp-1;.    (*pO
2ae10 75 74 29 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20  ut)->nOpAlloc = 
2ae20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
2ae30 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 52   sqliteVdbeMakeR
2ae40 65 61 64 79 28 20 2a 70 4f 75 74 2c 20 70 2d 3e  eady( *pOut, p->
2ae50 78 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 43  xCallback, p->pC
2ae60 62 41 72 67 2c 20 28 69 6e 74 29 70 2d 3e 65 78  bArg, (int)p->ex
2ae70 70 6c 61 69 6e 20 29 3b 0a 20 20 20 20 70 2d 3e  plain );.    p->
2ae80 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  aOp = 0;.    p->
2ae90 6e 4f 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  nOp = 0;.    p->
2aea0 6e 4f 70 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  nOpAlloc = 0;.  
2aeb0 7d 65 6c 73 65 20 69 66 28 20 70 4f 75 74 20 29  }else if( pOut )
2aec0 7b 0a 20 20 20 20 2a 70 4f 75 74 20 3d 20 4e 55  {.    *pOut = NU
2aed0 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
2aee0 20 73 71 6c 69 74 65 56 64 62 65 46 69 6e 61 6c   sqliteVdbeFinal
2aef0 69 7a 65 28 70 2c 20 70 45 72 72 4d 73 67 29 3b  ize(p, pErrMsg);
2af00 0a 7d 0a                                         .}.